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"