diff --git a/_maps/map_files/Delta/delta.dmm b/_maps/map_files/Delta/delta.dmm
index c5b876c8c3e..67aa6f37c3a 100644
--- a/_maps/map_files/Delta/delta.dmm
+++ b/_maps/map_files/Delta/delta.dmm
@@ -10705,7 +10705,7 @@
"dXS" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor/plating,/area/medical/surgery1)
"dXT" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small,/obj/structure/closet/crate/freezer,/obj/item/reagent_containers/blood/random,/obj/item/reagent_containers/blood/random,/obj/item/reagent_containers/blood/random,/obj/item/reagent_containers/blood/random,/obj/item/reagent_containers/blood/random,/obj/item/reagent_containers/blood/random,/turf/simulated/floor/plating,/area/medical/surgery1)
"dXU" = (/obj/structure/table/reinforced,/obj/item/storage/firstaid/regular,/obj/item/clothing/gloves/color/latex,/obj/item/clothing/mask/surgical,/obj/machinery/status_display{pixel_y = -32},/turf/simulated/floor/plasteel,/area/medical/surgery1)
-"dXV" = (/obj/structure/table/wood,/obj/item/soulstone/anybody/chaplain,/obj/item/nullrod,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
+"dXV" = (/obj/structure/table/wood,/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
"dXW" = (/obj/machinery/light/small{dir = 4; pixel_y = 8},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1379; master_tag = "arrival_south_airlock"; name = "interior access button"; pixel_x = -24; pixel_y = -24; req_access_txt = "10;13"},/obj/structure/sign/vacuum{pixel_x = -32},/turf/simulated/floor/plasteel,/area/hallway/secondary/exit)
"dXX" = (/turf/space,/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "sw_maint2_airlock"; name = "exterior access button"; pixel_x = 24; pixel_y = 24; req_access_txt = "0"},/turf/simulated/floor/plating/airless/catwalk,/area/space)
"dXY" = (/obj/structure/table/reinforced,/obj/item/reagent_containers/blood/random,/obj/item/reagent_containers/blood/random,/obj/item/reagent_containers/syringe/epinephrine,/obj/item/reagent_containers/syringe,/obj/item/clothing/accessory/stethoscope,/obj/effect/decal/cleanable/dirt,/obj/machinery/status_display{pixel_y = -32},/turf/simulated/floor/plasteel,/area/medical/surgery1)
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index 735d355d864..e76120bfc53 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -2828,7 +2828,7 @@
"bct" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
"bcu" = (/obj/structure/table/wood,/obj/item/pen,/obj/item/reagent_containers/food/drinks/bottle/holywater,/obj/machinery/light{dir = 1; on = 1},/turf/simulated/floor/carpet/black,/area/chapel/office)
"bcv" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel,/area/hallway/secondary/entry)
-"bcw" = (/obj/machinery/alarm{pixel_y = 25},/obj/machinery/camera{c_tag = "Chapel Chaplain's Office"; dir = 2; network = list("SS13")},/obj/structure/table/wood,/obj/item/soulstone/anybody/chaplain,/turf/simulated/floor/carpet/black,/area/chapel/office)
+"bcw" = (/obj/machinery/alarm{pixel_y = 25},/obj/machinery/camera{c_tag = "Chapel Chaplain's Office"; dir = 2; network = list("SS13")},/obj/structure/table/wood,/turf/simulated/floor/carpet/black,/area/chapel/office)
"bcx" = (/turf/simulated/floor/carpet/black,/area/chapel/office)
"bcy" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/grass,/area/hydroponics)
"bcz" = (/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
@@ -2927,7 +2927,7 @@
"beo" = (/obj/structure/chair/office/dark{dir = 8},/turf/simulated/floor/wood,/area/library)
"bep" = (/obj/machinery/newscaster{pixel_x = 30},/turf/simulated/floor/wood,/area/library)
"beq" = (/obj/machinery/ai_status_display{pixel_x = -32; pixel_y = 0; step_size = 0},/turf/simulated/floor/plasteel{icon_state = "grimy"},/area/chapel/office)
-"ber" = (/obj/structure/table/wood,/obj/item/stack/tile/carpet/black{amount = 10},/obj/item/nullrod,/turf/simulated/floor/carpet/black,/area/chapel/office)
+"ber" = (/obj/structure/table/wood,/obj/item/stack/tile/carpet/black{amount = 10},/turf/simulated/floor/carpet/black,/area/chapel/office)
"bes" = (/obj/item/radio/intercom{name = "station intercom (General)"; pixel_y = -28},/turf/simulated/shuttle/floor,/area/shuttle/arrival/station)
"bet" = (/obj/structure/chair{dir = 4},/obj/effect/landmark/start{name = "Chaplain"},/turf/simulated/floor/carpet/black,/area/chapel/office)
"beu" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/carpet/black,/area/chapel/office)
@@ -9164,3 +9164,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
"}
+
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 6f1fb59e8f8..a5093c2a677 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -58,6 +58,12 @@
var/rev_cooldown = 0
+ var/isholy = FALSE // is this person a chaplain or admin role allowed to use bibles
+ var/isblessed = FALSE // is this person blessed by a chaplain?
+ var/canpray = TRUE // is this person allowed to use the PRAY verb? Atheist chaplains lose this
+ var/alignment // for chaplains
+ var/religious_favor = 0 // for prayers
+
// the world.time since the mob has been brigged, or -1 if not at all
var/brigged_since = -1
var/suicided = FALSE
@@ -375,9 +381,9 @@
/** SILICON ***/
if(issilicon(current))
sections["silicon"] = memory_edit_silicon()
- /*
- This prioritizes antags relevant to the current round to make them appear at the top of the panel.
- Traitorchan and traitorvamp are snowflaked in because they have multiple sections.
+ /*
+ This prioritizes antags relevant to the current round to make them appear at the top of the panel.
+ Traitorchan and traitorvamp are snowflaked in because they have multiple sections.
*/
if(ticker.mode.config_tag == "traitorchan")
if(sections["traitor"])
diff --git a/code/datums/spells/chaplain.dm b/code/datums/spells/chaplain.dm
new file mode 100644
index 00000000000..1dc4a7fd934
--- /dev/null
+++ b/code/datums/spells/chaplain.dm
@@ -0,0 +1,184 @@
+
+/obj/effect/proc_holder/spell/targeted/chaplain_bless
+ name = "Bless"
+ desc = "Blesses a single person."
+
+ school = "transmutation"
+ charge_max = 600
+ clothes_req = 0
+ invocation = "none"
+ invocation_type = "none"
+
+ max_targets = 1
+ include_user = 0
+ humans_only = 1
+
+ range = 1
+ cooldown_min = 20
+ action_icon_state = "shield"
+
+
+/obj/effect/proc_holder/spell/targeted/chaplain_bless/cast(list/targets, mob/living/user = usr, distanceoverride)
+
+ if(!istype(user))
+ to_chat(user, "Somehow, you are not a living mob. This should never happen. Report this bug.")
+ return
+
+ if(!user.mind)
+ to_chat(user, "Somehow, you are mindless. This should never happen. Report this bug.")
+ return
+
+ if(!user.mind.isholy)
+ to_chat(user, "Somehow, you are not holy enough to use this ability. This should never happen. Report this bug.")
+ return
+
+ var/mob/living/carbon/human/target = targets[range]
+
+ if(!istype(target))
+ to_chat(user, "No target.")
+ return
+
+ if(!(target in oview(range)) && !distanceoverride)//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it.
+ to_chat(user, "[target] is too far away!")
+ return
+
+ if(!target.mind)
+ to_chat(user, "[target] appears to be catatonic. Your blessing would have no effect.")
+ return
+
+ if(!target.ckey)
+ to_chat(user, "[target] appears to be too out of it to benefit from this.")
+ return
+
+ if(target.stat == DEAD)
+ to_chat(user, "[target] is already dead. There is no point.")
+ return
+
+ if(target.mind.isblessed)
+ to_chat(user, "[target] already has the aura of one who is blessed. Blessing them again would be pointless.")
+ return
+
+ spawn(0) // allows cast to complete even if recipient ignores the prompt
+ if(alert(target, "[user] wants to bless you, in the name of their religion. Accept?","Accept Blessing?","Yes","No") == "Yes") // prevents forced conversions
+ user.visible_message("[user] starts blessing [target] in the name of [ticker.Bible_deity_name].", "You start blessing [target] in the name of [ticker.Bible_deity_name].")
+ if(do_after(user, 100, target = target))
+ user.visible_message("[user] has blessed [target] in the name of [ticker.Bible_deity_name].", "You have blessed [target] in the name of [ticker.Bible_deity_name].")
+ target.mind.isblessed = TRUE
+ user.mind.religious_favor++
+ to_chat(user, "You now have [user.mind.religious_favor] points of favor with your god.")
+
+
+/obj/effect/proc_holder/spell/targeted/chaplain_grantheal
+ name = "Grant Favor"
+ desc = "Bestows the favor of your god on a single creature. Extremely powerful. Can only be applied to one creature at once."
+
+ school = "transmutation"
+ charge_max = 600
+ clothes_req = 0
+ invocation = "none"
+ invocation_type = "none"
+
+ max_targets = 1
+ include_user = 0
+ humans_only = 1
+
+ range = 1
+ cooldown_min = 20
+ action_icon_state = "mech_defense_mode_off"
+ var/datum/mind/favored_mind
+
+
+/obj/effect/proc_holder/spell/targeted/chaplain_grantheal/cast(list/targets, mob/living/user = usr, distanceoverride)
+
+ if(!istype(user))
+ to_chat(user, "Somehow, you are not a living mob. This should never happen. Report this bug.")
+ return
+
+ if(!user.mind)
+ to_chat(user, "Somehow, you are mindless. This should never happen. Report this bug.")
+ return
+
+ if(!user.mind.isholy)
+ to_chat(user, "Somehow, you are not holy enough to use this ability. This should never happen. Report this bug.")
+ return
+
+ var/mob/living/carbon/human/target = targets[range]
+
+ if(!istype(target))
+ to_chat(user, "No target.")
+ return
+
+ if(!(target in oview(range)) && !distanceoverride)//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it.
+ to_chat(user, "[target] is too far away!")
+ return
+
+ if(!target.mind)
+ to_chat(user, "[target] appears to be catatonic. Your blessing would have no effect.")
+ return
+
+ if(!target.ckey)
+ to_chat(user, "[target] appears to be too out of it to benefit from this.")
+ return
+
+ if(target.stat == DEAD)
+ to_chat(user, "[target] is already dead. There is no point.")
+ return
+
+ if(!target.mind.isblessed)
+ to_chat(user, "[target] must be blessed first.")
+ return
+
+ if(istype(favored_mind))
+ for(var/obj/effect/proc_holder/spell/targeted/chaplain_heal/S in favored_mind.spell_list)
+ favored_mind.RemoveSpell(S)
+ to_chat(favored_mind.current, "You are no longer favored by [ticker.Bible_deity_name].")
+ to_chat(user, "You are no longer favoring [favored_mind].")
+ favored_mind = target.mind
+ target.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/chaplain_heal(null))
+ user.visible_message("[user] appeals to [ticker.Bible_deity_name] to grant [target] whatever favor they can!", "You appeal to [ticker.Bible_deity_name] to grant [target] whatever favor they can!")
+
+
+/obj/effect/proc_holder/spell/targeted/chaplain_heal
+ name = "Invoke Favor"
+ desc = ""
+
+ school = "transmutation"
+ charge_max = 1
+ clothes_req = 0
+ invocation = "none"
+ invocation_type = "none"
+
+ max_targets = 1
+ include_user = 1
+ humans_only = 1
+ stat_allowed = TRUE
+
+ range = -1
+ cooldown_min = 20
+ action_icon_state = "mech_defense_mode_off"
+
+/obj/effect/proc_holder/spell/targeted/chaplain_heal/can_cast(mob/user = usr)
+ if(user.stat == DEAD)
+ return FALSE
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if (H.health <= config.health_threshold_softcrit)
+ return TRUE
+ else if(isliving(user))
+ var/mob/living/L = user
+ if(L.health < (L.maxHealth / 2))
+ return TRUE
+ return FALSE
+
+/obj/effect/proc_holder/spell/targeted/chaplain_heal/cast(list/targets, mob/living/user = usr, distanceoverride)
+ user.SetWeakened(0)
+ user.SetStunned(0)
+ user.SetParalysis(0)
+ user.adjustStaminaLoss(-75)
+ user.adjustBruteLoss(-10)
+ user.adjustOxyLoss(-10)
+ user.adjustToxLoss(-10)
+ user.adjustFireLoss(-10)
+ SEND_SOUND(user, 'sound/effects/hallelujah.ogg')
+ to_chat(user, "You feel invigorated!")
+ user.mind.RemoveSpell(src)
\ No newline at end of file
diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm
index 95ff18761d6..28dc6b29a45 100644
--- a/code/game/gamemodes/vampire/vampire_powers.dm
+++ b/code/game/gamemodes/vampire/vampire_powers.dm
@@ -76,8 +76,8 @@
//Vampires who have reached their full potential can affect nearly everything
if(user.mind.vampire.get_ability(/datum/vampire_passive/full))
return 1
- //Chaplains are resistant to vampire powers
- if(target.mind && target.mind.assigned_role == "Chaplain")
+ //Holy characters are resistant to vampire powers
+ if(target.mind && target.mind.isholy)
return 0
return 1
diff --git a/code/game/jobs/job/support_chaplain.dm b/code/game/jobs/job/support_chaplain.dm
index 6b13b78c2bb..25571a599b9 100644
--- a/code/game/jobs/job/support_chaplain.dm
+++ b/code/game/jobs/job/support_chaplain.dm
@@ -1,3 +1,8 @@
+#define ALIGNMENT_GOOD "good"
+#define ALIGNMENT_NEUTRAL "neutral"
+#define ALIGNMENT_EVIL "evil"
+#define ALIGNMENT_GODLESS "godless"
+
//Due to how large this one is it gets its own file
/datum/job/chaplain
title = "Chaplain"
@@ -25,6 +30,7 @@
backpack_contents = list(
/obj/item/camera/spooky = 1
)
+ r_hand = /obj/item/nullrod
/datum/outfit/job/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
. = ..()
@@ -32,13 +38,20 @@
if(visualsOnly)
return
- var/obj/item/storage/bible/B = new /obj/item/storage/bible(H)
+ if(H.mind)
+ H.mind.isholy = TRUE
spawn()
+
+ var/religion_type = input(H,"What type of religion do you have?") in list(ALIGNMENT_GOOD, ALIGNMENT_NEUTRAL, ALIGNMENT_EVIL, ALIGNMENT_GODLESS)
+ if(H.mind)
+ H.mind.alignment = religion_type
+
+ var/obj/item/storage/bible/B = new /obj/item/storage/bible(H)
H.equip_to_slot_or_del(B, slot_l_hand)
var/religion_name = "Christianity"
- var/new_religion = sanitize(copytext(input(H, "You are the crew services officer. Would you like to change your religion? Default is Christianity, in SPACE.", "Name change", religion_name),1,MAX_NAME_LEN))
+ var/new_religion = sanitize(copytext(input(H, "What name do you give your beliefs? Default is Christianity.", "Name change", religion_name),1,MAX_NAME_LEN))
if(!new_religion)
new_religion = religion_name
@@ -72,12 +85,33 @@
feedback_set_details("religion_name","[new_religion]")
var/deity_name = "Space Jesus"
- var/new_deity = sanitize(copytext(input(H, "Would you like to change your deity? Default is Space Jesus.", "Name change", deity_name),1,MAX_NAME_LEN))
+ var/new_deity = sanitize(copytext(input(H, "Who or what do you worship? Default is Space Jesus.", "Name change", deity_name),1,MAX_NAME_LEN))
if((length(new_deity) == 0) || (new_deity == "Space Jesus") )
new_deity = deity_name
B.deity_name = new_deity
+ if(religion_type == ALIGNMENT_GODLESS)
+ // Atheist chaplain. Give mindshield instead of blessing power.
+ var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(H)
+ L.implant(H, null, 1)
+ if(H.mind)
+ H.mind.isholy = FALSE
+ H.mind.canpray = FALSE
+ else
+ // Otherwise, grant the ability to bless people, incrementing their religious_favor and showing up in prayers.
+ H.AddSpell(new /obj/effect/proc_holder/spell/targeted/chaplain_bless(null))
+
+ if(religion_type == ALIGNMENT_GOOD)
+ H.AddSpell(new /obj/effect/proc_holder/spell/targeted/chaplain_grantheal(null))
+ else if(religion_type == ALIGNMENT_NEUTRAL)
+ // neutral: give templar armor
+ H.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/riot/knight/templar(H), slot_in_backpack)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/armor/riot/knight/templar(H), slot_in_backpack)
+ else if(religion_type == ALIGNMENT_EVIL)
+ H.equip_to_slot_or_del(new /obj/item/soulstone/anybody/chaplain(H), slot_in_backpack)
+
+
var/accepted = 0
var/outoftime = 0
spawn(200) // 20 seconds to choose
@@ -165,3 +199,5 @@
ticker.Bible_deity_name = B.deity_name
feedback_set_details("religion_deity","[new_deity]")
feedback_set_details("religion_book","[new_book_style]")
+
+
diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm
index 56205b17997..c8d559a23c6 100644
--- a/code/game/objects/items/weapons/holy_weapons.dm
+++ b/code/game/objects/items/weapons/holy_weapons.dm
@@ -11,6 +11,8 @@
var/reskinned = FALSE
var/reskin_selectable = TRUE //set to FALSE if a subtype is meant to not normally be available as a reskin option (fluff ones will get re-added through their list)
var/list/fluff_transformations = list() //does it have any special transformations only accessible to it? Should only be subtypes of /obj/item/nullrod
+ var/alignment_required
+ var/alignment_prohibited
/obj/item/nullrod/suicide_act(mob/user)
user.visible_message("[user] is killing [user.p_them()]self with \the [src.name]! It looks like [user.p_theyre()] trying to get closer to god!")
@@ -26,9 +28,7 @@
M.mind.vampire.nullified = max(5, M.mind.vampire.nullified + 2)
/obj/item/nullrod/attack_self(mob/user)
- if(reskinned)
- return
- if(user.mind && (user.mind.assigned_role == "Chaplain" || user.mind.special_role == SPECIAL_ROLE_ERT))
+ if(user.mind && (user.mind.isholy) && !reskinned)
reskin_holy_weapon(user)
/obj/item/nullrod/proc/reskin_holy_weapon(mob/M)
@@ -37,6 +37,10 @@
var/obj/item/nullrod/variant = entry
if(!initial(variant.reskin_selectable))
holy_weapons_list -= variant
+ else if(initial(variant.alignment_required) && M.mind.alignment != initial(variant.alignment_required))
+ holy_weapons_list -= variant
+ else if(initial(variant.alignment_prohibited) && M.mind.alignment == initial(variant.alignment_prohibited))
+ holy_weapons_list -= variant
if(fluff_transformations.len)
for(var/thing in fluff_transformations)
holy_weapons_list += thing
@@ -75,6 +79,7 @@
hitsound = 'sound/weapons/sear.ogg'
damtype = BURN
attack_verb = list("punched", "cross countered", "pummeled")
+ alignment_prohibited = ALIGNMENT_GODLESS
/obj/item/nullrod/staff
name = "red holy staff"
@@ -85,6 +90,7 @@
force = 5
slot_flags = SLOT_BACK
block_chance = 50
+ alignment_required = ALIGNMENT_NEUTRAL
/obj/item/nullrod/staff/blue
name = "blue holy staff"
@@ -102,6 +108,7 @@
sharp = 1
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ alignment_prohibited = ALIGNMENT_GODLESS
/obj/item/nullrod/claymore/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type)
if(attack_type == PROJECTILE_ATTACK)
@@ -115,6 +122,7 @@
desc = "Spread the glory of the dark gods!"
slot_flags = SLOT_BELT
hitsound = 'sound/hallucinations/growl1.ogg'
+ alignment_required = ALIGNMENT_EVIL
/obj/item/nullrod/claymore/chainsaw_sword
name = "sacred chainsaw sword"
@@ -124,6 +132,7 @@
slot_flags = SLOT_BELT
attack_verb = list("sawed", "torn", "cut", "chopped", "diced")
hitsound = 'sound/weapons/chainsaw.ogg'
+ alignment_prohibited = ALIGNMENT_GODLESS
/obj/item/nullrod/claymore/glowing
name = "force weapon"
@@ -159,9 +168,10 @@
icon_state = "swordred"
item_state = "swordred"
desc = "Woefully ineffective when used on steep terrain."
+ alignment_required = ALIGNMENT_EVIL
/obj/item/nullrod/claymore/saber/pirate
- name = "nautical energy sword"
+ name = "nautical energy cutlass"
icon_state = "cutlass1"
item_state = "cutlass1"
desc = "Convincing HR that your religion involved piracy was no mean feat."
@@ -176,6 +186,7 @@
throwforce = 1
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ alignment_prohibited = ALIGNMENT_GODLESS
/obj/item/nullrod/scythe
name = "reaper scythe"
@@ -188,6 +199,7 @@
sharp = 1
attack_verb = list("chopped", "sliced", "cut", "reaped")
hitsound = 'sound/weapons/rapierhit.ogg'
+ alignment_required = ALIGNMENT_EVIL
/obj/item/nullrod/scythe/vibro
name = "high frequency blade"
@@ -311,6 +323,7 @@
throw_speed = 4
throw_range = 7
throwforce = 20
+ alignment_required = ALIGNMENT_GODLESS
/obj/item/nullrod/armblade
name = "dark blessing"
@@ -320,6 +333,7 @@
flags = ABSTRACT | NODROP
w_class = WEIGHT_CLASS_HUGE
sharp = 1
+ alignment_required = ALIGNMENT_EVIL
/obj/item/nullrod/carp
name = "carp-sie plushie"
@@ -335,7 +349,7 @@
/obj/item/nullrod/carp/attack_self(mob/living/user)
if(used_blessing)
return
- if(user.mind && (user.mind.assigned_role != "Chaplain" && user.mind.special_role != SPECIAL_ROLE_ERT))
+ if(user.mind && !user.mind.isholy)
return
to_chat(user, "You are blessed by Carp-Sie. Wild space carp will no longer attack you.")
user.faction |= "carp"
@@ -386,6 +400,7 @@
attack_verb = list("poked", "impaled", "pierced", "jabbed")
hitsound = 'sound/weapons/bladeslice.ogg'
sharp = 1
+ alignment_required = ALIGNMENT_EVIL
/obj/item/nullrod/rosary
name = "prayer beads"
@@ -394,6 +409,7 @@
desc = "A set of prayer beads used by many of the more traditional religions in space.
Vampires and other unholy abominations have learned to fear these."
force = 0
throwforce = 0
+ alignment_required = ALIGNMENT_GOOD
var/praying = 0
/obj/item/nullrod/rosary/New()
@@ -489,6 +505,7 @@
icon = 'icons/obj/food/food.dmi'
icon_state = "baguette"
desc = "a staple of worshipers of the Silentfather, this holy mime artifact has an odd effect on clowns."
+ alignment_required = null
/obj/item/nullrod/rosary/bread/process()
if(ishuman(loc))
diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm
index 03787385e1c..16ecd7cc72c 100644
--- a/code/game/objects/items/weapons/storage/bible.dm
+++ b/code/game/objects/items/weapons/storage/bible.dm
@@ -38,10 +38,6 @@
return
/obj/item/storage/bible/attack(mob/living/M as mob, mob/living/user as mob)
- var/chaplain = 0
- if(user.mind && (user.mind.assigned_role == "Chaplain"))
- chaplain = 1
-
add_attack_logs(user, M, "Hit with [src]")
if(!iscarbon(user))
M.LAssailant = null
@@ -51,7 +47,7 @@
if(!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
to_chat(user, "You don't have the dexterity to do this!")
return
- if(!chaplain)
+ if(!user.mind || !user.mind.isholy)
to_chat(user, "The book sizzles in your hands.")
user.take_organ_damage(0,10)
return
@@ -62,14 +58,7 @@
user.Paralyse(20)
return
-// if(..() == BLOCKED)
-// return
-
if(M.stat !=2)
- /*if((M.mind in ticker.mode.cult) && (prob(20)))
- to_chat(M, "The power of [src.deity_name] clears your mind of heresy!")
- to_chat(user, "You see how [M]'s eyes become clear, the cult no longer holds control over [M.p_them()]!")
- ticker.mode.remove_cultist(M.mind)*/
if((istype(M, /mob/living/carbon/human) && prob(60)))
bless(M)
for(var/mob/O in viewers(M, null))
@@ -94,11 +83,11 @@
return
if(istype(A, /turf/simulated/floor))
to_chat(user, "You hit the floor with the bible.")
- if(user.mind && (user.mind.assigned_role == "Chaplain"))
+ if(user.mind && (user.mind.isholy))
for(var/obj/effect/rune/R in A)
if(R.invisibility)
R.talismanreveal()
- if(user.mind && (user.mind.assigned_role == "Chaplain"))
+ if(user.mind && (user.mind.isholy))
if(A.reagents && A.reagents.has_reagent("water")) //blesses all the water in the holder
to_chat(user, "You bless [A].")
var/water2holy = A.reagents.get_reagent_amount("water")
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm b/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm
index 0a44e818264..d72b7efc8be 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/chaplain.dm
@@ -21,8 +21,6 @@
new /obj/item/clothing/suit/holidaypriest(src)
new /obj/item/clothing/under/wedding/bride_white(src)
new /obj/item/storage/backpack/cultpack (src)
- new /obj/item/clothing/head/helmet/riot/knight/templar(src)
- new /obj/item/clothing/suit/armor/riot/knight/templar(src)
new /obj/item/storage/fancy/candle_box/eternal(src)
new /obj/item/storage/fancy/candle_box/eternal(src)
new /obj/item/storage/fancy/candle_box/eternal(src)
diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm
index b92b304fd57..5624d4cdeea 100644
--- a/code/modules/admin/verbs/pray.dm
+++ b/code/modules/admin/verbs/pray.dm
@@ -3,7 +3,8 @@
set name = "Pray"
msg = sanitize(copytext(msg, 1, MAX_MESSAGE_LEN))
- if(!msg) return
+ if(!msg)
+ return
if(usr.client)
if(usr.client.prefs.muted & MUTE_PRAY)
@@ -12,6 +13,10 @@
if(client.handle_spam_prevention(msg, MUTE_PRAY, OOC_COOLDOWN))
return
+ if(mind && !mind.canpray)
+ to_chat(usr, "You cannot pray (atheist).")
+ return
+
var/image/cross = image('icons/obj/storage.dmi',"bible")
var/font_color = "purple"
var/prayer_type = "PRAYER"
@@ -28,8 +33,11 @@
prayer_type = "CULTIST PRAYER"
deity = ticker.cultdat.entity_name
+ var/religious_favor = 0
+ if(mind && mind.religious_favor != 0)
+ religious_favor = mind.religious_favor
log_say("(PRAYER) [msg]", usr)
- msg = "[bicon(cross)][prayer_type][deity ? " (to [deity])" : ""]:[key_name(src, 1)] ([ADMIN_QUE(src,"?")]) ([ADMIN_PP(src,"PP")]) ([ADMIN_VV(src,"VV")]) ([ADMIN_SM(src,"SM")]) ([admin_jump_link(src)]) (CA) ([ADMIN_SC(src,"SC")]) (BLESS) (SMITE): [msg]"
+ msg = "[bicon(cross)][prayer_type][deity ? " (to [deity])" : ""][religious_favor != 0 ? " (favor: [religious_favor])" : ""]: [key_name(src, 1)] ([ADMIN_QUE(src,"?")]) ([ADMIN_PP(src,"PP")]) ([ADMIN_VV(src,"VV")]) ([ADMIN_SM(src,"SM")]) ([admin_jump_link(src)]) (CA) ([ADMIN_SC(src,"SC")]) (BLESS) (SMITE): [msg]"
for(var/client/X in GLOB.admins)
if(check_rights(R_EVENT,0,X.mob))
diff --git a/code/modules/response_team/ert.dm b/code/modules/response_team/ert.dm
index 0c2688cc3f1..e8c91920cb8 100644
--- a/code/modules/response_team/ert.dm
+++ b/code/modules/response_team/ert.dm
@@ -279,6 +279,7 @@ var/ert_request_answered = FALSE
paranormal_slots -= 1
M.equipOutfit(paranormal_outfit)
M.job = "ERT Paranormal"
+ M.mind.isholy = TRUE
if("Commander")
command_slots = 0
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index eedcb52be00..6e630fe7438 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -136,8 +136,8 @@ var/static/regex/multispin_words = regex("like a record baby")
var/power_multiplier = base_multiplier
if(owner.mind)
- //Chaplains are very good at speaking with the voice of god
- if(owner.mind.assigned_role == "Chaplain")
+ //Holy characters are very good at speaking with the voice of god
+ if(owner.mind.isholy)
power_multiplier *= 2
//Command staff has authority
if(owner.mind.assigned_role in command_positions)
diff --git a/sound/effects/hallelujah.ogg b/sound/effects/hallelujah.ogg
new file mode 100644
index 00000000000..f022c1d5939
Binary files /dev/null and b/sound/effects/hallelujah.ogg differ