diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index d6ed808461b..46cbbab20f3 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -81,8 +81,7 @@ O.show_message("[name] bites [ML]!", 1) if(armor >= 2) return for(var/datum/disease/D in viruses) - if(istype(D, /datum/disease/jungle_fever)) - ML.contract_disease(D,1,0) + ML.contract_disease(D,1,0) else for(var/mob/O in viewers(ML, null)) O.show_message("\red [src] has attempted to bite [ML]!", 1) diff --git a/code/datums/diseases/jungle_fever.dm b/code/datums/diseases/jungle_fever.dm deleted file mode 100644 index dba0c5f4a4f..00000000000 --- a/code/datums/diseases/jungle_fever.dm +++ /dev/null @@ -1,12 +0,0 @@ -/datum/disease/jungle_fever - name = "Jungle Fever" - max_stages = 1 - cure = "None" - spread = "Bites" - spread_type = SPECIAL - affected_species = list("Monkey", "Human") - curable = 0 - desc = "monkeys with this disease will bite humans, causing humans to spontaneously mutate into a monkey." - severity = "Medium" - //stage_prob = 100 - agent = "Kongey Vibrion M-909" diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm index 8749abed60d..b4079e34b63 100644 --- a/code/datums/diseases/transformation.dm +++ b/code/datums/diseases/transformation.dm @@ -21,48 +21,97 @@ ..() switch(stage) if(1) - if (prob(10) && stage1) + if (prob(stage_prob) && stage1) affected_mob << pick(stage1) if(2) - if (prob(10) && stage2) + if (prob(stage_prob) && stage2) affected_mob << pick(stage2) if(3) - if (prob(20) && stage3) + if (prob(stage_prob*2) && stage3) affected_mob << pick(stage3) if(4) - if (prob(20) && stage4) + if (prob(stage_prob*2) && stage4) affected_mob << pick(stage4) if(5) - if(istype(affected_mob, /mob/living/carbon) && affected_mob.stat != DEAD) - if(stage5) - affected_mob << pick(stage5) - if(jobban_isbanned(affected_mob, new_form)) - affected_mob.death(1) - return - if(affected_mob.notransform) return - affected_mob.notransform = 1 - affected_mob.canmove = 0 - affected_mob.icon = null - affected_mob.overlays.Cut() - affected_mob.invisibility = 101 - for(var/obj/item/W in affected_mob) - if(istype(W, /obj/item/weapon/implant)) - qdel(W) - continue - W.layer = initial(W.layer) - W.loc = affected_mob.loc - W.dropped(affected_mob) - var/mob/living/new_mob = new new_form(affected_mob.loc) - if(istype(new_mob)) - new_mob.a_intent = "harm" - new_mob.universal_speak = 1 - if(affected_mob.mind) - affected_mob.mind.transfer_to(new_mob) - else - new_mob.key = affected_mob.key + do_disease_transformation(affected_mob) + +/datum/disease/transformation/proc/do_disease_transformation(var/mob/living/affected_mob) + if(istype(affected_mob, /mob/living/carbon) && affected_mob.stat != DEAD) + if(stage5) + affected_mob << pick(stage5) + if(jobban_isbanned(affected_mob, new_form)) + affected_mob.death(1) + return + if(affected_mob.notransform) return + affected_mob.notransform = 1 + affected_mob.canmove = 0 + affected_mob.icon = null + affected_mob.overlays.Cut() + affected_mob.invisibility = 101 + for(var/obj/item/W in affected_mob) + if(istype(W, /obj/item/weapon/implant)) + qdel(W) + continue + W.layer = initial(W.layer) + W.loc = affected_mob.loc + W.dropped(affected_mob) + var/mob/living/new_mob = new new_form(affected_mob.loc) + if(istype(new_mob)) + new_mob.a_intent = "harm" + new_mob.universal_speak = 1 + if(affected_mob.mind) + affected_mob.mind.transfer_to(new_mob) + else + new_mob.key = affected_mob.key qdel(affected_mob) + +/datum/disease/transformation/jungle_fever + name = "Jungle Fever" + cure = "Bananas" + cure_id = "banana" + spread = "Bites" + spread_type = SPECIAL + affected_species = list("Monkey", "Human") + permeability_mod = 1 + cure_chance = 1 + curable = 0 + longevity = 30 + desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey." + severity = "Major" + hidden = list(0, 0)//Not hidden, with the exception of the starting ape. + stage_prob = 4 + agent = "Kongey Vibrion M-909" + new_form = /mob/living/carbon/monkey + + stage1 = list("") + stage2 = list("") + stage3 = list("") + stage4 = list("Your back hurts.", "You breathe through your mouth.", + "You have a craving for bananas.", "Your mind feels clouded.") + stage5 = list("You feel like monkeying around.") + +/datum/disease/transformation/jungle_fever/do_disease_transformation(var/mob/living/carbon/affected_mob) + if(!ismonkey(affected_mob)) + affected_mob.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE) + +/datum/disease/transformation/jungle_fever/stage_act() + ..() + switch(stage) + if(2) + affected_mob << "Your [pick("back", "arm", "leg", "elbow", "head")] itches." + if(3) + if (prob(8)) + affected_mob.say(pick("Eek?", "Ook ook.")) + if (prob(4)) + affected_mob << "You feel a stabbing pain in your head." + affected_mob.Paralyse(2) + if(4) + if (prob(20)) + affected_mob.say(pick("Eeek, ook ook!", "Eee-eeek!", "Eeee!", "Ungh, ungh.")) + + /datum/disease/transformation/robot name = "Robotic Transformation" @@ -86,7 +135,7 @@ if (prob(8)) affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop")) if (prob(4)) - affected_mob << "\red You feel a stabbing pain in your head." + affected_mob << "You feel a stabbing pain in your head." affected_mob.Paralyse(2) if(4) if (prob(20)) @@ -113,7 +162,7 @@ switch(stage) if(3) if (prob(4)) - affected_mob << "\red You feel a stabbing pain in your head." + affected_mob << "You feel a stabbing pain in your head." affected_mob.Paralyse(2) if(4) if (prob(20)) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 1e2f7d20e0e..16700334986 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -249,7 +249,7 @@ datum/mind else if (istype(current, /mob/living/carbon/monkey)) var/found = 0 for(var/datum/disease/D in current.viruses) - if(istype(D, /datum/disease/jungle_fever)) found = 1 + if(istype(D, /datum/disease/transformation/jungle_fever)) found = 1 if(found) text += "healthy|INFECTED|human|other" @@ -799,16 +799,16 @@ datum/mind src = null M = H.monkeyize() src = M.mind - current.contract_disease(new /datum/disease/jungle_fever,1,0) + current.contract_disease(new /datum/disease/transformation/jungle_fever,1,0) else if (istype(M)) - current.contract_disease(new /datum/disease/jungle_fever,1,0) + current.contract_disease(new /datum/disease/transformation/jungle_fever,1,0) if("human") if (check_rights(R_ADMIN, 0)) var/mob/living/carbon/human/H = current var/mob/living/carbon/monkey/M = current if (istype(M)) for(var/datum/disease/D in M.viruses) - if (istype(D,/datum/disease/jungle_fever)) + if (istype(D,/datum/disease/transformation/jungle_fever)) D.cure(0) sleep(0) //because deleting of virus is doing throught spawn(0) log_admin("[key_name(usr)] attempting to humanize [key_name(current)]") diff --git a/code/game/gamemodes/monkey/monkey.dm b/code/game/gamemodes/monkey/monkey.dm new file mode 100644 index 00000000000..ef737a86621 --- /dev/null +++ b/code/game/gamemodes/monkey/monkey.dm @@ -0,0 +1,85 @@ +/datum/game_mode/monkey + name = "monkey" + config_tag = "monkey" + antag_flag = BE_REV + + required_players = 20 + required_enemies = 1 + recommended_enemies = 1 + + restricted_jobs = list("Cyborg", "AI") + + var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) + var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) + + var/carriers_to_make = 1 + var/list/carriers = list() + + var/monkeys_to_win = 0 + var/escaped_monkies = 0 + + var/players_per_carrier = 30 + + +/datum/game_mode/monkey/pre_setup() + carriers_to_make = max(round(num_players()/players_per_carrier, 1), 1) + for(var/datum/mind/player in antag_candidates) + for(var/job in restricted_jobs)//Removing robots from the list + if(player.assigned_role == job) + antag_candidates -= player + for(var/j = 0, j < carriers, j++) + if (!antag_candidates.len) + break + var/datum/mind/carrier = pick(antag_candidates) + carriers += carrier + carrier.special_role = "monkey" + log_game("[carrier.key] (ckey) has been selected as a Jungle Fever carrier") + antag_candidates -= carrier + if(!carriers.len) + return 0 + return 1 + + +/datum/game_mode/monkey/announce() + world << "The current game mode is - Monkey!" + 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(var/datum/mind/carrier) + carrier.current << "You are infected by the Jungle Fever patient zero!!" + carrier.current << "You have been planted onto this station by the Animal Rights Consortium." + carrier.current << "Soon the disease will transform you into an ape. Afterwards, you will be able spread the infection to others with a bite." + carrier.current << "While your infection is undetectable, any other infectees will show up on medical equipment." + carrier.current << "Your mission will be deemed a success if any of the live infected monkeys reach Centcom." + return + +/datum/game_mode/monkey/post_setup() + for(var/datum/mind/carriermind in carriers) + greet_carrier(carriermind) + var/datum/disease/transformation/jungle_fever/J = new /datum/disease/transformation/jungle_fever + J.hidden = list(1, 1)//Starting disease is hidden from medical equipment + carriermind.current.contract_disease(J, 1, 0) + ..() + +/datum/game_mode/monkey/proc/check_monkey_victory() + for(var/mob/living/carbon/monkey/M in living_mob_list) + if (M.has_disease(/datum/disease/transformation/jungle_fever)) + var/area/A = get_area(M) + if(is_type_in_list(A, centcom_areas)) + escaped_monkies++ + if(escaped_monkies >= monkeys_to_win) + return 0 + else + return 1 + + +/datum/game_mode/monkey/declare_completion() + if(!check_monkey_victory()) + feedback_set_details("round_end_result","win - monkey win") + feedback_set("round_end_result",escaped_monkies) + world << "\red The monkies have overthrown their captors! Eeek eeeek!!" + else + feedback_set_details("round_end_result","loss - staff stopped the monkies") + feedback_set("round_end_result",escaped_monkies) + world << "\red The staff managed to contain the monkey infestation!" diff --git a/code/game/objects/effects/gibs.dm b/code/game/objects/effects/gibs.dm index 5f0f77e17aa..e8ffb118201 100644 --- a/code/game/objects/effects/gibs.dm +++ b/code/game/objects/effects/gibs.dm @@ -58,7 +58,7 @@ gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.blood_type else if(istype(src, /obj/effect/gibspawner/xeno)) gib.blood_DNA["UNKNOWN DNA"] = "X*" - else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey + else if(istype(src, /obj/effect/gibspawner/generic)) // Probably a monkey gib.blood_DNA["Non-human DNA"] = "A+" var/list/directions = gibdirections[i] if(istype(loc,/turf)) diff --git a/code/modules/mob/living/carbon/human/human_attackpaw.dm b/code/modules/mob/living/carbon/human/human_attackpaw.dm index 9109084194f..17d1e721587 100644 --- a/code/modules/mob/living/carbon/human/human_attackpaw.dm +++ b/code/modules/mob/living/carbon/human/human_attackpaw.dm @@ -15,9 +15,5 @@ apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, "melee")) for(var/datum/disease/D in M.viruses) - if(istype(D, /datum/disease/jungle_fever)) - var/mob/living/carbon/human/H = src - if(src.stat != 2) - H.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSE) - contract_disease(D,1,0) + contract_disease(D,1,0) return diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 7938cea3365..bce977b3ecc 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -83,8 +83,7 @@ adjustBruteLoss(damage) health = 100 - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() for(var/datum/disease/D in M.viruses) - if(istype(D, /datum/disease/jungle_fever)) - contract_disease(D,1,0) + contract_disease(D,1,0) else visible_message("[M.name] has attempted to bite [name]!", \ "[M.name] has attempted to bite [name]!") diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 25d81d559cb..16aabeec14c 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -408,7 +408,7 @@ proc/is_special_character(mob/M) // returns 1 for special characters and 2 for h if(M.mind in ticker.mode.wizards) return 2 if("monkey") - if(M.viruses && (locate(/datum/disease/jungle_fever) in M.viruses)) + if(M.viruses && (locate(/datum/disease/transformation/jungle_fever) in M.viruses)) return 2 return 1 return 0 diff --git a/tgstation.dme b/tgstation.dme index c01bdc15e3a..122af9afb85 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -136,7 +136,6 @@ #include "code\datums\diseases\flu.dm" #include "code\datums\diseases\fluspanish.dm" #include "code\datums\diseases\gbs.dm" -#include "code\datums\diseases\jungle_fever.dm" #include "code\datums\diseases\magnitis.dm" #include "code\datums\diseases\pierrot_throat.dm" #include "code\datums\diseases\plasmatoid.dm" @@ -280,6 +279,7 @@ #include "code\game\gamemodes\malfunction\malfunction.dm" #include "code\game\gamemodes\meteor\meteor.dm" #include "code\game\gamemodes\meteor\meteors.dm" +#include "code\game\gamemodes\monkey\monkey.dm" #include "code\game\gamemodes\nuclear\nuclear.dm" #include "code\game\gamemodes\nuclear\nuclearbomb.dm" #include "code\game\gamemodes\nuclear\pinpointer.dm"