diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index d435e55f793..57ddf7817e5 100755
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -66,6 +66,29 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
containername = "Monkey crate"
group = "Hydroponics"
+/datum/supply_packs/farwa
+ name = "Farwa crate"
+ contains = list (/obj/item/weapon/storage/box/farwacubes)
+ cost = 30
+ containertype = /obj/structure/closet/crate/freezer
+ containername = "Farwa crate"
+ group = "Hydroponics"
+
+/datum/supply_packs/skrell
+ name = "Neaera crate"
+ contains = list (/obj/item/weapon/storage/box/neaeracubes)
+ cost = 30
+ containertype = /obj/structure/closet/crate/freezer
+ containername = "Neaera crate"
+ group = "Hydroponics"
+
+/datum/supply_packs/stok
+ name = "Stok crate"
+ contains = list (/obj/item/weapon/storage/box/stokcubes)
+ cost = 30
+ containertype = /obj/structure/closet/crate/freezer
+ containername = "Stok crate"
+ group = "Hydroponics"
/datum/supply_packs/beanbagammo
name = "Beanbag shells"
diff --git a/code/game/dna.dm b/code/game/dna.dm
index c652140d96c..cb58013e016 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -548,7 +548,17 @@
sleep(48)
del(animation)
- var/mob/living/carbon/monkey/O = new(src)
+
+ var/mob/living/carbon/monkey/O = null
+ switch(M.dna.mutantrace)
+ if("tajaran")
+ O = new /mob/living/carbon/monkey/tajara(src)
+ if("lizard")
+ O = new /mob/living/carbon/monkey/unathi(src)
+ if("skrell")
+ O = new /mob/living/carbon/monkey/skrell(src)
+ else
+ O = new /mob/living/carbon/monkey(src)
if(M)
if (M.dna)
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index b89cfd6a7fd..f1b9319f954 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -277,7 +277,41 @@
..()
for(var/i = 1; i <= 5; i++)
new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped(src)
+/obj/item/weapon/storage/box/farwacubes
+ name = "farwa cube box"
+ desc = "Drymate brand farwa cubes. Just add water!"
+ icon = 'icons/obj/food.dmi'
+ icon_state = "monkeycubebox"
+ storage_slots = 7
+ can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/farwacube")
+ New()
+ ..()
+ for(var/i = 1; i <= 5; i++)
+ new /obj/item/weapon/reagent_containers/food/snacks/farwacube/wrapped(src)
+/obj/item/weapon/storage/box/stokcubes
+ name = "stok cube box"
+ desc = "Drymate brand stok cubes. Just add water!"
+ icon = 'icons/obj/food.dmi'
+ icon_state = "monkeycubebox"
+ storage_slots = 7
+ can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/stokcube")
+ New()
+ ..()
+ for(var/i = 1; i <= 5; i++)
+ new /obj/item/weapon/reagent_containers/food/snacks/stokcube/wrapped(src)
+
+/obj/item/weapon/storage/box/neaeracubes
+ name = "neaera cube box"
+ desc = "Drymate brand neaera cubes. Just add water!"
+ icon = 'icons/obj/food.dmi'
+ icon_state = "monkeycubebox"
+ storage_slots = 7
+ can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/stokcube")
+ New()
+ ..()
+ for(var/i = 1; i <= 5; i++)
+ new /obj/item/weapon/reagent_containers/food/snacks/neaeracube/wrapped(src)
/obj/item/weapon/storage/box/ids
name = "spare IDs"
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index 5dcc1158545..3b0240fe39c 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -3,13 +3,113 @@
voice_name = "monkey"
voice_message = "chimpers"
say_message = "chimpers"
- icon = 'icons/mob/monkey.dmi'
icon_state = "monkey1"
+ icon = 'icons/mob/monkey.dmi'
gender = NEUTER
pass_flags = PASSTABLE
update_icon = 0 ///no need to call regenerate_icon
var/obj/item/weapon/card/id/wear_id = null // Fix for station bounced radios -- Skie
+/mob/living/carbon/monkey/tajara
+ name = "farwa"
+ voice_name = "farwa"
+ voice_message = "mews"
+ say_message = "mews"
+ icon_state = "tajkey1"
+
+/mob/living/carbon/monkey/skrell
+ name = "neaera"
+ voice_name = "neaera"
+ voice_message = "squicks"
+ say_message = "squicks"
+ icon_state = "skrellkey1"
+/mob/living/carbon/monkey/unathi
+ name = "stok"
+ voice_name = "stok"
+ voice_message = "hisses"
+ say_message = "hisses"
+ icon_state = "stok1"
+
+/mob/living/carbon/monkey/unathi/New()
+ var/datum/reagents/R = new/datum/reagents(1000)
+ reagents = R
+ R.my_atom = src
+
+ if(name == "stok")
+ name = text("stok ([rand(1, 1000)])")
+ real_name = name
+ if (!(dna))
+ if(gender == NEUTER)
+ gender = pick(MALE, FEMALE)
+ dna = new /datum/dna( null )
+ dna.real_name = real_name
+ dna.uni_identity = "000000000000000000DC0000066000"
+ dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
+ dna.unique_enzymes = md5(name)
+ dna.mutantrace = "lizard"
+ //////////blah
+ var/gendervar
+ if (gender == MALE)
+ gendervar = add_zero2(num2hex((rand(1,2049)),1), 3)
+ else
+ gendervar = add_zero2(num2hex((rand(2051,4094)),1), 3)
+ dna.uni_identity += gendervar
+ dna.uni_identity += "044"
+ dna.uni_identity += "C5D"
+ ..()
+/mob/living/carbon/monkey/skrell/New()
+ var/datum/reagents/R = new/datum/reagents(1000)
+ reagents = R
+ R.my_atom = src
+ if(name == "neaera")
+ name = text("neaera ([rand(1, 1000)])")
+ real_name = name
+ if (!(dna))
+ if(gender == NEUTER)
+ gender = pick(MALE, FEMALE)
+ dna = new /datum/dna( null )
+ dna.real_name = real_name
+ dna.uni_identity = "000000000000000000DC0000066000"
+ dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
+ dna.unique_enzymes = md5(name)
+ dna.mutantrace = "skrell"
+ //////////blah
+ var/gendervar
+ if (gender == MALE)
+ gendervar = add_zero2(num2hex((rand(1,2049)),1), 3)
+ else
+ gendervar = add_zero2(num2hex((rand(2051,4094)),1), 3)
+ dna.uni_identity += gendervar
+ dna.uni_identity += "01C"
+ dna.uni_identity += "C92"
+ ..()
+/mob/living/carbon/monkey/tajara/New()
+ var/datum/reagents/R = new/datum/reagents(1000)
+ reagents = R
+ R.my_atom = src
+
+ if(name == "farwa")
+ name = text("farwa ([rand(1, 1000)])")
+ real_name = name
+ if (!(dna))
+ if(gender == NEUTER)
+ gender = pick(MALE, FEMALE)
+ dna = new /datum/dna( null )
+ dna.real_name = real_name
+ dna.uni_identity = "000000000000000000DC0000066000"
+ dna.struc_enzymes = "43359156756131E13763334D1C369012032164D4FE4CD61544B6C03F251B6C60A42821D26BA3B0FD6"
+ dna.unique_enzymes = md5(name)
+ dna.mutantrace = "tajaran"
+ //////////blah
+ var/gendervar
+ if (gender == MALE)
+ gendervar = add_zero2(num2hex((rand(1,2049)),1), 3)
+ else
+ gendervar = add_zero2(num2hex((rand(2051,4094)),1), 3)
+ dna.uni_identity += gendervar
+ dna.uni_identity += "0A0"
+ dna.uni_identity += "E00"
+ ..()
/mob/living/carbon/monkey/New()
var/datum/reagents/R = new/datum/reagents(1000)
diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm
index 9dd3e416410..c6895db0070 100644
--- a/code/modules/mob/living/carbon/monkey/update_icons.dm
+++ b/code/modules/mob/living/carbon/monkey/update_icons.dm
@@ -28,12 +28,20 @@
update_hud()
lying_prev = lying //so we don't update overlays for lying/standing unless our stance changes again
overlays.Cut()
+ var/ico = "monkey"
+ switch(src.dna.mutantrace) //On monkey spawn, check the DNA of the mob. If alien, change to appropriate alien monkey sprite
+ if("tajaran")
+ ico = "tajkey"
+ if("lizard")
+ ico = "stok"
+ if("skrell")
+ icon_state = "skrellkey"
if(lying)
- icon_state = "monkey0"
+ icon_state = ico + "0"
for(var/image/I in overlays_lying)
overlays += I
else
- icon_state = "monkey1"
+ icon_state = ico + "1"
for(var/image/I in overlays_standing)
overlays += I
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 9e3ed4b3a11..0da452cd318 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -20,29 +20,104 @@
flick("h2monkey", animation)
sleep(48)
//animation = null
- var/mob/living/carbon/monkey/O = new /mob/living/carbon/monkey( loc )
- del(animation)
- O.name = "monkey"
- O.dna = dna
- dna = null
- O.dna.uni_identity = "00600200A00E0110148FC01300B009"
- //O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
- O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*(STRUCDNASIZE-1))]BB8"
- O.loc = loc
- O.viruses = viruses
- viruses = list()
- for(var/datum/disease/D in O.viruses)
- D.affected_mob = O
+ var/mob/living/carbon/monkey/O = null
+
+ switch(dna.mutantrace)
+ if("tajara")
+ O = new /mob/living/carbon/monkey/tajara( loc )
+ O.name = "farwa"
+ O.dna = dna
+ dna = null
+ O.dna.uni_identity = "000000000000000000DC00000660004DA0A0E00"
+ //O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
+ O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*(STRUCDNASIZE-1))]BB8"
+ O.loc = loc
+ O.viruses = viruses
+ viruses = list()
+ for(var/datum/disease/D in O.viruses)
+ D.affected_mob = O
+
+ if (client)
+ client.mob = O
+ if(mind)
+ mind.transfer_to(O)
+ O << "You are now a farwa. "
+ O.a_intent = "hurt"
+ spawn(0)//To prevent the proc from returning null.
+ del(src)
+ del(animation)
+ if("lizard")
+ O = new /mob/living/carbon/monkey/unathi( loc )
+ O.name = "stok"
+ O.dna = dna
+ dna = null
+ O.dna.uni_identity = "000000000000000000DC00000660002A8044C5D"
+ //O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
+ O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*(STRUCDNASIZE-1))]BB8"
+ O.loc = loc
+ O.viruses = viruses
+ viruses = list()
+ for(var/datum/disease/D in O.viruses)
+ D.affected_mob = O
+
+ if (client)
+ client.mob = O
+ if(mind)
+ mind.transfer_to(O)
+ O << "You are now a stok. "
+ O.a_intent = "hurt"
+ spawn(0)//To prevent the proc from returning null.
+ del(src)
+ del(animation)
+ if("skrell")
+ O = new /mob/living/carbon/monkey/unathi( loc )
+ O.name = "neaera"
+ O.dna = dna
+ dna = null
+ O.dna.uni_identity = "000000000000000000DC00000660002A8044C5D"
+ //O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
+ O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*(STRUCDNASIZE-1))]BB8"
+ O.loc = loc
+ O.viruses = viruses
+ viruses = list()
+ for(var/datum/disease/D in O.viruses)
+ D.affected_mob = O
+
+ if (client)
+ client.mob = O
+ if(mind)
+ mind.transfer_to(O)
+ O << "You are now a neaera. "
+ O.a_intent = "hurt"
+ spawn(0)//To prevent the proc from returning null.
+ del(src)
+ del(animation)
+ else
+ O = new /mob/living/carbon/monkey( loc )
+ O.name = "monkey"
+ O.dna = dna
+ dna = null
+ O.dna.uni_identity = "00600200A00E0110148FC01300B009"
+ //O.dna.struc_enzymes = "0983E840344C39F4B059D5145FC5785DC6406A4BB8"
+ O.dna.struc_enzymes = "[copytext(O.dna.struc_enzymes,1,1+3*(STRUCDNASIZE-1))]BB8"
+ O.loc = loc
+ O.viruses = viruses
+ viruses = list()
+ for(var/datum/disease/D in O.viruses)
+ D.affected_mob = O
+
+ if (client)
+ client.mob = O
+ if(mind)
+ mind.transfer_to(O)
+ O << "You are now a monkey."
+ O.a_intent = "hurt"
+ spawn(0)//To prevent the proc from returning null.
+ del(src)
+ del(animation)
+
- if (client)
- client.mob = O
- if(mind)
- mind.transfer_to(O)
- O.a_intent = "hurt"
- O << "You are now a monkey."
- spawn(0)//To prevent the proc from returning null.
- del(src)
return O
/mob/new_player/AIize()
diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm
index a5985618ec5..f15c3410947 100644
--- a/code/modules/reagents/reagent_containers/food/snacks.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks.dm
@@ -1367,6 +1367,126 @@
icon_state = "monkeycubewrap"
wrapped = 1
+/obj/item/weapon/reagent_containers/food/snacks/farwacube
+ name = "farwa cube"
+ desc = "Just add water!"
+ icon_state = "monkeycube"
+ bitesize = 12
+ var/wrapped = 0
+
+ New()
+ ..()
+ reagents.add_reagent("nutriment",10)
+
+ afterattack(obj/O as obj, mob/user as mob)
+ if(istype(O,/obj/structure/sink) && !wrapped)
+ user << "You place [name] under a stream of water..."
+ loc = get_turf(O)
+ return Expand()
+ ..()
+
+ attack_self(mob/user as mob)
+ if(wrapped)
+ Unwrap(user)
+
+ proc/Expand()
+ for(var/mob/M in viewers(src,7))
+ M << "\red The farwa cube expands!"
+ new /mob/living/carbon/monkey/tajara(get_turf(src))
+ del(src)
+
+ proc/Unwrap(mob/user as mob)
+ icon_state = "monkeycube"
+ desc = "Just add water!"
+ user << "You unwrap the cube."
+ wrapped = 0
+ return
+
+/obj/item/weapon/reagent_containers/food/snacks/stokcube
+ name = "stok cube"
+ desc = "Just add water!"
+ icon_state = "monkeycube"
+ bitesize = 12
+ var/wrapped = 0
+
+ New()
+ ..()
+ reagents.add_reagent("nutriment",10)
+
+ afterattack(obj/O as obj, mob/user as mob)
+ if(istype(O,/obj/structure/sink) && !wrapped)
+ user << "You place [name] under a stream of water..."
+ loc = get_turf(O)
+ return Expand()
+ ..()
+
+ attack_self(mob/user as mob)
+ if(wrapped)
+ Unwrap(user)
+
+ proc/Expand()
+ for(var/mob/M in viewers(src,7))
+ M << "\red The stok cube expands!"
+ new /mob/living/carbon/monkey/unathi(get_turf(src))
+ del(src)
+
+ proc/Unwrap(mob/user as mob)
+ icon_state = "monkeycube"
+ desc = "Just add water!"
+ user << "You unwrap the cube."
+ wrapped = 0
+ return
+/obj/item/weapon/reagent_containers/food/snacks/neaeracube
+ name = "neaera cube"
+ desc = "Just add water!"
+ icon_state = "monkeycube"
+ bitesize = 12
+ var/wrapped = 0
+
+ New()
+ ..()
+ reagents.add_reagent("nutriment",10)
+
+ afterattack(obj/O as obj, mob/user as mob)
+ if(istype(O,/obj/structure/sink) && !wrapped)
+ user << "You place [name] under a stream of water..."
+ loc = get_turf(O)
+ return Expand()
+ ..()
+
+ attack_self(mob/user as mob)
+ if(wrapped)
+ Unwrap(user)
+
+ proc/Expand()
+ for(var/mob/M in viewers(src,7))
+ M << "\red The neaera cube expands!"
+ new /mob/living/carbon/monkey/skrell(get_turf(src))
+ del(src)
+
+ proc/Unwrap(mob/user as mob)
+ icon_state = "monkeycube"
+ desc = "Just add water!"
+ user << "You unwrap the cube."
+ wrapped = 0
+ return
+
+/obj/item/weapon/reagent_containers/food/snacks/neaeracube/wrapped
+ desc = "Still wrapped in some paper."
+ icon_state = "monkeycubewrap"
+ wrapped = 1
+/obj/item/weapon/reagent_containers/food/snacks/stokcube/wrapped
+ desc = "Still wrapped in some paper."
+ icon_state = "monkeycubewrap"
+ wrapped = 1
+
+
+/obj/item/weapon/reagent_containers/food/snacks/farwacube/wrapped
+ desc = "Still wrapped in some paper."
+ icon_state = "monkeycubewrap"
+ wrapped = 1
+
+
/obj/item/weapon/reagent_containers/food/snacks/spellburger
name = "Spell Burger"
diff --git a/icons/mob/monkey.dmi b/icons/mob/monkey.dmi
index 437ba085b15..75ce4c4596d 100644
Binary files a/icons/mob/monkey.dmi and b/icons/mob/monkey.dmi differ