diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index 17b6e60158..1fba96b1eb 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -9,10 +9,12 @@ #define ANTAG_DATUM_TRAITOR /datum/antagonist/traitor #define ANTAG_DATUM_TRAITOR_HUMAN /datum/antagonist/traitor/human #define ANTAG_DATUM_TRAITOR_AI /datum/antagonist/traitor/AI -#define ANTAG_DATUM_IAA /datum/antagonist/traitor/internal_affairs +#define ANTAG_DATUM_IAA /datum/antagonist/traitor/internal_affairs #define ANTAG_DATUM_IAA_HUMAN /datum/antagonist/traitor/human/internal_affairs -#define ANTAG_DATUM_IAA_AI /datum/antagonist/traitor/AI/internal_affairs +#define ANTAG_DATUM_IAA_AI /datum/antagonist/traitor/AI/internal_affairs #define ANTAG_DATUM_BROTHER /datum/antagonist/brother #define ANTAG_DATUM_ABDUCTOR /datum/antagonist/abductor -#define ANTAG_DATUM_ABDUCTOR_SCIENTIST /datum/antagonist/abductor/scientist -#define ANTAG_DATUM_ABDUCTOR_AGENT /datum/antagonist/abductor/agent +#define ANTAG_DATUM_ABDUCTOR_SCIENTIST /datum/antagonist/abductor/scientist +#define ANTAG_DATUM_ABDUCTOR_AGENT /datum/antagonist/abductor/agent +#define ANTAG_DATUM_MONKEY /datum/antagonist/monkey +#define ANTAG_DATUM_MONKEY_LEADER /datum/antagonist/monkey/leader \ No newline at end of file diff --git a/code/__DEFINES/say.dm b/code/__DEFINES/say.dm index 74a1669686..8f38acb203 100644 --- a/code/__DEFINES/say.dm +++ b/code/__DEFINES/say.dm @@ -17,6 +17,7 @@ #define MODE_HOLOPAD "holopad" #define MODE_CHANGELING "changeling" #define MODE_VOCALCORDS "cords" +#define MODE_MONKEY "monkeyhive" //Spans. Robot speech, italics, etc. Applied in compose_message(). #define SPAN_ROBOT "robot" diff --git a/code/datums/antagonists/monkey.dm b/code/datums/antagonists/monkey.dm new file mode 100644 index 0000000000..8d7462b567 --- /dev/null +++ b/code/datums/antagonists/monkey.dm @@ -0,0 +1,170 @@ +#define MONKEYS_ESCAPED 1 +#define MONKEYS_LIVED 2 +#define MONKEYS_DIED 3 +#define DISEASE_LIVED 4 + +/datum/antagonist/monkey + name = "Monkey" + job_rank = ROLE_MONKEY + roundend_category = "monkeys" + var/datum/objective_team/monkey/monkey_team + +/datum/antagonist/monkey/on_gain() + . = ..() + SSticker.mode.ape_infectees += owner + owner.special_role = "Infected Monkey" + + var/datum/disease/D = new /datum/disease/transformation/jungle_fever + if(!owner.current.HasDisease(D)) + D.affected_mob = owner + owner.current.viruses += D + else + QDEL_NULL(D) + +/datum/antagonist/monkey/greet() + to_chat(owner, "You are a monkey now!") + to_chat(owner, "Bite humans to infect them, follow the orders of the monkey leaders, and help fellow monkeys!") + to_chat(owner, "Ensure at least one infected monkey escapes on the Emergency Shuttle!") + to_chat(owner, "As an intelligent monkey, you know how to use technology and how to ventcrawl while wearing things.") + to_chat(owner, "You can use :k to talk to fellow monkeys!") + SEND_SOUND(owner.current, sound('sound/ambience/antag/monkey.ogg')) + +/datum/antagonist/monkey/on_removal() + . = ..() + owner.special_role = null + SSticker.mode.ape_infectees -= owner + + var/datum/disease/D = (/datum/disease/transformation/jungle_fever in owner.current.viruses) + if(D) + D.cure() + +/datum/antagonist/monkey/create_team(datum/objective_team/monkey/new_team) + if(!new_team) + for(var/datum/antagonist/monkey/N in get_antagonists(/datum/antagonist/monkey, TRUE)) + if(N.monkey_team) + monkey_team = N.monkey_team + return + monkey_team = new /datum/objective_team/monkey + monkey_team.update_objectives() + return + if(!istype(new_team)) + stack_trace("Wrong team type passed to [type] initialization.") + monkey_team = new_team + +/datum/antagonist/monkey/proc/forge_objectives() + if(monkey_team) + owner.objectives |= monkey_team.objectives + +/datum/antagonist/monkey/leader + name = "Monkey Leader" + +/datum/antagonist/monkey/leader/on_gain() + . = ..() + var/datum/disease/D = (/datum/disease/transformation/jungle_fever in owner.current.viruses) + if(D) + D.visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC + var/obj/item/organ/heart/freedom/F = new + F.Insert(owner.current, drop_if_replaced = FALSE) + SSticker.mode.ape_leaders += owner + owner.special_role = "Monkey Leader" + +/datum/antagonist/monkey/leader/on_removal() + . = ..() + SSticker.mode.ape_leaders -= owner + var/obj/item/organ/heart/H = new + H.Insert(owner.current, drop_if_replaced = FALSE) //replace freedom heart with normal heart + +/datum/antagonist/monkey/leader/greet() + to_chat(owner, "You are the Jungle Fever patient zero!!") + to_chat(owner, "You have been planted onto this station by the Animal Rights Consortium.") + to_chat(owner, "Soon the disease will transform you into an ape. Afterwards, you will be able spread the infection to others with a bite.") + to_chat(owner, "While your infection strain is undetectable by scanners, any other infectees will show up on medical equipment.") + to_chat(owner, "Your mission will be deemed a success if any of the live infected monkeys reach CentCom.") + to_chat(owner, "As an initial infectee, you will be considered a 'leader' by your fellow monkeys.") + to_chat(owner, "You can use :k to talk to fellow monkeys!") + SEND_SOUND(owner.current, sound('sound/ambience/antag/monkey.ogg')) + +/datum/objective/monkey + explanation_text = "Ensure that infected monkeys escape on the emergency shuttle!" + martyr_compatible = TRUE + var/monkeys_to_win = 1 + var/escaped_monkeys = 0 + +/datum/objective/monkey/check_completion() + var/datum/disease/D = new /datum/disease/transformation/jungle_fever() + for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list) + if (M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase())) + escaped_monkeys++ + if(escaped_monkeys >= monkeys_to_win) + return TRUE + return FALSE + +/datum/objective_team/monkey + name = "Monkeys" + +/datum/objective_team/monkey/proc/update_objectives() + objectives = list() + var/datum/objective/monkey/O = new /datum/objective/monkey() + O.team = src + objectives += O + return + +/datum/objective_team/monkey/proc/infected_monkeys_alive() + var/datum/disease/D = new /datum/disease/transformation/jungle_fever() + for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list) + if(M.HasDisease(D)) + return TRUE + return FALSE + +/datum/objective_team/monkey/proc/infected_monkeys_escaped() + var/datum/disease/D = new /datum/disease/transformation/jungle_fever() + for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list) + if(M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase())) + return TRUE + return FALSE + +/datum/objective_team/monkey/proc/infected_humans_escaped() + var/datum/disease/D = new /datum/disease/transformation/jungle_fever() + for(var/mob/living/carbon/human/M in GLOB.alive_mob_list) + if(M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase())) + return TRUE + return FALSE + +/datum/objective_team/monkey/proc/infected_humans_alive() + var/datum/disease/D = new /datum/disease/transformation/jungle_fever() + for(var/mob/living/carbon/human/M in GLOB.alive_mob_list) + if(M.HasDisease(D)) + return TRUE + return FALSE + +/datum/objective_team/monkey/proc/get_result() + if(infected_monkeys_escaped()) + return MONKEYS_ESCAPED + if(infected_monkeys_alive()) + return MONKEYS_LIVED + if(infected_humans_alive() || infected_humans_escaped()) + return DISEASE_LIVED + return MONKEYS_DIED + +/datum/objective_team/monkey/roundend_report() + var/list/parts = list() + switch(get_result()) + if(MONKEYS_ESCAPED) + parts += "Monkey Major Victory!" + parts += "Central Command and [station_name()] were taken over by the monkeys! Ook ook!" + if(MONKEYS_LIVED) + parts += "Monkey Minor Victory!" + parts += "[station_name()] was taken over by the monkeys! Ook ook!" + if(DISEASE_LIVED) + parts += "Monkey Minor Defeat!" + parts += "All the monkeys died, but the disease lives on! The future is uncertain." + if(MONKEYS_DIED) + parts += "Monkey Major Defeat!" + parts += "All the monkeys died, and Jungle Fever was wiped out!" + if(LAZYLEN(SSticker.mode.ape_leaders)) + parts += "The monkey leaders were:" + parts += printplayerlist(SSticker.mode.ape_leaders) + if(LAZYLEN(SSticker.mode.ape_infectees)) + parts += "The monkeys were:" + parts += printplayerlist(SSticker.mode.ape_infectees) + return "
[parts.Join("
")]
" \ No newline at end of file diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 60622f61cb..30bb3d1898 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -88,9 +88,12 @@ stage5 = list("You feel like monkeying around.") /datum/disease/transformation/jungle_fever/do_disease_transformation(mob/living/carbon/affected_mob) - if(!ismonkey(affected_mob)) - SSticker.mode.add_monkey(affected_mob.mind) - affected_mob.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE) + if(affected_mob.mind && !is_monkey(affected_mob)) + add_monkey(affected_mob.mind) + if(ishuman(affected_mob)) + var/mob/living/carbon/monkey/M = affected_mob.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE) + M.ventcrawler = VENTCRAWLER_ALWAYS + /datum/disease/transformation/jungle_fever/stage_act() ..() @@ -107,7 +110,7 @@ affected_mob.say(pick("Eeek, ook ook!", "Eee-eeek!", "Eeee!", "Ungh, ungh.")) /datum/disease/transformation/jungle_fever/cure() - SSticker.mode.remove_monkey(affected_mob.mind) + remove_monkey(affected_mob.mind) ..() diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 231ce66f28..f7f3ef8825 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -461,20 +461,27 @@ text = uppertext(text) text = "[text]: " if (ishuman(current)) - text += "healthy | infected | HUMAN | other" + if(is_monkey_leader(src)) + text += "healthy | infected LEADER | human | other" + else + text += "healthy | infected | leader | HUMAN | other" else if(ismonkey(current)) var/found = FALSE for(var/datum/disease/transformation/jungle_fever/JF in current.viruses) found = TRUE break - if(found) - text += "healthy | INFECTED | human | other" + var/isLeader = is_monkey_leader(src) + + if(isLeader) + text += "healthy | infected LEADER | human | other" + else if(found) + text += "healthy | INFECTED | leader | human | other" else - text += "HEALTHY | infected | human | other" + text += "HEALTHY | infected | leader | human | other" else - text += "healthy | infected | human | OTHER" + text += "healthy | infected | leader | human | OTHER" if(current && current.client && (ROLE_MONKEY in current.client.prefs.be_special)) text += " | Enabled in Prefs" @@ -1255,11 +1262,17 @@ else if (istype(M) && length(M.viruses)) for(var/thing in M.viruses) var/datum/disease/D = thing - D.cure(0) + D.cure(FALSE) + if("leader") + if(check_rights(R_ADMIN, 0)) + add_monkey_leader(src) + log_admin("[key_name(usr)] made [key_name(current)] a monkey leader!") + message_admins("[key_name_admin(usr)] made [key_name_admin(current)] a monkey leader!") if("infected") - if (check_rights(R_ADMIN, 0)) + if(check_rights(R_ADMIN, 0)) var/mob/living/carbon/human/H = current var/mob/living/carbon/monkey/M = current + add_monkey(src) if (istype(H)) log_admin("[key_name(usr)] attempting to monkeyize and infect [key_name(current)]") message_admins("[key_name_admin(usr)] attempting to monkeyize and infect [key_name_admin(current)]") @@ -1277,6 +1290,7 @@ for(var/datum/disease/transformation/jungle_fever/JF in M.viruses) JF.cure(0) stoplag() //because deleting of virus is doing throught spawn(0) //What + remove_monkey(src) log_admin("[key_name(usr)] attempting to humanize [key_name(current)]") message_admins("[key_name_admin(usr)] attempting to humanize [key_name_admin(current)]") H = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_DEFAULTMSG) diff --git a/code/datums/saymode.dm b/code/datums/saymode.dm index e372d5c0b2..176c762e9c 100644 --- a/code/datums/saymode.dm +++ b/code/datums/saymode.dm @@ -33,7 +33,7 @@ if(LINGHIVE_LING) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) var/msg = "[changeling.changelingID]: [message]" - log_talk(src,"[changeling.changelingID]/[user.key] : [message]",LOGSAY) + log_talk(user,"[changeling.changelingID]/[user.key] : [message]",LOGSAY) for(var/_M in GLOB.mob_list) var/mob/M = _M if(M in GLOB.dead_mob_list) @@ -110,3 +110,25 @@ AI.holopad_talk(message, language) return FALSE return TRUE + +/datum/saymode/monkey + key = "k" + mode = MODE_MONKEY + +/datum/saymode/monkey/handle_message(mob/living/user, message, datum/language/language) + var/datum/mind = user.mind + if(!mind) + return TRUE + if(is_monkey_leader(mind) || (ismonkey(user) && is_monkey(mind))) + log_talk(user, "(MONKEY) [user]/[user.key]: [message]",LOGSAY) + if(prob(75) && ismonkey(user)) + user.visible_message("\The [user] chimpers.") + var/msg = "\[[is_monkey_leader(mind) ? "Monkey Leader" : "Monkey"]\] [user]: [message]" + for(var/_M in GLOB.mob_list) + var/mob/M = _M + if(M in GLOB.dead_mob_list) + var/link = FOLLOW_LINK(M, user) + to_chat(M, "[link] [msg]") + if((is_monkey_leader(M.mind) || ismonkey(M)) && (M.mind in SSticker.mode.ape_infectees)) + to_chat(M, msg) + return FALSE diff --git a/code/game/gamemodes/miniantags/monkey/monkey.dm b/code/game/gamemodes/miniantags/monkey/monkey.dm index 8e02d41441..682552e2d1 100644 --- a/code/game/gamemodes/miniantags/monkey/monkey.dm +++ b/code/game/gamemodes/miniantags/monkey/monkey.dm @@ -1,5 +1,6 @@ /datum/game_mode var/list/ape_infectees = list() + var/list/ape_leaders = list() /datum/game_mode/monkey name = "monkey" @@ -21,6 +22,9 @@ var/players_per_carrier = 30 + var/datum/objective_team/monkey/monkey_team + + /datum/game_mode/monkey/pre_setup() carriers_to_make = max(round(num_players()/players_per_carrier, 1), 1) @@ -30,79 +34,59 @@ break var/datum/mind/carrier = pick(antag_candidates) carriers += carrier - carrier.special_role = "monkey" + carrier.special_role = "Monkey Leader" carrier.restricted_roles = restricted_jobs log_game("[carrier.key] (ckey) has been selected as a Jungle Fever carrier") antag_candidates -= carrier if(!carriers.len) - return 0 - return 1 + return FALSE + return TRUE /datum/game_mode/monkey/announce() to_chat(world, "The current game mode is - Monkey!") to_chat(world, "One or more crewmembers have been infected with Jungle Fever! Crew: Contain the outbreak. None of the infected monkeys may escape alive to CentCom. Monkeys: Ensure that your kind lives on! Rise up against your captors!") - -/datum/game_mode/monkey/proc/greet_carrier(datum/mind/carrier) - to_chat(carrier.current, "You are the Jungle Fever patient zero!!") - to_chat(carrier.current, "You have been planted onto this station by the Animal Rights Consortium.") - to_chat(carrier.current, "Soon the disease will transform you into an ape. Afterwards, you will be able spread the infection to others with a bite.") - to_chat(carrier.current, "While your infection strain is undetectable by scanners, any other infectees will show up on medical equipment.") - to_chat(carrier.current, "Your mission will be deemed a success if any of the live infected monkeys reach CentCom.") - carrier.current.playsound_local(get_turf(carrier.current), 'sound/ambience/antag/monkey.ogg', 100, FALSE, pressure_affected = FALSE) - return - /datum/game_mode/monkey/post_setup() for(var/datum/mind/carriermind in carriers) - greet_carrier(carriermind) - ape_infectees += carriermind - - var/datum/disease/D = new /datum/disease/transformation/jungle_fever - D.visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC - D.affected_mob = carriermind.current - carriermind.current.viruses += D - ..() + var/datum/antagonist/monkey/M = add_monkey_leader(carriermind, monkey_team) + if(M) + monkey_team = M.monkey_team + return ..() /datum/game_mode/monkey/check_finished() if((SSshuttle.emergency.mode == SHUTTLE_ENDGAME) || station_was_nuked) - return 1 + return TRUE if(!round_converted) for(var/datum/mind/monkey_mind in ape_infectees) - continuous_sanity_checked = 1 + continuous_sanity_checked = TRUE if(monkey_mind.current && monkey_mind.current.stat != DEAD) - return 0 + return FALSE var/datum/disease/D = new /datum/disease/transformation/jungle_fever() //ugly but unfortunately needed for(var/mob/living/carbon/human/H in GLOB.alive_mob_list) - if(H.mind && H.stat != DEAD) + if(!(H.z in GLOB.station_z_levels)) + continue + if(H.mind && H.client && H.stat != DEAD) if(H.HasDisease(D)) - return 0 + return FALSE - ..() + return ..() /datum/game_mode/monkey/proc/check_monkey_victory() if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME) - return 0 + return FALSE var/datum/disease/D = new /datum/disease/transformation/jungle_fever() for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list) if (M.HasDisease(D)) if(M.onCentCom() || M.onSyndieBase()) escaped_monkeys++ if(escaped_monkeys >= monkeys_to_win) - return 1 + return TRUE else - return 0 - -/datum/game_mode/proc/add_monkey(datum/mind/monkey_mind) - ape_infectees |= monkey_mind - monkey_mind.special_role = "Infected Monkey" - -/datum/game_mode/proc/remove_monkey(datum/mind/monkey_mind) - ape_infectees.Remove(monkey_mind) - monkey_mind.special_role = null + return FALSE /datum/game_mode/monkey/set_round_result() @@ -120,3 +104,29 @@ /datum/game_mode/monkey/generate_report() return "Reports of an ancient [pick("retrovirus", "flesh eating bacteria", "disease", "magical curse blamed on viruses", "banana blight")] outbreak that turn humans into monkeys has been reported in your quadrant. Any such infections may be treated with banana juice. If an outbreak occurs, ensure the station is quarantined to prevent a largescale outbreak at CentCom." + +/proc/add_monkey_leader(datum/mind/monkey_mind) + if(is_monkey_leader(monkey_mind)) + return FALSE + var/datum/antagonist/monkey/leader/M = monkey_mind.add_antag_datum(ANTAG_DATUM_MONKEY_LEADER) + return M + +/proc/add_monkey(datum/mind/monkey_mind) + if(is_monkey(monkey_mind)) + return FALSE + var/datum/antagonist/monkey/M = monkey_mind.add_antag_datum(ANTAG_DATUM_MONKEY) + return M + +/proc/remove_monkey(datum/mind/monkey_mind) + if(!is_monkey(monkey_mind)) + return FALSE + var/datum/antagonist/monkey/M = monkey_mind.has_antag_datum(ANTAG_DATUM_MONKEY) + M.on_removal() + return TRUE + +/proc/is_monkey_leader(datum/mind/monkey_mind) + return monkey_mind && monkey_mind.has_antag_datum(ANTAG_DATUM_MONKEY_LEADER) + +/proc/is_monkey(datum/mind/monkey_mind) + return monkey_mind && (monkey_mind.has_antag_datum(ANTAG_DATUM_MONKEY) || is_monkey_leader(monkey_mind)) + diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css index c72f26a4e7..a35748e13e 100644 --- a/code/modules/goonchat/browserassets/css/browserOutput.css +++ b/code/modules/goonchat/browserassets/css/browserOutput.css @@ -399,6 +399,9 @@ h1.alert, h2.alert {color: #000000;} .love {color: #FF69Bf;} .lovebold {color: #FF69Bf; font-weight: bold;} +.monkeyhive {color: #774704;} +.monkeylead {color: #774704; font-size: 2;} + .connectionClosed, .fatalError {background: red; color: white; padding: 5px;} .connectionClosed.restored {background: green;} diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index f0c630421d..b153f914f3 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -847,7 +847,8 @@ return TRUE /mob/living/carbon/human/update_gravity(has_gravity,override = 0) - override = dna.species.override_float + if(dna && dna.species) //prevents a runtime while a human is being monkeyfied + override = dna.species.override_float ..() /mob/living/carbon/human/vomit(lost_nutrition = 10, blood = 0, stun = 1, distance = 0, message = 1, toxic = 0) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index c90d1a0231..6e5d8c7373 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -23,7 +23,7 @@ . = 1 /mob/living/carbon/human/mob_negates_gravity() - return ((shoes && shoes.negates_gravity()) || dna.species.negates_gravity(src)) + return ((shoes && shoes.negates_gravity()) || (dna.species.negates_gravity(src))) /mob/living/carbon/human/Move(NewLoc, direct) . = ..() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index a84683c5ae..80db28b99d 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -93,19 +93,18 @@ failed_last_breath = 1 - if(dna && dna.species) - var/datum/species/S = dna.species + var/datum/species/S = dna.species - if(S.breathid == "o2") - throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) - else if(S.breathid == "tox") - throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox) - else if(S.breathid == "co2") - throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2) - else if(S.breathid == "n2") - throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro) + if(S.breathid == "o2") + throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) + else if(S.breathid == "tox") + throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox) + else if(S.breathid == "co2") + throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2) + else if(S.breathid == "n2") + throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro) - return 0 + return FALSE else if(istype(L, /obj/item/organ/lungs)) var/obj/item/organ/lungs/lun = L @@ -238,10 +237,10 @@ /mob/living/carbon/human/proc/get_cold_protection(temperature) if(dna.check_mutation(COLDRES)) - return 1 //Fully protected from the cold. + return TRUE //Fully protected from the cold. - if(dna && (RESISTCOLD in dna.species.species_traits)) - return 1 + if(RESISTCOLD in dna.species.species_traits) + return TRUE if(istype(loc, /obj/item/device/dogborg/sleeper)) return 1 //freezing to death in sleepers ruins fun. diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 7c65e4a604..59a19c7b84 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -11,7 +11,7 @@ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/monkey = 5, /obj/item/stack/sheet/animalhide/monkey = 1) type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/monkey gib_type = /obj/effect/decal/cleanable/blood/gibs - unique_name = 1 + unique_name = TRUE bodyparts = list(/obj/item/bodypart/chest/monkey, /obj/item/bodypart/head/monkey, /obj/item/bodypart/l_arm/monkey, /obj/item/bodypart/r_arm/monkey, /obj/item/bodypart/r_leg/monkey, /obj/item/bodypart/l_leg/monkey) devourable = TRUE @@ -62,7 +62,7 @@ if (bodytemperature < 283.222) . += (283.222 - bodytemperature) / 10 * 1.75 - + var/static/config_monkey_delay if(isnull(config_monkey_delay)) config_monkey_delay = CONFIG_GET(number/monkey_delay) @@ -89,13 +89,15 @@ /mob/living/carbon/monkey/IsAdvancedToolUser()//Unless its monkey mode monkeys cant use advanced tools - return 0 + if(mind && is_monkey(mind)) + return TRUE + return FALSE /mob/living/carbon/monkey/reagent_check(datum/reagent/R) //can metabolize all reagents - return 0 + return FALSE /mob/living/carbon/monkey/canBeHandcuffed() - return 1 + return TRUE /mob/living/carbon/monkey/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) if(judgement_criteria & JUDGE_EMAGGED) diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 21d15fb609..5da89f125f 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -152,3 +152,17 @@ /obj/item/organ/heart/cybernetic/emp_act() Stop() + +/obj/item/organ/heart/freedom + name = "heart of freedom" + desc = "This heart pumps with the passion to give... something freedom." + var/min_next_adrenaline = 0 + +/obj/item/organ/heart/freedom/on_life() + . = ..() + if(owner.health < 5 && world.time > min_next_adrenaline) + min_next_adrenaline = world.time + rand(250, 600) //anywhere from 4.5 to 10 minutes + to_chat(owner, "You feel yourself dying, but you refuse to give up!") + owner.heal_overall_damage(15, 15) + if(owner.reagents.get_reagent_amount("ephedrine") < 20) + owner.reagents.add_reagent("ephedrine", 10) \ No newline at end of file diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index e1505d6088..ece61736ba 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -168,4 +168,7 @@ h1.alert, h2.alert {color: #000000;} .resonate {color: #298F85;} .love {color: #FF69Bf;} .lovebold {color: #FF69Bf; font-weight: bold;} + +.monkeyhive {color: #774704;} +.monkeylead {color: #774704; font-size: 2;} "} diff --git a/tgstation.dme b/tgstation.dme index d35d7a8e21..2974e7b135 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -331,6 +331,7 @@ #include "code\datums\antagonists\datum_traitor.dm" #include "code\datums\antagonists\devil.dm" #include "code\datums\antagonists\internal_affairs.dm" +#include "code\datums\antagonists\monkey.dm" #include "code\datums\antagonists\ninja.dm" #include "code\datums\antagonists\nukeop.dm" #include "code\datums\antagonists\pirate.dm"