diff --git a/code/game/machinery/podmen.dm b/code/game/machinery/podmen.dm
index 1e8eb4e5368..730f69e6643 100644
--- a/code/game/machinery/podmen.dm
+++ b/code/game/machinery/podmen.dm
@@ -74,17 +74,16 @@ Growing it to term with nothing injected will grab a ghost from the observers. *
ghost = source
else // If no sample was injected or revival is not allowed, we grab an interested observer.
for(var/mob/dead/observer/O in player_list)
- if(O.client)
- var/response = alert(O, "Someone is harvesting a replica pod. Would you like to play as a Dionaea?", "Replica pod harvest", "Yes", "No")
+ if(O.client && O.client.prefs.be_special & BE_PLANT)
+ var/response = alert(O, "Someone is harvesting a replica pod. Would you like to play as a Dionaea?", "Replica pod harvest", "Yes", "No", "Never for this round.")
if(response == "Yes")
candidates += O
+ else if(response == "Never for this round")
+ O.client.prefs.be_special ^= BE_PLANT
if(!do_after(user, 100))
return
- if(!src || !user)
- return
-
if(candidates.len)
ghost = pick(candidates)
diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm
index 44f1cfdd820..1b55ca6b039 100644
--- a/code/modules/admin/player_panel.dm
+++ b/code/modules/admin/player_panel.dm
@@ -470,12 +470,15 @@
dat += ""
if(ticker.mode.raiders.len > 0)
+ dat += "
| Raiders | | |
"
for(var/datum/mind/raider in ticker.mode.raiders)
var/mob/M = raider.current
if(M)
dat += "| [M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""] | "
dat += "PM | "
dat += "Show Objective |
"
+ dat += "
"
+
/*
if(ticker.mode.ninjas.len > 0)
dat += "
| Ninjas | | |
"
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 1809cfd205d..8e977bbc7d1 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -16,6 +16,7 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
"infested monkey" = IS_MODE_COMPILED("monkey"), // 9
"ninja" = "true", // 10
"vox raider" = IS_MODE_COMPILED("heist"), // 11
+ "diona" = 1, // 12
)
var/const/MAX_SAVE_SLOTS = 10
diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm
index 647f9318afa..b55faf7b98e 100644
--- a/code/modules/mob/living/simple_animal/borer.dm
+++ b/code/modules/mob/living/simple_animal/borer.dm
@@ -38,6 +38,7 @@
attacktext = "nips"
friendly = "prods"
wander = 0
+ pass_flags = PASSTABLE
var/chemicals = 10 // Chemicals used for reproduction and spitting neurotoxin.
var/mob/living/carbon/human/host // Human host for the brain worm.
@@ -109,6 +110,21 @@
src << "You drop words into [host]'s mind: \"[message]\""
host << "Your own thoughts speak: \"[message]\""
+/mob/living/simple_animal/borer/Stat()
+ ..()
+ statpanel("Status")
+
+ if(emergency_shuttle)
+ if(emergency_shuttle.online && emergency_shuttle.location < 2)
+ var/timeleft = emergency_shuttle.timeleft()
+ if (timeleft)
+ stat(null, "ETA-[(timeleft / 60) % 60]:[add_zero(num2text(timeleft % 60), 2)]")
+
+ if (client.statpanel == "Status")
+ stat("Chemicals", chemicals)
+
+// VERBS!
+
/mob/living/simple_animal/borer/proc/borer_speak(var/message)
if(!message)
return
@@ -148,7 +164,31 @@
host.verbs += /mob/living/carbon/human/proc/punish_host
host.verbs += /mob/living/carbon/human/proc/spawn_larvae
-mob/living/simple_animal/borer/verb/release_host()
+/mob/living/simple_animal/borer/verb/bond_brain()
+ set category = "Alien"
+ set name = "Secrete Chemicals"
+ set desc = "Push some chemicals into your host's bloodstream."
+
+ if(!host)
+ src << "You are not inside a host body."
+ return
+
+ if(stat)
+ src << "You cannot secrete chemicals in your current state."
+
+ if(chemicals < 50)
+ src << "You don't have enough chemicals!"
+
+ var/chem = input("Select a chemical to secrete.", "Chemicals") in list("bicaridine","tramadol","hyperzine")
+
+ if(chemicals < 50 || !host || controlling || !src || stat) //Sanity check.
+ return
+
+ src << "\red You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream."
+ host.reagents.add_reagent(chem, 15)
+ chemicals -= 50
+
+/mob/living/simple_animal/borer/verb/release_host()
set category = "Alien"
set name = "Release Host"
set desc = "Slither out of your host."
@@ -269,4 +309,62 @@ mob/living/simple_animal/borer/proc/detatch()
return
else
src << "They are no longer in range!"
- return
\ No newline at end of file
+ return
+
+/mob/living/simple_animal/borer/verb/ventcrawl()
+ set name = "Crawl through Vent"
+ set desc = "Enter an air vent and crawl through the pipe system."
+ set category = "Alien"
+
+// if(!istype(V,/obj/machinery/atmoalter/siphs/fullairsiphon/air_vent))
+// return
+ var/obj/machinery/atmospherics/unary/vent_pump/vent_found
+ var/welded = 0
+ for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src))
+ if(!v.welded)
+ vent_found = v
+ break
+ else
+ welded = 1
+ if(vent_found)
+ if(vent_found.network&&vent_found.network.normal_members.len)
+ var/list/vents = list()
+ for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members)
+ if(temp_vent.loc == loc)
+ continue
+ vents.Add(temp_vent)
+ var/list/choices = list()
+ for(var/obj/machinery/atmospherics/unary/vent_pump/vent in vents)
+ if(vent.loc.z != loc.z)
+ continue
+ var/atom/a = get_turf(vent)
+ choices.Add(a.loc)
+ var/turf/startloc = loc
+ var/obj/selection = input("Select a destination.", "Duct System") in choices
+ var/selection_position = choices.Find(selection)
+ if(loc==startloc)
+ var/obj/target_vent = vents[selection_position]
+ if(target_vent)
+ loc = target_vent.loc
+ else
+ src << "\blue You need to remain still while entering a vent."
+ else
+ src << "\blue This vent is not connected to anything."
+ else if(welded)
+ src << "\red That vent is welded."
+ else
+ src << "\blue You must be standing on or beside an air vent to enter it."
+ return
+
+//copy paste from alien/larva, if that func is updated please update this one alsoghost
+/mob/living/simple_animal/borer/verb/hide()
+ set name = "Hide"
+ set desc = "Allows to hide beneath tables or certain items. Toggled on or off."
+ set category = "Alien"
+
+ if (layer != TURF_LAYER+0.2)
+ layer = TURF_LAYER+0.2
+ src << text("\blue You are now hiding.")
+ else
+ layer = MOB_LAYER
+ src << text("\blue You have stopped hiding.")
\ No newline at end of file
diff --git a/code/setup.dm b/code/setup.dm
index 7e6f0cb7a98..e4beb3781df 100644
--- a/code/setup.dm
+++ b/code/setup.dm
@@ -641,6 +641,7 @@ var/list/TAGGERLOCATIONS = list("Disposals",
#define BE_MONKEY 512
#define BE_NINJA 1024
#define BE_RAIDER 2048
+#define BE_PLANT 4096
var/list/be_special_flags = list(
"Traitor" = BE_TRAITOR,
@@ -654,7 +655,8 @@ var/list/be_special_flags = list(
"Cultist" = BE_CULTIST,
"Monkey" = BE_MONKEY,
"Ninja" = BE_NINJA,
- "Raider" = BE_RAIDER
+ "Raider" = BE_RAIDER,
+ "Diona" = BE_PLANT
)
#define AGE_MIN 17 //youngest a character can be