Cult Overhaul

Cult is awful, so let's try to improve it. Idea by KorPhaeron. I also
took some inspiration from adrix89's sacrifice cult, so credits to him.
Also thanks a lot specially to MrPerson and Iamgoofball for helping
me brainstorm this, and Joan for the sprites for the summoning orb,
the large nar-sie shell, and the new cult antag hud.

Basically, we remove conversion, and turn cult into a magic version of
nuke, with a small team of stealth elite cultists that have to build a
base in the station and sacrifice people in order to build an army of
constructs and get materials to eventually summon Nar-Sie.

Stun talismans and conversion are gone. Nar-Sie is now the only
objective. Sacrifice runes now provide summoning orbs, which you can use
to drop a large shell. Insert enough orbs in the shell and you trigger a
Delta. Defend the shell for 3 minutes and Nar-sie will arise. This shell
is bombproof and singularityproof. It may be summoned up to three times
if destroyed, but you will have to start from the beginning sac-wise.

Runes are now RNG. Each cultist only gets 50% of the runes. Inspiration
is basically The Binding of Isaac here (thank you MrPerson for this!).
Furthermore, many old runes were merged/removed and other new ones were
added. Almost all were massively rebalanced. Cult now also has a
stealthy ritual dagger with high bleeding and throw effects.
This commit is contained in:
Tkdrg
2015-12-15 04:59:31 -03:00
parent b0da7b3a64
commit 8ead3e8628
22 changed files with 474 additions and 826 deletions
+6 -63
View File
@@ -46,7 +46,6 @@
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
@@ -147,12 +146,7 @@
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)
@@ -342,11 +336,8 @@
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>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>."
*/
text += "<br><a href='?src=\ref[src];cult=equip'>Equip</a>"
else if(isloyal(current))
text += "<b>LOYAL</b>|employee|<a href='?src=\ref[src];cult=cultist'>cultist</a>"
else
@@ -1008,31 +999,9 @@
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("tome")
var/mob/living/carbon/human/H = current
if (istype(H))
var/obj/item/weapon/tome/T = new(H)
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 = H.equip_in_one_of_slots(T, slots)
if (!where)
usr << "<span class='danger'>Spawning tome failed!</span>"
else
H << "A tome, a message from your new master, appears in your [where]."
if(where == "backpack")
var/obj/item/weapon/storage/B = H.back
B.orient2hud(H)
B.show_to(H)
if("amulet")
if("equip")
if (!ticker.mode.equip_cultist(current))
usr << "<span class='danger'>Spawning amulet failed!</span>"
usr << "<span class='danger'>equip_cultist() failed! [current]'s starting equipment will be incomplete.</span>"
else if (href_list["wizard"])
switch(href_list["wizard"])
@@ -1430,34 +1399,8 @@
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>"
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 (istype(H))
var/obj/item/weapon/tome/T = new(H)
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 = H.equip_in_one_of_slots(T, slots)
if (!where)
else
H << "A tome, a message from your new master, appears in your [where]."
if (!ticker.mode.equip_cultist(current))
H << "Spawning an amulet from your Master failed."
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)
/datum/mind/proc/make_Rev()
if (ticker.mode.head_revolutionaries.len>0)
+36 -164
View File
@@ -2,29 +2,11 @@
/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/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") //redundent?
if(is_sacrifice_target(mind)) return 0
return 1
/proc/cultist_commune(mob/living/user, clear = 0, say = 0, message)
/proc/cultist_commune(mob/living/user, say = 0, message)
if(!message)
return
if(say)
@@ -40,10 +22,7 @@
user.whisper(message)
for(var/mob/M in mob_list)
if(iscultist(M) || (M in dead_mob_list))
if(clear || !ishuman(user))
M << "<span class='cultitalic'><b>[(ishuman(user) ? "Acolyte" : "Construct")] [user]:</b> [message]</span>"
else //Emergency comms
M << "<span class='purple'><i>Acolyte ???:</i> <b>[message]</b></span>"
M << "<span class='cultitalic'><b>[(ishuman(user) ? "Acolyte" : "Construct")] [user]:</b> [message]</span>"
log_say("[user.real_name]/[user.key] : [message]")
@@ -54,42 +33,31 @@
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 = 20
required_enemies = 4
recommended_enemies = 4
required_players = 10
required_enemies = 2
recommended_enemies = 2
enemy_minimum_age = 14
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
var/eldergod = 0
var/orbs_needed = 3
var/large_shell_summoned = 0
var/attempts_left = 3
/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 - complete your objectives. Convert crewmembers to your cause by using the convert rune. Remember - there is no you, there is only the cult.<BR>\nPersonnel - Do not let the cult succeed in its mission. Brainwashing them with the chaplain's bible reverts them to whatever Centcom-allowed faith they had.</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>"
/datum/game_mode/cult/pre_setup()
cult_objectives += "sacrifice"
if(prob(50))
cult_objectives += "survive"
else
cult_objectives += "eldergod"
if(config.protect_roles_from_antagonist)
restricted_jobs += protected_jobs
if(config.protect_assistant_from_antagonist)
restricted_jobs += "Assistant"
acolytes_needed = round(num_players()/5,1) //Scales the escape requirement with the amount of people in the round; for every 5 players, one cultist added to the count, i.e. 25 players = 5 to escape
acolytes_needed = Clamp(acolytes_needed, 1, 15) //Max at 15 and minimum at 1 - before the update, people rarely got even 15
//cult scaling goes here
recommended_enemies = 1 + round(num_players()/8)
orbs_needed = recommended_enemies
for(var/cultists_number = 1 to recommended_enemies)
if(!antag_candidates.len)
@@ -106,22 +74,6 @@
/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)
@@ -131,20 +83,7 @@
/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>"
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)
if(!istype(mob))
@@ -155,20 +94,27 @@
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)
mob << "These will help you start the cult on this station. Use them well, and remember - you are not the only one.</span>"
var/obj/item/weapon/paper/talisman/supply/T = new(mob)
var/list/slots = list (
/datum/game_mode/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob)
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/T = new item_path(mob)
var/item_name = initial(item_path.name)
var/where = mob.equip_in_one_of_slots(T, slots)
if(!where)
mob << "Unfortunately, you weren't able to get a talisman. This is very bad and you should adminhelp immediately."
mob << "<span class='userdanger'>Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).</span>"
return 0
else
mob << "<span class='danger'>You have a talisman in your [where], one that will help you start the cult on this station. Use it well, and remember - you are not the only one.</span>"
mob << "<span class='danger'>You have a [item_name] in your [where]."
mob.update_icons()
if(where == "backpack")
var/obj/item/weapon/storage/B = mob.back
@@ -176,20 +122,18 @@
B.show_to(mob)
return 1
/datum/game_mode/proc/add_cultist(datum/mind/cult_mind) //BASE
if (!istype(cult_mind))
if (!istype(cult_mind) || (cult_mind in cult))
return 0
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
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
/datum/game_mode/cult/add_cultist(datum/mind/cult_mind) //INHERIT
@@ -222,85 +166,13 @@
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()
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(!check_cult_victory())
if(eldergod)
feedback_set_details("round_end_result","win - cult win")
feedback_set("round_end_result",acolytes_survived)
world << "<span class='greentext'>The cult wins! It has succeeded in serving its dark master!</span>"
else
feedback_set_details("round_end_result","loss - staff stopped the cult")
feedback_set("round_end_result",acolytes_survived)
world << "<span class='redtext'>The staff managed to stop the cult!</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
+65
View File
@@ -4,6 +4,7 @@
icon_state = "cultblade"
item_state = "cultblade"
flags = CONDUCT
sharpness = IS_SHARP
w_class = 4
force = 30
throwforce = 10
@@ -31,6 +32,21 @@
user << "<span class='warning'>An overwhelming sense of nausea overpowers you!</span>"
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
embed_chance = 75
/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(50)
/obj/item/clothing/head/culthood
name = "ancient cultist hood"
@@ -108,3 +124,52 @@
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/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
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.large_shell_summoned)
user << "<span class='cult'>Another Acolyte has already summoned Her shell. You must go forth and contact them.</span>"
return
if(cult.attempts_left <= 0)
user << "<span class='cultlarge'>The Geometer is no longer interested in you.</span>"
new /obj/structure/constructshell/large(get_turf(src))
cult.large_shell_summoned = 1
+145 -1
View File
@@ -1,3 +1,148 @@
/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
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
black_overlay = image('icons/obj/cult_large.dmi', "shell_narsie_black")
/obj/structure/constructshell/large/Destroy()
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")
if(ticker.mode.name == "cult")
var/datum/game_mode/cult/cult = ticker.mode
cult.large_shell_summoned = 0
black_overlay = null
if(timer_id)
deltimer(timer_id)
..()
/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
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
animate(black_overlay, alpha = 255, 5, -1)
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
/obj/structure/cult
density = 1
anchored = 1
@@ -8,7 +153,6 @@
desc = "A bloodstained altar dedicated to Nar-Sie"
icon_state = "talismanaltar"
/obj/structure/cult/forge
name = "daemon forge"
desc = "A forge used in crafting the unholy weapons used by the armies of Nar-Sie"
+28 -88
View File
@@ -1,9 +1,6 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
/*
This file contains the arcane tome files as well as innate cultist emergency communications.
It also contains rune words, which are soon to be removed.
*/
@@ -12,7 +9,7 @@ It also contains rune words, which are soon to be removed.
/mob/living/proc/cult_innate_comm()
set category = "Cultist"
set name = "Imperfect Communion"
set name = "Communion"
if(!iscultist(usr)) //they shouldn't have this verb, but just to be sure...
return
@@ -24,24 +21,7 @@ It also contains rune words, which are soon to be removed.
if(!input) // TO-DO: Add some kind of filter to corrupt the inputted text
return
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)
cultist_commune(usr, 0, input)
return
@@ -52,6 +32,13 @@ It also contains rune words, which are soon to be removed.
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)
..()
@@ -92,47 +79,20 @@ It also contains rune words, which are soon to be removed.
open_tome(user)
/obj/item/weapon/tome/proc/open_tome(mob/user)
var/choice = alert(user,"You open the tome...",,"Commune","Scribe Rune","Read Tome")
var/choice = alert(user,"You open the tome...",,"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. 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). 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>"/*In order to write a rune, you must know the combination of words required for the rune. These words are in the tongue of the Geometer and must be written as such. \
A rune will always have a specific combination, and the combination for runes may be revealed by perfomring actions such as conversion or sacrifice. Once a rune has been written, any cultists can \
examine it to find out its \"grammar\", or the words required to scribe it. To scribe the rune, the words must be entered in lowercase and separated by exactly one space. For instance, to draw a \
Rite of Enlightenment, one would enter the sentence \"certum nahlizet ego\", which means \"join blood self\". You may guess at combinations or perform actions to discover them.<br><br>A full list of \
the Words of Power as well as their meanings in plain English are listed below, although a more complete archive may be accessed at a research desk.<br><br>\
<b>The Words of Power</b><br>\
\"ire\" is Travel<br>\
\"ego\" is Self<br>\
\"nahlizet\" is Blood<br>\
\"certum\" is Join<br>\
\"veri\" is Hell<br>\
\"jatkaa\" is Other<br>\
\"mgar\" is Destroy<br>\
\"balaq\" is Technology<br>\
\"karazet\" is See<br>\
\"geeri\" is Hide<br><br>\
<b>A few basic runes</b><br>\
<i>Rite of Translocation:</i> \"ire ego\"<br>\
<i>Rite of Enlightenment:</i> \"certum nahlizet ego\"<br>\
<i>Rite of Tribute:</i> \"veri nahlizet certum\"<br>\
<i>Rite of Knowledge:</i> \"karazet nahlizet ego\"<br>\
<br><br><br>"*/
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>"
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 \
@@ -141,13 +101,6 @@ It also contains rune words, which are soon to be removed.
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>"
@@ -157,14 +110,7 @@ It also contains rune words, which are soon to be removed.
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.<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>"
(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>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>"
@@ -178,14 +124,11 @@ It also contains rune words, which are soon to be removed.
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>Deafen</b></font><br>The Rite of the Unheard Whisper is simple. When invoked, it will cause all non-cultists within a radius of seven tiles to become \
completely deaf for a large amount of time.<br><br>"
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>Blind</b></font><br>Much like the Rite of the Unheard Whisper, the Rite of the Unseen Glance serves a single purpose. Any non-cultists who can see \
the rune will instantly be blinded for a substantial 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, using it in conjuction with the Rite of Binding makes it much more useful. \
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>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>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>"
@@ -204,15 +147,18 @@ It also contains rune words, which are soon to be removed.
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>"
text += "<font color='red'><b>Manifest Spirit</b></font><br>If you wish to bring a spirit back from the dead with a wish for vengeance and desire to serve, the Rite of Spectral \
Manifestation can do just that. When invoked, any spirits above the rune will be brought to life as a human wearing nothing that seeks only to serve you and the Geometer. 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, 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>"
@@ -220,17 +166,11 @@ It also contains rune words, which are soon to be removed.
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>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>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 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 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 rendering them incapable of speech. Robotic lifeforms will suffer the effects of a heavy electromagnetic pulse instead."
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>"
var/datum/browser/popup = new(user, "tome", "", 800, 600)
popup.set_content(text)
@@ -242,10 +182,10 @@ It also contains rune words, which are soon to be removed.
var/rune_to_scribe
var/entered_rune_name
var/list/possible_runes = list()
for(var/T in subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed)
for(var/T in known_runes)
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
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
if(!possible_runes.len)
return
entered_rune_name = input(user, "Choose a rite to scribe.", "Sigils of Power") as null|anything in possible_runes
+108 -253
View File
@@ -1,6 +1,3 @@
var/list/sacrificed = list()
var/list/non_revealed_runes = (subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed)
/*
This file contains runes.
@@ -9,18 +6,7 @@ They are drawn with an arcane tome in blood, and are distinguishable to cultists
Fake runes can be drawn in crayon to fool people.
Runes can either be invoked by one's self or with many different cultists. Each rune has a specific incantation that the cultists will say when invoking it.
To draw a rune, use an arcane tome and enter the words required. These words are in the tongue of the Geometer and must be entered as such.
Word definitions:
"ire" is Travel
"ego" is Self
"nahlizet" is Blood
"certum" is Join
"veri" is Hell
"jatkaa" is Other
"mgar" is Destroy
"balaq" is Technology
"karazet" is See
"geeri" is Hide
To draw a rune, use an arcane tome.
*/
@@ -38,7 +24,6 @@ Word definitions:
mouse_opacity = 2
var/invocation = "Aiy ele-mayo!" //This is said by cultists when the rune is invoked.
var/grammar //This is only framework at the moment, but may be required to draw runes in the future
var/req_cultists = 1 //The amount of cultists required around the rune to invoke it. If only 1, any cultist can invoke it.
var/rune_in_use = 0 // Used for some runes, this is for when you want a rune to not be usable when in use.
@@ -55,7 +40,6 @@ Word definitions:
if(iscultist(user) || user.stat == DEAD) //If they're a cultist or a ghost, tell them the effects
user << "<b>Name:</b> [cultist_name]"
user << "<b>Effects:</b> [cultist_desc]"
//user << "<b>Words:</b> [grammar]"
user << "<b>Required Acolytes:</b> [req_cultists]"
if(req_keyword && keyword)
user << "<b>Keyword:</b> [keyword]"
@@ -77,6 +61,9 @@ Word definitions:
return
if(can_invoke(user))
invoke(user)
var/oldtransform = transform
animate(src, transform = matrix()*2, alpha = 0, time = 5) //fade out
animate(transform = oldtransform, alpha = 255, time = 0)
else
fail_invoke(user)
@@ -151,7 +138,6 @@ structure_check() searches for nearby cultist structures required for the invoca
cultist_name = "malformed rune"
cultist_desc = "A senseless rune written in gibberish. No good can come from invoking this."
invocation = "Ra'sha yoka!"
grammar = "N/A"
/obj/effect/rune/malformed/New()
..()
@@ -177,7 +163,6 @@ var/list/teleport_runes = list()
invocation = "Sas'so c'arta forbici!"
icon_state = "2"
color = rgb(0, 0, 255)
grammar = "ire ego"
req_keyword = 1
/obj/effect/rune/teleport/New()
@@ -216,7 +201,6 @@ var/list/teleport_other_runes = list()
invocation = "Sas'so c'arta forbica!"
icon_state = "1"
color = rgb(200, 0, 0)
grammar = "ire jatkaa"
req_keyword = 1
/obj/effect/rune/teleport_other/New()
@@ -264,62 +248,6 @@ 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)
grammar = "karazet nahlizet ego"
/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)
grammar = "certum nahlizet ego"
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"
@@ -327,7 +255,6 @@ var/list/teleport_other_runes = list()
icon_state = "3"
invocation = "Barhah hra zar'garis!"
color = rgb(255, 255, 255)
grammar = "veri nahlizet certum"
rune_in_use = 0
/obj/effect/rune/sacrifice/New()
@@ -357,13 +284,13 @@ var/list/teleport_other_runes = list()
fail_invoke()
rune_in_use = 0
return
if(((ishuman(offering) || isrobot(offering)) && offering.stat != DEAD) || is_sacrifice_target(offering.mind)) //Requires three people to sacrifice living targets or the round's target
if(((ishuman(offering) || isrobot(offering)) && offering.stat != DEAD)) //Requires two people to sacrifice living targets
var/cultists_nearby = 1
for(var/mob/living/M in orange(1,src))
for(var/mob/living/M in range(1,src))
if(iscultist(M) && M != user)
cultists_nearby++
M.say(invocation)
if(cultists_nearby < 3)
if(cultists_nearby < 2)
user << "<span class='cultitalic'>[offering] is too greatly linked to the world! You need more acolytes!</span>"
fail_invoke()
log_game("Sacrifice rune failed - not enough acolytes and target is living")
@@ -376,29 +303,17 @@ 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(sacrifice_fulfilled)
M << "<span class='cultlarge'>\"Yes! This is the one I desire! You have done well.\"</span>"
if(ishuman(T) || isrobot(T))
M << "<span class='cultlarge'>\"I accept this sacrifice.\"</span>"
else
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>"
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
@@ -417,65 +332,6 @@ var/list/teleport_other_runes = list()
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
grammar = "veri certum ego"
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 range(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>Rip... <span class='big'>Rrrip...</span> <span class='reallybig'>RRRRRRRRRR--</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
//Rite of Resurrection: Requires two corpses. Revives one and gibs the other.
/obj/effect/rune/raise_dead
cultist_name = "Raise Dead"
@@ -483,7 +339,6 @@ var/list/teleport_other_runes = list()
invocation = null //Depends on the name of the user - see below
icon_state = "1"
color = rgb(255, 0, 0)
grammar = "nahlizet certum veri"
/obj/effect/rune/raise_dead/invoke(mob/living/user)
var/turf/T = get_turf(src)
@@ -540,9 +395,9 @@ var/list/teleport_other_runes = list()
mob_to_sacrifice.visible_message("<span class='warning'><b>[mob_to_sacrifice]'s body rises into the air, connected to [mob_to_revive] by a glowing tendril!</span>")
mob_to_revive.Beam(mob_to_sacrifice,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=20)
sleep(20)
if(mob_to_sacrifice) //sighing noise
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>")
if(!mob_to_sacrifice || !in_range(mob_to_sacrifice, src))
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>")
@@ -561,63 +416,27 @@ var/list/teleport_other_runes = list()
M.visible_message("<span class='warning'>[M] twitches.</span>")
//Rite of Obscurity: Turns all runes within a 3-tile radius invisible.
//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 the Reveal Runes rune."
cultist_desc = "Turns nearby runes invisible. They can be revealed by using this rune again."
invocation = "Kla'atu barada nikt'o!"
icon_state = "1"
color = rgb(0,0,255)
grammar = "geeri karazet nahlizet"
/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))
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
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
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)
grammar = "karazet geeri nahlizet"
/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)
grammar = "geeri nahlizet jatkaa"
/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
cultist_name = "Electromagnetic Disruption"
@@ -625,7 +444,6 @@ var/list/teleport_other_runes = list()
invocation = "Ta'gh fara'qha fel d'amar det!"
icon_state = "5"
color = rgb(255, 0, 0)
grammar = "mgar karazet balaq"
/obj/effect/rune/emp/invoke(mob/living/user)
visible_message("<span class='warning'>[src] glows blue for a moment before vanishing.</span>")
@@ -645,7 +463,6 @@ var/list/teleport_other_runes = list()
color = rgb(126, 23, 23)
rune_in_use = 0 //One at a time, please!
var/mob/living/affecting = null
grammar = "veri ire ego"
/obj/effect/rune/astral/examine(mob/user)
..()
@@ -713,7 +530,6 @@ var/list/teleport_other_runes = list()
invocation = "Khari'd! Eske'te tannin!"
icon_state = "1"
color = rgb(255, 0, 0)
grammar = "mgar ire ego"
/obj/effect/rune/wall/examine(mob/user)
..()
@@ -729,73 +545,62 @@ var/list/teleport_other_runes = list()
C.apply_damage(2, BRUTE, pick("l_arm", "r_arm"))
//Rite of the Unheard Whisper: Deafens all non-cultists nearby.
//Rite of the Shadowed Mind: Deafens, blinds and mutes all non-cultists nearby.
/obj/effect/rune/deafen
cultist_name = "Deafen"
cultist_desc = "Causes all non-followers nearby to lose their hearing."
cultist_name = "Debilitate"
cultist_desc = "Causes all non-followers nearby to lose their hearing, sight and voice."
invocation = "Sti kaliedir!"
grammar = "geeri jatkaa karazet"
color = rgb(0, 255, 0)
icon_state = "4"
/obj/effect/rune/deafen/invoke(mob/living/user)
visible_message("<span class='warning'>[src] blurs for a moment before fading away.</span>")
for(var/mob/living/carbon/C in range(7,src))
if(!iscultist(C) && !C.null_rod_check())
C << "<span class='warning'>The world around you goes quiet.</span>"
C.adjustEarDamage(0,50)
qdel(src)
//Rite of the Unseen Glance: Blinds all non-cultists nearby.
/obj/effect/rune/blind
cultist_name = "Blind"
cultist_desc = "Causes all non-followers nearby to lose their sight."
invocation = "Sti kaliesin!"
icon_state = "4"
color = rgb(0, 0, 255)
grammar = "mgar jatkaa karazet"
/obj/effect/rune/blind/invoke(mob/living/user)
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='cultitalic'><b>You can't see!</b></span>"
C << "<span class='cultlarge'>You feel oily shadows cover your senses.</span>"
C.adjustEarDamage(0,50)
C.flash_eyes(1, 1)
C.eye_blurry += 50
C.eye_blind += 20
C.silent += 10
qdel(src)
//Rite of Disorientation: Stuns all non-cultists nearby for a brief time
//Rite of Disorientation: Stuns and mutes all non-cultists nearby for a brief time
/obj/effect/rune/stun
cultist_name = "Stun"
cultist_desc = "Stuns all nearby non-followers for a brief time."
cultist_desc = "Stuns and mutes all nearby non-followers for a brief time."
invocation = "Fuu ma'jin!"
icon_state = "2"
color = rgb(100, 0, 100)
grammar = "certum geeri balaq"
/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))
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)
stun_he(M)
qdel(src)
/obj/effect/rune/stun/Crossed(atom/movable/AM)
..()
if(isliving(AM))
stun_he(AM)
//Rite of Joined Souls: Summons a single cultist. Requires 2 cultists.
/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)
grammar = "certum jatkaa ego"
/obj/effect/rune/summon/invoke(mob/living/user)
var/list/cultists = list()
@@ -817,9 +622,7 @@ var/list/teleport_other_runes = list()
cultist_to_summon.visible_message("<span class='warning'>[cultist_to_summon] suddenly disappears in a flash of red light!</span>", \
"<span class='cultitalic'><b>Overwhelming vertigo consumes you as you are hurled through the air!</b></span>")
visible_message("<span class='warning'>A foggy shape materializes atop [src] and solidifes into [cultist_to_summon]!</span>")
for(var/mob/living/carbon/C in orange(1,src))
if(iscultist(C))
C.apply_damage(10, BRUTE, "head")
user.apply_damage(10, BRUTE, "head")
cultist_to_summon.loc = get_turf(src)
qdel(src)
@@ -831,7 +634,6 @@ var/list/teleport_other_runes = list()
invocation = null //no talisman made, no invocation.
icon_state = "3"
color = rgb(0, 0, 255)
grammar = "veri balaq certum"
/obj/effect/rune/imbue/invoke(mob/living/user)
var/turf/T = get_turf(src)
@@ -881,7 +683,6 @@ var/list/teleport_other_runes = list()
invocation = null //see below; doesn't say the invocation unless there's enough sheets.
icon_state = "5"
color = rgb(150, 150, 150)
grammar = "ire veri balaq"
/obj/effect/rune/construct_shell/invoke(mob/living/user)
var/turf/T = get_turf(src)
@@ -911,7 +712,6 @@ var/list/teleport_other_runes = list()
invocation = "N'ath reth sh'yro eth draggathnor!"
icon_state = "4"
color = rgb(255, 0, 0)
grammar = "veri mgar jatkaa"
/obj/effect/rune/armor/invoke(mob/living/user)
visible_message("<span class='warning'>With the sound of clanging metal, [src] crumbles to dust!</span>")
@@ -930,7 +730,6 @@ var/list/teleport_other_runes = list()
invocation = null //see below; doesn't say the invocation if it has no targets.
icon_state = "2"
color = rgb(255, 0, 0)
grammar = "ire nahlizet ego"
/obj/effect/rune/leeching/invoke(mob/living/user)
var/turf/T = get_turf(src)
@@ -961,8 +760,7 @@ var/list/teleport_other_runes = list()
invocation = "Dedo ol'btoh!"
icon_state = "4"
color = rgb(255, 0, 0)
req_cultists = 3
grammar = "mgar karazet nahlizet"
req_cultists = 2
/obj/effect/rune/blood_boil/invoke(mob/living/user)
visible_message("<span class='warning'>[src] briefly bubbles before exploding!</span>")
@@ -973,7 +771,7 @@ var/list/teleport_other_runes = list()
continue
C << "<span class='cultlarge'>Your blood boils in your veins!</span>"
C.take_overall_damage(51,51)
for(var/mob/living/carbon/M in orange(1,src))
for(var/mob/living/carbon/M in range(1,src))
if(iscultist(M))
M.apply_damage(15, BRUTE, pick("l_arm", "r_arm"))
M << "<span class='cultitalic'>[src] saps your strength!</span>"
@@ -981,6 +779,27 @@ 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"
@@ -988,7 +807,6 @@ var/list/teleport_other_runes = list()
invocation = "Gal'h'rfikk harfrandid mud'gib!" //how the fuck do you pronounce this
icon_state = "6"
color = rgb(255, 0, 0)
grammar = "nahlizet karazet ire"
/obj/effect/rune/manifest/invoke(mob/living/user)
if(!(user in get_turf(src)))
@@ -1027,3 +845,40 @@ var/list/teleport_other_runes = list()
for(var/obj/I in new_human)
new_human.unEquip(I)
new_human.dust()
//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."
invocation = "T'ak ot'marzah oahr'du!"
icon_state = "2"
color = rgb(0, 0, 255)
req_cultists = 2
/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>")
new /obj/effect/timestop/cult(get_turf(src))
for(var/mob/living/carbon/M in range(1,src))
if(iscultist(M))
M.apply_damage(20, BRUTE, "chest")
M << "<span class='cultitalic'>[src] temporarily stops your heart from beating!</span>"
qdel(src)
/obj/effect/timestop/cult
name = "Dimensional Corruption"
desc = "Something not from this world has corrupted the spacetime continuum in this exact spot."
icon = 'icons/effects/96x96.dmi'
icon_state = "rune_large"
pixel_x = -32
pixel_y = -32
duration = 50
alpha = 0
color = rgb(255, 0, 0)
/obj/effect/timestop/cult/timestop()
animate(src, alpha = 255, time = 5, loop = -1)
SpinAnimation(speed = 5)
for(var/mob/living/M in player_list)
if(iscultist(M) || M.null_rod_check())
immune |= M
..()
+58 -131
View File
@@ -26,8 +26,8 @@ Rite of Disorientation
user << "<b>Name:</b> [cultist_name]"
user << "<b>Effect:</b> [cultist_desc]"
user << "<b>Uses Remaining:</b> [uses]"
return
..()
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/attack_self(mob/living/user)
if(!iscultist(user))
@@ -70,12 +70,11 @@ 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.<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=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=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)
@@ -85,46 +84,37 @@ Rite of Disorientation
return 1
/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"])
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)
if(!src || usr.stat || usr.restrained() || !in_range(src, usr))
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
@@ -162,65 +152,24 @@ Rite of Disorientation
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>")
//Rite of Obscurity: Same as rune, but less range
//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."
cultist_desc = "A talisman that will make all runes within a small radius invisible, or make invisible runes visible again."
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,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 isit!"
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."
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
//Rite of Disruption: Same as rune
@@ -236,42 +185,20 @@ Rite of Disorientation
empulse(src, 4, 8)
//Rite of Disorientation: Stuns and mutes 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 mute a single target. To use, attack target directly."
invocation = "Fuu ma'jin!"
health_cost = 10 //A lot of health because of how powerful this is
//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/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 null rod absorbs the talisman's light!</span>", \
"<span class='userdanger'>Your null rod 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 += 10
user.drop_item()
qdel(src)
return
..()
/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 Arming: Equips cultist armor on the user, where available
+6 -9
View File
@@ -28,9 +28,12 @@
if(!istype(M, /mob/living/carbon/human))//If target is not a human.
return ..()
if(istype(M, /mob/living/carbon/human/dummy))
return..()
return ..()
add_logs(user, M, "captured [M.name]'s soul", src)
if(iscultist(user) && M && M.mind)
new /obj/item/summoning_orb(get_turf(M))
transfer_soul("VICTIM", M, user)
return
@@ -104,7 +107,7 @@
/obj/item/device/soulstone/proc/transfer_soul(choice as text, target, mob/user).
switch(choice)
if("FORCE")
if(!iscarbon(target)) //TO-DO: Add sacrifice stoning for non-organics, just because you have no body doesnt mean you dont have a soul
if(!iscarbon(target)) //TODO: Add sacrifice stoning for non-organics, just because you have no body doesnt mean you dont have a soul
return 0
if(contents.len)
return 0
@@ -120,12 +123,6 @@
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
@@ -200,7 +197,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 complete their goals at all costs.</B>"
newstruct << "<B>You are still bound to serve the cult, follow their orders and help them summon the Geometer 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()
@@ -146,17 +146,10 @@ var/global/list/bibleitemstates = list("bible", "koran", "scrapbook", "bible", "
user.Paralyse(20)
return
// if(..() == BLOCKED)
// return
if (M.stat !=2)
if(M.mind && (M.mind.assigned_role == "Chaplain"))
user << "<span class='warning'>You can't heal yourself!</span>"
return
/*if((M.mind in ticker.mode.cult) && (prob(20)))
M << "\red The power of [src.deity_name] clears your mind of heresy!"
user << "\red You see how [M]'s eyes become clear, the cult no longer holds control over him!"
ticker.mode.remove_cultist(M.mind)*/
if ((istype(M, /mob/living/carbon/human) && prob(60)))
bless(M)
if(ishuman(M))
-91
View File
@@ -310,97 +310,6 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
else
alert("Invalid mob")
/*
/client/proc/cmd_admin_monkeyize(var/mob/M in world)
set category = "Fun"
set name = "Make Monkey"
if(!ticker)
alert("Wait until the game starts")
return
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/target = M
log_admin("[key_name(src)] is attempting to monkeyize [M.key].")
spawn(10)
target.monkeyize()
else
alert("Invalid mob")
/client/proc/cmd_admin_changelinginize(var/mob/M in world)
set category = "Fun"
set name = "Make Changeling"
if(!ticker)
alert("Wait until the game starts")
return
if(istype(M, /mob/living/carbon/human))
log_admin("[key_name(src)] has made [M.key] a changeling.")
spawn(10)
M.absorbed_dna[M.real_name] = M.dna
M.make_changeling()
if(M.mind)
M.mind.special_role = "Changeling"
else
alert("Invalid mob")
*/
/*
/client/proc/cmd_admin_abominize(var/mob/M in world)
set category = null
set name = "Make Abomination"
usr << "Ruby Mode disabled. Command aborted."
return
if(!ticker)
alert("Wait until the game starts.")
return
if(istype(M, /mob/living/carbon/human))
log_admin("[key_name(src)] has made [M.key] an abomination.")
// spawn(10)
// M.make_abomination()
*/
/*
/client/proc/make_cultist(var/mob/M in world)
set category = "Fun"
set name = "Make Cultist"
set desc = "Makes target a cultist"
if(!wordtravel)
runerandom()
if(M)
if(M.mind in ticker.mode.cult)
return
else
if(alert("Spawn that person a tome?",,"Yes","No")=="Yes")
M << "\red 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. A tome, a message from your new master, appears on the ground."
new /obj/item/weapon/tome(M.loc)
else
M << "\red 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."
var/glimpse=pick("1","2","3","4","5","6","7","8")
switch(glimpse)
if("1")
M << "\red You remembered one thing from the glimpse... [wordtravel] is travel..."
if("2")
M << "\red You remembered one thing from the glimpse... [wordblood] is blood..."
if("3")
M << "\red You remembered one thing from the glimpse... [wordjoin] is join..."
if("4")
M << "\red You remembered one thing from the glimpse... [wordhell] is Hell..."
if("5")
M << "\red You remembered one thing from the glimpse... [worddestr] is destroy..."
if("6")
M << "\red You remembered one thing from the glimpse... [wordtech] is technology..."
if("7")
M << "\red You remembered one thing from the glimpse... [wordself] is self..."
if("8")
M << "\red You remembered one thing from the glimpse... [wordsee] is see..."
if(M.mind)
M.mind.special_role = "Cultist"
ticker.mode.cult += M.mind
src << "Made [M] a cultist."
*/
var/list/TYPES_SHORTCUTS = list(
/obj/effect/decal/cleanable = "CLEANABLE",
/obj/item/device/radio/headset = "HEADSET",
+1 -2
View File
@@ -194,7 +194,6 @@
/datum/admins/proc/makeCult()
var/datum/game_mode/cult/temp = new
if(config.protect_roles_from_antagonist)
temp.restricted_jobs += temp.protected_jobs
@@ -216,7 +215,7 @@
candidates += applicant
if(candidates.len)
var/numCultists = min(candidates.len, 4)
var/numCultists = min(candidates.len, 5)
for(var/i = 0, i<numCultists, i++)
H = pick(candidates)
+3 -3
View File
@@ -18,12 +18,12 @@ obj/effect/dummy/slaughter/relaymove(mob/user, direction)
spawn(1)
src.canmove = 1
/obj/effect/dummy/slaughter/ex_act(blah)
/obj/effect/dummy/slaughter/ex_act()
return
/obj/effect/dummy/slaughter/bullet_act(blah)
/obj/effect/dummy/slaughter/bullet_act()
return
/obj/effect/dummy/slaughter/singularity_act(blah)
/obj/effect/dummy/slaughter/singularity_act()
return
/obj/effect/dummy/slaughter/Destroy()
@@ -684,9 +684,6 @@
var/see_temp = H.see_invisible
H.see_invisible = invis_sight
if(H.seer)
H.see_invisible = SEE_INVISIBLE_OBSERVER
if(H.glasses)
if(istype(H.glasses, /obj/item/clothing/glasses))
var/obj/item/clothing/glasses/G = H.glasses
-1
View File
@@ -87,7 +87,6 @@
var/obj/item/r_hand = null//Living
var/obj/item/weapon/storage/s_active = null//Carbon
var/seer = 0 //for cult//Carbon, probably Human
var/see_override = 0 //0 for no override, sets see_invisible = see_override in mob life process
var/datum/hud/hud_used = null
-4
View File
@@ -54,10 +54,6 @@
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]")
+1 -1
View File
@@ -61,7 +61,7 @@
return
/obj/singularity/narsie/proc/godsmack(atom/A)
if(istype(A,/obj/))
if(isobj(A))
var/obj/O = A
O.ex_act(1)
if(O) qdel(O)
@@ -246,7 +246,7 @@
/obj/singularity/proc/consume(atom/A)
var/gain = A.singularity_act(current_size)
var/gain = A.singularity_act(current_size, src)
src.energy += gain
if(istype(A, /obj/machinery/power/supermatter_shard) && !consumedSupermatter)
desc = "[initial(desc)] It glows fiercely with inner fire."
@@ -183,13 +183,10 @@
if (!M.stuttering) 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","Egkau'haom'nai en Chaous","Ho Diak'nos tou Ap'iron","R'ge Na'sie","Diabo us Vo'iscum","Si gn'um Co'nu"))
if(data >= 75 && prob(33)) // 30 units, 135 seconds
if (!M.confused) M.confused = 1
M.confused += 3
if(iscultist(M) || (is_handofgod_cultist(M) && !is_handofgod_prophet(M)))
ticker.mode.remove_cultist(M.mind)
if((is_handofgod_cultist(M) && !is_handofgod_prophet(M)))
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
+15
View File
@@ -0,0 +1,15 @@
author: Tkdrg
delete-after: True
changes:
- experiment: "Cult has been overhauled in an attempt to make the gamemode more fun."
- rscdel: "Cult onversion and stunpapers have been removed. So have most cult objectives."
- tweak: "The cult's single objective is now defend and feed a large construct shell in order to summon the Geometer."
- tweak: "The cult must sacrifice souls in order to acquire summoning orbs, which must be inserted inside said shell."
- tweak: "The large construct shell can be procured by using a summoning orb in hand, but it is vulnerable to attack."
- tweak: "Once enough orbs are inserted, the station will go Delta. After three minutes, the cult will have won."
- rscadd: "Cult communications now no longer damage you when done without a tome."
- rscadd: "Cultists now start with a sacrificial dagger, with bleeding effects and high throwing damage."
- rscadd: "Most existing runes were buffed, merged, or removed. A Immolate rune and a Time Stop rune were added. Experiment!"
- experiment: "Each cultist now gets a random set of runes in their tomes. Pool together your knowledge in order to thrive."
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB