diff --git a/aurorastation.dme b/aurorastation.dme index 0b9566a1537..3371f1cc274 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -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" diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index 84a0c94442a..d7e2728c825 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.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. diff --git a/code/game/antagonist/alien/borer.dm b/code/game/antagonist/alien/borer.dm index d0d1183a0d9..d81e9b89b2f 100644 --- a/code/game/antagonist/alien/borer.dm +++ b/code/game/antagonist/alien/borer.dm @@ -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 "\[put in host\]" - /datum/antagonist/xenos/borer/create_objectives(var/datum/mind/player) if(!..()) return diff --git a/code/game/antagonist/antagonist_add.dm b/code/game/antagonist/antagonist_add.dm index 52236191b94..3d93786f471 100644 --- a/code/game/antagonist/antagonist_add.dm +++ b/code/game/antagonist/antagonist_add.dm @@ -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, "Once you decide on a goal to pursue, you can optionally display it to everyone at the end of the shift with the Set Ambition verb, located in the IC tab. You can change this at any time, and it otherwise has no bearing on your round.") 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 diff --git a/code/game/antagonist/station/renegade.dm b/code/game/antagonist/station/renegade.dm index 7f8fefde3ee..c5dcb867112 100644 --- a/code/game/antagonist/station/renegade.dm +++ b/code/game/antagonist/station/renegade.dm @@ -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 ) diff --git a/code/game/gamemodes/mixed/bughunt.dm b/code/game/gamemodes/mixed/bughunt.dm new file mode 100644 index 00000000000..63b55f087ab --- /dev/null +++ b/code/game/gamemodes/mixed/bughunt.dm @@ -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 diff --git a/code/game/gamemodes/mixed/incursion.dm b/code/game/gamemodes/mixed/incursion.dm new file mode 100644 index 00000000000..de42f733463 --- /dev/null +++ b/code/game/gamemodes/mixed/incursion.dm @@ -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 diff --git a/code/game/gamemodes/mixed/spyvspy.dm b/code/game/gamemodes/mixed/spyvspy.dm new file mode 100644 index 00000000000..983ccb716a5 --- /dev/null +++ b/code/game/gamemodes/mixed/spyvspy.dm @@ -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 diff --git a/code/game/gamemodes/mixed/towerdefense.dm b/code/game/gamemodes/mixed/towerdefense.dm new file mode 100644 index 00000000000..54cbef3ec28 --- /dev/null +++ b/code/game/gamemodes/mixed/towerdefense.dm @@ -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 diff --git a/code/modules/mob/language/outsider.dm b/code/modules/mob/language/outsider.dm index db0da9751ea..b22dc5a6da4 100644 --- a/code/modules/mob/language/outsider.dm +++ b/code/modules/mob/language/outsider.dm @@ -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 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 195b183e25c..7d2a9166132 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -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) diff --git a/code/modules/mob/living/carbon/carbon_powers.dm b/code/modules/mob/living/carbon/carbon_powers.dm index 150775ed96d..6ec908e4606 100644 --- a/code/modules/mob/living/carbon/carbon_powers.dm +++ b/code/modules/mob/living/carbon/carbon_powers.dm @@ -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, "You withdraw your probosci, releasing control of [B.host_brain]") - - 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, "ERROR NO BORER OR BRAINMOB DETECTED IN THIS MOB, THIS IS A BUG !") - -//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, "You send a punishing spike of psychic agony lancing into your host's brain.") - - if (!can_feel_pain()) - to_chat(B.host_brain, "You feel a strange sensation as a foreign influence prods your mind.") - to_chat(src, "It doesn't seem to be as effective as you hoped.") - else - to_chat(B.host_brain, "Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!") - -/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, "Your host twitches and quivers as you rapidly excrete a larva from your sluglike body.") - visible_message("[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!") - 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 * diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 6d90a3c2c45..c93dee2e635 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -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 diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index c10c84a41da..c7bbf6b8145 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -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) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index aef988cec4d..01d68b29b6f 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -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", "[pick(psi_operancy_messages)]")) + 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 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/borer/borer.dm b/code/modules/mob/living/simple_animal/borer/borer.dm index f10bd4216cc..23e54d40af9 100644 --- a/code/modules/mob/living/simple_animal/borer/borer.dm +++ b/code/modules/mob/living/simple_animal/borer/borer.dm @@ -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, "You feel the soporific flow of sugar in your host's blood, lulling you into docility.") + 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, "You feel the soporific flow of sugar in your host's blood, lulling you into docility.") - 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, "You shake off your lethargy as the sugar leaves your host's blood.") + to_chat(host, span("notice", "You shake off your lethargy as the sugar leaves your host's blood.")) else - to_chat(src, "You shake off your lethargy as the sugar leaves your host's blood.") - 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, "You are feeling far too docile to continue controlling your host...") + 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 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/borer/borer_captive.dm b/code/modules/mob/living/simple_animal/borer/borer_captive.dm index f46efd9d449..dd145abcc56 100644 --- a/code/modules/mob/living/simple_animal/borer/borer_captive.dm +++ b/code/modules/mob/living/simple_animal/borer/borer_captive.dm @@ -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, "You begin doggedly resisting the parasite's control (this will take approximately sixty seconds).") - to_chat(B.host, "You feel the captive mind of [src] begin to resist your control.") - - spawn(rand(200,250)+B.host.getBrainLoss()) - if(!B || !B.controlling) return - - B.host.adjustBrainLoss(rand(5,10), 55) - to_chat(H, "With an immense exertion of will, you regain control of your body!") - to_chat(B.host, "You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you.") - 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 diff --git a/code/modules/mob/living/simple_animal/borer/borer_powers.dm b/code/modules/mob/living/simple_animal/borer/borer_powers.dm index 3812163a408..a288cf0ee16 100644 --- a/code/modules/mob/living/simple_animal/borer/borer_powers.dm +++ b/code/modules/mob/living/simple_animal/borer/borer_powers.dm @@ -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, "You are feeling far too docile to do that.") - 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, "Something slimy wiggles out of your ear and plops to the ground!") - to_chat(host, "As though waking from a dream, you shake off the insidious mind control of the brain worm. Your thoughts are your own again.") - - 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, "You can't affect synthetics.") + 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, "You are feeling far too docile to do that.") + to_chat(src, span("warning", "You are feeling far too docile to do that.")) return - to_chat(src, "It only takes a few moments to render the dead host brain down into a nutrient-rich slurry...") + 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, "You settle into the empty brainpan and begin to expand, fusing inextricably with the dead flesh of [H].") + 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, "You are feeling far too docile to do that.") + 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, "You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream.") - 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, "You can't affect synthetics.") + 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, "You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread.") - to_chat(M, "You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing.") + 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, "You are feeling far too docile to do that.") + 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, "You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system.") - to_chat(host, "You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours.") - 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("With a hideous, rattling moan, [src] shudders back to life!") + 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() \ No newline at end of file + 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", "Horrific, burning agony lances through you, ripping a soundless scream from your trapped mind!")) + +/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.")) diff --git a/code/modules/mob/living/simple_animal/borer/say.dm b/code/modules/mob/living/simple_animal/borer/say.dm index 294edc6f608..ff1a5e20028 100644 --- a/code/modules/mob/living/simple_animal/borer/say.dm +++ b/code/modules/mob/living/simple_animal/borer/say.dm @@ -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]\"") diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index 20d863f7f76..9940e77dd2e 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -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)) diff --git a/code/modules/organs/misc.dm b/code/modules/organs/misc.dm index 78a84f4bcf8..4b67999ef30 100644 --- a/code/modules/organs/misc.dm +++ b/code/modules/organs/misc.dm @@ -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 diff --git a/code/modules/psionics/faculties/coercion.dm b/code/modules/psionics/faculties/coercion.dm index 4df3bc7fd52..10f93a3aef0 100644 --- a/code/modules/psionics/faculties/coercion.dm +++ b/code/modules/psionics/faculties/coercion.dm @@ -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(.) diff --git a/code/modules/psionics/faculties/psychokinesis.dm b/code/modules/psionics/faculties/psychokinesis.dm index cf74026e174..cc64c275387 100644 --- a/code/modules/psionics/faculties/psychokinesis.dm +++ b/code/modules/psionics/faculties/psychokinesis.dm @@ -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(.) diff --git a/code/modules/surgery/implant.dm b/code/modules/surgery/implant.dm index 1a1cb5c5a55..d1c85daee16 100644 --- a/code/modules/surgery/implant.dm +++ b/code/modules/surgery/implant.dm @@ -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) diff --git a/html/changelogs/mattatlasgeeves-gamemodeboogaloo.yml b/html/changelogs/mattatlasgeeves-gamemodeboogaloo.yml new file mode 100644 index 00000000000..bfdab2a2c6f --- /dev/null +++ b/html/changelogs/mattatlasgeeves-gamemodeboogaloo.yml @@ -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!"