diff --git a/code/modules/client/preference_setup/loadout/items/augments.dm b/code/modules/client/preference_setup/loadout/items/augments.dm index 0f6214b91b4..4f8f073e776 100644 --- a/code/modules/client/preference_setup/loadout/items/augments.dm +++ b/code/modules/client/preference_setup/loadout/items/augments.dm @@ -262,3 +262,12 @@ allowed_roles = list("Physician", "Surgeon", "Pharmacist", "First Responder", "Psychiatrist", "Medical Intern", "Medical Personnel", "Security Officer", "Warden", "Security Cadet", "Investigator", "Security Personnel", "Corporate Liaison", "Assistant", "Off-Duty Crew Member") faction = "Private Military Contracting Group" cost = 1 + +/datum/gear/augment/vekatak_hivenet + display_name = "Ve'katak Phalanx Hivenet receiver" + description = "An experimental augment developed for the non-Vaurca of the Ve'katak Phalanx, allowing them to recieve Hivenet transmissions and send preset messages." + path = /obj/item/organ/internal/augment/language/vekatak + whitelisted = list(SPECIES_HUMAN, SPECIES_HUMAN_OFFWORLD, SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI, SPECIES_SKRELL, SPECIES_SKRELL_AXIORI, SPECIES_IPC, SPECIES_IPC_G1, SPECIES_IPC_G2, SPECIES_IPC_XION, SPECIES_IPC_ZENGHU, SPECIES_IPC_BISHOP, SPECIES_IPC_SHELL, SPECIES_UNATHI) + faction = "Private Military Contracting Group" + cost = 4 + allowed_roles = list("Physician", "Surgeon", "Pharmacist", "First Responder", "Psychiatrist", "Medical Intern", "Medical Personnel", "Security Officer", "Warden", "Security Cadet", "Investigator", "Security Personnel", "Corporate Liaison", "Assistant", "Off-Duty Crew Member") diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index c29b329fecb..ef1ae0567b5 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -265,9 +265,13 @@ to_chat(player, encrypted_msg) continue var/obj/item/organ/internal/vaurca/neuralsocket/listener_socket = listener_human.internal_organs_by_name[BP_NEURAL_SOCKET] + var/obj/item/organ/internal/augment/language/vekatak/receiver = listener_human.internal_organs_by_name[BP_AUG_LANGUAGE] if(!listener_socket || listener_socket.decryption_key != speaker_encryption_key) to_chat(player, encrypted_msg) continue + if (!receiver || receiver.decryption_key != speaker_encryption_key) + to_chat(player, encrypted_msg) + continue to_chat(player, msg) /datum/language/bug/format_message(message, verb, speaker_mask) @@ -301,6 +305,10 @@ return 0 if(M.internal_organs_by_name[BP_NEURAL_SOCKET] && (GLOB.all_languages[LANGUAGE_VAURCA] in M.languages)) return 1 + if(M.internal_organs_by_name[BP_AUG_LANGUAGE]) + var/obj/item/organ/internal/augment/language/vekatak/V = M.internal_organs_by_name[BP_AUG_LANGUAGE] + if(istype(V) && (GLOB.all_languages[LANGUAGE_VAURCA] in M.languages)) + return 1 if(M.internal_organs_by_name["blackkois"]) return 1 @@ -321,11 +329,17 @@ /datum/language/bug/check_speech_restrict(var/mob/speaker) var/mob/living/carbon/human/H = speaker var/obj/item/organ/internal/vaurca/neuralsocket/S = H.internal_organs_by_name[BP_NEURAL_SOCKET] + var/obj/item/organ/internal/augment/language/vekatak/V = H.internal_organs_by_name[BP_AUG_LANGUAGE] //Black k'ois zombies don't have neural sockets but need to talk, hence check if the socket exists, or it will runtime for them if(S && (S.muted || S.disrupted)) to_chat(speaker, SPAN_WARNING("You have been muted over the Hivenet!")) return FALSE + + if(istype(V)) + if(!V.transmitting || V.disrupted || V.muted) + to_chat(speaker, SPAN_WARNING("Your implant cannot transmit over the Hivenet!")) + return FALSE else return TRUE diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index 67207f5def3..16f4d61657c 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -1415,13 +1415,32 @@ var/player_surname = player_fullname[2] if(player_surname == surname || HAS_TRAIT(src, TRAIT_ORIGIN_ELECTRONIC_WARFARE)) LAZYADD(available_vaurca, player) - var/mob/living/carbon/human/target = input(src, "Select a Vaurca to ban.", "Hivenet Ban") as null|anything in available_vaurca - if(!target || !isvaurca(target)) + if(player.internal_organs_by_name[BP_AUG_LANGUAGE]) + var/obj/item/organ/internal/augment/language/vekatak/V = player.internal_organs_by_name[BP_AUG_LANGUAGE] + if(istype(V)) + LAZYADD(available_vaurca, player) + var/mob/living/carbon/human/target = tgui_input_list(src, "Select a target to ban", "Hivenet Ban", available_vaurca) + if(!target) return var/obj/item/organ/internal/vaurca/neuralsocket/S = target.internal_organs_by_name[BP_NEURAL_SOCKET] + var/obj/item/organ/internal/augment/language/vekatak/V = target.internal_organs_by_name[BP_AUG_LANGUAGE] var/list/target_fullname = splittext(target.name, " ") - var/target_surname = target_fullname[2] - to_chat(src, target.real_name) + var/target_surname = target_fullname[target_fullname.len] + if(istype(V)) + if(!(GLOB.all_languages[LANGUAGE_VAURCA] in target.languages) && V.banned) + target.add_language(LANGUAGE_VAURCA) + V.banned = FALSE + to_chat(src, SPAN_NOTICE("You extend your will, restoring [target]'s connection to the Hivenet. Hopefully they will be better-behaved in future.")) + to_chat(target, SPAN_NOTICE("You feel your implant reactivate, as your limited connection to the Hivenet is restored.")) + return + else if((GLOB.all_languages[LANGUAGE_VAURCA] in target.languages) && !V.banned) + to_chat(src, SPAN_NOTICE("You extend your will, severing [target]'s connection to the Hivenet. Perhaps now they will learn their lesson.")) + to_chat(target, SPAN_WARNING("You feel your implant's connection to the Hivenet shut off, as [src]'s will severs it.")) + target.remove_language(LANGUAGE_VAURCA) + V.banned = TRUE + host.last_action = world.time + 1 MINUTES + return + if(!(GLOB.all_languages[LANGUAGE_VAURCA] in target.languages) && S.banned) target.add_language(LANGUAGE_VAURCA) S.banned = FALSE @@ -1505,16 +1524,16 @@ var/player_surname = player_fullname[2] if(player_surname == surname || HAS_TRAIT(src, TRAIT_ORIGIN_ELECTRONIC_WARFARE)) LAZYADD(available_vaurca, player) - var/mob/living/carbon/human/target = input(src, "Select a Vaurca to void.", "Hivenet Void") as null|anything in available_vaurca + var/mob/living/carbon/human/target = tgui_input_list(src, "Select a target to void", "Hivenet Void", available_vaurca) if(!target || !isvaurca(target)) return - var/choice = alert(src, "Are you sure you want to void [target]? This cannot be undone!", "Void User?", "Proceed", "Cancel") + var/choice = tgui_alert(src, "Are you sure you want to void [target]? This cannot be undone!", "Void User?", list("Proceed", "Cancel")) if(choice == "Cancel") return msg_admin_attack("[key_name_admin(src)] attempted to void [key_name_admin(target)]'s neural socket! (JMP)",ckey=key_name(src),ckey_target=key_name(target)) var/obj/item/organ/internal/vaurca/neuralsocket/S = target.internal_organs_by_name[BP_NEURAL_SOCKET] var/list/target_fullname = splittext(target.name, " ") - var/target_surname = target_fullname[2] + var/target_surname = target_fullname[target_fullname.len] if(target_surname == surname) if(S.shielded) to_chat(src, SPAN_WARNING("You feel a sudden pain in your neural socket as you are repelled by [target]'s countermeasures!")) @@ -1573,15 +1592,35 @@ for(var/mob/living/carbon/human/player in (GLOB.human_mob_list - src)) if(isvaurca(player) && player.internal_organs_by_name[BP_NEURAL_SOCKET]) var/list/player_fullname = splittext(player.name, " ") - var/player_surname = player_fullname[2] + var/player_surname = player_fullname[player_fullname.len] if(player_surname == surname || HAS_TRAIT(src, TRAIT_ORIGIN_ELECTRONIC_WARFARE)) LAZYADD(available_vaurca, player) - var/mob/living/carbon/human/target = input(src, "Select a Vaurca to mute.", "Hivenet Mute") as null|anything in available_vaurca - if(!target || !isvaurca(target)) + if(player.internal_organs_by_name[BP_AUG_LANGUAGE]) + var/obj/item/organ/internal/augment/language/vekatak/V = player.internal_organs_by_name[BP_AUG_LANGUAGE] + if(istype(V)) + LAZYADD(available_vaurca, player) + + var/mob/living/carbon/human/target = tgui_input_list(src, "Select a target to mute", "Hivenet Mute", available_vaurca) + if(!target) return var/obj/item/organ/internal/vaurca/neuralsocket/S = target.internal_organs_by_name[BP_NEURAL_SOCKET] + var/obj/item/organ/internal/augment/language/vekatak/V = target.internal_organs_by_name[BP_AUG_LANGUAGE] var/list/target_fullname = splittext(target.name, " ") - var/target_surname = target_fullname[2] + var/target_surname = target_fullname[target_fullname.len] + if(istype(V)) + if(V.banned) + to_chat(src, SPAN_NOTICE("[target] is already banned from the Hivenet. Muting them would be pointless.")) + return + if(V.muted) + V.muted = FALSE + to_chat(src, SPAN_NOTICE("You extend your will, restoring [target]'s ability to speak over the Hivenet. Hopefully it will be better-behaved in future.")) + to_chat(target, SPAN_NOTICE("You feel [src]'s restriction on your implant lifted, allowing you to transmit over the Hivenet once more.")) + return + to_chat(src, SPAN_NOTICE("You extend your will, disabling [target]'s Hivenet implant.")) + to_chat(target, SPAN_WARNING("You feel [src]'s will enter your mind, disabling your implant's transmission function. Though you can still receive Hivenet broadcasts, you are incapable of transmitting.")) + V.muted = TRUE + host.last_action = world.time + 5 MINUTES + return if(S.banned) to_chat(src, SPAN_NOTICE("[target] is already banned from the Hivenet. Muting them would be pointless.")) return @@ -1649,14 +1688,34 @@ set category = "Hivenet" var/obj/item/organ/internal/vaurca/neuralsocket/S = src.internal_organs_by_name[BP_NEURAL_SOCKET] - if(!src.can_hivenet()) + var/obj/item/organ/internal/augment/language/vekatak/V = src.internal_organs_by_name[BP_AUG_LANGUAGE] + if(src.stat != CONSCIOUS) + to_chat(src, SPAN_WARNING("You must be conscious to use this ability!")) return - if(S.decryption_key) - S.decryption_key = null - to_chat(src, SPAN_NOTICE("Your Hivenet decryption key has been reset.")) + + if(!(GLOB.all_languages[LANGUAGE_VAURCA] in src.languages)) + to_chat(src, SPAN_DANGER("Your mind is dark, unable to communicate with the Hive.")) return - S.decryption_key = input(src, "Enter a new decryption key for Hivenet messages.", "Hivenet Decryption") as text - to_chat(src, SPAN_NOTICE("Your Hivenet decryption key has been set to [S.decryption_key].")) + + if(!istype(S) && !istype(V)) + to_chat(src, SPAN_WARNING("You do not have a functional connection to the Hivenet!")) + return + + if(istype(S)) + if(S.decryption_key) + S.decryption_key = null + to_chat(src, SPAN_NOTICE("Your Hivenet decryption key has been reset.")) + return + S.decryption_key = tgui_input_text(src, "Enter a new decryption key for Hivenet messages", "Hivenet Decryption") + to_chat(src, SPAN_NOTICE("Your Hivenet decryption key has been set to [S.decryption_key].")) + + else if(istype(V)) + if(V.decryption_key) + V.decryption_key = null + to_chat(src, SPAN_NOTICE("Your Hivenet decryption key has been reset.")) + return + V.decryption_key = tgui_input_text(src, "Enter a new decryption key for Hivenet messages", "Hivenet Decryption") + to_chat(src, SPAN_NOTICE("Your Hivenet decryption key has been set to [V.decryption_key].")) /mob/living/carbon/human/proc/hivenet_encrypt() set name = "Set Hivenet Encryption" @@ -1669,7 +1728,7 @@ S.encryption_key = null to_chat(src, SPAN_NOTICE("Your Hivenet encryption key has been reset.")) return - S.encryption_key = input(src, "Enter a new encryption key for Hivenet messages.", "Hivenet Decryption") as text + S.encryption_key = tgui_input_text(src, "Enter a new encryption key for Hivenet messages", "Hivenet Encryption") to_chat(src, SPAN_NOTICE("Your Hivenet encryption key has been set to [S.encryption_key].")) /mob/living/carbon/human/proc/hivenet_decrypt() @@ -1716,25 +1775,35 @@ reset_view(0) return for(var/mob/living/carbon/human/player in (GLOB.human_mob_list - src)) + if(player.stat != CONSCIOUS) + continue if(isvaurca(player) && player.internal_organs_by_name[BP_NEURAL_SOCKET]) - if(player.stat != CONSCIOUS) - continue LAZYADD(available_vaurca, player) - var/mob/living/carbon/human/target = input(src, "Select a Vaurca to observe.", "Hivenet Remote Observation") as null|anything in available_vaurca - if(!target || !isvaurca(target)) + if(player.internal_organs_by_name[BP_AUG_LANGUAGE]) + var/obj/item/organ/internal/augment/language/vekatak/V = player.internal_organs_by_name[BP_AUG_LANGUAGE] + if(istype(V)) + LAZYADD(available_vaurca, player) + var/mob/living/carbon/human/target = tgui_input_list(src, "Select a Vaurca to observe.", "Hivenet Remote Observation", available_vaurca) + if(!target) remoteview_target = null reset_view(0) return + var/obj/item/organ/internal/augment/language/vekatak/V = target.internal_organs_by_name[BP_AUG_LANGUAGE] + if(istype(V)) + to_chat(src, SPAN_NOTICE("You extend your mind into the Hivenet, accessing [target]'s senses. Use this verb again to cancel.")) + remoteview_target = target + reset_view(target) + return var/obj/item/organ/internal/vaurca/neuralsocket/S = target.internal_organs_by_name[BP_NEURAL_SOCKET] var/list/target_fullname = splittext(target.name, " ") - var/target_surname = target_fullname[2] + var/target_surname = target_fullname[target_fullname.len] if(target_surname == surname && !S.shielded) to_chat(src, SPAN_NOTICE("You extend your mind into the Hivenet, accessing [target]'s senses. Use this verb again to cancel.")) remoteview_target = target reset_view(target) else host.last_action = world.time + 5 MINUTES - var/choice = alert(target, "[src] is attempting to access your senses. Do you wish to allow this?", "Hivenet Remote Observation", "Deny", "Allow") + var/choice = tgui_alert(target, "[src] is attempting to access your senses. Do you wish to allow this?", "Hivenet Remote Observation", list("Deny", "Allow")) if(choice == "Allow") to_chat(src, SPAN_NOTICE("You extend your mind into the Hivenet, accessing [target]'s senses. Use this verb again to cancel.")) remoteview_target = target @@ -1742,7 +1811,7 @@ if(choice == "Deny") if(HAS_TRAIT(src, TRAIT_ORIGIN_ELECTRONIC_WARFARE)) - var/hijack = alert(src, "[target] has denied your access request. Attempt a hijack?", "Hijack Hivenet Senses", "No", "Yes") + var/hijack = tgui_alert(src, "[target] has denied your access request. Attempt a hijack?", "Hijack Hivenet Senses", list("No", "Yes")) if(hijack == "Yes") if(prob(40) && !S.shielded) to_chat(src, SPAN_NOTICE("You extend your mind into the Hivenet, accessing [target]'s senses. Use this verb again to cancel.")) @@ -1777,15 +1846,28 @@ for(var/mob/living/carbon/human/player in (GLOB.human_mob_list - src)) if(isvaurca(player) && player.internal_organs_by_name[BP_NEURAL_SOCKET]) var/list/player_fullname = splittext(player.name, " ") - var/player_surname = player_fullname[2] + var/player_surname = player_fullname[player_fullname.len] if(player_surname == surname || HAS_TRAIT(src, TRAIT_ORIGIN_ELECTRONIC_WARFARE)) LAZYADD(available_vaurca, player) - var/mob/living/carbon/human/target = input(src, "Select a Vaurca to shock.", "Neural Shock") as null|anything in available_vaurca - if(!target || !isvaurca(target)) + if(player.internal_organs_by_name[BP_AUG_LANGUAGE]) + var/obj/item/organ/internal/augment/language/vekatak/V = player.internal_organs_by_name[BP_AUG_LANGUAGE] + if(istype(V)) + LAZYADD(available_vaurca, player) + var/mob/living/carbon/human/target = tgui_input_list(src, "Select a target to shock", "Neural Shock", available_vaurca) + if(!target) + return + var/obj/item/organ/internal/augment/language/vekatak/V = target.internal_organs_by_name[BP_AUG_LANGUAGE] + if(istype(V)) + to_chat(src, SPAN_WARNING("You lash out over the Hivenet, delivering a neural shock to [target]!")) + to_chat(target, SPAN_DANGER("You feel [src]'s will strike out at you, pain burning inside your head!")) + target.adjustHalLoss(15) + target.flash_pain(15) + target.adjustBrainLoss(10) + host.last_action = world.time + 5 MINUTES return var/obj/item/organ/internal/vaurca/neuralsocket/S = target.internal_organs_by_name[BP_NEURAL_SOCKET] var/list/target_fullname = splittext(target.name, " ") - var/target_surname = target_fullname[2] + var/target_surname = target_fullname[target_fullname.len] if(!istype(S) || S.is_broken()) to_chat(src, SPAN_WARNING("The target must have a functional neural socket!")) return @@ -1832,10 +1914,9 @@ if(HAS_TRAIT(src, TRAIT_ORIGIN_ELECTRONIC_WARFARE)) max = 5 if(length(host.shielded_sockets)) - var/choice = alert(src, "Do you wish to remove your protection from a Vaurca?", "Hivenet Defensive Lattice", "No", "Yes") - to_chat(src, SPAN_NOTICE("You chose [choice]")) + var/choice = tgui_alert(src, "Do you wish to remove your protection from a Vaurca?", "Hivenet Defensive Lattice", list("No", "Yes")) if(choice == "Yes") - var/mob/living/carbon/human/H = input(src, "Select a Vaurca to remove your defenses from.", "Hivenet Defensive Lattice", null) as anything in host.shielded_mobs + var/mob/living/carbon/human/H = tgui_input_list(src, "Select a Vaurca to remove your defenses from.", "Hivenet Defensive Lattice", host.shielded_mobs) var/obj/item/organ/internal/vaurca/neuralsocket/S = H.internal_organs_by_name[BP_NEURAL_SOCKET] to_chat(src, SPAN_NOTICE("You remove your protection from [H]'s neural socket.")) to_chat(H, SPAN_WARNING("You feel [src]'s protection vanish from you, leaving your neural socket exposed.")) @@ -1882,14 +1963,30 @@ continue if(isvaurca(player) && player.internal_organs_by_name[BP_NEURAL_SOCKET]) LAZYADD(available_vaurca, player) + if(player.internal_organs_by_name[BP_AUG_LANGUAGE]) + var/obj/item/organ/internal/augment/language/vekatak/V = player.internal_organs_by_name[BP_AUG_LANGUAGE] + if(istype(V)) + LAZYADD(available_vaurca, player) LAZYADD(available_vaurca, "Cancel") - var/mob/living/carbon/human/target = input(src, "Select a target to disrupt", "Disrupt Hivenet User", null) as anything in available_vaurca + var/mob/living/carbon/human/target = tgui_input_list(src, "Select a target to disrupt", "Hivenet Disrupt", available_vaurca) if(!istype(target)) return + var/obj/item/organ/internal/augment/language/vekatak/V = target.internal_organs_by_name[BP_AUG_LANGUAGE] + if(istype(V)) + if(prob(35)) + to_chat(src, SPAN_DANGER("Your disruption attempt fails, [target]'s countermeasures repelling your assault! You can feel their defenses spring to life, tracing your location!")) + to_chat(target, SPAN_DANGER("You feel a presence attempting to block your neural socket, but your countermeasures repel it! Analysing the attack, you sense that it came from [get_area(src)]!")) + return + to_chat(target, SPAN_DANGER("Suddenly, you feel an attack on your systems, blocking your neural socket's ability to transmit to the Hivenet!")) + V.disrupted = TRUE + V.disrupttime = world.time + 10 MINUTES + host.last_action = world.time + 5 MINUTES + return var/obj/item/organ/internal/vaurca/neuralsocket/S = target.internal_organs_by_name[BP_NEURAL_SOCKET] - if(prob(70) || S.shielded) + if(prob(60) || S.shielded) to_chat(src, SPAN_DANGER("Your disruption attempt fails, [target]'s countermeasures repelling your assault! You can feel their defenses spring to life, tracing your location!")) to_chat(target, SPAN_DANGER("You feel a presence attempting to block your neural socket, but your countermeasures repel it! Analysing the attack, you sense that it came from [get_area(src)]!")) + return to_chat(target, SPAN_DANGER("Suddenly, you feel an attack on your systems, blocking your neural socket's ability to transmit to the Hivenet!")) S.disrupted = TRUE S.disrupttime = world.time + 10 MINUTES @@ -1909,7 +2006,7 @@ continue if(isvaurca(player) && player.internal_organs_by_name[BP_NEURAL_SOCKET]) LAZYADD(available_vaurca, player) - var/mob/living/carbon/human/target = input(src, "Select a target to shock", "Neural Shock User", null) as anything in available_vaurca + var/mob/living/carbon/human/target = tgui_input_list(src, "Select a target to shock", "Neural Shock", available_vaurca) if(!istype(target)) to_chat(src, SPAN_WARNING("Invalid target!")) return @@ -1954,15 +2051,15 @@ if(player.stat != CONSCIOUS) continue LAZYADD(available_vaurca, player) - var/mob/living/carbon/human/target = input(src, "Select a Vaurca to observe.", "Hivenet Sensory Hijack") as null|anything in available_vaurca + var/mob/living/carbon/human/target = tgui_input_list(src, "Select a target to observe", "Hivenet Sensory Hijack", available_vaurca) if(!target || !isvaurca(target)) remoteview_target = null reset_view(0) return var/obj/item/organ/internal/vaurca/neuralsocket/S = target.internal_organs_by_name[BP_NEURAL_SOCKET] - var/stealth = alert(src, "Do you wish to ask your target's permission?", "Hivenet Sensory Hijack", "No", "Yes") + var/stealth = tgui_alert(src, "Do you wish to ask your target's permission?", "Hivenet Sensory Hijack", list("No", "Yes")) if(stealth == "Yes") - var/allowed = alert(target, "Someone is attempting to access your senses through the Hivenet. Do you wish to allow them?", "Hivenet Sensory Access", "Deny", "Allow") + var/allowed = tgui_alert(target, "Someone is attempting to access your senses through the Hivenet. Do you wish to allow them?", "Hivenet Sensory Access", list("Allow", "Deny")) if(allowed == "Allow") to_chat(src, SPAN_NOTICE("You extend your mind into the Hivenet, accessing [target]'s senses. Use this verb again to cancel.")) remoteview_target = target @@ -2095,6 +2192,44 @@ msg_admin_attack("[key_name_admin(src)] infected [key_name_admin(H)] with black k'ois! (JMP)",ckey=key_name(src),ckey_target=key_name(H)) +/mob/living/carbon/human/proc/phalanx_transmit() + set name = "Phalanx Hivenet Transmission" + set desc = "Make a preset transmission over the Hivenet." + set category = "Hivenet" + + var/obj/item/organ/internal/augment/language/vekatak/V = src.internal_organs_by_name[BP_AUG_LANGUAGE] + var/list/messages = list( + "I remain operational.", + "Message received.", + "Order completed.", + "Cannot complete order.", + "I am on standby.", + "Minor damage registered.", + "Damage registered", + "Critical damage registered", + "Assistance required at my location.", + "Hostiles sighted at my location.", + "Location clear of threats." + ) + if(src.stat != CONSCIOUS) + to_chat(src, SPAN_WARNING("You are in no state to do that!")) + return + + if(!(GLOB.all_languages[LANGUAGE_VAURCA] in src.languages) || !(istype(V))) + to_chat(src, SPAN_WARNING("You are not connected to the Hivenet!")) + return + + if(within_jamming_range(src)) + to_chat(src, SPAN_WARNING("You attempt to reach the Hivenet, but find nothing!")) + return + + var/message = input("What message do you wish to transmit?","Choose a message") as null|anything in messages + if(!message) + return + V.transmitting = TRUE + say(",9[message]") + V.transmitting = FALSE + /mob/living/carbon/human/proc/hivenet_manifest() set name = "Hivenet Manifest" set desc = "Get a list of all vaurca currently on the Hivenet." diff --git a/code/modules/organs/subtypes/augment/augments/language_processor.dm b/code/modules/organs/subtypes/augment/augments/language_processor.dm index 33833dfffa3..9c1bcd29927 100644 --- a/code/modules/organs/subtypes/augment/augments/language_processor.dm +++ b/code/modules/organs/subtypes/augment/augments/language_processor.dm @@ -8,6 +8,8 @@ var/list/augment_languages = list() /// A list of languages that get added when it's installed. used to remove languages later. don't touch this. var/list/added_languages = list() + /// A list of language-related verbs granted by the augment. + var/list/granted_verbs = list() /obj/item/organ/internal/augment/language/replaced(var/mob/living/carbon/human/target, obj/item/organ/external/affected) . = ..() @@ -15,11 +17,13 @@ if(!(language in target.languages)) target.add_language(language) added_languages += language + add_verb(target, granted_verbs) /obj/item/organ/internal/augment/language/removed(var/mob/living/carbon/human/target, mob/living/user) for(var/language in added_languages) target.remove_language(language) added_languages = list() + remove_verb(target, granted_verbs) ..() /obj/item/organ/internal/augment/language/emp_act() @@ -99,3 +103,36 @@ SPECIES_VAURCA_WARRIOR, SPECIES_VAURCA_WORKER, ) + +/obj/item/organ/internal/augment/language/vekatak + name = "Ve'katak Phalanx Hivenet receiver" + icon_state = "phalanx_hivenet" + dead_icon = "phalanx_hivenet_broken" + on_mob_icon = 'icons/mob/human_races/augments_external.dmi' + augment_languages = list(LANGUAGE_VAURCA) + granted_verbs = list(/mob/living/carbon/human/proc/hivenet_recieve, /mob/living/carbon/human/proc/phalanx_transmit) + var/decryption_key + var/banned = FALSE + var/muted = FALSE + var/transmitting = FALSE + var/disrupted = FALSE + var/disrupttime = 0 + +/obj/item/organ/internal/augment/language/vekatak/process() + . = ..() + if(disrupted) + if(disrupttime > world.time) + disrupttime-- + else + disrupted = FALSE + +/obj/item/organ/internal/augment/language/vekatak/emp_act() + . = ..() + for(var/language in added_languages) + if(prob(25)) + owner.remove_language(language) + owner.set_default_language(pick(owner.languages)) + to_chat(owner, SPAN_DANGER("You feel thousands of voices, all clamoring inside your mind!")) + owner.adjustHalLoss(15) + owner.flash_pain(15) + owner.adjustBrainLoss(5) diff --git a/html/changelogs/RustingWithYou - phalanx.yml b/html/changelogs/RustingWithYou - phalanx.yml new file mode 100644 index 00000000000..d7759eecb45 --- /dev/null +++ b/html/changelogs/RustingWithYou - phalanx.yml @@ -0,0 +1,41 @@ +################################ +# 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: RustingWithYou + +# 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: "Adds a Ve'katak Phalanx Hivenet receiver augment." diff --git a/icons/mob/human_races/augments_external.dmi b/icons/mob/human_races/augments_external.dmi index 90f9dcdb822..a33b26af06f 100644 Binary files a/icons/mob/human_races/augments_external.dmi and b/icons/mob/human_races/augments_external.dmi differ diff --git a/icons/obj/organs/augments.dmi b/icons/obj/organs/augments.dmi index 74c17efff6d..9288db8f4c6 100644 Binary files a/icons/obj/organs/augments.dmi and b/icons/obj/organs/augments.dmi differ