diff --git a/code/game/gamemodes/handofgod/_handofgod.dm b/code/game/gamemodes/handofgod/_handofgod.dm
index 100f079770d..c18f5246be3 100644
--- a/code/game/gamemodes/handofgod/_handofgod.dm
+++ b/code/game/gamemodes/handofgod/_handofgod.dm
@@ -316,6 +316,18 @@ var/global/list/global_handofgod_structuretypes = list()
return 1
+/mob/camera/god/proc/is_handofgod_myfollowers(A)
+ if(!ishuman(A))
+ return 0
+ var/mob/living/carbon/human/H = A
+ if(!H.mind)
+ return 0
+ if(side == "red")
+ if(H.mind in ticker.mode.red_deity_prophets|ticker.mode.red_deity_followers)
+ return 1
+ else if(side == "blue")
+ if(H.mind in ticker.mode.blue_deity_prophets|ticker.mode.blue_deity_followers)
+ return 1
//////////////////////
//Roundend Reporting//
diff --git a/code/game/gamemodes/handofgod/god.dm b/code/game/gamemodes/handofgod/god.dm
index 55f5a16738f..7dcd5b5f933 100644
--- a/code/game/gamemodes/handofgod/god.dm
+++ b/code/game/gamemodes/handofgod/god.dm
@@ -6,6 +6,7 @@
icon_state = "marker"
invisibility = 60
see_in_dark = 0
+ see_invisible = 55
sight = SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF
languages = HUMAN | MONKEY | ALIEN | ROBOT | SLIME | DRONE | SWARMER
hud_possible = list(ANTAG_HUD)
@@ -22,7 +23,8 @@
var/list/conduits = list()
var/prophets_sacrificed_in_name = 0
var/image/ghostimage = null //For observer with darkness off visiblity
- var/list/prophet_hats = list()
+ var/list/prophets = list()
+ var/datum/action/innate/godspeak/speak2god
/mob/camera/god/New()
..()
@@ -51,10 +53,8 @@
for(var/datum/mind/F in followers)
if(F.current)
F.current << "Your god is DEAD!"
- for(var/X in prophet_hats)
- var/obj/item/clothing/head/helmet/plate/crusader/prophet/P = X
- if(P.speak2god && P.speak2god.god == src)
- qdel(P.speak2god)
+ for(var/X in prophets)
+ speak2god.Remove(X)
ghost_darkness_images -= ghostimage
updateallghostimages()
return ..()
@@ -200,7 +200,7 @@
var/rendered = "Divine Telepathy, [name] [msg]"
for(var/mob/M in mob_list)
- if(is_handofgod_myprophet(M) || isobserver(M))
+ if(is_handofgod_myfollowers(M) || isobserver(M))
M.show_message(rendered, 2)
src << rendered
diff --git a/code/game/gamemodes/handofgod/items.dm b/code/game/gamemodes/handofgod/items.dm
index 010afd2c091..05e99855643 100644
--- a/code/game/gamemodes/handofgod/items.dm
+++ b/code/game/gamemodes/handofgod/items.dm
@@ -137,43 +137,36 @@
armor = list(melee = 60, bullet = 60, laser = 60, energy = 50, bomb = 70, bio = 50, rad = 50) //religion protects you from disease and radiation, honk.
worn_x_dimension = 64
worn_y_dimension = 64
- var/datum/action/innate/godspeak/speak2god
+ var/side = "neither"
-
-/obj/item/clothing/head/helmet/plate/crusader/prophet/proc/assign_deity(mob/camera/god/G)
- if(speak2god)
- if(speak2god.owner)
- speak2god.Remove(speak2god.owner)
- else
- speak2god = new()
- speak2god.god = G
- G.prophet_hats += src
-
-/obj/item/clothing/head/helmet/plate/crusader/prophet/Destroy()
- if(speak2god)
- qdel(speak2god)
- return ..()
-
-/obj/item/clothing/head/helmet/plate/crusader/prophet/equipped(mob/user, slot)
+/obj/item/clothing/head/helmet/plate/crusader/prophet/equipped(mob/living/carbon/user, slot)
+ var/faithful = 0
if(slot == slot_head)
- if(speak2god)
- speak2god.Grant(user)
- user << "You gain the ability to speak to the god this hat belongs to!"
-
-
-/obj/item/clothing/head/helmet/plate/crusader/prophet/dropped(mob/user)
- if(speak2god)
- if(speak2god.owner == user)
- speak2god.Remove(user)
- user << "You lose the ability to speak to the god this hat belongs to!"
-
+ switch(side)
+ if("blue")
+ faithful = is_handofgod_bluecultist(user)
+ if("red")
+ faithful = is_handofgod_redcultist(user)
+ else
+ faithful = 1
+ if(!faithful)
+ user << "Your mind is assaulted by a vast power, furious at your desecration!"
+ user.emote("scream")
+ user.adjustFireLoss(10)
+ user.unEquip(src)
+ user.head = null
+ user.update_inv_head()
+ src.screen_loc = null
+ user.Weaken(1)
/obj/item/clothing/head/helmet/plate/crusader/prophet/red
icon_state = "prophet-red"
+ side = "red"
/obj/item/clothing/head/helmet/plate/crusader/prophet/blue
icon_state = "prophet-blue"
+ side = "blue"
/obj/item/clothing/head/helmet/plate/crusader/prophet/examine(mob/user)
@@ -182,8 +175,7 @@
user << "A brownish, religious-looking hat."
else
user << "A hat bestowed upon a prophet of gods and demigods."
- if(speak2god && speak2god.god)
- user << "This hat belongs to the [speak2god.god.side] god."
+ user << "This hat belongs to the [side] god."
@@ -192,6 +184,8 @@
name = "godstaff"
icon_state = "godstaff-red"
var/mob/camera/god/god = null
+ var/staffcooldown = 0
+ var/staffwait = 30
/obj/item/weapon/godstaff/examine(mob/user)
..()
@@ -201,6 +195,29 @@
user << "A powerful staff capable of changing the allegiance of god/demigod structures."
+
+/obj/item/weapon/godstaff/attack_self(mob/living/carbon/user)
+ if(god && !god.is_handofgod_myprophet(user))
+ user << "YOU ARE NOT THE CHOSEN ONE!"
+ return
+ if(!(istype(user.head, /obj/item/clothing/head/helmet/plate/crusader/prophet)))
+ user << "Your connection to your diety isn't strong enough! You must wear your big hat!"
+ return
+ if(staffcooldown + staffwait > world.time)
+ return
+ user.visible_message("[user] chants deeply and waves their staff")
+ if(do_after(user, 20,1,src))
+ for(var/obj/structure/divine/R in orange(3,user))
+ user.say("Grant us true sight my god!")
+ if(istype(R, /obj/structure/divine/nexus)|| istype(R, /obj/structure/divine/trap))
+ continue
+ R.visible_message("[R] suddenly appears!")
+ R.invisibility = 0
+ R.alpha = initial(R.alpha)
+ R.density = initial(R.density)
+ R.activate()
+ staffcooldown = world.time
+
/obj/item/weapon/godstaff/red
icon_state = "godstaff-red"
diff --git a/code/game/gamemodes/handofgod/powers.dm b/code/game/gamemodes/handofgod/powers.dm
index 7afcc57c12b..41cb3ec1999 100644
--- a/code/game/gamemodes/handofgod/powers.dm
+++ b/code/game/gamemodes/handofgod/powers.dm
@@ -43,9 +43,11 @@
var/datum/mind/enemy
switch(side)
if("red")
- enemy = ticker.mode.blue_deities[1]
+ if(ticker.mode.blue_deities.len)
+ enemy = ticker.mode.blue_deities[1]
if("blue")
- enemy = ticker.mode.red_deities[1]
+ if(ticker.mode.red_deities.len)
+ enemy = ticker.mode.red_deities[1]
if(enemy && is_handofgod_god(enemy.current))
var/mob/camera/god/enemy_god = enemy.current
@@ -117,7 +119,9 @@
if(choice && choice.current && choice.current.stat != DEAD)
src << "You choose [choice.current] as your prophet."
choice.make_Handofgod_prophet(side)
-
+ speak2god = new()
+ speak2god.god = src
+ speak2god.Grant(choice.current)
//Prophet gear
var/mob/living/carbon/human/H = choice.current
@@ -134,10 +138,9 @@
if(popehat)
var/obj/item/clothing/head/helmet/plate/crusader/prophet/P = new popehat()
- P.assign_deity(src)
H.unEquip(H.head)
- H << "A powerful hat has been bestowed upon your head, you will need to wear this to speak with your god..."
+ H << "A powerful hat has been bestowed upon your head, you will need to wear this to utilize your staff fully.."
H.equip_to_slot_or_del(P,slot_head)
if(popestick)
@@ -303,3 +306,53 @@
var/itemtype = item_types[item]
new itemtype (get_turf(src))
+
+
+
+/mob/camera/god/verb/veil_structures()
+ set category = "Deity"
+ set name = "Veil Structures (20)"
+ set desc = "Hide your structures from sight and touch, but prevent yourself from using them."
+
+ if(!ability_cost(20,1,1))
+ return
+
+ src << "You focus your powers and start dragging your influence into the spiritual plane."
+ for(var/mob/M in orange(3,src))//Yes I know this is terrible, but visible message doesnt work for this
+ M << "The air begins to shimmer..."
+ if(do_after(src, 30, 0, src))
+ for(var/obj/structure/divine/R in orange(3,src))
+ if(istype(R, /obj/structure/divine/nexus)|| istype(R, /obj/structure/divine/trap)||(src.side != R.side))
+ continue
+ R.visible_message("[R] fades away.")
+ R.invisibility = 55
+ R.alpha = 100 //To help ghosts distinguish hidden structures
+ R.density = 0
+ R.deactivate()
+ src << "You hide your influence from view"
+ add_faith(-20)
+
+
+/mob/camera/god/verb/reveal_structures()
+ set category = "Deity"
+ set name = "Reveal Structures (20)"
+ set desc = "Make your structures visible again and allow them to be used."
+
+ if(!ability_cost(20,1,1))
+ return
+
+ src << "You focus your powers and start dragging your influence into the material plane."
+ for(var/mob/M in orange(3,src))//Yes I know this is terrible, but visible message doesnt work for this
+ M << "The air begins to shimmer..."
+ if(do_after(src, 40, 0, src))
+ for(var/obj/structure/divine/R in orange(3,src))
+ if(istype(R, /obj/structure/divine/nexus)|| istype(R, /obj/structure/divine/trap)||(src.side != R.side))
+ continue
+ R.visible_message("[R] suddenly appears!")
+ R.invisibility = 0
+ R.alpha = initial(R.alpha)
+ R.density = initial(R.density)
+ R.activate()
+ src << "You bring your influence into view"
+ add_faith(-20)
+
diff --git a/code/game/gamemodes/handofgod/structures.dm b/code/game/gamemodes/handofgod/structures.dm
index 4b79b6bcbbc..3212041eb04 100644
--- a/code/game/gamemodes/handofgod/structures.dm
+++ b/code/game/gamemodes/handofgod/structures.dm
@@ -28,11 +28,18 @@
var/side = "neutral" //"blue" or "red", also used for colouring structures when construction is started by a deity
var/health = 100
var/maxhealth = 100
+ var/deactivated = 0 //Structures being hidden can't be used. Mainly to prevent invisible defense pylons.
var/autocolours = TRUE //do we colour to our side?
/obj/structure/divine/New()
..()
+/obj/structure/divine/proc/deactivate()
+ deactivated = 1
+
+/obj/structure/divine/proc/activate()
+ deactivated = 0
+
/obj/structure/divine/proc/update_icons()
if(autocolours)
@@ -280,6 +287,15 @@
if(deity)
deity.conduits += src
+/obj/structure/divine/conduit/deactivate()
+ ..()
+ if(deity)
+ deity.conduits -= src
+
+/obj/structure/divine/conduit/activate()
+ ..()
+ if(deity)
+ deity.conduits += src
/* //No good sprites, and not enough items to make it viable yet
/obj/structure/divine/forge
@@ -304,6 +320,8 @@
/obj/structure/divine/convertaltar/attack_hand(mob/living/user)
..()
+ if(deactivated)
+ return
var/mob/living/carbon/human/H = locate() in get_turf(src)
if(!is_handofgod_cultist(user))
user << "You try to use it, but unfortunately you don't know any rituals."
@@ -332,6 +350,8 @@
/obj/structure/divine/sacrificealtar/attack_hand(mob/living/user)
..()
+ if(deactivated)
+ return
var/mob/living/L = locate() in get_turf(src)
if(!is_handofgod_cultist(user))
user << "You try to use it, but unfortunately you don't know any rituals."
@@ -397,6 +417,8 @@
cult_only = FALSE
/obj/structure/divine/healingfountain/attack_hand(mob/living/user)
+ if(deactivated)
+ return
if(last_process + time_between_uses > world.time)
user << "The fountain appears to be empty."
return
@@ -434,7 +456,7 @@
/obj/structure/divine/powerpylon/New()
..()
if(deity && deity.god_nexus)
- deity.god_nexus.powerpylons |= src
+ deity.god_nexus.powerpylons += src
/obj/structure/divine/powerpylon/Destroy()
@@ -443,6 +465,16 @@
return ..()
+/obj/structure/divine/powerpylon/deactivate()
+ ..()
+ if(deity)
+ deity.god_nexus.powerpylons -= src
+
+/obj/structure/divine/powerpylon/activate()
+ ..()
+ if(deity)
+ deity.god_nexus.powerpylons += src
+
/obj/structure/divine/defensepylon
name = "defense pylon"
desc = "A pylon which is blessed to withstand many blows, and fire strong bolts at nonbelievers. A god can toggle it."
@@ -478,9 +510,22 @@
/obj/structure/divine/defensepylon/attack_god(mob/camera/god/user)
if(user.side == side)
+ if(deactivated)
+ user << "You need to reveal it first!"
+ return
pylon_gun.on = !pylon_gun.on
icon_state = (pylon_gun.on) ? "defensepylon-[side]" : "defensepylon"
+/obj/structure/divine/defensepylon/deactivate()
+ ..()
+ pylon_gun.on = 0
+ icon_state = (pylon_gun.on) ? "defensepylon-[side]" : "defensepylon"
+
+/obj/structure/divine/defensepylon/activate()
+ ..()
+ pylon_gun.on = 1
+ icon_state = (pylon_gun.on) ? "defensepylon-[side]" : "defensepylon"
+
//This sits inside the defensepylon, to avoid copypasta
/obj/machinery/porta_turret/defensepylon_internal_turret
name = "defense pylon"
diff --git a/code/game/objects/items/weapons/implants/implant_loyality.dm b/code/game/objects/items/weapons/implants/implant_loyality.dm
index acb98761d04..516e7e83739 100644
--- a/code/game/objects/items/weapons/implants/implant_loyality.dm
+++ b/code/game/objects/items/weapons/implants/implant_loyality.dm
@@ -32,9 +32,7 @@
return -1
if(target.mind in ticker.mode.revolutionaries)
ticker.mode.remove_revolutionary(target.mind)
- if(target.mind in ticker.mode.red_deity_followers|ticker.mode.blue_deity_followers)
- ticker.mode.remove_hog_follower(target.mind)
- if((target.mind in ticker.mode.cult) || (target.mind in ticker.mode.blue_deity_prophets|ticker.mode.red_deity_prophets))
+ if((target.mind in ticker.mode.cult) || (target.mind in ticker.mode.blue_deity_prophets|ticker.mode.red_deity_prophets|ticker.mode.red_deity_followers|ticker.mode.blue_deity_followers))
target << "You feel the corporate tendrils of Nanotrasen try to invade your mind!"
else
target << "You feel a surge of loyalty towards Nanotrasen."