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 += "
" for(var/datum/mind/raider in ticker.mode.raiders) var/mob/M = raider.current if(M) dat += "" dat += "" dat += "" + dat += "
Raiders
[M.real_name][M.client ? "" : " (logged out)"][M.stat == 2 ? " (DEAD)" : ""]PMShow Objective
" + /* if(ticker.mode.ninjas.len > 0) dat += "
" 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
Ninjas