diff --git a/code/__DEFINES/roguetown.dm b/code/__DEFINES/roguetown.dm
index 85380ceaa1..3e3b56d85a 100644
--- a/code/__DEFINES/roguetown.dm
+++ b/code/__DEFINES/roguetown.dm
@@ -1,9 +1,9 @@
//used in various places
-#define ALL_RACES_LIST list("human", "dwarf", "elf", "tiefling", "aasimar")
+#define ALL_RACES_LIST list("human", "dwarf", "elf", "tiefling", "aasimar")
#define ALL_RACES_LIST_NAMES list("Humen", "Half-Elf", "Dark Elf", "Elf", "Dwarf","Tiefling", "Aasimar")
-#define ALL_PATRON_NAMES_LIST list("Astrata", "Noc", "Xylix", "Eora", "Malum", "Dendor", "Abyssor", "Necra", "Pestra", "Malum", "Ravox")
+#define ALL_CLERIC_PATRONS list(/datum/patron/divine/astrata, /datum/patron/divine/noc, /datum/patron/divine/dendor, /datum/patron/divine/necra, /datum/patron/divine/pestra)
#define PLATEHIT "plate"
#define CHAINHIT "chain"
@@ -42,40 +42,6 @@ GLOBAL_LIST_INIT(wolf_suffixes, list("Fang", "Claw", "Stalker", "Prowler", "Roar
#define FAMILY_PARTIAL 2
#define FAMILY_FULL 3
-#define FAITH_NONE 0
-#define FAITH_PSYDON 1
-#define FAITH_ELF 2
-#define FAITH_DWARF 3
-#define FAITH_SPIDER 4
-#define FAITH_ZIZO 5
-
-/proc/get_faith_name(faith)
- switch(faith)
- if(FAITH_PSYDON)
- return "Father-Son"
- if(FAITH_ELF)
- return "Elfish Pantheon"
- if(FAITH_DWARF)
- return "Dwarfish Paganism"
- if(FAITH_SPIDER)
- return "Spider Queen"
- if(FAITH_ZIZO)
- return "Zizo"
-
-/proc/get_faith_desc(faith)
- switch(faith)
- if(FAITH_PSYDON)
- return "You believe in the Father-Son. Only through His sun SAVIOR PSYDON may you join His golden kingdom in death."
- if(FAITH_ELF)
- return "You believe in the FAERIE PANTHEON, may Brother Courage and Sister Pride protect you from the wrath of the Trickster."
- if(FAITH_DWARF)
- return "By rock, you believe in DWARFISH PAGANISM! Only by respecting the gods of soil and water may you survive this week."
- if(FAITH_SPIDER)
- return "You pledged your faith in the SPIDER QUEEN, a godlike creature who ruled the Under-World before her untimely death."
- if(FAITH_ZIZO)
- return "You are a disgusting slave of ZIZO! Let the scum of creation die in obscene ways as your beautiful evil turns the world dark and miserable."
-
-
GLOBAL_LIST_EMPTY(sunlights)
GLOBAL_LIST_EMPTY(job_respawn_delays)
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 77f138c76e..037721c91a 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -73,10 +73,21 @@
for(var/i in 0 to 20)
GLOB.mouseicons_human += file("icons/effects/mousemice/swang/[i * 5].dmi")
+ // Faiths
+ for(var/path in subtypesof(/datum/faith))
+ var/datum/faith/faith = new path()
+ GLOB.faithlist[path] = faith
+ if(faith.preference_accessible)
+ GLOB.preference_faiths[path] = faith
+
// Patron Gods
- for(var/gods in subtypesof(/datum/patrongods))
- var/datum/patrongods/A = new gods()
- GLOB.patronlist[A] = gods
+ for(var/path in subtypesof(/datum/patron))
+ var/datum/patron/patron = new path()
+ GLOB.patronlist[path] = patron
+ LAZYINITLIST(GLOB.patrons_by_faith[patron.associated_faith])
+ GLOB.patrons_by_faith[patron.associated_faith][path] = patron
+ if(patron.preference_accessible)
+ GLOB.preference_patrons[path] = patron
//creates every subtype of prototype (excluding prototype) and adds it to list L.
//if no list/L is provided, one is created.
diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm
index b8e4da2133..12fff50e1d 100644
--- a/code/controllers/subsystem/job.dm
+++ b/code/controllers/subsystem/job.dm
@@ -127,13 +127,13 @@ SUBSYSTEM_DEF(job)
if(flag && (!(flag in player.client.prefs.be_special)))
JobDebug("FOC flag failed, Player: [player], Flag: [flag], ")
continue
- if(player.mind && job.title in player.mind.restricted_roles)
+ if(player.mind && (job.title in player.mind.restricted_roles))
JobDebug("FOC incompatible with antagonist role, Player: [player]")
continue
- if(!(player.client.prefs.pref_species.name in job.allowed_races))
+ if(length(job.allowed_races) && !(player.client.prefs.pref_species.name in job.allowed_races))
JobDebug("FOC incompatible with species, Player: [player], Job: [job.title], Race: [player.client.prefs.pref_species.name]")
continue
- if(!(player.client.prefs.selected_patron.name in job.allowed_patrons))
+ if(length(job.allowed_patrons) && !(player.client.prefs.selected_patron.type in job.allowed_patrons))
JobDebug("FOC incompatible with patron, Player: [player], Job: [job.title], Race: [player.client.prefs.pref_species.name]")
continue
if(job.plevel_req > player.client.patreonlevel())
@@ -141,10 +141,10 @@ SUBSYSTEM_DEF(job)
continue
if(get_playerquality(player.ckey) < job.min_pq)
continue
- if(!(player.client.prefs.gender in job.allowed_sexes))
+ if(length(job.allowed_sexes) && !(player.client.prefs.gender in job.allowed_sexes))
JobDebug("FOC incompatible with sex, Player: [player], Job: [job.title]")
continue
- if(!(player.client.prefs.age in job.allowed_ages))
+ if(length(job.allowed_ages) && !(player.client.prefs.age in job.allowed_ages))
JobDebug("FOC incompatible with age, Player: [player], Job: [job.title], Age: [player.client.prefs.age]")
continue
if(check_blacklist(player.client.ckey) && !job.bypass_jobban)
@@ -200,11 +200,11 @@ SUBSYSTEM_DEF(job)
JobDebug("GRJ incompatible with antagonist role, Player: [player], Job: [job.title]")
continue
- if(!(player.client.prefs.pref_species.name in job.allowed_races))
+ if(length(job.allowed_races) && !(player.client.prefs.pref_species.name in job.allowed_races))
JobDebug("GRJ incompatible with species, Player: [player], Job: [job.title], Race: [player.client.prefs.pref_species.name]")
continue
- if(!(player.client.prefs.selected_patron.name in job.allowed_patrons))
+ if(length(job.allowed_patrons) && !(player.client.prefs.selected_patron.type in job.allowed_patrons))
JobDebug("GRJ incompatible with patron, Player: [player], Job: [job.title], Race: [player.client.prefs.pref_species.name]")
continue
@@ -215,11 +215,11 @@ SUBSYSTEM_DEF(job)
if(get_playerquality(player.ckey) < job.min_pq)
continue
- if(!(player.client.prefs.age in job.allowed_ages))
+ if(length(job.allowed_ages) && !(player.client.prefs.age in job.allowed_ages))
JobDebug("GRJ incompatible with age, Player: [player], Job: [job.title], Race: [player.client.prefs.pref_species.name]")
continue
- if(!(player.client.prefs.gender in job.allowed_sexes))
+ if(length(job.allowed_sexes) && !(player.client.prefs.gender in job.allowed_sexes))
JobDebug("GRJ incompatible with sex, Player: [player], Job: [job.title]")
continue
@@ -439,11 +439,11 @@ SUBSYSTEM_DEF(job)
JobDebug("DO incompatible with antagonist role, Player: [player], Job:[job.title]")
continue
- if(!(player.client.prefs.pref_species.name in job.allowed_races))
+ if(length(job.allowed_races) && !(player.client.prefs.pref_species.name in job.allowed_races))
JobDebug("DO incompatible with species, Player: [player], Job: [job.title], Race: [player.client.prefs.pref_species.name]")
continue
- if(!(player.client.prefs.selected_patron.name in job.allowed_patrons))
+ if(length(job.allowed_patrons) && !(player.client.prefs.selected_patron.type in job.allowed_patrons))
JobDebug("DO incompatible with patron, Player: [player], Job: [job.title], Race: [player.client.prefs.pref_species.name]")
continue
@@ -465,11 +465,11 @@ SUBSYSTEM_DEF(job)
if(job.whitelist_req && (!player.client.whitelisted()))
continue
- if(!(player.client.prefs.age in job.allowed_ages))
+ if(length(job.allowed_ages) && !(player.client.prefs.age in job.allowed_ages))
JobDebug("DO incompatible with age, Player: [player], Job: [job.title]")
continue
- if(!(player.client.prefs.gender in job.allowed_sexes))
+ if(length(job.allowed_sexes) && !(player.client.prefs.gender in job.allowed_sexes))
JobDebug("DO incompatible with gender preference, Player: [player], Job: [job.title]")
continue
@@ -527,10 +527,10 @@ SUBSYSTEM_DEF(job)
if(player.mind && job.title in player.mind.restricted_roles)
continue
- if(!(player.client.prefs.pref_species.name in job.allowed_races))
+ if(length(job.allowed_races) && !(player.client.prefs.pref_species.name in job.allowed_races))
continue
- if(!(player.client.prefs.selected_patron.name in job.allowed_patrons))
+ if(length(job.allowed_patrons) && !(player.client.prefs.selected_patron.type in job.allowed_patrons))
continue
if(job.plevel_req > player.client.patreonlevel())
@@ -549,10 +549,10 @@ SUBSYSTEM_DEF(job)
if(job.whitelist_req && (!player.client.whitelisted()))
continue
- if(!(player.client.prefs.age in job.allowed_ages))
+ if(length(job.allowed_ages) && !(player.client.prefs.age in job.allowed_ages))
continue
- if(!(player.client.prefs.gender in job.allowed_sexes))
+ if(length(job.allowed_sexes) && !(player.client.prefs.gender in job.allowed_sexes))
continue
if(!job.special_job_check(player))
diff --git a/code/controllers/subsystem/rogue/devotion.dm b/code/controllers/subsystem/rogue/devotion.dm
index cf2bad2ee9..ef31bdfe05 100644
--- a/code/controllers/subsystem/rogue/devotion.dm
+++ b/code/controllers/subsystem/rogue/devotion.dm
@@ -30,7 +30,7 @@
return FALSE
/datum/devotion/cleric_holder/proc/update_devotion(dev_amt, prog_amt)
- var/datum/patrongods/P = patron
+ var/datum/patron/P = patron
devotion += dev_amt
//Max devotion limit
if(devotion > max_devotion)
@@ -63,7 +63,7 @@
if(!H || !H.mind)
return
- var/datum/patrongods/A = H.PATRON
+ var/datum/patron/A = H.patron
var/list/spelllist = list(A.t0, A.t1, A.t2, A.t3)
for(var/spell_type in spelllist)
if(!spell_type || H.mind.has_spell(spell_type))
@@ -76,7 +76,7 @@
if(!H || !H.mind)
return
- var/datum/patrongods/A = H.PATRON
+ var/datum/patron/A = H.patron
var/list/spelllist = list(A.t0, A.t1)
for(var/spell_type in spelllist)
if(!spell_type || H.mind.has_spell(spell_type))
@@ -88,7 +88,7 @@
if(!H || !H.mind)
return
- var/datum/patrongods/A = H.PATRON
+ var/datum/patron/A = H.patron
var/list/spelllist = list(/obj/effect/proc_holder/spell/targeted/churn, A.t0)
for(var/spell_type in spelllist)
if(!spell_type || H.mind.has_spell(spell_type))
@@ -123,7 +123,7 @@
var/datum/devotion/cleric_holder/C = src.cleric
var/prayersesh = 0
- visible_message("[src] kneels their head in prayer to the Gods.", "I kneel my head in prayer to [PATRON]")
+ visible_message("[src] kneels their head in prayer to the Gods.", "I kneel my head in prayer to [patron.name]")
for(var/i in 1 to 20)
if(do_after(src, 30))
if(C.devotion >= C.max_devotion)
diff --git a/code/datums/gods/_faith.dm b/code/datums/gods/_faith.dm
new file mode 100644
index 0000000000..e358fade3a
--- /dev/null
+++ b/code/datums/gods/_faith.dm
@@ -0,0 +1,13 @@
+GLOBAL_LIST_EMPTY(faithlist)
+
+GLOBAL_LIST_EMPTY(preference_faiths)
+
+/datum/faith
+ /// Name of the faith
+ var/name
+ /// Description of the faith
+ var/desc = "A faith that believes in the power of reporting this issue on GitHub - You shouldn't be seeing this, someone forgot to set the description for this faith."
+ /// Our "primary" patron god
+ var/datum/patron/godhead = /datum/patron
+ /// Whether or not this faith can be accessed in preferences
+ var/preference_accessible = TRUE
\ No newline at end of file
diff --git a/code/datums/gods/_patron.dm b/code/datums/gods/_patron.dm
new file mode 100644
index 0000000000..b821b85d98
--- /dev/null
+++ b/code/datums/gods/_patron.dm
@@ -0,0 +1,34 @@
+#define CLERIC_SPELLS "Cleric"
+#define PRIEST_SPELLS "Priest"
+
+GLOBAL_LIST_EMPTY(patronlist)
+GLOBAL_LIST_EMPTY(patrons_by_faith)
+GLOBAL_LIST_EMPTY(preference_patrons)
+
+/datum/patron
+ /// Name of the god
+ var/name
+ /// Domain of the god, such as earth, fire, water, murder etc
+ var/domain = "Bad coding practices"
+ /// Description of the god
+ var/desc = "A god that ordains you to report this on GitHub - You shouldn't be seeing this, someone forgot to set the description of this patron."
+ /// String that represents who worships this guy
+ var/worshippers = "Shitty coders"
+ ///String that represents the god's flaws
+ var/flaws = "This spagetti code"
+ ///Strong that represents what this god views as sins
+ var/sins = "Codersocks"
+ /// Faith this god belongs to
+ var/datum/faith/associated_faith = /datum/faith
+ /// Whether or not we are accessible in preferences
+ var/preference_accessible = TRUE
+ /// Some gods have related confessions, if they're evil and such
+ var/list/confess_lines
+ /// Tier 0 spell
+ var/t0
+ /// Tier 1 spell
+ var/t1
+ /// Tier 2 spell
+ var/t2
+ /// Final tier spell
+ var/t3
\ No newline at end of file
diff --git a/code/datums/gods/faiths/atheism.dm b/code/datums/gods/faiths/atheism.dm
new file mode 100644
index 0000000000..889330e491
--- /dev/null
+++ b/code/datums/gods/faiths/atheism.dm
@@ -0,0 +1,5 @@
+/datum/faith/godless
+ name = "Godless" //Redditor religion
+ desc = "Although gods obviously exist in this world, you refuse to bow down to them! You are completely godless."
+ godhead = /datum/patron/godless
+ preference_accessible = FALSE
\ No newline at end of file
diff --git a/code/datums/gods/faiths/divine_pantheon.dm b/code/datums/gods/faiths/divine_pantheon.dm
new file mode 100644
index 0000000000..e11e816266
--- /dev/null
+++ b/code/datums/gods/faiths/divine_pantheon.dm
@@ -0,0 +1,4 @@
+/datum/faith/divine_pantheon
+ name = "Divine Pantheon"
+ desc = "The most accepted religion in Rockhill. May Almighty Psydon and His ten children protect us from Zizo!"
+ godhead = /datum/patron/divine/astrata
\ No newline at end of file
diff --git a/code/datums/gods/faiths/inhumen_pantheon.dm b/code/datums/gods/faiths/inhumen_pantheon.dm
new file mode 100644
index 0000000000..8e1b46c026
--- /dev/null
+++ b/code/datums/gods/faiths/inhumen_pantheon.dm
@@ -0,0 +1,8 @@
+/datum/faith/inhumen_pantheon
+ name = "Inhumen Pantheon"
+ desc = "The nine are FALSE GODS.\n\
+ They keep us trapped in tartarus and choke out our divine light, \
+ but only though FULL BELIEF in the divinity of men and women can we escape and reach the TRUE spiritual realm.\n\
+ The godhead smiles upon us as we defile Psydon and become the divinities we were always meant to be."
+ godhead = /datum/patron/inhumen/zizo
+ preference_accessible = FALSE
\ No newline at end of file
diff --git a/code/datums/gods/patrons/atheism.dm b/code/datums/gods/patrons/atheism.dm
new file mode 100644
index 0000000000..e014027fa9
--- /dev/null
+++ b/code/datums/gods/patrons/atheism.dm
@@ -0,0 +1,12 @@
+/datum/patron/godless
+ name = "Science"
+ domain = "Ontological Reality"
+ desc = "No gods or kings, only man! Gods exist but you give them the finger."
+ worshippers = "Madmen, some dwarves, the occasional mathematician"
+ associated_faith = /datum/faith/godless
+ preference_accessible = FALSE
+ confess_lines = list(
+ "No Gods, No Masters! The faith is FALSE!",
+ "A man chooses, a slave obeys - I will be free from the Gods!",
+ "The old ways WILL CRUMBLE, the gods are UNTRUE!"
+ )
\ No newline at end of file
diff --git a/code/datums/gods/patrons.dm b/code/datums/gods/patrons/divine_pantheon.dm
similarity index 57%
rename from code/datums/gods/patrons.dm
rename to code/datums/gods/patrons/divine_pantheon.dm
index d01caa1b15..20bc86e398 100644
--- a/code/datums/gods/patrons.dm
+++ b/code/datums/gods/patrons/divine_pantheon.dm
@@ -1,113 +1,97 @@
-GLOBAL_LIST_EMPTY(patronlist)
-
-#define CLERIC_SPELLS "Cleric"
-#define PRIEST_SPELLS "Priest"
-
-/datum/patrongods
- var/name
- var/domain
- var/summary
- var/flaws
- var/worshippers
- var/sins
- var/t0
- var/t1
- var/t2
- var/t3
+/datum/patron/divine
+ name = null
+ associated_faith = /datum/faith/divine_pantheon
+ t0 = /obj/effect/proc_holder/spell/invoked/lesser_heal
-/datum/patrongods/astrata
+/datum/patron/divine/astrata
name = "Astrata"
domain = "Goddess of Order, the Sun Queen"
- summary = "The Firstborn of Psydon, twin of Noc, gifted man the Sun as her divine gift."
- flaws= "Tyrannical, Fury, Uncompromising"
+ desc = "The Firstborn of Psydon, twin of Noc, gifted man the Sun as her divine gift."
+ flaws = "Tyrannical, Fury, Uncompromising"
worshippers = "Nobles, Zealots, Commoners"
sins = "Betrayal, Sloth, Witchcraft"
- t0 = /obj/effect/proc_holder/spell/invoked/lesser_heal/
+ t0 = /obj/effect/proc_holder/spell/invoked/lesser_heal
t1 = /obj/effect/proc_holder/spell/invoked/sacred_flame_rogue
t2 = /obj/effect/proc_holder/spell/invoked/heal
t3 = /obj/effect/proc_holder/spell/invoked/revive
-/datum/patrongods/noc
+/datum/patron/divine/noc
name = "Noc"
domain = "God of Knowledge, the Moon Prince"
- summary = "The Firstborn of Psydon, twin of Astrala, gifted man divine knowledge."
- flaws= "Resentful, Vindictive, Haughty"
+ desc = "The Firstborn of Psydon, twin of Astrata, gifted man divine knowledge."
+ flaws = "Resentful, Vindictive, Haughty"
worshippers = "Magic Practitioners, Scholars, Scribes"
sins = "Ignorance, Burning books, Carnal desire"
-
// ............ FORCES ..................
-/datum/patrongods/abyssor
+/datum/patron/divine/dendor
+ name = "Dendor"
+ domain = "Force of Nature and Beasts"
+ desc = "The Primordial Son of Psydon, patron of beasts and the wood. Gone mad with time."
+ flaws = "Madness, Rebellious, Disorderly"
+ worshippers = "Druids, Beasts, Madmen"
+ sins = "Deforestation, Overhunting, Disrespecting nature"
+ t0 = /obj/effect/proc_holder/spell/invoked/lesser_heal
+ t1 = /obj/effect/proc_holder/spell/targeted/blesscrop
+ t2 = /obj/effect/proc_holder/spell/targeted/beasttame
+ t3 = null
+
+/datum/patron/divine/abyssor
name = "Abyssor"
domain = "Force of Seas and Storms"
- summary = "The World Whale, one of the three primordial forces."
+ desc = "The World Whale, one of the three primordial forces."
flaws= "Reckless, Stubborn, Destructive"
worshippers = "Men of the Sea and Sky, Horrid sea-creechers"
sins = "Fear, Hubris, Trying to tame water and storms"
-/datum/patrongods/necra /// SUMMARY AND FLASWS AND SINS
+/datum/patron/divine/necra
name = "Necra"
domain = "Force of Death and Decay"
- summary = "By some worshipped as the Undermaiden, death cares little for the living."
- flaws= "Unchanging, Apathetic, Strict"
+ desc = "The Veiled Lady, a feared but respected God who leads the dead."
+ flaws = "Unchanging, Apathetic, Strict"
worshippers = " The Dead, Gravekeepers and Mourners"
sins = "Undeath"
t0 = /obj/effect/proc_holder/spell/invoked/lesser_heal
t1 = /obj/effect/proc_holder/spell/targeted/burialrite
t2 = /obj/effect/proc_holder/spell/targeted/churn
-/datum/patrongods/dendor
- name = "Dendor"
- domain = "Force of Nature and Beasts"
- summary = "The Primordial Son, patron of beasts and the wood. Gone mad with time."
- flaws= "Madness, Rebellious, Disorderly"
- worshippers = "Druids, Beasts, Madmen"
- sins = "Deforestation, Overhunting, Disrespecting nature"
- t0 = /obj/effect/proc_holder/spell/invoked/lesser_heal
- t1 = /obj/effect/proc_holder/spell/targeted/blesscrop
- t2 = /obj/effect/proc_holder/spell/targeted/beasttame
- t3 = null
-
-
// ............ SAINTS ..................
-/datum/patrongods/ravox
+/datum/patron/divine/ravox
name = "Ravox"
domain = "Saint of Warfare, Struggle and Chivalry"
- summary = "The strong-arm of the Pantheon, he watches man from afar."
- flaws= "Careless, Confrontational, Proud"
+ desc = "The strong-arm of the Pantheon, he watches man from afar."
+ flaws = "Careless, Confrontational, Proud"
worshippers = "Warriors, Sellswords & the Ambitious"
sins = "Cowardice, Cruelty, Stagnation"
-/datum/patrongods/xylix
+/datum/patron/divine/xylix
name = "Xylix"
domain = "Saint of Trickery, Freedom and Inspiration"
- summary = "Mortal turned trickster and shadow of the Pantheon."
- flaws= "Annoying, Liar, Deceitful"
+ desc = "Mortal turned trickster and shadow of the Pantheon."
+ flaws = "Annoying, Liar, Deceitful"
worshippers = "Cheats, Artists, the Hopeless"
sins = "Boredom, Predictability, Routine"
-/datum/patrongods/pestra
+/datum/patron/divine/pestra
name = "Pestra"
domain = "Saint of Disease, Alchemy, and Prophecy"
- summary = "A mortal turned saint by her own brew."
- flaws= "Disrespectful, Irresponsible, Drunkard"
+ desc = "A mortal turned saint by her own brew."
+ flaws = "Disrespectful, Irresponsible, Drunkard"
worshippers = "Warlocks, The Sick and Alchemists"
sins = "´Curing´ abnormalities, Refusing to help the misfortunates, Groveling"
-/datum/patrongods/malum
+/datum/patron/divine/malum
name = "Malum"
domain = "Saint of Toil, Value and Craft"
- summary = "Father of the dwarves, master of the craft."
- flaws= "Obsessive, Repetetive, Greedy"
+ desc = "Father of the dwarves, master of the craft."
+ flaws = "Obsessive, Repetetive, Greedy"
worshippers = "Smiths, Miners, Artists."
sins = "Cheating, Shoddy work, Suicide"
-/datum/patrongods/eora
+/datum/patron/divine/eora
name = "Eora"
domain = "Saint of the Love, Life and Beauty"
- summary = "Blind love for all, without a shred of hate in her heart"
+ desc = "Blind love for all, without a shred of hate in her heart"
flaws= "Naive, Compulsive, Ignorant"
worshippers = "Lovers, Harlots, Doting Grandparents"
- sins = "Sadism, Celibacy, Ruining beauty"
-
-
+ sins = "Sadism, Celibacy, Ruining beauty"
\ No newline at end of file
diff --git a/code/datums/gods/patrons/inhumen_pantheon.dm b/code/datums/gods/patrons/inhumen_pantheon.dm
new file mode 100644
index 0000000000..13986a20f0
--- /dev/null
+++ b/code/datums/gods/patrons/inhumen_pantheon.dm
@@ -0,0 +1,47 @@
+/datum/patron/inhumen
+ name = null
+ associated_faith = /datum/faith/inhumen_pantheon
+ confess_lines = list(
+ "PSYDON IS THE DEMIURGE!",
+ "THE NINE ARE WORTHLESS COWARDS!",
+ "THE NINE ARE DECEIVERS!"
+ )
+
+/datum/patron/inhumen/zizo
+ name = "Zizo"
+ domain = "The Eternal Beast of Chaos"
+ desc = "He who shall not be named, the supreme force and true creator of reality!"
+ flaws = "ZIZOZIZOZIZO"
+ worshippers = "Apostates, Anarchists, Psychopaths"
+ sins = "None; Zizo Embraces All"
+ confess_lines = list(
+ "PRAISE ZIZO!",
+ "LONG LIVE ZIZO!",
+ "ZIZO WITH TRIUMPH!",
+ )
+
+/datum/patron/inhumen/graggar
+ name = "Graggar"
+ domain = "God of Murder, Cruelty & Hate"
+ desc = "The Dark Sun, Graggar is the father of Orcs & Goblins and demon prince of Zizo."
+ flaws = "Rage, Hatred, Bloodthirst"
+ worshippers = "Beasts, Murderers, Sadists"
+ sins = "Compassion, Frailty, Servility"
+ confess_lines = list(
+ "GRAGGAR IS THE BEAST I WORSHIP!",
+ "GRAGGAR WILL RAVAGE YOU!",
+ "GRAGGAR BRINGS UNHOLY DESTRUCTION!"
+ )
+
+/datum/patron/inhumen/matthios
+ name = "Matthios"
+ domain = "God of Robbery, Mugging and Redistribution of Wealth"
+ desc = "Man who stole a spark of the divine, becoming a powerful yet shunned Saint. Gifted his lessons of thievery and subversion to his devoted followers."
+ flaws = "Pride, Greed, Arbitrary"
+ worshippers = "Outlaws, Robbers and Downtrodden Peasantry"
+ sins = "Clumsiness, Stupidity, Humility"
+ confess_lines = list(
+ "Matthios steal my pain, and take me away from these HEATHENS!",
+ "Matthios is my true lord, he WILL steal me away from YOU!",
+ "I am a devoted of Matthios, I will sooner martyr than REPENT!",
+ )
\ No newline at end of file
diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm
index 26ad88b45e..ec8edf7b13 100644
--- a/code/game/objects/effects/glowshroom.dm
+++ b/code/game/objects/effects/glowshroom.dm
@@ -31,6 +31,10 @@
if(isliving(mover) && mover.z == z)
// var/throwdir = get_dir(src, mover)
var/mob/living/L = mover
+
+ if(istype(L.patron, /datum/patron/divine/dendor)) //Dendor kneestinger immunity
+ return TRUE
+
if(L.electrocute_act(30, src))
L.consider_ambush()
if(L.throwing)
@@ -44,9 +48,10 @@
if(isliving(AM))
var/mob/living/L = AM
if(L.z == z)
- if(L.electrocute_act(30, src))
- L.emote("painscream")
- L.consider_ambush()
+ if(!(istype(L.patron, /datum/patron/divine/dendor)))
+ if(L.electrocute_act(30, src))
+ L.emote("painscream")
+ L.consider_ambush()
. = ..()
/obj/structure/glowshroom/attackby(obj/item/W, mob/user, params)
diff --git a/code/game/objects/items/rogueitems/petard.dm b/code/game/objects/items/rogueitems/petard.dm
new file mode 100644
index 0000000000..11e736c77d
--- /dev/null
+++ b/code/game/objects/items/rogueitems/petard.dm
@@ -0,0 +1,156 @@
+/obj/item/grenade/petard
+ name = "Petard"
+ desc = "A small metallic cap atop of a wooden box, a fuze running out from the top of the metallic cap."
+ icon_state = "petard0"
+ item_state = "petard"
+ lefthand_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/bombs_righthand.dmi'
+ item_flags = NOBLUDGEON
+ flags_1 = NONE
+ det_time = rand(5, 20)
+ display_timer = FALSE
+ wlength = WLENGTH_NORMAL
+ w_class = WEIGHT_CLASS_BULKY
+ var/atom/target = null
+ var/mutable_appearance/plastic_overlay
+ var/directional = FALSE
+ var/aim_dir = NORTH
+ var/boom_sizes = list(0, 0, 3)
+ var/full_damage_on_mobs = FALSE
+
+/obj/item/grenade/petard/Initialize()
+ . = ..()
+ plastic_overlay = mutable_appearance(icon, "[item_state]2", HIGH_OBJ_LAYER)
+ wires = new /datum/wires/explosive/c4(src)
+
+/obj/item/grenade/c4/Destroy()
+ qdel(wires)
+ wires = null
+ target = null
+ ..()
+
+/obj/item/grenade/c4/attackby(obj/item/I, mob/user, params)
+ if(I.tool_behaviour == TOOL_SCREWDRIVER)
+ to_chat(user, "The wire panel can be accessed without a screwdriver.")
+ else if(is_wire_tool(I))
+ wires.interact(user)
+ else
+ return ..()
+
+/obj/item/grenade/c4/prime()
+ if(QDELETED(src))
+ return
+ var/turf/location
+ if(target)
+ if(!QDELETED(target))
+ location = get_turf(target)
+ target.cut_overlay(plastic_overlay, TRUE)
+ if(!ismob(target) || full_damage_on_mobs)
+ target.ex_act(EXPLODE_HEAVY, target)
+ else
+ location = get_turf(src)
+ if(location)
+ if(directional && target && target.density)
+ var/turf/T = get_step(location, aim_dir)
+ explosion(get_step(T, aim_dir), boom_sizes[1], boom_sizes[2], boom_sizes[3])
+ else
+ explosion(location, boom_sizes[1], boom_sizes[2], boom_sizes[3])
+ qdel(src)
+
+//assembly stuff
+/obj/item/grenade/c4/receive_signal()
+ prime()
+
+/obj/item/grenade/c4/attack_self(mob/user)
+ var/newtime = input(usr, "Please set the timer.", "Timer", 10) as num|null
+
+ if (isnull(newtime))
+ return
+
+ if(user.get_active_held_item() == src)
+ newtime = CLAMP(newtime, 10, 60000)
+ det_time = newtime
+ to_chat(user, "Timer set for [det_time] seconds.")
+
+/obj/item/grenade/c4/afterattack(atom/movable/AM, mob/user, flag)
+ . = ..()
+ aim_dir = get_dir(user,AM)
+ if(!flag)
+ return
+
+ to_chat(user, "I start planting [src]. The timer is set to [det_time]...")
+
+ if(do_after(user, 30, target = AM))
+ if(!user.temporarilyRemoveItemFromInventory(src))
+ return
+ target = AM
+
+ message_admins("[ADMIN_LOOKUPFLW(user)] planted [name] on [target.name] at [ADMIN_VERBOSEJMP(target)] with [det_time] second fuse")
+ log_game("[key_name(user)] planted [name] on [target.name] at [AREACOORD(user)] with a [det_time] second fuse")
+
+ notify_ghosts("[user] has planted \a [src] on [target] with a [det_time] second fuse!", source = target, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Explosive Planted")
+
+ moveToNullspace() //Yep
+
+ if(istype(AM, /obj/item)) //your crappy throwing star can't fly so good with a giant brick of c4 on it.
+ var/obj/item/I = AM
+ I.throw_speed = max(1, (I.throw_speed - 3))
+ I.throw_range = max(1, (I.throw_range - 3))
+ I.embedding = I.embedding.setRating(embed_chance = 0)
+ else if(istype(AM, /mob/living))
+ plastic_overlay.layer = FLOAT_LAYER
+
+ target.add_overlay(plastic_overlay)
+ to_chat(user, "I plant the bomb. Timer counting down from [det_time].")
+ addtimer(CALLBACK(src, PROC_REF(prime)), det_time*10)
+
+/obj/item/grenade/c4/proc/shout_syndicate_crap(mob/M)
+ if(!M)
+ return
+ var/message_say = "FOR NO RAISIN!"
+ if(M.mind)
+ var/datum/mind/UM = M.mind
+ if(UM.has_antag_datum(/datum/antagonist/nukeop) || UM.has_antag_datum(/datum/antagonist/traitor))
+ message_say = "FOR THE SYNDICATE!"
+ else if(UM.has_antag_datum(/datum/antagonist/changeling))
+ message_say = "FOR THE HIVE!"
+ else if(UM.has_antag_datum(/datum/antagonist/cult))
+ message_say = "FOR NAR'SIE!"
+ else if(UM.has_antag_datum(/datum/antagonist/rev))
+ message_say = "VIVA LA REVOLUTION!"
+ else if(UM.has_antag_datum(/datum/antagonist/brother))
+ message_say = "FOR MY BROTHER!"
+ else if(UM.has_antag_datum(/datum/antagonist/ninja))
+ message_say = "FOR THE SPIDER CLAN!"
+ else if(UM.has_antag_datum(/datum/antagonist/fugitive))
+ message_say = "FOR FREEDOM!"
+ else if(UM.has_antag_datum(/datum/antagonist/ashwalker))
+ message_say = "I HAVE NO IDEA WHAT THIS THING DOES!"
+ else if(UM.has_antag_datum(/datum/antagonist/ert))
+ message_say = "FOR NANOTRASEN!"
+ else if(UM.has_antag_datum(/datum/antagonist/pirate))
+ message_say = "FOR ME MATEYS!"
+ else if(UM.has_antag_datum(/datum/antagonist/wizard))
+ message_say = "FOR THE FEDERATION!"
+ M.say(message_say, forced="C4 suicide")
+
+/obj/item/grenade/c4/suicide_act(mob/user)
+ message_admins("[ADMIN_LOOKUPFLW(user)] suicided with [src] at [ADMIN_VERBOSEJMP(user)]")
+ log_game("[key_name(user)] suicided with [src] at [AREACOORD(user)]")
+ user.visible_message("[user] activates [src] and holds it above [user.p_their()] head! It looks like [user.p_theyre()] going out with a bang!")
+ shout_syndicate_crap(user)
+ explosion(user,0,2,0) //Cheap explosion imitation because putting prime() here causes runtimes
+ user.gib(1, 1)
+ qdel(src)
+
+// X4 is an upgraded directional variant of c4 which is relatively safe to be standing next to. And much less safe to be standing on the other side of.
+// C4 is intended to be used for infiltration, and destroying tech. X4 is intended to be used for heavy breaching and tight spaces.
+// Intended to replace C4 for nukeops, and to be a randomdrop in surplus/random traitor purchases.
+
+/obj/item/grenade/c4/x4
+ name = "X-4 charge"
+ desc = ""
+ icon_state = "plasticx40"
+ item_state = "plasticx4"
+ directional = TRUE
+ boom_sizes = list(0, 2, 5)
\ No newline at end of file
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index 1776e51ec9..4b662cbe5f 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -24,6 +24,9 @@
var/font_color = "purple"
var/prayer_type = "PRAYER"
var/deity
+ if(ishuman(src))
+ var/mob/living/carbon/human/human_user = src
+ deity = human_user.patron.name
if(usr.job == "Chaplain")
cross.icon_state = "kingyellow"
font_color = "blue"
diff --git a/code/modules/antagonists/roguetown/villain/assassin.dm b/code/modules/antagonists/roguetown/villain/assassin.dm
index 83669a558f..d9de023169 100644
--- a/code/modules/antagonists/roguetown/villain/assassin.dm
+++ b/code/modules/antagonists/roguetown/villain/assassin.dm
@@ -7,7 +7,12 @@
antag_hud_type = ANTAG_HUD_TRAITOR
antag_hud_name = "villain"
var/special_role = ROLE_VILLAIN
- confess_lines = list("I gave the lady no time to squeal.", "I am down on whores.", "I shant quit ripping them.")
+ confess_lines = list(
+ "I gave them no time to squeal.",
+ "I shant quit ripping them.",
+ "They deserve to be put at my blade.",
+ "Do what thou wilt shall be the whole of the law.",
+ )
/datum/antagonist/villain/on_gain()
owner.special_role = "Maniac"
diff --git a/code/modules/antagonists/roguetown/villain/bandit.dm b/code/modules/antagonists/roguetown/villain/bandit.dm
index b64c735b1e..2b6eb28b04 100644
--- a/code/modules/antagonists/roguetown/villain/bandit.dm
+++ b/code/modules/antagonists/roguetown/villain/bandit.dm
@@ -31,6 +31,7 @@
ADD_TRAIT(H, TRAIT_SEEPRICES, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_VILLAIN, TRAIT_GENERIC)
+ H.patron = GLOB.patronlist[/datum/patron/inhumen/matthios]
/datum/antagonist/bandit/greet()
to_chat(owner.current, "I am a BANDIT!")
diff --git a/code/modules/antagonists/roguetown/villain/peasantrebel.dm b/code/modules/antagonists/roguetown/villain/peasantrebel.dm
index bd42b26fe4..18c4fbac43 100644
--- a/code/modules/antagonists/roguetown/villain/peasantrebel.dm
+++ b/code/modules/antagonists/roguetown/villain/peasantrebel.dm
@@ -8,10 +8,15 @@
job_rank = ROLE_PREBEL
antag_hud_type = ANTAG_HUD_REV
antag_hud_name = "rev"
- var/datum/team/prebels/rev_team
show_in_roundend = FALSE
- confess_lines = list("VIVA!", "DEATH TO THE NOBLES!")
+ confess_lines = list(
+ "VIVA!",
+ "DEATH TO THE NOBLES!",
+ "STICK IT TO THE MAN!",
+ "NO GODS, NO MASTERS!",
+ )
increase_votepwr = FALSE
+ var/datum/team/prebels/rev_team
/datum/antagonist/prebel/examine_friendorfoe(datum/antagonist/examined_datum,mob/examiner,mob/examined)
if(istype(examined_datum, /datum/antagonist/prebel/head))
diff --git a/code/modules/antagonists/roguetown/villain/vampirelord.dm b/code/modules/antagonists/roguetown/villain/vampirelord.dm
index c8677467be..7e5edb35e8 100644
--- a/code/modules/antagonists/roguetown/villain/vampirelord.dm
+++ b/code/modules/antagonists/roguetown/villain/vampirelord.dm
@@ -108,6 +108,7 @@ GLOBAL_LIST_EMPTY(vampire_objects)
H.set_species(/datum/species/elf/snow) //setspecies randomizes body
H.after_creation()
H.equipOutfit(/datum/outfit/job/roguetown/vamplord)
+ H.patron = GLOB.patronlist[/datum/patron/inhumen/zizo]
return TRUE
@@ -775,12 +776,12 @@ GLOBAL_LIST_EMPTY(vampire_objects)
sunstolen = FALSE
priority_announce("The Sun is torn from the sky!", "Terrible Omen", 'sound/misc/astratascream.ogg')
addomen("sunsteal")
- for(var/mob/living/carbon/human/W in GLOB.human_list)
- var/datum/patrongods/patron = W.client.prefs.selected_patron
- if(patron.name == "Astrata")
- if(!W.mind.antag_datums)
- to_chat(W, "You feel the pain of your Patron!")
- W.emote_scream()
+ for(var/mob/living/carbon/human/astrater in GLOB.human_list)
+ if(!istype(astrater.patron, /datum/patron/divine/astrata) || !length(astrater.mind?.antag_datums))
+ continue
+ to_chat(astrater, "You feel the pain of [astrater.patron.name]!")
+ astrater.emote_scream()
+
if(user.mind.special_role == "Vampire Spawn")
to_chat(user, "I don't have the power to use this!")
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index a120c9b55b..31783ee811 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -82,7 +82,8 @@ GLOBAL_LIST_EMPTY(chosen_names)
var/voice_color = "a0a0a0"
var/detail_color = "000"
var/datum/species/pref_species = new /datum/species/human/northern() //Mutant race
- var/datum/patrongods/selected_patron = new /datum/patrongods/astrata()
+ var/datum/patron/selected_patron
+ var/static/datum/patron/default_patron = /datum/patron/divine/astrata
var/list/features = list("mcolor" = "FFF", "ethcolor" = "9c3030", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "ears" = "None", "wings" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs", "moth_wings" = "Plain", "moth_markings" = "None")
var/list/randomise = list(RANDOM_UNDERWEAR = TRUE, RANDOM_UNDERWEAR_COLOR = TRUE, RANDOM_UNDERSHIRT = TRUE, RANDOM_SOCKS = TRUE, RANDOM_BACKPACK = TRUE, RANDOM_JUMPSUIT_STYLE = FALSE, RANDOM_HAIRSTYLE = TRUE, RANDOM_HAIR_COLOR = TRUE, RANDOM_FACIAL_HAIRSTYLE = TRUE, RANDOM_FACIAL_HAIR_COLOR = TRUE, RANDOM_SKIN_TONE = TRUE, RANDOM_EYE_COLOR = TRUE)
var/list/friendlyGenders = list("Male" = "male", "Female" = "female")
@@ -135,7 +136,6 @@ GLOBAL_LIST_EMPTY(chosen_names)
var/datum/charflaw/charflaw
var/family = FAMILY_NONE
- var/faith = FAITH_PSYDON
var/crt = FALSE
@@ -165,6 +165,8 @@ GLOBAL_LIST_EMPTY(chosen_names)
charflaw = pick(GLOB.character_flaws)
charflaw = GLOB.character_flaws[charflaw]
charflaw = new charflaw()
+ if(!selected_patron)
+ selected_patron = GLOB.patronlist[default_patron]
key_bindings = deepCopyList(GLOB.hotkey_keybinding_list_by_key) // give them default keybinds and update their movement keys
C.update_movement_keys()
real_name = pref_species.random_name(gender,1)
@@ -322,8 +324,9 @@ GLOBAL_LIST_EMPTY(chosen_names)
// dat += "Random Name
"
dat += "Flaw: [charflaw]
"
- dat += "Faith: The Divine Pantheon
"
- dat += "Patron: [selected_patron]
"
+ var/datum/faith/selected_faith = GLOB.faithlist[selected_patron?.associated_faith]
+ dat += "Faith: [selected_faith?.name || "FUCK!"]
"
+ dat += "Patron: [selected_patron?.name || "FUCK!"]
"
// dat += "Family: Unknown
" // Disabling until its working
dat += "Dominance: [domhand == 1 ? "Left-handed" : "Right-handed"]
"
@@ -1035,16 +1038,16 @@ GLOBAL_LIST_EMPTY(chosen_names)
if(get_playerquality(user.ckey) < job.min_pq)
HTML += "[used_name] (Min PQ: [job.min_pq])