mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-28 23:51:17 +01:00
Adds Bughunt, Incursion, Spy vs Spy, Tower Defense (#7698)
rscadd: "Added three new gamemodes: Tower Defense, Bughunt, Spy vs. Spy."
rscadd: "Bughunt, mercenary and borer, needs twenty required players and five required enemies."
tweak: "Borers have received some miscellaneous fixes and tweaks across the board. They should overall work better now."
rscadd: "Borers can now awaken psionics in their hosts. Maybe it's not a bad idea to get a brain slug after all..."
rscadd: "Spy vs. Spy, traitor and renegade, needs four required players."
tweak: "Changed how renegades work a bit. You're not traitors! You're paranoid people who smuggled a gun to work and are working to keep themselves safe."
rscadd: "Tower Defense, mercenary, heist and ninjas, needs thirty required players and ten required enemies. Good luck!"
This commit is contained in:
+4
-1
@@ -480,14 +480,18 @@
|
||||
#include "code\game\gamemodes\malfunction\newmalf_ability_trees\tree_synthetic.dm"
|
||||
#include "code\game\gamemodes\meteor\meteor.dm"
|
||||
#include "code\game\gamemodes\meteor\meteors.dm"
|
||||
#include "code\game\gamemodes\mixed\bughunt.dm"
|
||||
#include "code\game\gamemodes\mixed\conflux.dm"
|
||||
#include "code\game\gamemodes\mixed\crossfire.dm"
|
||||
#include "code\game\gamemodes\mixed\feeding.dm"
|
||||
#include "code\game\gamemodes\mixed\incursion.dm"
|
||||
#include "code\game\gamemodes\mixed\infestation.dm"
|
||||
#include "code\game\gamemodes\mixed\infiltration.dm"
|
||||
#include "code\game\gamemodes\mixed\intrigue.dm"
|
||||
#include "code\game\gamemodes\mixed\paranoia.dm"
|
||||
#include "code\game\gamemodes\mixed\siege.dm"
|
||||
#include "code\game\gamemodes\mixed\spyvspy.dm"
|
||||
#include "code\game\gamemodes\mixed\towerdefense.dm"
|
||||
#include "code\game\gamemodes\mixed\traitorling.dm"
|
||||
#include "code\game\gamemodes\mixed\uprising.dm"
|
||||
#include "code\game\gamemodes\mixed\veilparty.dm"
|
||||
@@ -2327,7 +2331,6 @@
|
||||
#include "code\modules\research\designs\weapon_designs.dm"
|
||||
#include "code\modules\research\designs\mechfab\hardsuit\modules.dm"
|
||||
#include "code\modules\research\designs\mechfab\hardsuit\rigs.dm"
|
||||
#include "code\modules\research\designs\mechfab\mechs\designs_exosuits.dm"
|
||||
#include "code\modules\research\designs\mechfab\prosthetics\external.dm"
|
||||
#include "code\modules\research\designs\mechfab\prosthetics\internal.dm"
|
||||
#include "code\modules\research\designs\mechfab\robot\robot.dm"
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
#define LANGUAGE_VOX "Vox-pidgin"
|
||||
#define LANGUAGE_CHANGELING "Changeling"
|
||||
#define LANGUAGE_BORER "Cortical Link"
|
||||
#define LANGUAGE_BORER_HIVEMIND "Cortical Hivemind"
|
||||
#define LANGUAGE_CULT "Cult" // NOT CULTISTS!
|
||||
#define LANGUAGE_OCCULT "Occult"
|
||||
#define LANGUAGE_TERMINATOR "Hephaestus Darkcomms" // HKs.
|
||||
|
||||
@@ -6,7 +6,7 @@ var/datum/antagonist/xenos/borer/borers
|
||||
role_text_plural = "Cortical Borers"
|
||||
mob_path = /mob/living/simple_animal/borer
|
||||
bantype = "Borer"
|
||||
welcome_text = "Use your Infest power to crawl into the ear of a host and fuse with their brain. You can only take control temporarily, and at risk of hurting your host, so be clever and careful; your host is encouraged to help you however they can. Talk to your fellow borers with :x."
|
||||
welcome_text = "Use your Infest power to crawl into the ear of a host and fuse with their brain. You can only take control temporarily, and at risk of hurting your host, so be clever and careful; your host is encouraged to help you however they can. Talk to your fellow borers with ,x."
|
||||
antag_indicator = "brainworm"
|
||||
antaghud_indicator = "hudborer"
|
||||
|
||||
@@ -18,12 +18,9 @@ var/datum/antagonist/xenos/borer/borers
|
||||
initial_spawn_target = 5
|
||||
|
||||
/datum/antagonist/xenos/borer/New()
|
||||
..(1)
|
||||
..(TRUE)
|
||||
borers = src
|
||||
|
||||
/datum/antagonist/xenos/borer/get_extra_panel_options(var/datum/mind/player)
|
||||
return "<a href='?src=\ref[src];move_to_spawn=\ref[player.current]'>\[put in host\]</a>"
|
||||
|
||||
/datum/antagonist/xenos/borer/create_objectives(var/datum/mind/player)
|
||||
if(!..())
|
||||
return
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
if(faction_verb && player.current)
|
||||
player.current.verbs |= faction_verb
|
||||
|
||||
player.current.client.verbs += /client/proc/aooc
|
||||
player.current?.client.verbs += /client/proc/aooc
|
||||
|
||||
to_chat(player.current, "<span class='notice'>Once you decide on a goal to pursue, you can optionally display it to everyone at the end of the shift with the <b>Set Ambition</b> verb, located in the IC tab. You can change this at any time, and it otherwise has no bearing on your round.</span>")
|
||||
player.current.verbs += /mob/living/proc/write_ambition
|
||||
@@ -68,8 +68,9 @@
|
||||
update_icons_removed(player)
|
||||
BITSET(player.current.hud_updateflag, SPECIALROLE_HUD)
|
||||
|
||||
if (!is_special_character(player) && !check_rights(R_ADMIN|R_MOD|R_CCIAA, 0, player.current))
|
||||
player.current.client.verbs -= /client/proc/aooc
|
||||
if(player.current.client)
|
||||
if(!is_special_character(player) && !check_rights(R_ADMIN|R_MOD|R_CCIAA, 0, player.current))
|
||||
player.current.client.verbs -= /client/proc/aooc
|
||||
|
||||
if(!is_special_character(player))
|
||||
player.current.verbs -= /mob/living/proc/write_ambition
|
||||
|
||||
@@ -3,7 +3,7 @@ var/datum/antagonist/renegade/renegades
|
||||
/datum/antagonist/renegade
|
||||
role_text = "Renegade"
|
||||
role_text_plural = "Renegades"
|
||||
welcome_text = "Your own safety matters above all else, trust no one and kill anyone who gets in your way. However, armed as you are, now would be the perfect time to settle that score or grab that pair of yellow gloves you've been eyeing..."
|
||||
welcome_text = "You're extremely paranoid today. Something's here to kill you, but you don't know what... Remember that you're not a full antagonist. You can prepare to murder someone and kill, but you shouldn't actively seek conflict."
|
||||
id = MODE_RENEGADE
|
||||
flags = ANTAG_SUSPICIOUS | ANTAG_IMPLANT_IMMUNE | ANTAG_VOTABLE
|
||||
hard_cap = 5
|
||||
@@ -20,8 +20,7 @@ var/datum/antagonist/renegade/renegades
|
||||
/obj/item/gun/energy/xray,
|
||||
/obj/item/gun/projectile/revolver,
|
||||
/obj/item/gun/projectile/revolver/deckard,
|
||||
/obj/item/gun/projectile/revolver/detective,
|
||||
/obj/item/gun/projectile/revolver/derringer,
|
||||
/obj/item/gun/projectile/revolver/adhomian,
|
||||
/obj/item/gun/projectile/automatic/c20r,
|
||||
/obj/item/gun/projectile/deagle,
|
||||
/obj/item/gun/projectile/pistol,
|
||||
@@ -31,7 +30,6 @@ var/datum/antagonist/renegade/renegades
|
||||
/obj/item/gun/projectile/automatic/c20r,
|
||||
/obj/item/gun/projectile/automatic/tommygun,
|
||||
/obj/item/gun/projectile/automatic/mini_uzi,
|
||||
/obj/item/gun/energy/crossbow,
|
||||
/obj/item/gun/projectile/tanto
|
||||
)
|
||||
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
/datum/game_mode/bughunt
|
||||
name = "Bughunt (merc+borer)"
|
||||
round_description = "A mercenary strike force is approaching to eradicate a borer infestation!"
|
||||
extended_round_description = "Mercenaries and borers spawn in this game mode."
|
||||
config_tag = "bughunt"
|
||||
required_players = 20
|
||||
required_enemies = 5
|
||||
end_on_antag_death = FALSE
|
||||
antag_tags = list(MODE_BORER, MODE_MERCENARY)
|
||||
require_all_templates = TRUE
|
||||
votable = TRUE
|
||||
ert_disabled = TRUE
|
||||
@@ -0,0 +1,10 @@
|
||||
/datum/game_mode/incursion
|
||||
name = "Incursion (merc+ninjas)"
|
||||
config_tag = "incursion"
|
||||
round_description = "A group of mercenaries and a set of ninjas have their eyes set on the NSS Aurora."
|
||||
extended_round_description = "Nanotrasen has been playing with fire, maybe a little visit will teach them a lesson."
|
||||
required_players = 20
|
||||
required_enemies = 6
|
||||
end_on_antag_death = FALSE
|
||||
antag_tags = list(MODE_MERCENARY, MODE_NINJA)
|
||||
require_all_templates = TRUE
|
||||
@@ -0,0 +1,13 @@
|
||||
/datum/game_mode/spyvspy
|
||||
name = "Spy v. Spy (traitor+renegade)"
|
||||
round_description = "There are traitorous forces at play, but some crew have resolved to stop them by any means necessary!"
|
||||
extended_round_description = "Traitors and renegades both spawn during this mode."
|
||||
config_tag = "spyvspy"
|
||||
required_players = 4
|
||||
required_enemies = 4
|
||||
end_on_antag_death = FALSE
|
||||
votable = TRUE
|
||||
antag_tags = list(MODE_TRAITOR, MODE_RENEGADE)
|
||||
require_all_templates = TRUE
|
||||
antag_scaling_coeff = 5
|
||||
round_autoantag = TRUE
|
||||
@@ -0,0 +1,10 @@
|
||||
/datum/game_mode/towerdefense
|
||||
name = "Tower Defense (merc+heist+ninjas)"
|
||||
config_tag = "towerdefense"
|
||||
round_description = "A group of mercenaries, a gaggle of raiders, and a set of ninjas have their eyes set on the NSS Aurora."
|
||||
extended_round_description = "Nanotrasen has been playing with fire, maybe a big visit will teach them a lesson."
|
||||
required_players = 30
|
||||
required_enemies = 10
|
||||
end_on_antag_death = FALSE
|
||||
antag_tags = list(MODE_MERCENARY, MODE_RAIDER, MODE_NINJA)
|
||||
require_all_templates = TRUE
|
||||
@@ -15,27 +15,33 @@
|
||||
|
||||
/datum/language/corticalborer
|
||||
name = LANGUAGE_BORER
|
||||
desc = "Cortical borers possess a strange link between their tiny minds."
|
||||
desc = "A language Cortical Borers use to influence the minds of those nearby, or those they infest."
|
||||
speech_verb = "sings"
|
||||
ask_verb = "sings"
|
||||
exclaim_verb = "sings"
|
||||
colour = "alien"
|
||||
key = "v"
|
||||
flags = RESTRICTED
|
||||
|
||||
/datum/language/corticalborer/hivemind
|
||||
name = LANGUAGE_BORER_HIVEMIND
|
||||
desc = "Cortical Borers possess a strange link between their tiny minds, allowing them to communicate telepathically."
|
||||
key = "x"
|
||||
flags = RESTRICTED | HIVEMIND
|
||||
|
||||
/datum/language/corticalborer/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
|
||||
/datum/language/corticalborer/hivemind/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
|
||||
|
||||
var/mob/living/simple_animal/borer/B
|
||||
|
||||
if(istype(speaker,/mob/living/carbon))
|
||||
if(istype(speaker, /mob/living/carbon))
|
||||
var/mob/living/carbon/M = speaker
|
||||
B = M.has_brain_worms()
|
||||
else if(istype(speaker,/mob/living/simple_animal/borer))
|
||||
else if(istype(speaker, /mob/living/simple_animal/borer))
|
||||
B = speaker
|
||||
|
||||
if(B)
|
||||
speaker_mask = B.truename
|
||||
..(speaker,message,speaker_mask)
|
||||
..(speaker, message, speaker_mask)
|
||||
|
||||
/datum/language/vox
|
||||
name = LANGUAGE_VOX
|
||||
|
||||
@@ -56,7 +56,6 @@
|
||||
if((user in contents) && istype(user))
|
||||
if(user.last_special <= world.time)
|
||||
user.last_special = world.time + 50
|
||||
src.visible_message(span("danger", "You hear something rumbling inside [src]'s stomach..."))
|
||||
var/obj/item/I = user.get_active_hand()
|
||||
if(I && I.force)
|
||||
var/d = rand(round(I.force / 4), I.force)
|
||||
|
||||
@@ -1,68 +1,3 @@
|
||||
//Brain slug proc for voluntary removal of control.
|
||||
/mob/living/carbon/proc/release_control()
|
||||
|
||||
set category = "Abilities"
|
||||
set name = "Release Control"
|
||||
set desc = "Release control of your host's body."
|
||||
|
||||
var/mob/living/simple_animal/borer/B = has_brain_worms()
|
||||
|
||||
if(B && B.host_brain)
|
||||
to_chat(src, "<span class='danger'>You withdraw your probosci, releasing control of [B.host_brain]</span>")
|
||||
|
||||
B.detatch()
|
||||
|
||||
verbs -= /mob/living/carbon/proc/release_control
|
||||
verbs -= /mob/living/carbon/proc/punish_host
|
||||
verbs -= /mob/living/carbon/proc/spawn_larvae
|
||||
|
||||
else
|
||||
to_chat(src, "<span class='danger'>ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !</span>")
|
||||
|
||||
//Brain slug proc for tormenting the host.
|
||||
/mob/living/carbon/proc/punish_host()
|
||||
set category = "Abilities"
|
||||
set name = "Torment host"
|
||||
set desc = "Punish your host with agony."
|
||||
|
||||
var/mob/living/simple_animal/borer/B = has_brain_worms()
|
||||
|
||||
if(!B)
|
||||
return
|
||||
|
||||
if(B.host_brain.ckey)
|
||||
to_chat(src, "<span class='warning'>You send a punishing spike of psychic agony lancing into your host's brain.</span>")
|
||||
|
||||
if (!can_feel_pain())
|
||||
to_chat(B.host_brain, "<span class='warning'>You feel a strange sensation as a foreign influence prods your mind.</span>")
|
||||
to_chat(src, "<span class='warning'>It doesn't seem to be as effective as you hoped.</span>")
|
||||
else
|
||||
to_chat(B.host_brain, "<span class='danger'><FONT size=3>Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!</FONT></span>")
|
||||
|
||||
/mob/living/carbon/proc/spawn_larvae()
|
||||
set category = "Abilities"
|
||||
set name = "Reproduce"
|
||||
set desc = "Spawn several young."
|
||||
|
||||
var/mob/living/simple_animal/borer/B = has_brain_worms()
|
||||
|
||||
if(!B)
|
||||
return
|
||||
|
||||
if(B.chemicals >= 100)
|
||||
to_chat(src, "<span class='warning'>Your host twitches and quivers as you rapidly excrete a larva from your sluglike body.</span>")
|
||||
visible_message("<span class='warning'>[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!</span>")
|
||||
B.chemicals -= 100
|
||||
B.has_reproduced = 1
|
||||
|
||||
new /obj/effect/decal/cleanable/vomit(get_turf(src))
|
||||
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
|
||||
new /mob/living/simple_animal/borer(get_turf(src))
|
||||
|
||||
else
|
||||
to_chat(src, "You do not have enough chemicals stored to reproduce.")
|
||||
return
|
||||
|
||||
/**
|
||||
* Attempt to devour victim
|
||||
*
|
||||
|
||||
@@ -1714,6 +1714,8 @@
|
||||
/mob/living/carbon/human/proc/get_traumas()
|
||||
. = list()
|
||||
var/obj/item/organ/internal/brain/B = internal_organs_by_name[BP_BRAIN]
|
||||
if(istype(B, /obj/item/organ/borer))
|
||||
return
|
||||
if(B && should_have_organ(BP_BRAIN) && !isipc(src))
|
||||
. = B.traumas
|
||||
|
||||
|
||||
@@ -150,6 +150,13 @@ emp_act
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/human/proc/check_head_airtight_coverage()
|
||||
var/list/clothing = list(head, wear_mask, wear_suit)
|
||||
for(var/obj/item/clothing/C in clothing)
|
||||
if((C.body_parts_covered & HEAD) && (C.item_flags & (AIRTIGHT|STOPPRESSUREDAMAGE)))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
//Used to check if they can be fed food/drinks/pills
|
||||
/mob/living/carbon/human/proc/check_mouth_coverage()
|
||||
var/list/protective_gear = list(head, wear_mask, wear_suit, w_uniform)
|
||||
|
||||
@@ -154,5 +154,27 @@
|
||||
|
||||
return O
|
||||
|
||||
/mob/living/carbon/human/proc/awaken_psi_basic(var/source)
|
||||
var/static/list/psi_operancy_messages = list(
|
||||
"There's something in your skull!",
|
||||
"Something is eating your thoughts!",
|
||||
"You can feel your brain being rewritten!",
|
||||
"Something is crawling over your frontal lobe!",
|
||||
"Something is drilling through your skull!",
|
||||
"Your head feels like it's going to implode!",
|
||||
"Thousands of ants are tunneling in your head!"
|
||||
)
|
||||
to_chat(src, span("danger", "An indescribable, brain-tearing sound hisses from [source], and you collapse in a seizure!"))
|
||||
seizure()
|
||||
var/new_latencies = rand(2,4)
|
||||
var/list/faculties = list(PSI_COERCION, PSI_REDACTION, PSI_ENERGISTICS, PSI_PSYCHOKINESIS)
|
||||
for(var/i = 1 to new_latencies)
|
||||
to_chat(src, span("danger", "<font size = 3>[pick(psi_operancy_messages)]</font>"))
|
||||
set_psi_rank(pick_n_take(faculties), 1)
|
||||
sleep(30)
|
||||
psi.update()
|
||||
sleep(45)
|
||||
psi.check_latency_trigger(100, source, TRUE)
|
||||
|
||||
/mob/living/carbon/human/get_resist_power()
|
||||
return species.resist_mod
|
||||
@@ -36,7 +36,7 @@
|
||||
var/roundstart
|
||||
|
||||
/mob/living/simple_animal/borer/roundstart
|
||||
roundstart = 1
|
||||
roundstart = TRUE
|
||||
|
||||
/mob/living/simple_animal/borer/Login()
|
||||
..()
|
||||
@@ -46,50 +46,45 @@
|
||||
/mob/living/simple_animal/borer/Initialize()
|
||||
. = ..()
|
||||
|
||||
add_language("Cortical Link")
|
||||
add_language(LANGUAGE_BORER)
|
||||
add_language(LANGUAGE_BORER_HIVEMIND)
|
||||
verbs += /mob/living/proc/ventcrawl
|
||||
verbs += /mob/living/proc/hide
|
||||
|
||||
truename = "[pick("Primary","Secondary","Tertiary","Quaternary")] [rand(1000,9999)]"
|
||||
if(!roundstart) request_player()
|
||||
truename = "[pick("Primary","Secondary","Tertiary","Quaternary")]-[rand(1000,9999)]"
|
||||
if(!roundstart)
|
||||
request_player()
|
||||
|
||||
/mob/living/simple_animal/borer/Life()
|
||||
|
||||
..()
|
||||
|
||||
if(host)
|
||||
|
||||
if(!stat && !host.stat)
|
||||
|
||||
if(host.reagents.has_reagent("sugar"))
|
||||
if(!docile)
|
||||
if(controlling)
|
||||
to_chat(host, "<span class='notice'>You feel the soporific flow of sugar in your host's blood, lulling you into docility.</span>")
|
||||
to_chat(host, span("notice", "You feel the soporific flow of sugar in your host's blood, lulling you into docility."))
|
||||
else
|
||||
to_chat(src, "<span class='notice'>You feel the soporific flow of sugar in your host's blood, lulling you into docility.</span>")
|
||||
docile = 1
|
||||
to_chat(src, span("notice", "You feel the soporific flow of sugar in your host's blood, lulling you into docility."))
|
||||
docile = TRUE
|
||||
else
|
||||
if(docile)
|
||||
if(controlling)
|
||||
to_chat(host, "<span class='notice'>You shake off your lethargy as the sugar leaves your host's blood.</span>")
|
||||
to_chat(host, span("notice", "You shake off your lethargy as the sugar leaves your host's blood."))
|
||||
else
|
||||
to_chat(src, "<span class='notice'>You shake off your lethargy as the sugar leaves your host's blood.</span>")
|
||||
docile = 0
|
||||
to_chat(src, span("notice", "You shake off your lethargy as the sugar leaves your host's blood."))
|
||||
docile = FALSE
|
||||
|
||||
if(chemicals < 250)
|
||||
chemicals++
|
||||
if(controlling)
|
||||
|
||||
if(controlling)
|
||||
if(docile)
|
||||
to_chat(host, "<span class='notice'>You are feeling far too docile to continue controlling your host...</span>")
|
||||
to_chat(host, span("notice", "You are feeling far too docile to continue controlling your host..."))
|
||||
host.release_control()
|
||||
return
|
||||
|
||||
if(prob(5))
|
||||
host.adjustBrainLoss(rand(1,2), 55)
|
||||
|
||||
if(prob(host.getBrainLoss()/20))
|
||||
host.say("*[pick(list("blink","blink_r","choke","aflap","drool","twitch","twitch_s","gasp"))]")
|
||||
host.say("*[pick(list("blink","blink_r","choke","drool","twitch","twitch_s","gasp"))]")
|
||||
|
||||
/mob/living/simple_animal/borer/Stat()
|
||||
..()
|
||||
@@ -100,19 +95,19 @@
|
||||
if(eta_status)
|
||||
stat(null, eta_status)
|
||||
|
||||
if (client.statpanel == "Status")
|
||||
if(client.statpanel == "Status")
|
||||
stat("Chemicals", chemicals)
|
||||
|
||||
/mob/living/simple_animal/borer/proc/detatch()
|
||||
|
||||
if(!host || !controlling) return
|
||||
/mob/living/simple_animal/borer/proc/detach()
|
||||
if(!host || !controlling)
|
||||
return
|
||||
|
||||
if(istype(host,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = host
|
||||
var/obj/item/organ/external/head = H.get_organ(BP_HEAD)
|
||||
head.implants -= src
|
||||
|
||||
controlling = 0
|
||||
controlling = FALSE
|
||||
|
||||
host.remove_language("Cortical Link")
|
||||
host.verbs -= /mob/living/carbon/proc/release_control
|
||||
@@ -120,7 +115,6 @@
|
||||
host.verbs -= /mob/living/carbon/proc/spawn_larvae
|
||||
|
||||
if(host_brain)
|
||||
|
||||
// these are here so bans and multikey warnings are not triggered on the wrong people when ckey is changed.
|
||||
// computer_id and IP are not updated magically on their own in offline mobs -walter0o
|
||||
|
||||
@@ -155,13 +149,14 @@
|
||||
qdel(host_brain)
|
||||
|
||||
/mob/living/simple_animal/borer/proc/leave_host()
|
||||
|
||||
if(!host) return
|
||||
if(!host)
|
||||
return
|
||||
|
||||
if(host.mind)
|
||||
borers.clear_indicators(host.mind)
|
||||
borers.remove_antagonist(host.mind)
|
||||
|
||||
src.forceMove(get_turf(host))
|
||||
forceMove(get_turf(host))
|
||||
|
||||
reset_view(null)
|
||||
machine = null
|
||||
@@ -180,4 +175,4 @@
|
||||
G.request_player(src, "A cortical borer needs a player.")
|
||||
|
||||
/mob/living/simple_animal/borer/cannot_use_vents()
|
||||
return
|
||||
return
|
||||
@@ -1,26 +1,25 @@
|
||||
/mob/living/captive_brain
|
||||
name = "host brain"
|
||||
real_name = "host brain"
|
||||
universal_understand = 1
|
||||
universal_understand = TRUE
|
||||
|
||||
/mob/living/captive_brain/say(var/message)
|
||||
if(istype(src.loc,/mob/living/simple_animal/borer))
|
||||
|
||||
message = sanitize(message)
|
||||
if (!message)
|
||||
if(!message)
|
||||
return
|
||||
log_say("[key_name(src)] : [message]",ckey=key_name(src))
|
||||
if (stat == 2)
|
||||
log_say("[key_name(src)] : [message]", ckey=key_name(src))
|
||||
if(stat == DEAD)
|
||||
return say_dead(message)
|
||||
|
||||
var/mob/living/simple_animal/borer/B = src.loc
|
||||
to_chat(src, "You whisper silently, \"[message]\"")
|
||||
to_chat(B.host, "The captive mind of [src] whispers, \"[message]\"")
|
||||
|
||||
for (var/mob/M in player_list)
|
||||
if (istype(M, /mob/abstract/new_player))
|
||||
for(var/mob/M in player_list)
|
||||
if(istype(M, /mob/abstract/new_player))
|
||||
continue
|
||||
else if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS)
|
||||
else if(M.stat == DEAD && M.client.prefs.toggles & CHAT_GHOSTEARS)
|
||||
to_chat(M, "The captive mind of [src] whispers, \"[message]\"")
|
||||
|
||||
/mob/living/captive_brain/emote(var/message)
|
||||
@@ -32,20 +31,21 @@
|
||||
var/mob/living/simple_animal/borer/B = src.loc
|
||||
var/mob/living/captive_brain/H = src
|
||||
|
||||
to_chat(H, "<span class='danger'>You begin doggedly resisting the parasite's control (this will take approximately sixty seconds).</span>")
|
||||
to_chat(B.host, "<span class='danger'>You feel the captive mind of [src] begin to resist your control.</span>")
|
||||
|
||||
spawn(rand(200,250)+B.host.getBrainLoss())
|
||||
if(!B || !B.controlling) return
|
||||
|
||||
B.host.adjustBrainLoss(rand(5,10), 55)
|
||||
to_chat(H, "<span class='danger'>With an immense exertion of will, you regain control of your body!</span>")
|
||||
to_chat(B.host, "<span class='danger'>You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you.</span>")
|
||||
B.detatch()
|
||||
verbs -= /mob/living/carbon/proc/release_control
|
||||
verbs -= /mob/living/carbon/proc/punish_host
|
||||
verbs -= /mob/living/carbon/proc/spawn_larvae
|
||||
to_chat(H, span("danger", "You begin doggedly resisting the parasite's control (this will take approximately sixty seconds)."))
|
||||
to_chat(B.host, span("danger", "You feel the captive mind of [src] begin to resist your control."))
|
||||
|
||||
addtimer(CALLBACK(src, .proc/eject_borer, B, H), rand(200, 250) + B.host.getBrainLoss())
|
||||
return
|
||||
|
||||
..()
|
||||
|
||||
/mob/living/captive_brain/proc/eject_borer(var/mob/living/simple_animal/borer/borer, var/mob/living/captive_brain/host)
|
||||
if(!borer?.controlling)
|
||||
return
|
||||
|
||||
to_chat(host, span("danger", "With an immense exertion of will, you regain control of your body!"))
|
||||
to_chat(borer.host, span("danger", "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you."))
|
||||
borer.detach()
|
||||
verbs -= /mob/living/carbon/proc/release_control
|
||||
verbs -= /mob/living/carbon/proc/punish_host
|
||||
verbs -= /mob/living/carbon/proc/spawn_larvae
|
||||
|
||||
@@ -1,41 +1,42 @@
|
||||
/mob/living/simple_animal/borer/verb/release_host()
|
||||
set category = "Abilities"
|
||||
set name = "Release Host"
|
||||
set name = "Exit Host"
|
||||
set desc = "Slither out of your host."
|
||||
|
||||
if(!host)
|
||||
to_chat(src, "You are not inside a host body.")
|
||||
to_chat(src, span("notice", "You are not inside a host body."))
|
||||
return
|
||||
if(stat)
|
||||
to_chat(src, span("notice", "You cannot leave your host in your current state."))
|
||||
return
|
||||
if(docile)
|
||||
to_chat(src, span("notice", "You are feeling far too docile to do that."))
|
||||
return
|
||||
|
||||
to_chat(src, span("notice", "You begin disconnecting from [host]'s synapses and prodding at their internal ear canal."))
|
||||
|
||||
if(!host.stat)
|
||||
to_chat(host, span("warning", "An odd, uncomfortable pressure begins to build inside your skull, behind your ear..."))
|
||||
|
||||
addtimer(CALLBACK(src, .proc/exit_host), 100)
|
||||
|
||||
/mob/living/simple_animal/borer/proc/exit_host()
|
||||
if(!host || !src)
|
||||
return
|
||||
|
||||
if(stat)
|
||||
to_chat(src, "You cannot leave your host in your current state.")
|
||||
to_chat(src, span("notice", "You cannot release your host in your current state."))
|
||||
return
|
||||
|
||||
if(docile)
|
||||
to_chat(src, "<span class='notice'>You are feeling far too docile to do that.</span>")
|
||||
return
|
||||
to_chat(src, span("notice", "You wiggle out of [host]'s ear and plop to the ground."))
|
||||
if(host.mind)
|
||||
if(!host.stat)
|
||||
to_chat(host, span("danger", "Something slimy wiggles out of your ear and plops to the ground!"))
|
||||
to_chat(host, span("danger", "As though waking from a dream, you shake off the insidious mind control of the brain worm. Your thoughts are your own again."))
|
||||
|
||||
to_chat(src, "You begin disconnecting from [host]'s synapses and prodding at their internal ear canal.")
|
||||
detach()
|
||||
leave_host()
|
||||
|
||||
if(!host.stat)
|
||||
to_chat(host, "An odd, uncomfortable pressure begins to build inside your skull, behind your ear...")
|
||||
|
||||
spawn(100)
|
||||
|
||||
if(!host || !src) return
|
||||
|
||||
if(src.stat)
|
||||
to_chat(src, "You cannot release your host in your current state.")
|
||||
return
|
||||
|
||||
to_chat(src, "You wiggle out of [host]'s ear and plop to the ground.")
|
||||
if(host.mind)
|
||||
if(!host.stat)
|
||||
to_chat(host, "<span class='danger'>Something slimy wiggles out of your ear and plops to the ground!</span>")
|
||||
to_chat(host, "<span class='danger'>As though waking from a dream, you shake off the insidious mind control of the brain worm. Your thoughts are your own again.</span>")
|
||||
|
||||
detatch()
|
||||
leave_host()
|
||||
|
||||
/mob/living/simple_animal/borer/verb/infest()
|
||||
set category = "Abilities"
|
||||
@@ -43,11 +44,10 @@
|
||||
set desc = "Infest a suitable humanoid host."
|
||||
|
||||
if(host)
|
||||
to_chat(src, "You are already within a host.")
|
||||
to_chat(src, span("notice", "You are already within a host."))
|
||||
return
|
||||
|
||||
if(stat)
|
||||
to_chat(src, "You cannot infest a target in your current state.")
|
||||
to_chat(src, span("notice", "You cannot infest a target in your current state."))
|
||||
return
|
||||
|
||||
var/list/choices = list()
|
||||
@@ -56,17 +56,17 @@
|
||||
choices += C
|
||||
|
||||
if(!choices.len)
|
||||
to_chat(src, "There are no viable hosts within range...")
|
||||
to_chat(src, span("notice", "There are no viable hosts within range."))
|
||||
return
|
||||
|
||||
var/mob/living/carbon/M = input(src,"Who do you wish to infest?") in null|choices
|
||||
|
||||
if(!M || !src) return
|
||||
|
||||
if(!(src.Adjacent(M))) return
|
||||
|
||||
if(!M || !src)
|
||||
return
|
||||
if(!(src.Adjacent(M)))
|
||||
return
|
||||
if(M.has_brain_worms())
|
||||
to_chat(src, "You cannot infest someone who is already infested!")
|
||||
to_chat(src, span("warning", "You cannot infest someone who is already infested!"))
|
||||
return
|
||||
|
||||
if(istype(M,/mob/living/carbon/human))
|
||||
@@ -74,38 +74,34 @@
|
||||
|
||||
var/obj/item/organ/external/E = H.organs_by_name[BP_HEAD]
|
||||
if(!E || E.is_stump())
|
||||
to_chat(src, "\The [H] does not have a head!")
|
||||
to_chat(src, span("warning", "\The [H] does not have a head!"))
|
||||
return
|
||||
|
||||
if(!H.species.has_organ[BP_BRAIN])
|
||||
to_chat(src, "\The [H] does not seem to have an ear canal to breach.")
|
||||
to_chat(src, span("warning", "\The [H] does not seem to have an ear canal to breach."))
|
||||
return
|
||||
|
||||
if(H.isSynthetic())
|
||||
to_chat(src, "<span class='warning'>You can't affect synthetics.</span>")
|
||||
to_chat(src, span("notice", "You can't affect synthetics."))
|
||||
return
|
||||
if(H.check_head_airtight_coverage())
|
||||
to_chat(src, span("warning", "You cannot get through that host's protective gear."))
|
||||
return
|
||||
|
||||
if(H.check_head_coverage())
|
||||
to_chat(src, "You cannot get through that host's protective gear.")
|
||||
return
|
||||
|
||||
to_chat(M, "Something slimy begins probing at the opening of your ear canal...")
|
||||
to_chat(src, "You slither up [M] and begin probing at their ear canal...")
|
||||
to_chat(M, span("warning", "Something slimy begins probing at the opening of your ear canal..."))
|
||||
to_chat(src, span("warning", "You slither up [M] and begin probing at their ear canal..."))
|
||||
|
||||
if(!do_after(src,30))
|
||||
to_chat(src, "As [M] moves away, you are dislodged and fall to the ground.")
|
||||
to_chat(src, span("warning", "As [M] moves away, you are dislodged and fall to the ground."))
|
||||
return
|
||||
if(!M || !src)
|
||||
return
|
||||
|
||||
if(!M || !src) return
|
||||
|
||||
if(src.stat)
|
||||
to_chat(src, "You cannot infest a target in your current state.")
|
||||
to_chat(src, span("notice", "You cannot infest a target in your current state."))
|
||||
return
|
||||
|
||||
if(M in view(1, src))
|
||||
to_chat(src, "You wiggle into [M]'s ear.")
|
||||
to_chat(src, span("notice", "You wiggle into [M]'s ear."))
|
||||
if(!M.stat)
|
||||
to_chat(M, "Something disgusting and slimy wiggles into your ear!")
|
||||
to_chat(M, span("danger", "Something disgusting and slimy wiggles into your ear!"))
|
||||
|
||||
src.host = M
|
||||
src.host.status_flags |= PASSEMOTES
|
||||
@@ -127,48 +123,43 @@
|
||||
|
||||
return
|
||||
else
|
||||
to_chat(src, "They are no longer in range!")
|
||||
to_chat(src, span("warning", "They are no longer in range!"))
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/borer/verb/devour_brain()
|
||||
set category = "Abilities"
|
||||
set name = "Devour Brain"
|
||||
set desc = "Take permanent control of a dead host."
|
||||
set desc = "Replace the brain of your host by devouring it, forming a husk."
|
||||
|
||||
if(!host)
|
||||
to_chat(src, "You are not inside a host body.")
|
||||
to_chat(src, span("notice", "You are not inside a host body."))
|
||||
return
|
||||
|
||||
if(stat)
|
||||
to_chat(src, "You cannot do that in your current state.")
|
||||
to_chat(src, span("notice", "You cannot do that in your current state."))
|
||||
return
|
||||
|
||||
if(host.stat != 2)
|
||||
to_chat(src, "Your host is still alive.")
|
||||
if(host.stat != DEAD)
|
||||
to_chat(src, span("warning", "Your host is still alive."))
|
||||
return
|
||||
|
||||
if(docile)
|
||||
to_chat(src, "<span class='notice'>You are feeling far too docile to do that.</span>")
|
||||
to_chat(src, span("warning", "You are feeling far too docile to do that."))
|
||||
return
|
||||
|
||||
to_chat(src, "<span class = 'danger'>It only takes a few moments to render the dead host brain down into a nutrient-rich slurry...</span>")
|
||||
to_chat(src, span("danger", "It only takes a few moments to render the dead brain down into a nutrient-rich slurry..."))
|
||||
replace_brain()
|
||||
|
||||
|
||||
// BRAIN WORM ZOMBIES AAAAH.
|
||||
/mob/living/simple_animal/borer/proc/replace_brain()
|
||||
|
||||
var/mob/living/carbon/human/H = host
|
||||
|
||||
if(!istype(host))
|
||||
to_chat(src, "This host does not have a suitable brain.")
|
||||
to_chat(src, span("warning", "This host does not have a suitable brain."))
|
||||
return
|
||||
|
||||
to_chat(src, "<span class = 'danger'>You settle into the empty brainpan and begin to expand, fusing inextricably with the dead flesh of [H].</span>")
|
||||
to_chat(src, span("warning", "You settle into the empty brainpan and begin to expand, fusing inextricably with the dead flesh of [H]."))
|
||||
|
||||
H.add_language("Cortical Link")
|
||||
|
||||
if(host.stat == 2)
|
||||
if(host.stat == DEAD)
|
||||
H.verbs |= /mob/living/carbon/human/proc/jumpstart
|
||||
|
||||
H.verbs |= /mob/living/carbon/human/proc/psychic_whisper
|
||||
@@ -176,14 +167,12 @@
|
||||
H.verbs |= /mob/living/carbon/proc/spawn_larvae
|
||||
|
||||
if(H.client)
|
||||
H.ghostize(0)
|
||||
H.ghostize(FALSE)
|
||||
|
||||
if(src.mind)
|
||||
src.mind.special_role = "Borer Husk"
|
||||
src.mind.transfer_to(host)
|
||||
|
||||
H.ChangeToHusk()
|
||||
|
||||
var/obj/item/organ/borer/B = new(H)
|
||||
H.internal_organs_by_name[BP_BRAIN] = B
|
||||
H.internal_organs |= B
|
||||
@@ -202,35 +191,37 @@
|
||||
if(!H.lastKnownIP)
|
||||
H.lastKnownIP = s2h_ip
|
||||
|
||||
// Since the host is dead, we want to kick it back into action immediately, then redo it to ensure they're good to go
|
||||
H.rejuvenate()
|
||||
addtimer(CALLBACK(H, .proc/rejuvenate), 30)
|
||||
|
||||
/mob/living/simple_animal/borer/verb/secrete_chemicals()
|
||||
set category = "Abilities"
|
||||
set name = "Secrete Chemicals"
|
||||
set desc = "Push some chemicals into your host's bloodstream."
|
||||
set name = "Secrete Chemicals (20)"
|
||||
set desc = "Push 5u of chemicals into your host's bloodstream."
|
||||
|
||||
if(!host)
|
||||
to_chat(src, "You are not inside a host body.")
|
||||
to_chat(src, span("notice", "You are not inside a host body."))
|
||||
return
|
||||
|
||||
if(stat)
|
||||
to_chat(src, "You cannot secrete chemicals in your current state.")
|
||||
to_chat(src, span("notice", "You cannot secrete chemicals in your current state."))
|
||||
return
|
||||
|
||||
if(docile)
|
||||
to_chat(src, "<span class='notice'>You are feeling far too docile to do that.</span>")
|
||||
to_chat(src, span("notice", "You are feeling far too docile to do that."))
|
||||
return
|
||||
if(chemicals < 20)
|
||||
to_chat(src, span("warning", "You don't have enough chemicals!"))
|
||||
return
|
||||
|
||||
if(chemicals < 50)
|
||||
to_chat(src, "You don't have enough chemicals!")
|
||||
var/chem = input("Select a chemical to secrete.", "Chemicals") as null|anything in list("Inaprovaline", "Bicaridine", "Hyperzine", "Synaptizine", "Peridaxon", "Tramadol", "Oxycodone", "Fluvoxamine")
|
||||
|
||||
if(!chem || docile || chemicals < 20 || !host || controlling || !src || stat) //Sanity check.
|
||||
return
|
||||
|
||||
var/chem = input("Select a chemical to secrete.", "Chemicals") as null|anything in list("alkysine","bicaridine","hyperzine","tramadol")
|
||||
|
||||
if(!chem || docile || chemicals < 50 || !host || controlling || !src || stat) //Sanity check.
|
||||
return
|
||||
|
||||
to_chat(src, "<span class='danger'>You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream.</span>")
|
||||
host.reagents.add_reagent(chem, 10)
|
||||
chemicals -= 50
|
||||
to_chat(src, span("notice", "You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream."))
|
||||
to_chat(host, span("warning", "You feel cold fluid enter your bloodstream."))
|
||||
host.reagents.add_reagent(lowertext(chem), 5)
|
||||
chemicals -= 20
|
||||
|
||||
/mob/living/simple_animal/borer/verb/dominate_victim()
|
||||
set category = "Abilities"
|
||||
@@ -238,15 +229,13 @@
|
||||
set desc = "Freeze the limbs of a potential host with supernatural fear."
|
||||
|
||||
if(world.time - used_dominate < 150)
|
||||
to_chat(src, "You cannot use that ability again so soon.")
|
||||
to_chat(src, span("notice", "You cannot use that ability again so soon."))
|
||||
return
|
||||
|
||||
if(host)
|
||||
to_chat(src, "You cannot do that from within a host body.")
|
||||
to_chat(src, span("notice", "You cannot do that from within a host body."))
|
||||
return
|
||||
|
||||
if(src.stat)
|
||||
to_chat(src, "You cannot do that in your current state.")
|
||||
to_chat(src, span("notice", "You cannot do that in your current state."))
|
||||
return
|
||||
|
||||
var/list/choices = list()
|
||||
@@ -255,23 +244,22 @@
|
||||
choices += C
|
||||
|
||||
if(world.time - used_dominate < 150)
|
||||
to_chat(src, "You cannot use that ability again so soon.")
|
||||
to_chat(src, span("notice", "You cannot use that ability again so soon."))
|
||||
return
|
||||
|
||||
var/mob/living/carbon/M = input(src,"Who do you wish to dominate?") in null|choices
|
||||
|
||||
if(!M || !src) return
|
||||
|
||||
if(!M || !src)
|
||||
return
|
||||
if(M.isSynthetic())
|
||||
to_chat(src, "<span class='warning'>You can't affect synthetics.</span>")
|
||||
to_chat(src, span("warning", "You can't affect synthetics."))
|
||||
return
|
||||
|
||||
if(M.has_brain_worms())
|
||||
to_chat(src, "You cannot infest someone who is already infested!")
|
||||
to_chat(src, span("warning", "You cannot infest someone who is already infested!"))
|
||||
return
|
||||
|
||||
to_chat(src, "<span class='warning'>You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread.</span>")
|
||||
to_chat(M, "<span class='warning'>You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing.</span>")
|
||||
to_chat(src, span("warning", "You focus your psionic lance on [M] and freeze their limbs with a wave of terrible dread."))
|
||||
to_chat(M, span("warning", "You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing."))
|
||||
M.Weaken(10)
|
||||
|
||||
used_dominate = world.time
|
||||
@@ -282,83 +270,215 @@
|
||||
set desc = "Fully connect to the brain of your host."
|
||||
|
||||
if(!host)
|
||||
to_chat(src, "You are not inside a host body.")
|
||||
to_chat(src, span("notice", "You are not inside a host body."))
|
||||
return
|
||||
|
||||
if(src.stat)
|
||||
to_chat(src, "You cannot do that in your current state.")
|
||||
to_chat(src, span("notice", "You cannot do that in your current state."))
|
||||
return
|
||||
|
||||
if(docile)
|
||||
to_chat(src, "<span class='notice'>You are feeling far too docile to do that.</span>")
|
||||
to_chat(src, span("notice", "You are feeling far too docile to do that."))
|
||||
return
|
||||
|
||||
to_chat(src, "You begin delicately adjusting your connection to the host brain...")
|
||||
to_chat(src, span("warning", "You begin delicately adjusting your connection to the host brain..."))
|
||||
to_chat(host, span("warning", "You feel a tingling sensation at the back of your head."))
|
||||
|
||||
spawn(100+(host.getBrainLoss()*5))
|
||||
addtimer(CALLBACK(src, .proc/host_takeover), 100+(host.getBrainLoss()*5))
|
||||
|
||||
if(!host || !src || controlling)
|
||||
return
|
||||
else
|
||||
/mob/living/simple_animal/borer/proc/host_takeover()
|
||||
if(!host || !src || controlling)
|
||||
return
|
||||
|
||||
to_chat(src, "<span class='danger'>You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system.</span>")
|
||||
to_chat(host, "<span class='danger'>You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours.</span>")
|
||||
host.add_language("Cortical Link")
|
||||
to_chat(src, span("danger", "You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system."))
|
||||
to_chat(host, span("danger", "You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours."))
|
||||
host.add_language("Cortical Link")
|
||||
|
||||
// host -> brain
|
||||
var/h2b_id = host.computer_id
|
||||
var/h2b_ip= host.lastKnownIP
|
||||
host.computer_id = null
|
||||
host.lastKnownIP = null
|
||||
// host -> brain
|
||||
var/h2b_id = host.computer_id
|
||||
var/h2b_ip= host.lastKnownIP
|
||||
host.computer_id = null
|
||||
host.lastKnownIP = null
|
||||
|
||||
qdel(host_brain)
|
||||
host_brain = new(src)
|
||||
qdel(host_brain)
|
||||
host_brain = new(src)
|
||||
|
||||
host_brain.ckey = host.ckey
|
||||
host_brain.ckey = host.ckey
|
||||
|
||||
host_brain.name = host.name
|
||||
host_brain.name = host.name
|
||||
|
||||
if(!host_brain.computer_id)
|
||||
host_brain.computer_id = h2b_id
|
||||
if(!host_brain.computer_id)
|
||||
host_brain.computer_id = h2b_id
|
||||
|
||||
if(!host_brain.lastKnownIP)
|
||||
host_brain.lastKnownIP = h2b_ip
|
||||
if(!host_brain.lastKnownIP)
|
||||
host_brain.lastKnownIP = h2b_ip
|
||||
|
||||
// self -> host
|
||||
var/s2h_id = src.computer_id
|
||||
var/s2h_ip= src.lastKnownIP
|
||||
src.computer_id = null
|
||||
src.lastKnownIP = null
|
||||
// self -> host
|
||||
var/s2h_id = src.computer_id
|
||||
var/s2h_ip= src.lastKnownIP
|
||||
src.computer_id = null
|
||||
src.lastKnownIP = null
|
||||
|
||||
host.ckey = src.ckey
|
||||
host.ckey = src.ckey
|
||||
|
||||
if(!host.computer_id)
|
||||
host.computer_id = s2h_id
|
||||
if(!host.computer_id)
|
||||
host.computer_id = s2h_id
|
||||
|
||||
if(!host.lastKnownIP)
|
||||
host.lastKnownIP = s2h_ip
|
||||
if(!host.lastKnownIP)
|
||||
host.lastKnownIP = s2h_ip
|
||||
|
||||
controlling = 1
|
||||
controlling = TRUE
|
||||
|
||||
host.verbs += /mob/living/carbon/proc/release_control
|
||||
host.verbs += /mob/living/carbon/proc/punish_host
|
||||
host.verbs += /mob/living/carbon/proc/spawn_larvae
|
||||
|
||||
return
|
||||
host.verbs += /mob/living/carbon/proc/release_control
|
||||
host.verbs += /mob/living/carbon/proc/punish_host
|
||||
host.verbs += /mob/living/carbon/proc/spawn_larvae
|
||||
|
||||
/mob/living/carbon/human/proc/jumpstart()
|
||||
set category = "Abilities"
|
||||
set name = "Revive Host"
|
||||
set desc = "Send a jolt of electricity through your host, reviving them."
|
||||
set desc = "Muster all psionic energies to pulse through a dead host, restoring them to a prime state."
|
||||
|
||||
if(stat != 2)
|
||||
to_chat(usr, "Your host is already alive.")
|
||||
if(stat != DEAD)
|
||||
to_chat(usr, span("warning", "Your host is already alive."))
|
||||
return
|
||||
|
||||
verbs -= /mob/living/carbon/human/proc/jumpstart
|
||||
visible_message("<span class='warning'>With a hideous, rattling moan, [src] shudders back to life!</span>")
|
||||
visible_message(span("warning", "With a hideous, rattling moan, [src] shudders back to life!"))
|
||||
|
||||
rejuvenate()
|
||||
vessel.add_reagent("blood",560-vessel.total_volume)
|
||||
fixblood()
|
||||
update_canmove()
|
||||
update_canmove()
|
||||
|
||||
//Brain slug proc for voluntary removal of control.
|
||||
/mob/living/carbon/proc/release_control()
|
||||
set category = "Abilities"
|
||||
set name = "Release Control"
|
||||
set desc = "Release control of your host's body."
|
||||
|
||||
var/mob/living/simple_animal/borer/B = has_brain_worms()
|
||||
|
||||
if(B?.host_brain)
|
||||
to_chat(src, span("warning", "You withdraw your probosci, releasing control of [B.host_brain]"))
|
||||
|
||||
B.detach()
|
||||
|
||||
verbs -= /mob/living/carbon/proc/release_control
|
||||
verbs -= /mob/living/carbon/proc/punish_host
|
||||
verbs -= /mob/living/carbon/proc/spawn_larvae
|
||||
|
||||
else
|
||||
to_chat(src, span("danger", "Something has gone terribly wrong, as your host's brain does not seem to contain you. Make a Github report and ahelp to get out."))
|
||||
|
||||
//Brain slug proc for tormenting the host.
|
||||
/mob/living/carbon/proc/punish_host()
|
||||
set category = "Abilities"
|
||||
set name = "Torment host"
|
||||
set desc = "Punish your host with agony."
|
||||
|
||||
var/mob/living/simple_animal/borer/B = has_brain_worms()
|
||||
|
||||
if(!B)
|
||||
return
|
||||
|
||||
if(B.host_brain.ckey)
|
||||
to_chat(src, span("warning", "You send a punishing spike of psionic agony lancing into your host's brain."))
|
||||
|
||||
if(!can_feel_pain())
|
||||
to_chat(B.host_brain, span("warning", "You feel a strange sensation as a foreign influence prods your mind."))
|
||||
to_chat(src, span("warning", "It doesn't seem to be as effective as you hoped."))
|
||||
else
|
||||
to_chat(B.host_brain, span("danger", "<FONT size=3>Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!</FONT>"))
|
||||
|
||||
/mob/living/carbon/proc/spawn_larvae()
|
||||
set category = "Abilities"
|
||||
set name = "Reproduce (100)"
|
||||
set desc = "Spawn several young."
|
||||
|
||||
var/mob/living/simple_animal/borer/B = has_brain_worms()
|
||||
|
||||
if(!B)
|
||||
return
|
||||
|
||||
if(B.chemicals >= 100)
|
||||
to_chat(src, span("warning", "Your host twitches and quivers as you rapidly excrete a larva from your sluglike body."))
|
||||
visible_message(span("warning", "[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!"))
|
||||
B.chemicals -= 100
|
||||
B.has_reproduced = TRUE
|
||||
|
||||
new /obj/effect/decal/cleanable/vomit(get_turf(src))
|
||||
playsound(loc, 'sound/effects/splat.ogg', 50, 1)
|
||||
new /mob/living/simple_animal/borer(get_turf(src))
|
||||
|
||||
else
|
||||
to_chat(src, span("notice", "You do not have enough chemicals stored to reproduce."))
|
||||
return
|
||||
|
||||
/mob/living/simple_animal/borer/verb/awaken_psionics()
|
||||
set category = "Abilities"
|
||||
set name = "Awaken Host Psionics (100)"
|
||||
set desc = "Probe into your host an unlock their psionic potential."
|
||||
|
||||
if(!host)
|
||||
to_chat(src, span("notice", "You are not inside a host body."))
|
||||
return
|
||||
if(host.psi)
|
||||
to_chat(src, span("warning", "Your host is already psionically active!"))
|
||||
return
|
||||
if(stat)
|
||||
to_chat(src, span("notice", "You cannot do that in your current state."))
|
||||
return
|
||||
if(docile)
|
||||
to_chat(src, span("notice", "You are feeling far too docile to do that."))
|
||||
return
|
||||
if(chemicals < 100)
|
||||
to_chat(src, span("warning", "You don't have enough chemicals!"))
|
||||
return
|
||||
|
||||
chemicals -= 100
|
||||
to_chat(src, span("notice", "You probe your tendrils deep within your host's zona bovinae, seeking to unleash their potential."))
|
||||
to_chat(host, span("warning", "You feel a burning tingling sensation at the back of your head."))
|
||||
addtimer(CALLBACK(src, .proc/jumpstart_psi), 100)
|
||||
|
||||
/mob/living/simple_animal/borer/proc/jumpstart_psi()
|
||||
to_chat(src, span("notice", "You succeed in interfacing with the host's zona bovinae, this will be a painful process for them."))
|
||||
host.awaken_psi_basic("something in your head")
|
||||
|
||||
/mob/living/simple_animal/borer/verb/advance_faculty()
|
||||
set category = "Abilities"
|
||||
set name = "Advance Psionic Faculty (75)"
|
||||
set desc = "Advance one of your host's psionic faculties' by one step."
|
||||
|
||||
if(!host)
|
||||
to_chat(src, span("notice", "You are not inside a host body."))
|
||||
return
|
||||
if(!host.psi)
|
||||
to_chat(src, span("warning", "Your host has not been psionically awakened!"))
|
||||
return
|
||||
if(stat)
|
||||
to_chat(src, span("notice", "You cannot do that in your current state."))
|
||||
return
|
||||
if(docile)
|
||||
to_chat(src, span("notice", "You are feeling far too docile to do that."))
|
||||
return
|
||||
if(chemicals < 75)
|
||||
to_chat(src, span("warning", "You don't have enough chemicals!"))
|
||||
return
|
||||
|
||||
var/list/faculties = list(capitalize(PSI_COERCION), capitalize(PSI_REDACTION), capitalize(PSI_ENERGISTICS), capitalize(PSI_PSYCHOKINESIS))
|
||||
var/selected_faculty = input(src, "Choose a faculty to upgrade.") as null|anything in faculties
|
||||
if(!selected_faculty)
|
||||
return
|
||||
selected_faculty = lowertext(selected_faculty)
|
||||
if(host.psi.get_rank(selected_faculty) >= PSI_RANK_GRANDMASTER)
|
||||
to_chat(src, span("notice", "This faculty has already been pushed to the max potential you can achieve!"))
|
||||
return
|
||||
|
||||
chemicals -= 75
|
||||
to_chat(src, span("notice", "You probe your tendrils deep within your host's zona bovinae, seeking to upgrade their abilities."))
|
||||
to_chat(host, span("warning", "You feel a burning, tingling sensation at the back of your head..."))
|
||||
addtimer(CALLBACK(src, .proc/faculty_upgrade, selected_faculty), 100)
|
||||
|
||||
/mob/living/simple_animal/borer/proc/faculty_upgrade(var/selected_faculty)
|
||||
host.psi.set_rank(selected_faculty, host.psi.get_rank(selected_faculty) + 1)
|
||||
host.psi.update()
|
||||
to_chat(src, span("notice", "You successfully manage to upgrade your host's [selected_faculty] faculty."))
|
||||
to_chat(host, span("good", "A breeze of fresh air washes over your mind, you feel powerful!"))
|
||||
to_chat(host, span("notice", "You have been psionically enlightened. You are now a [psychic_ranks_to_strings[host.psi.ranks[selected_faculty]]] in the [selected_faculty] faculty."))
|
||||
|
||||
@@ -1,35 +1,48 @@
|
||||
/mob/living/simple_animal/borer/say(var/message)
|
||||
|
||||
message = sanitize(message)
|
||||
message = capitalize(message)
|
||||
|
||||
if(!message)
|
||||
return
|
||||
|
||||
if (stat == 2)
|
||||
if(stat == DEAD)
|
||||
return say_dead(message)
|
||||
|
||||
if (stat)
|
||||
if(stat)
|
||||
return
|
||||
|
||||
if (copytext(message, 1, 2) == "*")
|
||||
var/static/list/correct_punctuation = list("!" = TRUE, "." = TRUE, "?" = TRUE, "-" = TRUE, "~" = TRUE, "*" = TRUE, "/" = TRUE, ">" = TRUE, "\"" = TRUE, "'" = TRUE, "," = TRUE, ":" = TRUE, ";" = TRUE)
|
||||
var/ending = copytext(message, length(message), (length(message) + 1))
|
||||
if(ending && !correct_punctuation[ending])
|
||||
message += "."
|
||||
|
||||
if(copytext(message, 1, 2) == "*")
|
||||
return emote(copytext(message, 2))
|
||||
|
||||
var/datum/language/L = parse_language(message)
|
||||
if(L && L.flags & HIVEMIND)
|
||||
L.broadcast(src,trim(copytext(message,3)),src.truename)
|
||||
if(L?.flags & HIVEMIND)
|
||||
L.broadcast(src, trim(copytext(message,3)), src.truename)
|
||||
return
|
||||
|
||||
if(!host)
|
||||
//TODO: have this pick a random mob within 3 tiles to speak for the borer.
|
||||
to_chat(src, "You have no host to speak to.")
|
||||
return //No host, no audible speech.
|
||||
var/list/viable_sayers = list()
|
||||
for(var/mob/living/carbon/human/H in range(3, src))
|
||||
if(H.stat)
|
||||
continue
|
||||
viable_sayers += H
|
||||
if(!length(viable_sayers))
|
||||
to_chat(src, span("notice", "There are no viable hosts to speak with."))
|
||||
else
|
||||
var/mob/living/carbon/human/chosen_sayer = pick(viable_sayers)
|
||||
log_say("[key_name(src)] : ([name]) [message]", ckey=key_name(src))
|
||||
chosen_sayer.say(message)
|
||||
return
|
||||
|
||||
to_chat(src, "You drop words into [host]'s mind: \"[message]\"")
|
||||
to_chat(host, "Your own thoughts speak: \"[message]\"")
|
||||
|
||||
for (var/mob/M in player_list)
|
||||
if (istype(M, /mob/abstract/new_player))
|
||||
for(var/mob/M in player_list)
|
||||
if(istype(M, /mob/abstract/new_player))
|
||||
continue
|
||||
else if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS)
|
||||
else if(M.stat == DEAD && M.client.prefs.toggles & CHAT_GHOSTEARS)
|
||||
to_chat(M, "[src.truename] whispers to [host], \"[message]\"")
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
var/mob/living/simple_animal/borer/borer = owner.has_brain_worms()
|
||||
|
||||
if(borer)
|
||||
borer.detatch() //Should remove borer if the brain is removed - RR
|
||||
borer.detach() //Should remove borer if the brain is removed - RR
|
||||
|
||||
var/obj/item/organ/internal/brain/B = src
|
||||
if(istype(B) && istype(owner))
|
||||
|
||||
@@ -1,26 +1,4 @@
|
||||
//CORTICAL BORER ORGANS.
|
||||
/obj/item/organ/borer/process()
|
||||
|
||||
// Borer husks regenerate health, feel no pain, and are resistant to stuns and brainloss.
|
||||
for(var/chem in list("tricordrazine","tramadol","hyperzine","alkysine"))
|
||||
if(owner.reagents.get_reagent_amount(chem) < 3)
|
||||
owner.reagents.add_reagent(chem, 5)
|
||||
|
||||
// They're also super gross and ooze ichor.
|
||||
if(prob(5))
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(!istype(H))
|
||||
return
|
||||
|
||||
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in H.vessel.reagent_list
|
||||
blood_splatter(H,B,1)
|
||||
var/obj/effect/decal/cleanable/blood/splatter/goo = locate() in get_turf(owner)
|
||||
if(goo)
|
||||
goo.name = "husk ichor"
|
||||
goo.desc = "It's thick and stinks of decay."
|
||||
goo.basecolor = "#412464"
|
||||
goo.update_icon()
|
||||
|
||||
// This borer is the worm that replaced the host's brain, not the brainworm latched onto a brain
|
||||
/obj/item/organ/borer
|
||||
name = "cortical borer"
|
||||
icon = 'icons/obj/objects.dmi'
|
||||
@@ -28,10 +6,9 @@
|
||||
organ_tag = BP_BRAIN
|
||||
desc = "A disgusting space slug."
|
||||
parent_organ = BP_HEAD
|
||||
vital = 1
|
||||
vital = TRUE
|
||||
|
||||
/obj/item/organ/borer/removed(var/mob/living/user)
|
||||
|
||||
..()
|
||||
|
||||
var/mob/living/simple_animal/borer/B = owner.has_brain_worms()
|
||||
@@ -39,8 +16,7 @@
|
||||
B.leave_host()
|
||||
B.ckey = owner.ckey
|
||||
|
||||
spawn(0)
|
||||
qdel(src)
|
||||
qdel(src)
|
||||
|
||||
//VOX ORGANS.
|
||||
/obj/item/organ/internal/stack
|
||||
|
||||
@@ -287,7 +287,7 @@
|
||||
use_description = "Activate an empty hand on disarm intent to detect nearby psionic signatures."
|
||||
|
||||
/datum/psionic_power/coercion/psiping/invoke(var/mob/living/user, var/mob/living/target)
|
||||
if((target && user != target) && user.a_intent != I_HELP)
|
||||
if((target && user != target) || user.a_intent != I_HELP)
|
||||
return FALSE
|
||||
. = ..()
|
||||
if(.)
|
||||
|
||||
@@ -37,11 +37,11 @@
|
||||
cost = 5
|
||||
cooldown = 10
|
||||
min_rank = PSI_RANK_MASTER
|
||||
use_description = "Click on or otherwise activate an empty hand while on help intent to manifest a psychokinetic tool. Use it in-hand to switch between tool types."
|
||||
use_description = "Click on or otherwise activate an empty hand while on grab intent to manifest a psychokinetic tool. Use it in-hand to switch between tool types."
|
||||
admin_log = FALSE
|
||||
|
||||
/datum/psionic_power/psychokinesis/tinker/invoke(var/mob/living/user, var/mob/living/target)
|
||||
if((target && user != target) || user.a_intent != I_HELP)
|
||||
if((target && user != target) || user.a_intent != I_GRAB)
|
||||
return FALSE
|
||||
. = ..()
|
||||
if(.)
|
||||
|
||||
@@ -197,7 +197,7 @@
|
||||
var/mob/living/simple_animal/borer/worm = obj
|
||||
if(worm.controlling)
|
||||
target.release_control()
|
||||
worm.detatch()
|
||||
worm.detach()
|
||||
worm.leave_host()
|
||||
|
||||
playsound(target.loc, 'sound/effects/squelch1.ogg', 50, 1)
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
################################
|
||||
# Example Changelog File
|
||||
#
|
||||
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
|
||||
#
|
||||
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
|
||||
# When it is, any changes listed below will disappear.
|
||||
#
|
||||
# Valid Prefixes:
|
||||
# bugfix
|
||||
# wip (For works in progress)
|
||||
# tweak
|
||||
# soundadd
|
||||
# sounddel
|
||||
# rscadd (general adding of nice things)
|
||||
# rscdel (general deleting of nice things)
|
||||
# imageadd
|
||||
# imagedel
|
||||
# maptweak
|
||||
# spellcheck (typo fixes)
|
||||
# experiment
|
||||
# balance
|
||||
# admin
|
||||
# backend
|
||||
# security
|
||||
# refactor
|
||||
#################################
|
||||
|
||||
# Your name.
|
||||
author: MattAtlas, Geeves
|
||||
|
||||
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
|
||||
delete-after: True
|
||||
|
||||
# Any changes you've made. See valid prefix list above.
|
||||
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
|
||||
# SCREW THIS UP AND IT WON'T WORK.
|
||||
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
|
||||
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
|
||||
changes:
|
||||
- rscadd: "Added three new gamemodes: Tower Defense, Bughunt, Spy vs. Spy."
|
||||
- rscadd: "Bughunt, mercenary and borer, needs twenty required players and five required enemies."
|
||||
- tweak: "Borers have received some miscellaneous fixes and tweaks across the board. They should overall work better now."
|
||||
- rscadd: "Borers can now awaken psionics in their hosts. Maybe it's not a bad idea to get a brain slug after all..."
|
||||
- rscadd: "Spy vs. Spy, traitor and renegade, needs four required players."
|
||||
- tweak: "Changed how renegades work a bit. You're not traitors! You're paranoid people who smuggled a gun to work and are working to keep themselves safe. You can still murder given enough reasoning to."
|
||||
- rscadd: "Tower Defense, mercenary, heist and ninjas, needs thirty required players and ten required enemies. Good luck!"
|
||||
Reference in New Issue
Block a user