From 979a3bd4902952e0eb7e0a3ec4cca55ad82282e9 Mon Sep 17 00:00:00 2001 From: Ling Date: Mon, 9 Dec 2019 11:36:17 +0100 Subject: [PATCH] Revert "Ninja jail is no longer permanent (#7178)" This reverts commit f5b602c7ea08fc6ab1ff022dffa10a4b89f2dbc3. --- 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, 505 insertions(+), 84 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 0ffee9b7bc5c..1534f86197a6 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -140,6 +140,7 @@ #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 97912e4d1e72..d2748567979e 100644 --- a/code/game/objects/items/implants/implant_explosive.dm +++ b/code/game/objects/items/implants/implant_explosive.dm @@ -27,6 +27,7 @@ return dat /obj/item/implant/explosive/activate(cause) + . = ..() if(!cause || !imp_in || active) return 0 if(cause == "action_button" && !popup) @@ -40,7 +41,6 @@ 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 c40ff62dcd2a..9352e918779b 100644 --- a/code/modules/antagonists/ninja/ninja.dm +++ b/code/modules/antagonists/ninja/ninja.dm @@ -1,5 +1,3 @@ -GLOBAL_LIST_EMPTY(ninja_capture) - /datum/antagonist/ninja name = "Ninja" antagpanel_category = "Ninja" @@ -17,16 +15,10 @@ GLOBAL_LIST_EMPTY(ninja_capture) /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) @@ -133,24 +125,6 @@ GLOBAL_LIST_EMPTY(ninja_capture) 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")) @@ -185,4 +159,3 @@ GLOBAL_LIST_EMPTY(ninja_capture) 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 4057a8c9d662..74f33179be40 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -1,73 +1,522 @@ -/datum/emote/living/raisehand - key = "highfive" - key_third_person = "highfives" + +/* 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." restraint_check = TRUE -/datum/emote/living/raisehand/run_emote(mob/user, params) +/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) . = ..() - 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.") + 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) + . = ..() + if(HAS_TRAIT(user, TRAIT_SOOTHED_THROAT)) + return FALSE -/datum/emote/living/pose - key = "pose" - key_third_person = "poses" - message = "strikes a pose!" +/datum/emote/living/dance + key = "dance" + key_third_person = "dances" + message = "dances around happily." restraint_check = TRUE -/datum/emote/living/mpose - key = "mpose" - key_third_person = "mposes" - message = "strikes a menacing pose!" +/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." restraint_check = TRUE + var/wing_time = 20 -/datum/emote/living/tpose - key = "tpose" - key_third_person = "tposes" - message = "strikes a T-pose!" +/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!" 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/vpose - key = "vpose" - key_third_person = "vposes" - message = "strikes a valiant pose!" +/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!" restraint_check = TRUE -/datum/emote/living/wpose - key = "wpose" - key_third_person = "wposes" - message = "strikes a triumphant pose!" +/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." restraint_check = TRUE -/datum/emote/living/whistle - key = "whistle" - key_third_person = "whistles" - message = "whistles." +/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." emote_type = EMOTE_AUDIBLE -/datum/emote/living/iwhistle - key = "iwhistle" - key_third_person = "iwhistles" - message = "innocently whistles." +/datum/emote/living/scream + key = "scream" + key_third_person = "screams" + message = "screams." + message_mime = "acts out a scream!" emote_type = EMOTE_AUDIBLE + mob_type_blacklist_typecache = list(/mob/living/carbon/human) //Humans get specialized scream. -/datum/emote/living/smirk - key = "smirk" - key_third_person = "smirks" - message = "smirks." +/datum/emote/living/scream/select_message_type(mob/user, intentional) + . = ..() + if(!intentional && isanimal(user)) + return "makes a loud and pained whimper." -/datum/emote/living/dab - key = "dab" - key_third_person = "dabs" - message = "dabs." - message_param = "dabs on %t." +/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/dab/run_emote(mob/user, params) +/datum/emote/living/circle/run_emote(mob/user, params, type_override, intentional) . = ..() - if(. && ishuman(user)) - var/mob/living/carbon/human/H = user - H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) + 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" + restraint_check = TRUE + +/datum/emote/living/slap/run_emote(mob/user, params, type_override, intentional) + . = ..() + 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.") 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 146d110ce0e9..270e1f106f61 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 capture protocol. Procedure terminated.") + to_chat(master, "ERROR: unable to initiate transport protocol. Procedure terminated.") return ..() /obj/structure/energy_net/process() @@ -64,11 +64,10 @@ 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. - GLOB.ninja_capture += affecting - to_chat(affecting, "You appear in a strange place. You feel very trapped.") + to_chat(affecting, "You appear in a strange place!") if(!QDELETED(master))//As long as they still exist. - to_chat(master, "SUCCESS: capture procedure of [affecting] complete.") + to_chat(master, "SUCCESS: transport 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 ee5956304676..4057a8c9d662 100644 --- a/yogstation/code/modules/mob/living/emote.dm +++ b/yogstation/code/modules/mob/living/emote.dm @@ -71,4 +71,3 @@ if(. && ishuman(user)) var/mob/living/carbon/human/H = user H.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) -