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