From 7bb45f51ce8b5a85b54c741a52c17c9f4ecbe55a Mon Sep 17 00:00:00 2001 From: Ling Date: Mon, 9 Dec 2019 14:22:25 +0100 Subject: [PATCH] Revert "Revert "Ninja jail is no longer permanent (#7178)" (#7287)" This reverts commit edc547753496fc8b61bf9cbb36fb5449ee30a353. --- code/__DEFINES/traits.dm | 1 - .../items/implants/implant_explosive.dm | 2 +- code/modules/antagonists/ninja/ninja.dm | 27 + code/modules/mob/living/emote.dm | 551 ++---------------- .../suit/n_suit_verbs/energy_net_nets.dm | 7 +- yogstation/code/modules/mob/living/emote.dm | 1 + 6 files changed, 84 insertions(+), 505 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 1534f86197a6..0ffee9b7bc5c 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -140,7 +140,6 @@ #define TRAIT_OIL_FRIED "oil_fried" #define TRAIT_SHELTERED "sheltered" - //non-mob traits #define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it diff --git a/code/game/objects/items/implants/implant_explosive.dm b/code/game/objects/items/implants/implant_explosive.dm index d2748567979e..97912e4d1e72 100644 --- a/code/game/objects/items/implants/implant_explosive.dm +++ b/code/game/objects/items/implants/implant_explosive.dm @@ -27,7 +27,6 @@ return dat /obj/item/implant/explosive/activate(cause) - . = ..() if(!cause || !imp_in || active) return 0 if(cause == "action_button" && !popup) @@ -41,6 +40,7 @@ weak = round(weak) to_chat(imp_in, "You activate your [name].") active = TRUE + . = ..() var/turf/boomturf = get_turf(imp_in) message_admins("[ADMIN_LOOKUPFLW(imp_in)] has activated their [name] at [ADMIN_VERBOSEJMP(boomturf)], with cause of [cause].") //If the delay is short, just blow up already jeez diff --git a/code/modules/antagonists/ninja/ninja.dm b/code/modules/antagonists/ninja/ninja.dm index 9352e918779b..c40ff62dcd2a 100644 --- a/code/modules/antagonists/ninja/ninja.dm +++ b/code/modules/antagonists/ninja/ninja.dm @@ -1,3 +1,5 @@ +GLOBAL_LIST_EMPTY(ninja_capture) + /datum/antagonist/ninja name = "Ninja" antagpanel_category = "Ninja" @@ -15,10 +17,16 @@ /datum/antagonist/ninja/apply_innate_effects(mob/living/mob_override) var/mob/living/M = mob_override || owner.current + for(var/obj/item/implant/explosive/E in M.implants) + if(E) + RegisterSignal(E, COMSIG_IMPLANT_ACTIVATED, .proc/on_death) update_ninja_icons_added(M) /datum/antagonist/ninja/remove_innate_effects(mob/living/mob_override) var/mob/living/M = mob_override || owner.current + for(var/obj/item/implant/explosive/E in M.implants) + if(E) + UnregisterSignal(M, COMSIG_IMPLANT_ACTIVATED, .proc/on_death) update_ninja_icons_removed(M) /datum/antagonist/ninja/proc/equip_space_ninja(mob/living/carbon/human/H = owner.current) @@ -125,6 +133,24 @@ equip_space_ninja(owner.current) . = ..() +/datum/antagonist/ninja/proc/on_death() + for(var/mob/L in GLOB.ninja_capture) + if(get_area(L) == GLOB.areas_by_type[/area/centcom/holding]) + if(!L) + continue + var/atom/movable/target = L + if(isobj(L.loc)) + target = L.loc + target.forceMove(get_turf(pick(GLOB.generic_event_spawns))) + if(isliving(L)) + var/mob/living/LI = L + LI.Knockdown(120) + LI.blind_eyes(10) + to_chat(L, "You lose your footing as the dojo suddenly disappears. You're free!") + playsound(L, 'sound/effects/phasein.ogg', 25, 1) + playsound(L, 'sound/effects/sparks2.ogg', 50, 1) + GLOB.ninja_capture -= L + /datum/antagonist/ninja/admin_add(datum/mind/new_owner,mob/admin) var/adj switch(input("What kind of ninja?", "Ninja") as null|anything in list("Random","Syndicate","Nanotrasen","No objectives")) @@ -159,3 +185,4 @@ var/datum/atom_hud/antag/ninjahud = GLOB.huds[ANTAG_HUD_NINJA] ninjahud.leave_hud(ninja) set_antag_hud(ninja, null) + diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 74f33179be40..4057a8c9d662 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -1,522 +1,73 @@ - -/* EMOTE DATUMS */ -/datum/emote/living - mob_type_allowed_typecache = /mob/living - mob_type_blacklist_typecache = list(/mob/living/simple_animal/slime, /mob/living/brain) - -/datum/emote/living/blush - key = "blush" - key_third_person = "blushes" - message = "blushes." - -/datum/emote/living/bow - key = "bow" - key_third_person = "bows" - message = "bows." - message_param = "bows to %t." +/datum/emote/living/raisehand + key = "highfive" + key_third_person = "highfives" restraint_check = TRUE -/datum/emote/living/burp - key = "burp" - key_third_person = "burps" - message = "burps." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/choke - key = "choke" - key_third_person = "chokes" - message = "chokes!" - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/cross - key = "cross" - key_third_person = "crosses" - message = "crosses their arms." - restraint_check = TRUE - -/datum/emote/living/chuckle - key = "chuckle" - key_third_person = "chuckles" - message = "chuckles." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/collapse - key = "collapse" - key_third_person = "collapses" - message = "collapses!" - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/collapse/run_emote(mob/user, params, type_override, intentional) - . = ..() - if(. && isliving(user)) - var/mob/living/L = user - L.Unconscious(40) - -/datum/emote/living/cough - key = "cough" - key_third_person = "coughs" - message = "coughs!" - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/cough/can_run_emote(mob/user, status_check = TRUE , intentional) +/datum/emote/living/raisehand/run_emote(mob/user, params) . = ..() - if(HAS_TRAIT(user, TRAIT_SOOTHED_THROAT)) - return FALSE + var/obj/item/highfive/N = new(user) + if(user.put_in_hands(N)) + to_chat(user, "You raise your hand for a high-five.") + else + qdel(N) + to_chat(user, "You don't have any free hands to high-five with.") -/datum/emote/living/dance - key = "dance" - key_third_person = "dances" - message = "dances around happily." +/datum/emote/living/pose + key = "pose" + key_third_person = "poses" + message = "strikes a pose!" restraint_check = TRUE -/datum/emote/living/deathgasp - key = "deathgasp" - key_third_person = "deathgasps" - message = "seizes up and falls limp, their eyes dead and lifeless..." - message_robot = "shudders violently for a moment before falling still, its eyes slowly darkening." - message_AI = "lets out a flurry of sparks, its screen flickering as its systems slowly halt." - message_alien = "lets out a waning guttural screech, green blood bubbling from its maw..." - message_larva = "lets out a sickly hiss of air and falls limply to the floor..." - message_monkey = "lets out a faint chimper as it collapses and stops moving..." - message_simple = "stops moving..." - stat_allowed = UNCONSCIOUS - -/datum/emote/living/deathgasp/run_emote(mob/user, params, type_override, intentional) - var/mob/living/simple_animal/S = user - if(istype(S) && S.deathmessage) - message_simple = S.deathmessage - . = ..() - message_simple = initial(message_simple) - if(. && user.deathsound) - if(isliving(user)) - var/mob/living/L = user - if(!L.can_speak_vocal() || L.oxyloss >= 50) - return //stop the sound if oxyloss too high/cant speak - playsound(user, user.deathsound, 200, TRUE, TRUE) - -/datum/emote/living/drool - key = "drool" - key_third_person = "drools" - message = "drools." - -/datum/emote/living/faint - key = "faint" - key_third_person = "faints" - message = "faints." - -/datum/emote/living/faint/run_emote(mob/user, params, type_override, intentional) - . = ..() - if(. && isliving(user)) - var/mob/living/L = user - L.SetSleeping(200) - -/datum/emote/living/flap - key = "flap" - key_third_person = "flaps" - message = "flaps their wings." +/datum/emote/living/mpose + key = "mpose" + key_third_person = "mposes" + message = "strikes a menacing pose!" restraint_check = TRUE - var/wing_time = 20 -/datum/emote/living/flap/run_emote(mob/user, params, type_override, intentional) - . = ..() - if(. && ishuman(user)) - var/mob/living/carbon/human/H = user - var/open = FALSE - if(H.dna.features["wings"] != "None") - if("wingsopen" in H.dna.species.mutant_bodyparts) - open = TRUE - H.CloseWings() - else - H.OpenWings() - addtimer(CALLBACK(H, open ? /mob/living/carbon/human.proc/OpenWings : /mob/living/carbon/human.proc/CloseWings), wing_time) - -/datum/emote/living/flap/aflap - key = "aflap" - key_third_person = "aflaps" - message = "flaps their wings ANGRILY!" +/datum/emote/living/tpose + key = "tpose" + key_third_person = "tposes" + message = "strikes a T-pose!" restraint_check = TRUE - wing_time = 10 - -/datum/emote/living/frown - key = "frown" - key_third_person = "frowns" - message = "frowns." - -/datum/emote/living/gag - key = "gag" - key_third_person = "gags" - message = "gags." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/gasp - key = "gasp" - key_third_person = "gasps" - message = "gasps!" - emote_type = EMOTE_AUDIBLE - stat_allowed = UNCONSCIOUS - -/datum/emote/living/giggle - key = "giggle" - key_third_person = "giggles" - message = "giggles." - message_mime = "giggles silently!" - emote_type = EMOTE_AUDIBLE -/datum/emote/living/glare - key = "glare" - key_third_person = "glares" - message = "glares." - message_param = "glares at %t." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/grin - key = "grin" - key_third_person = "grins" - message = "grins." - -/datum/emote/living/groan - key = "groan" - key_third_person = "groans" - message = "groans!" - message_mime = "appears to groan!" - -/datum/emote/living/grimace - key = "grimace" - key_third_person = "grimaces" - message = "grimaces." - -/datum/emote/living/jump - key = "jump" - key_third_person = "jumps" - message = "jumps!" +/datum/emote/living/vpose + key = "vpose" + key_third_person = "vposes" + message = "strikes a valiant pose!" restraint_check = TRUE -/datum/emote/living/kiss - key = "kiss" - key_third_person = "kisses" - message = "blows a kiss." - message_param = "blows a kiss to %t." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/laugh - key = "laugh" - key_third_person = "laughs" - message = "laughs." - message_mime = "laughs silently!" - emote_type = EMOTE_AUDIBLE - vary = TRUE - -/datum/emote/living/laugh/can_run_emote(mob/living/user, status_check = TRUE , intentional) - . = ..() - if(. && iscarbon(user)) - var/mob/living/carbon/C = user - return !C.silent - -/datum/emote/living/laugh/get_sound(mob/living/user) - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.dna.species.id == "human" && (!H.mind || !H.mind.miming)) - if(user.gender == FEMALE) - return 'sound/voice/human/womanlaugh.ogg' - else - return pick('sound/voice/human/manlaugh1.ogg', 'sound/voice/human/manlaugh2.ogg') - -/datum/emote/living/look - key = "look" - key_third_person = "looks" - message = "looks." - message_param = "looks at %t." - -/datum/emote/living/nod - key = "nod" - key_third_person = "nods" - message = "nods." - message_param = "nods at %t." - -/datum/emote/living/point - key = "point" - key_third_person = "points" - message = "points." - message_param = "points at %t." +/datum/emote/living/wpose + key = "wpose" + key_third_person = "wposes" + message = "strikes a triumphant pose!" restraint_check = TRUE -/datum/emote/living/point/run_emote(mob/user, params, type_override, intentional) - message_param = initial(message_param) // reset - if(ishuman(user)) - var/mob/living/carbon/human/H = user - if(H.get_num_arms() == 0) - if(H.get_num_legs() != 0) - message_param = "tries to point at %t with a leg, falling down in the process!" - H.Paralyze(20) - else - message_param = "bumps [user.p_their()] head on the ground trying to motion towards %t." - H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) - ..() - -/datum/emote/living/pout - key = "pout" - key_third_person = "pouts" - message = "pouts." +/datum/emote/living/whistle + key = "whistle" + key_third_person = "whistles" + message = "whistles." emote_type = EMOTE_AUDIBLE -/datum/emote/living/scream - key = "scream" - key_third_person = "screams" - message = "screams." - message_mime = "acts out a scream!" +/datum/emote/living/iwhistle + key = "iwhistle" + key_third_person = "iwhistles" + message = "innocently whistles." emote_type = EMOTE_AUDIBLE - mob_type_blacklist_typecache = list(/mob/living/carbon/human) //Humans get specialized scream. -/datum/emote/living/scream/select_message_type(mob/user, intentional) - . = ..() - if(!intentional && isanimal(user)) - return "makes a loud and pained whimper." +/datum/emote/living/smirk + key = "smirk" + key_third_person = "smirks" + message = "smirks." -/datum/emote/living/scowl - key = "scowl" - key_third_person = "scowls" - message = "scowls." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/shake - key = "shake" - key_third_person = "shakes" - message = "shakes their head." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/shiver - key = "shiver" - key_third_person = "shiver" - message = "shivers." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/sigh - key = "sigh" - key_third_person = "sighs" - message = "sighs." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/sit - key = "sit" - key_third_person = "sits" - message = "sits down." - -/datum/emote/living/smile - key = "smile" - key_third_person = "smiles" - message = "smiles." - -/datum/emote/living/sneeze - key = "sneeze" - key_third_person = "sneezes" - message = "sneezes." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/smug - key = "smug" - key_third_person = "smugs" - message = "grins smugly." - -/datum/emote/living/sniff - key = "sniff" - key_third_person = "sniffs" - message = "sniffs." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/snore - key = "snore" - key_third_person = "snores" - message = "snores." - message_mime = "sleeps soundly." - emote_type = EMOTE_AUDIBLE - stat_allowed = UNCONSCIOUS - -/datum/emote/living/stare - key = "stare" - key_third_person = "stares" - message = "stares." - message_param = "stares at %t." - -/datum/emote/living/strech - key = "stretch" - key_third_person = "stretches" - message = "stretches their arms." - -/datum/emote/living/sulk - key = "sulk" - key_third_person = "sulks" - message = "sulks down sadly." - -/datum/emote/living/surrender - key = "surrender" - key_third_person = "surrenders" - message = "puts their hands on their head and falls to the ground, they surrender!" - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/surrender/run_emote(mob/user, params, type_override, intentional) - . = ..() - if(. && isliving(user)) - var/mob/living/L = user - L.Paralyze(200) - -/datum/emote/living/sway - key = "sway" - key_third_person = "sways" - message = "sways around dizzily." - -/datum/emote/living/tremble - key = "tremble" - key_third_person = "trembles" - message = "trembles in fear!" - -/datum/emote/living/twitch - key = "twitch" - key_third_person = "twitches" - message = "twitches violently." - -/datum/emote/living/twitch_s - key = "twitch_s" - message = "twitches." - -/datum/emote/living/wave - key = "wave" - key_third_person = "waves" - message = "waves." - -/datum/emote/living/whimper - key = "whimper" - key_third_person = "whimpers" - message = "whimpers." - message_mime = "appears hurt." - -/datum/emote/living/wsmile - key = "wsmile" - key_third_person = "wsmiles" - message = "smiles weakly." - -/datum/emote/living/yawn - key = "yawn" - key_third_person = "yawns" - message = "yawns." - emote_type = EMOTE_AUDIBLE - -/datum/emote/living/custom - key = "me" - key_third_person = "custom" - message = null - -/datum/emote/living/custom/can_run_emote(mob/user, status_check, intentional) - . = ..() && intentional - -/datum/emote/living/custom/proc/check_invalid(mob/user, input) - . = TRUE - if(copytext(input,1,5) == "says") - to_chat(user, "Invalid emote.") - else if(copytext(input,1,9) == "exclaims") - to_chat(user, "Invalid emote.") - else if(copytext(input,1,6) == "yells") - to_chat(user, "Invalid emote.") - else if(copytext(input,1,5) == "asks") - to_chat(user, "Invalid emote.") - else - . = FALSE - -/datum/emote/living/custom/run_emote(mob/user, params, type_override = null, intentional = FALSE) - if(!can_run_emote(user, TRUE, intentional)) - return FALSE - if(is_banned_from(user.ckey, "Emote")) - to_chat(user, "You cannot send custom emotes (banned).") - return FALSE - else if(QDELETED(user)) - return FALSE - else if(user.client && user.client.prefs.muted & MUTE_IC) - to_chat(user, "You cannot send IC messages (muted).") - return FALSE - else if(!params) - var/custom_emote = copytext(sanitize(input("Choose an emote to display.") as text|null), 1, MAX_MESSAGE_LEN) - if(custom_emote && !check_invalid(user, custom_emote)) - var/type = input("Is this a visible or hearable emote?") as null|anything in list("Visible", "Hearable") - switch(type) - if("Visible") - emote_type = EMOTE_VISIBLE - if("Hearable") - emote_type = EMOTE_AUDIBLE - else - alert("Unable to use this emote, must be either hearable or visible.") - return - message = custom_emote - else - message = params - if(type_override) - emote_type = type_override - . = ..() - message = null - emote_type = EMOTE_VISIBLE - -/datum/emote/living/custom/replace_pronoun(mob/user, message) - return message - -/datum/emote/living/help - key = "help" - -/datum/emote/living/help/run_emote(mob/user, params, type_override, intentional) - var/list/keys = list() - var/list/message = list("Available emotes, you can use them with say \"*emote\": ") - - for(var/key in GLOB.emote_list) - for(var/datum/emote/P in GLOB.emote_list[key]) - if(P.key in keys) - continue - if(P.can_run_emote(user, status_check = FALSE , intentional = TRUE)) - keys += P.key - - keys = sortList(keys) - - for(var/emote in keys) - if(LAZYLEN(message) > 1) - message += ", [emote]" - else - message += "[emote]" - - message += "." - - message = jointext(message, "") - - to_chat(user, message) - -/datum/emote/beep - key = "beep" - key_third_person = "beeps" - message = "beeps." - message_param = "beeps at %t." - sound = 'sound/machines/twobeep.ogg' - mob_type_allowed_typecache = list(/mob/living/brain, /mob/living/silicon) - -/datum/emote/living/circle - key = "circle" - key_third_person = "circles" - restraint_check = TRUE - -/datum/emote/living/circle/run_emote(mob/user, params, type_override, intentional) - . = ..() - var/obj/item/circlegame/N = new(user) - if(user.put_in_hands(N)) - to_chat(user, "You make a circle with your hand.") - else - qdel(N) - to_chat(user, "You don't have any free hands to make a circle with.") - -/datum/emote/living/slap - key = "slap" - key_third_person = "slaps" +/datum/emote/living/dab + key = "dab" + key_third_person = "dabs" + message = "dabs." + message_param = "dabs on %t." restraint_check = TRUE -/datum/emote/living/slap/run_emote(mob/user, params, type_override, intentional) +/datum/emote/living/dab/run_emote(mob/user, params) . = ..() - if(!.) - return - var/obj/item/slapper/N = new(user) - if(user.put_in_hands(N)) - to_chat(user, "You ready your slapping hand.") - else - to_chat(user, "You're incapable of slapping in your current state.") + if(. && ishuman(user)) + var/mob/living/carbon/human/H = user + H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) diff --git a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm index 270e1f106f61..146d110ce0e9 100644 --- a/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm +++ b/code/modules/ninja/suit/n_suit_verbs/energy_net_nets.dm @@ -36,7 +36,7 @@ It is possible to destroy the net by the occupant or someone else. if(!QDELETED(affecting)) affecting.visible_message("[affecting.name] was recovered from the energy net!", "You were recovered from the energy net!", "You hear a grunt.") if(!QDELETED(master))//As long as they still exist. - to_chat(master, "ERROR: unable to initiate transport protocol. Procedure terminated.") + to_chat(master, "ERROR: unable to initiate capture protocol. Procedure terminated.") return ..() /obj/structure/energy_net/process() @@ -64,10 +64,11 @@ It is possible to destroy the net by the occupant or someone else. visible_message("[affecting] suddenly vanishes!") affecting.forceMove(pick(GLOB.holdingfacility)) //Throw mob in to the holding facility. - to_chat(affecting, "You appear in a strange place!") + GLOB.ninja_capture += affecting + to_chat(affecting, "You appear in a strange place. You feel very trapped.") if(!QDELETED(master))//As long as they still exist. - to_chat(master, "SUCCESS: transport procedure of [affecting] complete.") + to_chat(master, "SUCCESS: capture procedure of [affecting] complete.") do_sparks(5, FALSE, affecting) playsound(affecting, 'sound/effects/phasein.ogg', 25, 1) playsound(affecting, 'sound/effects/sparks2.ogg', 50, 1) diff --git a/yogstation/code/modules/mob/living/emote.dm b/yogstation/code/modules/mob/living/emote.dm index 4057a8c9d662..ee5956304676 100644 --- a/yogstation/code/modules/mob/living/emote.dm +++ b/yogstation/code/modules/mob/living/emote.dm @@ -71,3 +71,4 @@ if(. && ishuman(user)) var/mob/living/carbon/human/H = user H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) +