[MIRROR] Refactors monkeys into a species (#2379)

* Refactors monkeys into a species

* aaa

Co-authored-by: Qustinnus <Floydje123@hotmail.com>
Co-authored-by: Azarak <azarak10@gmail.com>
This commit is contained in:
SkyratBot
2020-12-31 21:08:07 +01:00
committed by GitHub
co-authored by Qustinnus Azarak
parent 898121f9cd
commit d7f054b035
155 changed files with 614 additions and 1609 deletions
@@ -652,7 +652,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/mob/living/carbon/monkey{
/mob/living/carbon/human/species/monkey{
faction = list("neutral","Syndicate")
},
/turf/open/floor/plasteel/dark,
@@ -991,7 +991,7 @@
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/mob/living/carbon/monkey{
/mob/living/carbon/human/species/monkey{
faction = list("neutral","Syndicate")
},
/turf/open/floor/plasteel/dark,
@@ -2240,7 +2240,7 @@
/area/ruin/unpowered/syndicate_lava_base/cargo)
"hp" = (
/obj/effect/decal/cleanable/dirt,
/mob/living/carbon/monkey{
/mob/living/carbon/human/species/monkey{
faction = list("neutral","Syndicate")
},
/turf/open/floor/plasteel/white/side{
@@ -2257,7 +2257,7 @@
},
/area/ruin/unpowered/syndicate_lava_base/virology)
"hr" = (
/mob/living/carbon/monkey{
/mob/living/carbon/human/species/monkey{
faction = list("neutral","Syndicate")
},
/turf/open/floor/plasteel/white/side{
@@ -2395,7 +2395,7 @@
/turf/open/floor/mineral/plastitanium,
/area/ruin/unpowered/syndicate_lava_base/cargo)
"hE" = (
/mob/living/carbon/monkey{
/mob/living/carbon/human/species/monkey{
faction = list("neutral","Syndicate")
},
/turf/open/floor/plasteel/white/side{
@@ -2412,7 +2412,7 @@
/area/ruin/unpowered/syndicate_lava_base/virology)
"hG" = (
/obj/effect/decal/cleanable/dirt,
/mob/living/carbon/monkey{
/mob/living/carbon/human/species/monkey{
faction = list("neutral","Syndicate")
},
/turf/open/floor/plasteel/white/side{
+3 -3
View File
@@ -1119,7 +1119,7 @@
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel,
/area/awaymission/research/interior/genetics)
"cU" = (
@@ -1279,7 +1279,7 @@
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel,
/area/awaymission/research/interior/genetics)
"dj" = (
@@ -3699,7 +3699,7 @@
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel,
/area/awaymission/research/interior/genetics)
"hX" = (
@@ -26532,7 +26532,7 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
/mob/living/carbon/monkey/punpun,
/mob/living/carbon/human/species/monkey/punpun,
/turf/open/floor/plasteel,
/area/crew_quarters/kitchen)
"bff" = (
@@ -83762,7 +83762,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 9
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel/dark,
/area/science/genetics)
"djC" = (
@@ -83786,7 +83786,7 @@
/obj/effect/turf_decal/stripes/end{
dir = 4
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel/dark,
/area/science/genetics)
"djD" = (
@@ -84685,7 +84685,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel/dark,
/area/science/genetics)
"dlp" = (
@@ -85072,7 +85072,7 @@
layer = 2.9
},
/obj/effect/turf_decal/stripes/end,
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel/dark,
/area/science/genetics)
"dmC" = (
@@ -100811,7 +100811,7 @@
/obj/effect/turf_decal/tile/green{
dir = 8
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel/white,
/area/medical/virology)
"dVE" = (
@@ -100858,7 +100858,7 @@
/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{
dir = 8
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel/white,
/area/medical/virology)
"dVH" = (
@@ -101182,7 +101182,7 @@
/obj/structure/bed/roller,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/bot,
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel,
/area/medical/virology)
"dWy" = (
@@ -19393,7 +19393,7 @@
/obj/effect/turf_decal/tile/bar{
dir = 1
},
/mob/living/carbon/monkey/punpun,
/mob/living/carbon/human/species/monkey/punpun,
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"aSG" = (
@@ -38559,7 +38559,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
dir = 6
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel,
/area/medical/virology)
"bQK" = (
@@ -48362,7 +48362,7 @@
/obj/effect/turf_decal/tile/green{
dir = 4
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel,
/area/medical/virology)
"cKZ" = (
@@ -48923,7 +48923,7 @@
pixel_y = 2;
req_access_txt = "9"
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/engine,
/area/science/genetics)
"ddD" = (
@@ -49279,7 +49279,7 @@
/obj/effect/turf_decal/tile/green{
dir = 4
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel,
/area/medical/virology)
"dUO" = (
@@ -49290,7 +49290,7 @@
/obj/structure/window/reinforced{
dir = 1
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/engine,
/area/science/genetics)
"dYq" = (
@@ -49374,7 +49374,7 @@
/obj/effect/turf_decal/tile/green{
dir = 8
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel,
/area/medical/virology)
"emq" = (
@@ -54109,7 +54109,7 @@
req_access_txt = "9"
},
/obj/machinery/light,
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/engine,
/area/science/genetics)
"qrU" = (
@@ -56824,7 +56824,7 @@
/obj/effect/turf_decal/tile/green{
dir = 1
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/plasteel,
/area/medical/virology)
"xUi" = (
+10 -10
View File
@@ -30478,7 +30478,7 @@
/area/science/xenobiology)
"aXb" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4,
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/science/genetics)
"aXc" = (
@@ -31066,7 +31066,7 @@
/obj/effect/turf_decal/box/corners{
dir = 4
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/science/genetics)
"aXV" = (
@@ -34807,7 +34807,7 @@
dir = 8
},
/obj/structure/flora/ausbushes/grassybush,
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/science/genetics)
"bdB" = (
@@ -35037,7 +35037,7 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
dir = 4
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/science/genetics)
"bdT" = (
@@ -38263,7 +38263,7 @@
/obj/item/food/grown/banana,
/obj/structure/flora/ausbushes/ywflowers,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4,
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/medical/virology)
"biE" = (
@@ -40223,7 +40223,7 @@
name = "medical camera";
network = list("ss13","medical")
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/medical/virology)
"blC" = (
@@ -41656,7 +41656,7 @@
/obj/machinery/light{
dir = 4
},
/mob/living/carbon/monkey{
/mob/living/carbon/human/species/monkey{
name = "mankey"
},
/turf/open/floor/grass,
@@ -42413,7 +42413,7 @@
/obj/structure/flora/grass/jungle,
/obj/structure/flora/ausbushes/fernybush,
/obj/structure/disposalpipe/segment,
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/medical/virology)
"bpb" = (
@@ -45441,7 +45441,7 @@
dir = 8;
pixel_x = 24
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/medical/virology)
"btw" = (
@@ -80856,7 +80856,7 @@
pixel_y = 24;
req_access_txt = "25"
},
/mob/living/carbon/monkey/punpun,
/mob/living/carbon/human/species/monkey/punpun,
/turf/open/floor/plasteel/dark,
/area/crew_quarters/bar)
"cAl" = (
+8 -8
View File
@@ -1243,7 +1243,7 @@
/obj/machinery/airalarm{
pixel_y = 22
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/medical/virology)
"acX" = (
@@ -1393,7 +1393,7 @@
/area/security/prison)
"adv" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2,
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/medical/virology)
"adw" = (
@@ -1441,7 +1441,7 @@
/area/security/prison)
"adB" = (
/obj/structure/cable,
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/medical/virology)
"adC" = (
@@ -45483,7 +45483,7 @@
/area/bridge/showroom/corporate)
"chx" = (
/obj/structure/flora/ausbushes/brflowers,
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/science/genetics)
"chy" = (
@@ -50884,7 +50884,7 @@
/obj/effect/turf_decal/stripes/line{
dir = 4
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/science/genetics)
"cuu" = (
@@ -64880,7 +64880,7 @@
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{
dir = 8
},
/mob/living/carbon/monkey/punpun,
/mob/living/carbon/human/species/monkey/punpun,
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"enV" = (
@@ -68641,7 +68641,7 @@
/turf/open/floor/plating,
/area/maintenance/aft)
"jwJ" = (
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/medical/virology)
"jwW" = (
@@ -75953,7 +75953,7 @@
/turf/open/floor/plasteel/white,
/area/medical/chemistry)
"sRB" = (
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/science/genetics)
"sSr" = (
+5 -5
View File
@@ -287,7 +287,7 @@
/turf/open/floor/grass,
/area/shuttle/escape)
"it" = (
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/obj/structure/flora/grass/jungle/b{
icon_state = "bushb3"
},
@@ -428,7 +428,7 @@
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"mq" = (
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/obj/machinery/light/floor,
/obj/structure/flora/ausbushes/sparsegrass,
/turf/open/floor/grass,
@@ -926,7 +926,7 @@
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"Ia" = (
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/obj/structure/flora/ausbushes/sparsegrass,
/turf/open/floor/grass,
/area/shuttle/escape)
@@ -1243,11 +1243,11 @@
/obj/effect/turf_decal/weather/dirt{
dir = 1
},
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/shuttle/escape)
"Vv" = (
/mob/living/carbon/monkey,
/mob/living/carbon/human/species/monkey,
/turf/open/floor/grass,
/area/shuttle/escape)
"VI" = (
+4 -18
View File
@@ -91,22 +91,6 @@
#define DNA_MUTATION_BLOCKS 8
#define DNA_UNIQUE_ENZYMES_LEN 32
//Transformation proc stuff
#define TR_KEEPITEMS (1<<0)
#define TR_KEEPVIRUS (1<<1)
#define TR_KEEPDAMAGE (1<<2)
/// hashing names (e.g. monkey(e34f)) (only in monkeyize)
#define TR_HASHNAME (1<<3)
#define TR_KEEPIMPLANTS (1<<4)
/// changelings shouldn't edit the DNA's SE when turning into a monkey
#define TR_KEEPSE (1<<5)
#define TR_DEFAULTMSG (1<<6)
#define TR_KEEPORGANS (1<<8)
#define TR_KEEPSTUNS (1<<9)
#define TR_KEEPREAGENTS (1<<10)
#define TR_KEEPSTAMINADAMAGE (1<<11)
#define TR_KEEPAI (1<<12)
//species traits for mutantraces
#define MUTCOLORS 1
#define HAIR 2
@@ -129,7 +113,6 @@
#define AGENDER 16
/// Do not draw eyes or eyeless overlay
#define NOEYESPRITES 17
/// Used for determining which wounds are applicable to this species.
/// if we have flesh (can suffer slash/piercing/burn wounds, requires they don't have NOBLOOD)
#define HAS_FLESH 18
@@ -137,7 +120,10 @@
#define HAS_BONE 19
///If we have a limb-specific overlay sprite
#define HAS_MARKINGS 20
/// Do not draw blood overlay
#define NOBLOODOVERLAY 21
///No augments, for monkeys in specific because they will turn into fucking freakazoids https://cdn.discordapp.com/attachments/326831214667235328/791313258912153640/102707682-fa7cad80-4294-11eb-8f13-8c689468aeb0.png
#define NOAUGMENTS 22
//organ slots
#define ORGAN_SLOT_BRAIN "brain"
+2
View File
@@ -973,6 +973,8 @@
#define COMSIG_MOB_ITEM_ATTACK_QDELETED "mob_item_attack_qdeleted"
///from base of mob/RangedAttack(): (atom/A, params)
#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged"
///From base of atom/ctrl_click(): (atom/A)
#define COMSIG_MOB_CTRL_CLICKED "mob_ctrl_clicked"
///from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity)
#define COMSIG_HUMAN_EARLY_UNARMED_ATTACK "human_early_unarmed_attack"
///from mob/living/carbon/human/UnarmedAttack(): (atom/target, proximity)
+1 -1
View File
@@ -71,9 +71,9 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(
#define isethereal(A) (is_species(A, /datum/species/ethereal))
#define isvampire(A) (is_species(A,/datum/species/vampire))
#define isdullahan(A) (is_species(A, /datum/species/dullahan))
#define ismonkey(A) (is_species(A, /datum/species/monkey))
//more carbon mobs
#define ismonkey(A) (istype(A, /mob/living/carbon/monkey))
#define isalien(A) (istype(A, /mob/living/carbon/alien))
+2 -2
View File
@@ -1,7 +1,7 @@
//Monkey defines, placed here so they can be read by other things!
/// below this health value the monkey starts to flee from enemies
#define MONKEY_FLEE_HEALTH 50
#define MONKEY_FLEE_HEALTH 40
/// how close an enemy must be to trigger aggression
#define MONKEY_ENEMY_VISION 9
/// how close an enemy must be before it triggers flee
@@ -21,7 +21,7 @@
/// probability that monkey will get into mischief, i.e. finding/stealing items
#define MONKEY_SHENANIGAN_PROB 20
/// probability that monkey will disarm an armed attacker
#define MONKEY_ATTACK_DISARM_PROB 50
#define MONKEY_ATTACK_DISARM_PROB 20
/// probability that monkey will get recruited when friend is attacked
#define MONKEY_RECRUIT_PROB 25
+1
View File
@@ -35,6 +35,7 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_wings, GLOB.moth_wings_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_antennae, GLOB.moth_antennae_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, GLOB.moth_markings_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/monkey, GLOB.tails_list_monkey)
*/
//SKYRAT EDIT REMOVAL END
+1 -1
View File
@@ -80,7 +80,7 @@
if(!GLOB.moth_markings_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, GLOB.moth_markings_list)
//For now we will always return none for tail_human and ears.
return(list("mcolor" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),"ethcolor" = GLOB.color_list_ethereal[pick(GLOB.color_list_ethereal)], "tail_lizard" = pick(GLOB.tails_list_lizard), "tail_human" = "None", "wings" = "None", "snout" = pick(GLOB.snouts_list), "horns" = pick(GLOB.horns_list), "ears" = "None", "frills" = pick(GLOB.frills_list), "spines" = pick(GLOB.spines_list), "body_markings" = pick(GLOB.body_markings_list), "legs" = "Normal Legs", "caps" = pick(GLOB.caps_list), "moth_wings" = pick(GLOB.moth_wings_list), "moth_antennae" = pick(GLOB.moth_antennae_list), "moth_markings" = pick(GLOB.moth_markings_list)))
return(list("mcolor" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"),"ethcolor" = GLOB.color_list_ethereal[pick(GLOB.color_list_ethereal)], "tail_lizard" = pick(GLOB.tails_list_lizard), "tail_human" = "None", "wings" = "None", "snout" = pick(GLOB.snouts_list), "horns" = pick(GLOB.horns_list), "ears" = "None", "frills" = pick(GLOB.frills_list), "spines" = pick(GLOB.spines_list), "body_markings" = pick(GLOB.body_markings_list), "legs" = "Normal Legs", "caps" = pick(GLOB.caps_list), "moth_wings" = pick(GLOB.moth_wings_list), "moth_antennae" = pick(GLOB.moth_antennae_list), "moth_markings" = pick(GLOB.moth_markings_list), "tail_monkey" = "None"))
*/
//SKYRAT EDIT REMOVAL END
-2
View File
@@ -286,8 +286,6 @@ Turf and target are separate in case you want to teleport some distance from a t
moblist.Add(M)
for(var/mob/dead/new_player/M in sortmob)
moblist.Add(M)
for(var/mob/living/carbon/monkey/M in sortmob)
moblist.Add(M)
for(var/mob/living/simple_animal/slime/M in sortmob)
moblist.Add(M)
for(var/mob/living/simple_animal/M in sortmob)
+1
View File
@@ -40,6 +40,7 @@ GLOBAL_LIST_EMPTY(moth_wings_list)
GLOBAL_LIST_EMPTY(moth_antennae_list)
GLOBAL_LIST_EMPTY(moth_markings_list)
GLOBAL_LIST_EMPTY(caps_list)
GLOBAL_LIST_EMPTY(tails_list_monkey)
*/
//SKYRAT EDIT REMOVAL END
+1
View File
@@ -316,6 +316,7 @@
/atom/proc/CtrlClick(mob/user)
SEND_SIGNAL(src, COMSIG_CLICK_CTRL, user)
SEND_SIGNAL(user, COMSIG_MOB_CTRL_CLICKED, src)
var/mob/living/ML = user
if(istype(ML))
ML.pulled(src)
-169
View File
@@ -1,169 +0,0 @@
/datum/hud/monkey/New(mob/living/carbon/monkey/owner)
..()
var/atom/movable/screen/using
var/atom/movable/screen/inventory/inv_box
action_intent = new /atom/movable/screen/act_intent()
action_intent.icon = ui_style
action_intent.icon_state = mymob.a_intent
action_intent.screen_loc = ui_acti
action_intent.hud = src
static_inventory += action_intent
using = new /atom/movable/screen/mov_intent()
using.icon = ui_style
using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking")
using.screen_loc = ui_movi
using.hud = src
static_inventory += using
using = new/atom/movable/screen/language_menu
using.icon = ui_style
using.hud = src
static_inventory += using
using = new /atom/movable/screen/drop()
using.icon = ui_style
using.screen_loc = ui_drop_throw
using.hud = src
static_inventory += using
build_hand_slots()
using = new /atom/movable/screen/swap_hand()
using.icon = ui_style
using.icon_state = "swap_1_m" //extra wide!
using.screen_loc = ui_swaphand_position(owner,1)
using.hud = src
static_inventory += using
using = new /atom/movable/screen/swap_hand()
using.icon = ui_style
using.icon_state = "swap_2"
using.screen_loc = ui_swaphand_position(owner,2)
using.hud = src
static_inventory += using
inv_box = new /atom/movable/screen/inventory()
inv_box.name = "mask"
inv_box.icon = ui_style
inv_box.icon_state = "mask"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_monkey_mask
inv_box.slot_id = ITEM_SLOT_MASK
inv_box.hud = src
static_inventory += inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box.name = "neck"
inv_box.icon = ui_style
inv_box.icon_state = "neck"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_monkey_neck
inv_box.slot_id = ITEM_SLOT_NECK
inv_box.hud = src
static_inventory += inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box.name = "head"
inv_box.icon = ui_style
inv_box.icon_state = "head"
// inv_box.icon_full = "template"
inv_box.screen_loc = ui_monkey_head
inv_box.slot_id = ITEM_SLOT_HEAD
inv_box.hud = src
static_inventory += inv_box
inv_box = new /atom/movable/screen/inventory()
inv_box.name = "back"
inv_box.icon = ui_style
inv_box.icon_state = "back"
inv_box.screen_loc = ui_monkey_back
inv_box.slot_id = ITEM_SLOT_BACK
inv_box.hud = src
static_inventory += inv_box
throw_icon = new /atom/movable/screen/throw_catch()
throw_icon.icon = ui_style
throw_icon.screen_loc = ui_drop_throw
throw_icon.hud = src
hotkeybuttons += throw_icon
internals = new /atom/movable/screen/internals()
internals.hud = src
infodisplay += internals
healths = new /atom/movable/screen/healths()
healths.hud = src
infodisplay += healths
pull_icon = new /atom/movable/screen/pull()
pull_icon.icon = ui_style
pull_icon.update_icon()
pull_icon.screen_loc = ui_above_movement
pull_icon.hud = src
static_inventory += pull_icon
lingchemdisplay = new /atom/movable/screen/ling/chems()
lingchemdisplay.hud = src
infodisplay += lingchemdisplay
lingstingdisplay = new /atom/movable/screen/ling/sting()
lingstingdisplay.hud = src
infodisplay += lingstingdisplay
zone_select = new /atom/movable/screen/zone_sel()
zone_select.icon = ui_style
zone_select.hud = src
zone_select.update_icon()
static_inventory += zone_select
mymob.client.screen = list()
using = new /atom/movable/screen/resist()
using.icon = ui_style
using.screen_loc = ui_above_intent
using.hud = src
hotkeybuttons += using
for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory))
if(inv.slot_id)
inv.hud = src
inv_slots[TOBITSHIFT(inv.slot_id) + 1] = inv
inv.update_icon()
/datum/hud/monkey/persistent_inventory_update()
if(!mymob)
return
var/mob/living/carbon/monkey/M = mymob
if(hud_shown)
if(M.back)
M.back.screen_loc = ui_monkey_back
M.client.screen += M.back
if(M.wear_mask)
M.wear_mask.screen_loc = ui_monkey_mask
M.client.screen += M.wear_mask
if(M.wear_neck)
M.wear_neck.screen_loc = ui_monkey_neck
M.client.screen += M.wear_neck
if(M.head)
M.head.screen_loc = ui_monkey_head
M.client.screen += M.head
else
if(M.back)
M.back.screen_loc = null
if(M.wear_mask)
M.wear_mask.screen_loc = null
if(M.head)
M.head.screen_loc = null
if(hud_version != HUD_STYLE_NOHUD)
for(var/obj/item/I in M.held_items)
I.screen_loc = ui_hand_position(M.get_held_index_of_item(I))
M.client.screen += I
else
for(var/obj/item/I in M.held_items)
I.screen_loc = null
M.client.screen -= I
+4 -34
View File
@@ -28,6 +28,9 @@
if(SEND_SIGNAL(src, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, A, proximity) & COMPONENT_CANCEL_ATTACK_CHAIN)
return
SEND_SIGNAL(src, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, A, proximity)
if(dna?.species?.spec_unarmedattack(src, A)) //Because species like monkeys dont use attack hand
return
A.attack_hand(src)
/// Return TRUE to cancel other attack hand effects that respect it.
@@ -104,40 +107,7 @@
/atom/proc/attack_animal(mob/user)
SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_ANIMAL, user)
/*
Monkeys
*/
/mob/living/carbon/monkey/UnarmedAttack(atom/A)
if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED))
if(a_intent != INTENT_HARM || is_muzzled())
return
if(!iscarbon(A))
return
var/mob/living/carbon/victim = A
var/obj/item/bodypart/affecting = null
if(ishuman(victim))
var/mob/living/carbon/human/human_victim = victim
affecting = human_victim.get_bodypart(pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
var/armor = victim.run_armor_check(affecting, MELEE)
if(prob(25))
victim.visible_message("<span class='danger'>[src]'s bite misses [victim]!</span>",
"<span class='danger'>You avoid [src]'s bite!</span>", "<span class='hear'>You hear jaws snapping shut!</span>", COMBAT_MESSAGE_RANGE, src)
to_chat(src, "<span class='danger'>Your bite misses [victim]!</span>")
return
victim.apply_damage(rand(1, 3), BRUTE, affecting, armor)
victim.visible_message("<span class='danger'>[name] bites [victim]!</span>",
"<span class='userdanger'>[name] bites you!</span>", "<span class='hear'>You hear a chomp!</span>", COMBAT_MESSAGE_RANGE, name)
to_chat(name, "<span class='danger'>You bite [victim]!</span>")
if(armor >= 2)
return
for(var/d in diseases)
var/datum/disease/bite_infection = d
victim.ForceContractDisease(bite_infection)
return
A.attack_paw(src)
///Attacked by monkey
/atom/proc/attack_paw(mob/user)
if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_PAW, user) & COMPONENT_CANCEL_ATTACK_CHAIN)
return TRUE
@@ -269,8 +269,6 @@
movedelay_type = /mob/living/carbon/human
/datum/config_entry/number/outdated_movedelay/robot_delay
movedelay_type = /mob/living/silicon/robot
/datum/config_entry/number/outdated_movedelay/monkey_delay
movedelay_type = /mob/living/carbon/monkey
/datum/config_entry/number/outdated_movedelay/alien_delay
movedelay_type = /mob/living/carbon/alien
/datum/config_entry/number/outdated_movedelay/slime_delay
+8 -3
View File
@@ -77,6 +77,8 @@ have ways of interacting with a specific atom and control it. They posses a blac
/// Generates a plan and see if our existing one is still valid.
/datum/ai_controller/process(delta_time)
if(!able_to_run())
var/atom/movable/movable_pawn = pawn
walk(movable_pawn, 0) //stop moving
return //this should remove them from processing in the future through event-based stuff.
if(!current_behaviors?.len)
SelectBehaviors(delta_time)
@@ -101,10 +103,13 @@ have ways of interacting with a specific atom and control it. They posses a blac
///Move somewhere using dumb movement (byond base)
/datum/ai_controller/proc/MoveTo(delta_time)
var/current_loc = get_turf(pawn)
var/atom/movable/movable_pawn = pawn
if(!is_type_in_typecache(get_step(pawn, get_dir(pawn, current_movement_target)), GLOB.dangerous_turfs))
step_towards(pawn, current_movement_target)
if(current_loc == get_turf(pawn))
var/turf/target_turf = get_step_towards(movable_pawn, current_movement_target)
if(!is_type_in_typecache(target_turf, GLOB.dangerous_turfs))
movable_pawn.Move(target_turf, get_dir(current_loc, target_turf))
if(current_loc == get_turf(movable_pawn))
if(++pathing_attempts >= MAX_PATHING_ATTEMPTS)
CancelActions()
pathing_attempts = 0
+3 -2
View File
@@ -156,6 +156,8 @@
/datum/ai_behavior/monkey_attack_mob/finish_action(datum/ai_controller/controller, succeeded)
. = ..()
var/mob/living/living_pawn = controller.pawn
walk(living_pawn, 0)
controller.blackboard[BB_MONKEY_CURRENT_ATTACK_TARGET] = null
/// attack using a held weapon otherwise bite the enemy, then if we are angry there is a chance we might calm down a little
@@ -176,8 +178,7 @@
if(weapon)
weapon.melee_attack_chain(living_pawn, target)
else
target.attack_paw(living_pawn)
living_pawn.UnarmedAttack(target)
// no de-aggro
if(controller.blackboard[BB_MONKEY_AGRESSIVE])
return
+2 -1
View File
@@ -134,7 +134,8 @@ have ways of interacting with a specific mob and control it.
var/mob/living/living_pawn = pawn
if(DT_PROB(25, delta_time) && (living_pawn.mobility_flags & MOBILITY_MOVE) && isturf(living_pawn.loc) && !living_pawn.pulledby)
step(living_pawn, pick(GLOB.cardinals))
var/move_dir = pick(GLOB.alldirs)
living_pawn.Move(get_step(living_pawn, move_dir), move_dir)
else if(DT_PROB(5, delta_time))
INVOKE_ASYNC(living_pawn, /mob.proc/emote, pick("screech"))
else if(DT_PROB(1, delta_time))
+7 -9
View File
@@ -237,19 +237,17 @@
/datum/component/bloodysoles/feet/update_icon()
if(ishuman(wielder))
// Monkeys get no bloody feet :(
var/mob/living/carbon/human/human = wielder
if(NOBLOODOVERLAY in human.dna.species.species_traits)
return
if(bloody_shoes[BLOOD_STATE_HUMAN] > 0 && !is_obscured())
wielder.remove_overlay(SHOES_LAYER)
wielder.overlays_standing[SHOES_LAYER] = bloody_feet
wielder.apply_overlay(SHOES_LAYER)
human.remove_overlay(SHOES_LAYER)
human.overlays_standing[SHOES_LAYER] = bloody_feet
human.apply_overlay(SHOES_LAYER)
else
wielder.update_inv_shoes()
human.update_inv_shoes()
/datum/component/bloodysoles/feet/add_parent_to_footprint(obj/effect/decal/cleanable/blood/footprints/FP)
if(ismonkey(wielder))
FP.species_types |= "monkey"
return
if(!ishuman(wielder))
FP.species_types |= "unknown"
return
+2 -3
View File
@@ -1,6 +1,5 @@
GLOBAL_LIST_INIT(creamable, typecacheof(list(
/mob/living/carbon/human,
/mob/living/carbon/monkey,
/mob/living/simple_animal/pet/dog/corgi,
/mob/living/silicon/ai)))
@@ -26,11 +25,11 @@ GLOBAL_LIST_INIT(creamable, typecacheof(list(
var/mob/living/carbon/human/H = parent
if(H.dna.species.limbs_id == "lizard")
creamface.icon_state = "creampie_lizard"
else if(H.dna.species.limbs_id == "monkey")
creamface.icon_state = "creampie_monkey"
else
creamface.icon_state = "creampie_human"
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "creampie", /datum/mood_event/creampie)
else if(ismonkey(parent))
creamface.icon_state = "creampie_monkey"
else if(iscorgi(parent))
creamface.icon_state = "creampie_corgi"
else if(isAI(parent))
+11 -9
View File
@@ -57,7 +57,17 @@
else
target_zone = check_zone(target_zone)
if(ishuman(src))
if(ismonkey(src))
var/mob/living/carbon/human/M = src
switch(target_zone)
if(BODY_ZONE_HEAD)
if(M.wear_mask && isobj(M.wear_mask))
Cl = M.wear_mask
passed = prob((Cl.permeability_coefficient*100) - 1)
else if(ishuman(src))
var/mob/living/carbon/human/H = src
switch(target_zone)
@@ -95,14 +105,6 @@
Cl = H.shoes
passed = prob((Cl.permeability_coefficient*100) - 1)
else if(ismonkey(src))
var/mob/living/carbon/monkey/M = src
switch(target_zone)
if(BODY_ZONE_HEAD)
if(M.wear_mask && isobj(M.wear_mask))
Cl = M.wear_mask
passed = prob((Cl.permeability_coefficient*100) - 1)
if(passed)
D.try_infect(src)
+1 -1
View File
@@ -23,7 +23,7 @@
agent = "advance microbes"
max_stages = 5
spread_text = "Unknown"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
viable_mobtypes = list(/mob/living/carbon/human)
// NEW VARS
var/list/properties = list()
+1 -1
View File
@@ -7,7 +7,7 @@
cure_text = "Ethanol"
cures = list(/datum/reagent/consumable/ethanol)
agent = "Excess Lepidopticides"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
viable_mobtypes = list(/mob/living/carbon/human)
desc = "If left untreated subject will regurgitate butterflies."
severity = DISEASE_SEVERITY_MINOR
+1 -1
View File
@@ -7,7 +7,7 @@
cure_text = "Sugar"
cures = list(/datum/reagent/consumable/sugar)
agent = "Apidae Infection"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
viable_mobtypes = list(/mob/living/carbon/human)
desc = "If left untreated subject will regurgitate bees."
severity = DISEASE_SEVERITY_MEDIUM
infectable_biotypes = MOB_ORGANIC|MOB_UNDEAD //bees nesting in corpses
+1 -1
View File
@@ -4,7 +4,7 @@
cure_text = "Rest & Spaceacillin"
cures = list(/datum/reagent/medicine/spaceacillin)
agent = "XY-rhinovirus"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.5
desc = "If left untreated the subject will contract the flu."
severity = DISEASE_SEVERITY_NONTHREAT
+1 -1
View File
@@ -6,7 +6,7 @@
cure_text = "Synaptizine & Sulfur"
cures = list(/datum/reagent/medicine/synaptizine,/datum/reagent/sulfur)
agent = "Gravitokinetic Bipotential SADS-"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
viable_mobtypes = list(/mob/living/carbon/human)
desc = "If left untreated death will occur."
severity = DISEASE_SEVERITY_BIOHAZARD
+1 -1
View File
@@ -6,7 +6,7 @@
cures = list(/datum/reagent/medicine/spaceacillin)
cure_chance = 10
agent = "H13N1 flu virion"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey)
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.75
desc = "If left untreated the subject will feel quite unwell."
severity = DISEASE_SEVERITY_MINOR
+5 -6
View File
@@ -5,7 +5,7 @@
spread_flags = DISEASE_SPREAD_SPECIAL
cure_text = "A coder's love (theoretical)."
agent = "Shenanigans"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey, /mob/living/carbon/alien)
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/alien)
severity = DISEASE_SEVERITY_BIOHAZARD
stage_prob = 10
visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC
@@ -103,7 +103,7 @@
cures = list(/datum/reagent/medicine/adminordrazine)
spread_text = "Monkey Bites"
spread_flags = DISEASE_SPREAD_SPECIAL
viable_mobtypes = list(/mob/living/carbon/monkey, /mob/living/carbon/human)
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 1
cure_chance = 1
disease_flags = CAN_CARRY|CAN_RESIST
@@ -112,7 +112,7 @@
stage_prob = 4
visibility_flags = NONE
agent = "Kongey Vibrion M-909"
new_form = /mob/living/carbon/monkey
new_form = /mob/living/carbon/human/species/monkey
bantype = ROLE_MONKEY
@@ -126,9 +126,8 @@
/datum/disease/transformation/jungle_fever/do_disease_transformation(mob/living/carbon/affected_mob)
if(affected_mob.mind && !is_monkey(affected_mob.mind))
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_KEEPSTUNS | TR_KEEPREAGENTS | TR_KEEPSE)
M.ventcrawler = VENTCRAWLER_ALWAYS
affected_mob.monkeyize()
affected_mob.ventcrawler = VENTCRAWLER_ALWAYS
/datum/disease/transformation/jungle_fever/stage_act()
+2 -7
View File
@@ -141,11 +141,7 @@
mutation_index.Cut()
default_mutation_genes.Cut()
shuffle_inplace(mutations_temp)
if(ismonkey(holder))
mutations |= new RACEMUT(MUT_NORMAL)
mutation_index[RACEMUT] = GET_SEQUENCE(RACEMUT)
else
mutation_index[RACEMUT] = create_sequence(RACEMUT, FALSE)
mutation_index[RACEMUT] = create_sequence(RACEMUT, FALSE)
default_mutation_genes[RACEMUT] = mutation_index[RACEMUT]
for(var/i in 2 to DNA_MUTATION_BLOCKS)
var/datum/mutation/human/M = mutations_temp[i]
@@ -443,8 +439,7 @@
return
for(var/mutation in dna.mutation_index)
if(ismob(dna.check_block(mutation)))
return //we got monkeyized/humanized, this mob will be deleted, no need to continue.
dna.check_block(mutation)
update_mutations_overlay()
+4 -4
View File
@@ -180,11 +180,11 @@
/datum/mutation/human/race/on_acquiring(mob/living/carbon/human/owner)
if(..())
return
. = owner.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_KEEPSE | TR_KEEPAI)
. = owner.monkeyize()
/datum/mutation/human/race/on_losing(mob/living/carbon/monkey/owner)
if(owner && istype(owner) && owner.stat != DEAD && (owner.dna.mutations.Remove(src)))
. = owner.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_KEEPSE | TR_KEEPAI)
/datum/mutation/human/race/on_losing(mob/living/carbon/human/owner)
if(owner && owner.stat != DEAD && (owner.dna.mutations.Remove(src)) && ismonkey(owner))
. = owner.humanize()
/datum/mutation/human/glow
name = "Glowy"
+1 -1
View File
@@ -110,7 +110,7 @@
return
var/mob/living/carbon/possible_throwable = user.pulling
if(!possible_throwable.getorganslot(ORGAN_SLOT_TAIL) && !ismonkey(possible_throwable))
if(!possible_throwable.getorganslot(ORGAN_SLOT_TAIL))
return
if(ishuman(possible_throwable))
@@ -167,7 +167,7 @@
for(var/datum/mind/rev_mind in revolution.head_revolutionaries())
var/turf/T = get_turf(rev_mind.current)
if(!considered_afk(rev_mind) && considered_alive(rev_mind) && is_station_level(T.z))
if(ishuman(rev_mind.current) || ismonkey(rev_mind.current))
if(ishuman(rev_mind.current))
return FALSE
return TRUE
@@ -467,7 +467,7 @@
for(var/datum/mind/rev_mind in revolution.head_revolutionaries())
var/turf/T = get_turf(rev_mind.current)
if(!considered_afk(rev_mind) && considered_alive(rev_mind) && is_station_level(T.z))
if(ishuman(rev_mind.current) || ismonkey(rev_mind.current))
if(ishuman(rev_mind.current))
return FALSE
return TRUE
@@ -618,7 +618,9 @@
if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME)
return FALSE
var/datum/disease/D = new /datum/disease/transformation/jungle_fever()
for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list)
for(var/mob/living/carbon/human/M in GLOB.alive_mob_list)
if(!ismonkey(M))
continue
if (M.HasDisease(D))
if(M.onCentCom() || M.onSyndieBase())
escaped_monkeys++
+3 -1
View File
@@ -79,7 +79,9 @@
if(SSshuttle.emergency.mode != SHUTTLE_ENDGAME)
return FALSE
var/datum/disease/D = new /datum/disease/transformation/jungle_fever()
for(var/mob/living/carbon/monkey/M in GLOB.alive_mob_list)
for(var/mob/living/carbon/human/M in GLOB.alive_mob_list)
if(!ismonkey(M))
return
if (M.HasDisease(D))
if(M.onCentCom() || M.onSyndieBase())
escaped_monkeys++
+3 -2
View File
@@ -687,12 +687,13 @@ GLOBAL_LIST_EMPTY(possible_items_special)
var/captured_amount = 0
var/area/centcom/holding/A = GLOB.areas_by_type[/area/centcom/holding]
for(var/mob/living/carbon/human/M in A)//Humans.
if(ismonkey(M))
captured_amount+=0.1
continue
if(M.stat == DEAD)//Dead folks are worth less.
captured_amount+=0.5
continue
captured_amount+=1
for(var/mob/living/carbon/monkey/M in A)//Monkeys are almost worthless, you failure.
captured_amount+=0.1
for(var/mob/living/carbon/alien/larva/M in A)//Larva are important for research.
if(M.stat == DEAD)
captured_amount+=0.5
+1 -1
View File
@@ -149,7 +149,7 @@
for(var/datum/mind/rev_mind in revolution.head_revolutionaries())
var/turf/T = get_turf(rev_mind.current)
if(!considered_afk(rev_mind) && considered_alive(rev_mind) && is_station_level(T.z))
if(ishuman(rev_mind.current) || ismonkey(rev_mind.current))
if(ishuman(rev_mind.current))
return FALSE
return TRUE
+1 -1
View File
@@ -95,7 +95,7 @@
else
if(sbed)
data["table"] = sbed
if(!ishuman(sbed.occupant) && !ismonkey(sbed.occupant))
if(!ishuman(sbed.occupant))
return data
data["patient"] = list()
patient = sbed.occupant
-3
View File
@@ -360,9 +360,6 @@
L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
L.emote("scream")
L.Paralyze(100)
else if(ismonkey(L)) //For monkeys
L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
L.Paralyze(100)
else //for simple_animals & borgs
L.adjustBruteLoss(DOOR_CRUSH_DAMAGE)
var/turf/location = get_turf(src)
@@ -76,9 +76,6 @@
else if(ispath(mobtype, /mob/living/simple_animal/slime))
race = "Slime"
else if(ispath(mobtype, /mob/living/carbon/monkey))
race = "Monkey"
// sometimes M gets deleted prematurely for AIs... just check the job
else if(ispath(mobtype, /mob/living/silicon) || C.parameters["job"] == "AI")
race = "Artificial Life"
+2 -2
View File
@@ -447,7 +447,7 @@
var/endtime = world.time+duration
for(var/mutation in remove_mutations)
if(mutation == RACEMUT)
if(ishuman(M))
if(!ismonkey(M))
continue
M = M.dna.remove_mutation(mutation)
else
@@ -455,7 +455,7 @@
for(var/mutation in add_mutations)
if(M.dna.get_mutation(mutation))
continue //Skip permanent mutations we already have.
if(mutation == RACEMUT && ishuman(M))
if(mutation == RACEMUT && !ismonkey(M))
message_admins("[ADMIN_LOOKUPFLW(user)] injected [key_name_admin(M)] with the [name] <span class='danger'>(MONKEY)</span>")
log_msg += " (MONKEY)"
M = M.dna.add_mutation(mutation, MUT_OTHER, endtime)
+1 -1
View File
@@ -324,7 +324,7 @@
foodtypes = MEAT | SUGAR
w_class = WEIGHT_CLASS_TINY
var/faction
var/spawned_mob = /mob/living/carbon/monkey
var/spawned_mob = /mob/living/carbon/human/species/monkey
/obj/item/food/monkeycube/proc/Expand()
var/mob/spammer = get_mob_by_key(fingerprintslast)
+1 -1
View File
@@ -113,7 +113,7 @@
if(2)
if(scooldown < world.time)
if(M.health >= 0)
if(ishuman(M)||ismonkey(M))
if(ishuman(M))
M.electrocute_act(5, "[user]", flags = SHOCK_NOGLOVES)
user.visible_message("<span class='userdanger'>[user] electrocutes [M] with [user.p_their()] touch!</span>", \
"<span class='danger'>You electrocute [M] with your touch!</span>")
@@ -314,11 +314,6 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
if(!H.gloves && !HAS_TRAIT(H, TRAIT_PIERCEIMMUNE)) // golems, etc
to_chat(H, "<span class='warning'>[src] cuts into your hand!</span>")
H.apply_damage(force*0.5, BRUTE, hit_hand)
else if(ismonkey(user))
var/mob/living/carbon/monkey/M = user
if(!HAS_TRAIT(M, TRAIT_PIERCEIMMUNE))
to_chat(M, "<span class='warning'>[src] cuts into your hand!</span>")
M.apply_damage(force*0.5, BRUTE, hit_hand)
/obj/item/shard/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/lightreplacer))
+1 -1
View File
@@ -346,7 +346,7 @@
else
playsound(M, 'sound/items/trayhit2.ogg', 50, TRUE)
if(ishuman(M) || ismonkey(M))
if(ishuman(M))
if(prob(10))
M.Paralyze(40)
update_icon()
@@ -86,14 +86,6 @@
S.add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY)
return TRUE
/mob/living/carbon/monkey/petrify(statue_timer)
if(!isturf(loc))
return FALSE
var/obj/structure/statue/petrified/S = new(loc, src, statue_timer)
S.name = "statue of a monkey"
S.icon_state = "monkey"
return TRUE
/mob/living/simple_animal/pet/dog/corgi/petrify(statue_timer)
if(!isturf(loc))
return FALSE
+1 -1
View File
@@ -594,7 +594,7 @@
get_patient()
if(!patient)
return FALSE
if(ishuman(patient) || ismonkey(patient))
if(ishuman(patient))
return TRUE
return FALSE
+1 -1
View File
@@ -127,7 +127,7 @@
body += "<br>"
//Human
if(ishuman(M))
if(ishuman(M) && !ismonkey(M))
body += "<B>Human</B> | "
else
body += "<A href='?_src_=holder;[HrefToken()];humanone=[REF(M)]'>Humanize</A> | "
+3 -3
View File
@@ -231,10 +231,10 @@
if(isliving(M))
if(iscarbon(M)) //Carbon stuff
if(ishuman(M))
M_job = M.job
else if(ismonkey(M))
if(ismonkey(M))
M_job = "Monkey"
else if(ishuman(M))
M_job = M.job
else if(isalien(M)) //aliens
if(islarva(M))
M_job = "Alien larva"
+4 -4
View File
@@ -409,7 +409,7 @@
if("slime")
M.change_mob_type( /mob/living/simple_animal/slime , null, null, delmob )
if("monkey")
M.change_mob_type( /mob/living/carbon/monkey , null, null, delmob )
M.change_mob_type( /mob/living/carbon/human/species/monkey , null, null, delmob )
if("robot")
M.change_mob_type( /mob/living/silicon/robot , null, null, delmob )
if("cat")
@@ -894,9 +894,9 @@
if(!check_rights(R_SPAWN))
return
var/mob/living/carbon/monkey/Mo = locate(href_list["humanone"])
if(!istype(Mo))
to_chat(usr, "This can only be used on instances of type /mob/living/carbon/monkey.", confidential = TRUE)
var/mob/living/carbon/human/Mo = locate(href_list["humanone"])
if(!ismonkey(Mo))
to_chat(usr, "This can only be used on monkeys.", confidential = TRUE)
return
log_admin("[key_name(usr)] attempting to humanize [key_name(Mo)].")
+1 -1
View File
@@ -99,7 +99,7 @@
Don't crash the server, OK?
"UPDATE /mob/living/carbon/monkey SET #null = forceMove(usr.loc)"
"UPDATE /mob/living/carbon/human/species/monkey SET #null = forceMove(usr.loc)"
Writing "#null" in front of the "=" will call the proc and discard the return value.
+2 -2
View File
@@ -395,12 +395,12 @@ Traitors and the like can also be revived with the previous role mostly intact.
//check if they were a monkey
else if(findtext(G_found.real_name,"monkey"))
if(alert("This character appears to have been a monkey. Would you like to respawn them as such?",,"Yes","No")=="Yes")
var/mob/living/carbon/monkey/new_monkey = new
var/mob/living/carbon/human/species/monkey/new_monkey = new
SSjob.SendToLateJoin(new_monkey)
G_found.mind.transfer_to(new_monkey) //be careful when doing stuff like this! I've already checked the mind isn't in use
new_monkey.key = G_found.key
to_chat(new_monkey, "You have been fully respawned. Enjoy the game.", confidential = TRUE)
var/msg = "<span class='adminnotice'>[key_name_admin(usr)] has respawned [new_monkey.key] as a filthy xeno.</span>"
var/msg = "<span class='adminnotice'>[key_name_admin(usr)] has respawned [new_monkey.key] as a filthy monkey.</span>"
message_admins(msg)
admin_ticket_log(new_monkey, msg)
return //all done. The ghost is auto-deleted
+3 -3
View File
@@ -64,9 +64,9 @@
if(!check_rights(R_SPAWN))
return
var/mob/living/carbon/monkey/Mo = locate(href_list["makehuman"]) in GLOB.mob_list
if(!istype(Mo))
to_chat(usr, "This can only be done to instances of type /mob/living/carbon/monkey", confidential = TRUE)
var/mob/living/carbon/human/Mo = locate(href_list["makehuman"]) in GLOB.mob_list
if(!ismonkey(Mo))
to_chat(usr, "This can only be done to monkeys", confidential = TRUE)
return
if(alert("Confirm mob type change?",,"Transform","Cancel") != "Transform")
@@ -106,7 +106,7 @@
mimicing = ""
/datum/antagonist/changeling/proc/remove_changeling_powers()
if(ishuman(owner.current) || ismonkey(owner.current))
if(ishuman(owner.current))
reset_properties()
for(var/datum/action/changeling/p in purchasedpowers)
purchasedpowers -= p
@@ -66,10 +66,7 @@ the same goes for Remove(). if you override Remove(), call parent or else your p
//Fairly important to remember to return 1 on success >.<
/datum/action/changeling/proc/can_sting(mob/living/user, mob/target)
if(!ishuman(user) && !ismonkey(user)) //typecast everything from mob to carbon from this point onwards
return FALSE
if(req_human && !ishuman(user))
to_chat(user, "<span class='warning'>We cannot do that in this form!</span>")
if(!ishuman(user)) //typecast everything from mob to carbon from this point onwards
return FALSE
var/datum/antagonist/changeling/c = user.mind.has_antag_datum(/datum/antagonist/changeling)
if(c.chem_charges < chemical_cost)
@@ -92,7 +89,7 @@ the same goes for Remove(). if you override Remove(), call parent or else your p
/datum/action/changeling/proc/can_be_used_by(mob/user)
if(!user || QDELETED(user))
return FALSE
if(!ishuman(user) && !ismonkey(user))
if(!ishuman(user))
return FALSE
if(req_human && !ishuman(user))
return FALSE
@@ -28,7 +28,7 @@
..()
changeling.purchasedpowers -= src
var/newmob = user.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_KEEPSE)
var/newmob = user.humanize()
changeling_transform(newmob, chosen_prof)
return TRUE
@@ -14,6 +14,6 @@
to_chat(user, "<span class='warning'>Our genes cry out!</span>")
..()
user.monkeyize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_KEEPSE | TR_KEEPSTAMINADAMAGE)
user.monkeyize()
return TRUE
@@ -99,16 +99,12 @@
/datum/action/changeling/sting/transformation/sting_action(mob/user, mob/target)
log_combat(user, target, "stung", "transformation sting", " new identity is '[selected_dna.dna.real_name]'")
var/datum/dna/NewDNA = selected_dna.dna
if(ismonkey(target))
to_chat(user, "<span class='notice'>Our genes cry out as we sting [target.name]!</span>")
var/mob/living/carbon/C = target
. = TRUE
if(istype(C))
C.real_name = NewDNA.real_name
NewDNA.transfer_identity(C)
if(ismonkey(C))
C.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_DEFAULTMSG | TR_KEEPAI)
C.updateappearance(mutcolor_update=1)
*/
//SKYRAT EDIT REMOVAL END
+13 -7
View File
@@ -77,14 +77,14 @@
objectives |= monkey_team.objectives
/datum/antagonist/monkey/admin_remove(mob/admin)
var/mob/living/carbon/monkey/M = owner.current
if(istype(M))
var/mob/living/carbon/human/M = owner.current
if(ismonkey(M))
switch(alert(admin, "Humanize?", "Humanize", "Yes", "No"))
if("Yes")
if(admin == M)
admin = M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_DEFAULTMSG)
admin = M.humanize()
else
M.humanize(TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPORGANS | TR_KEEPDAMAGE | TR_KEEPVIRUS | TR_KEEPSTUNS | TR_KEEPREAGENTS | TR_DEFAULTMSG)
M.humanize()
if("No")
//nothing
else
@@ -144,7 +144,9 @@
/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)
for(var/mob/living/carbon/human/M in GLOB.alive_mob_list)
if(!ismonkey(M))
continue
if (M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase()))
escaped_monkeys++
if(escaped_monkeys >= monkeys_to_win)
@@ -162,14 +164,18 @@
/datum/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)
for(var/mob/living/carbon/human/M in GLOB.alive_mob_list)
if(!ismonkey(M))
continue
if(M.HasDisease(D))
return TRUE
return FALSE
/datum/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)
for(var/mob/living/carbon/human/M in GLOB.alive_mob_list)
if(!ismonkey(M))
continue
if(M.HasDisease(D) && (M.onCentCom() || M.onSyndieBase()))
return TRUE
return FALSE
@@ -201,7 +201,7 @@
to_chat(old_owner, "<span class='userdanger'>Revolution has been disappointed of your leader traits! You are a regular revolutionary now!</span>")
/datum/antagonist/rev/farewell()
if(ishuman(owner.current) || ismonkey(owner.current))
if(ishuman(owner.current))
owner.current.visible_message("<span class='deconversion_message'>[owner.current] looks like [owner.current.p_theyve()] just remembered [owner.current.p_their()] real allegiance!</span>", null, null, null, owner.current)
to_chat(owner, "<span class ='deconversion_message bold'>You are no longer a brainwashed revolutionary! Your memory is hazy from the time you were a rebel...the only thing you remember is the name of the one who brainwashed you....</span>")
else if(issilicon(owner.current))
@@ -209,7 +209,7 @@
to_chat(owner, "<span class='userdanger'>The frame's firmware detects and deletes your neural reprogramming! You remember nothing but the name of the one who flashed you.</span>")
/datum/antagonist/rev/head/farewell()
if((ishuman(owner.current) || ismonkey(owner.current)))
if((ishuman(owner.current)))
if(owner.current.stat != DEAD)
owner.current.visible_message("<span class='deconversion_message'>[owner.current] looks like [owner.current.p_theyve()] just remembered [owner.current.p_their()] real allegiance!</span>", null, null, null, owner.current)
to_chat(owner, "<span class ='deconversion_message bold'>You have given up your cause of overthrowing the command staff. You are no longer a Head Revolutionary.</span>")
@@ -236,7 +236,7 @@
/datum/antagonist/rev/head/equip_rev()
var/mob/living/carbon/C = owner.current
if(!ishuman(C) && !ismonkey(C))
if(!ishuman(C))
return
if(give_flash)
-18
View File
@@ -135,24 +135,6 @@
death(FALSE)
ghostize(FALSE) // Disallows reentering body and disassociates mind
/mob/living/carbon/monkey/verb/suicide()
set hidden = TRUE
if(!canSuicide())
return
var/confirm = alert("Are you sure you want to commit suicide?", "Confirm Suicide", "Yes", "No")
if(!canSuicide())
return
if(confirm == "Yes")
set_suicide(TRUE)
visible_message("<span class='danger'>[src] is attempting to bite [p_their()] tongue. It looks like [p_theyre()] trying to commit suicide.</span>", \
"<span class='userdanger'>[src] is attempting to bite [p_their()] tongue. It looks like [p_theyre()] trying to commit suicide.</span>")
suicide_log()
adjustOxyLoss(max(200- getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0))
death(FALSE)
ghostize(FALSE) // Disallows reentering body and disassociates mind
/mob/living/silicon/ai/verb/suicide()
set hidden = TRUE
if(!canSuicide())
+1 -1
View File
@@ -390,7 +390,7 @@
icon_state = "monkeymind"
inhand_icon_state = "monkeymind"
strip_delay = 100
var/mob/living/carbon/monkey/magnification = null ///if the helmet is on a valid target (just works like a normal helmet if not (cargo please stop))
var/mob/living/carbon/human/magnification = null ///if the helmet is on a valid target (just works like a normal helmet if not (cargo please stop))
var/polling = FALSE///if the helmet is currently polling for targets (special code for removal)
var/light_colors = 1 ///which icon state color this is (red, blue, yellow)
@@ -172,9 +172,7 @@
var/mob/living/carbon/C = occupant
typeofmeat = C.type_of_meat
gibtype = C.gib_type
if(ismonkey(C))
typeofskin = /obj/item/stack/sheet/animalhide/monkey
else if(isalien(C))
if(isalien(C))
typeofskin = /obj/item/stack/sheet/animalhide/xeno
var/occupant_volume
if(occupant?.reagents)
@@ -66,7 +66,7 @@ GLOBAL_LIST_EMPTY(monkey_recyclers)
if(ismonkey(target))
stuff_monkey_in(target, user)
/obj/machinery/monkey_recycler/proc/stuff_monkey_in(mob/living/carbon/monkey/target, mob/living/user)
/obj/machinery/monkey_recycler/proc/stuff_monkey_in(mob/living/carbon/human/target, mob/living/user)
if(!istype(target))
return
if(target.stat == CONSCIOUS)
+1 -1
View File
@@ -18,7 +18,7 @@
//if they are holding or wearing a card that has access, that works
if(check_access(H.get_active_held_item()) || src.check_access(H.wear_id))
return TRUE
else if(ismonkey(M) || isalienadult(M))
else if(isalienadult(M))
var/mob/living/carbon/george = M
//they can only hold things :(
if(check_access(george.get_active_held_item()))
@@ -1614,6 +1614,11 @@
icon_state = "cat"
color_src = HAIR
/datum/sprite_accessory/tails/monkey/default
name = "Monkey"
icon_state = "monkey"
color_src = FALSE
/datum/sprite_accessory/snouts
icon = 'icons/mob/mutant_bodyparts.dmi'
-21
View File
@@ -4,23 +4,6 @@
BLOOD SYSTEM
****************************************************/
/mob/living/carbon/monkey/handle_blood()
if(bodytemperature <= TCRYO || (HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood.
return
var/temp_bleed = 0
for(var/X in bodyparts)
var/obj/item/bodypart/BP = X
temp_bleed += BP.get_bleed_rate()
BP.generic_bleedstacks = max(0, BP.generic_bleedstacks - 1)
bleed(temp_bleed)
//Blood regeneration if there is some space
if(blood_volume < BLOOD_VOLUME_NORMAL)
blood_volume += 0.1 // regenerate blood VERY slowly
if(blood_volume < BLOOD_VOLUME_OKAY)
adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1))
// Takes care blood loss and regeneration
/mob/living/carbon/human/handle_blood()
@@ -207,10 +190,6 @@
if(blood_volume)
return /datum/reagent/blood
/mob/living/carbon/monkey/get_blood_id()
if(!(HAS_TRAIT(src, TRAIT_HUSK)))
return /datum/reagent/blood
/mob/living/carbon/human/get_blood_id()
if(HAS_TRAIT(src, TRAIT_HUSK))
return
@@ -72,7 +72,7 @@ In all, this is a lot like the monkey code. /N
return FALSE
/mob/living/carbon/alien/attack_paw(mob/living/carbon/monkey/M)
/mob/living/carbon/alien/attack_paw(mob/living/carbon/human/M)
if(..())
if (stat != DEAD)
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
@@ -250,10 +250,6 @@
return FALSE
if(M.getorgan(/obj/item/organ/alien/hivenode))
return FALSE
if(ismonkey(M))
return TRUE
var/mob/living/carbon/C = M
if(ishuman(C) && !(ITEM_SLOT_MASK in C.dna.species.no_equip))
var/mob/living/carbon/human/H = C
@@ -168,7 +168,7 @@
return FALSE
/mob/living/carbon/attack_paw(mob/living/carbon/monkey/M)
/mob/living/carbon/attack_paw(mob/living/carbon/human/M)
if(can_inject(M, TRUE))
for(var/thing in diseases)
+4 -36
View File
@@ -49,13 +49,6 @@
if(user.usable_hands < 2)
return FALSE
return ..()
/datum/emote/living/carbon/gnarl
key = "gnarl"
key_third_person = "gnarls"
message = "gnarls and shows its teeth..."
mob_type_allowed_typecache = list(/mob/living/carbon/monkey)
/datum/emote/living/carbon/moan
key = "moan"
key_third_person = "moans"
@@ -67,46 +60,21 @@
key = "roll"
key_third_person = "rolls"
message = "rolls."
mob_type_allowed_typecache = list(/mob/living/carbon/monkey, /mob/living/carbon/alien)
mob_type_allowed_typecache = list(/mob/living/carbon/alien)
hands_use_check = TRUE
/datum/emote/living/carbon/scratch
key = "scratch"
key_third_person = "scratches"
message = "scratches."
mob_type_allowed_typecache = list(/mob/living/carbon/monkey, /mob/living/carbon/alien)
mob_type_allowed_typecache = list(/mob/living/carbon/alien)
hands_use_check = TRUE
/datum/emote/living/carbon/screech
key = "screech"
key_third_person = "screeches"
message = "screeches."
mob_type_allowed_typecache = list(/mob/living/carbon/monkey)
emote_type = EMOTE_AUDIBLE
//SKYRAT EDIT REMOVAL BEGIN - EMOTES - begone with the annoying screech
/*
/datum/emote/living/carbon/screech/get_sound(mob/living/user)
return pick('sound/creatures/monkey/monkey_screech_1.ogg',
'sound/creatures/monkey/monkey_screech_2.ogg',
'sound/creatures/monkey/monkey_screech_3.ogg',
'sound/creatures/monkey/monkey_screech_4.ogg',
'sound/creatures/monkey/monkey_screech_5.ogg',
'sound/creatures/monkey/monkey_screech_6.ogg',
'sound/creatures/monkey/monkey_screech_7.ogg')
*/
//SKYRAT EDIT REMOVAL END
/datum/emote/living/carbon/screech/roar
key = "roar"
key_third_person = "roars"
message = "roars."
/datum/emote/living/carbon/sign
key = "sign"
key_third_person = "signs"
message_param = "signs the number %t."
mob_type_allowed_typecache = list(/mob/living/carbon/monkey, /mob/living/carbon/alien)
mob_type_allowed_typecache = list(/mob/living/carbon/alien)
hands_use_check = TRUE
/datum/emote/living/carbon/sign/select_param(mob/user, params)
@@ -124,7 +92,7 @@
/datum/emote/living/carbon/tail
key = "tail"
message = "waves their tail."
mob_type_allowed_typecache = list(/mob/living/carbon/monkey, /mob/living/carbon/alien)
mob_type_allowed_typecache = list(/mob/living/carbon/alien)
/datum/emote/living/carbon/wink
key = "wink"
@@ -1,9 +1,9 @@
GLOBAL_LIST_EMPTY(dead_players_during_shift)
/mob/living/carbon/human/gib_animation()
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-h")
new /obj/effect/temp_visual/gib_animation(loc, dna.species.gib_anim)
/mob/living/carbon/human/dust_animation()
new /obj/effect/temp_visual/dust_animation(loc, "dust-h")
new /obj/effect/temp_visual/dust_animation(loc, dna.species.dust_anim)
/mob/living/carbon/human/spawn_gibs(with_bodyparts)
if(with_bodyparts)
@@ -70,8 +70,23 @@
return pick('sound/voice/human/malescream_1.ogg', 'sound/voice/human/malescream_2.ogg', 'sound/voice/human/malescream_3.ogg', 'sound/voice/human/malescream_4.ogg', 'sound/voice/human/malescream_5.ogg', 'sound/voice/human/malescream_6.ogg')
else if(ismoth(H))
return 'sound/voice/moth/scream_moth.ogg'
else if(ismonkey(user)) //If its a monkey, override it.
return pick('sound/creatures/monkey/monkey_screech_1.ogg',
'sound/creatures/monkey/monkey_screech_2.ogg',
'sound/creatures/monkey/monkey_screech_3.ogg',
'sound/creatures/monkey/monkey_screech_4.ogg',
'sound/creatures/monkey/monkey_screech_5.ogg',
'sound/creatures/monkey/monkey_screech_6.ogg',
'sound/creatures/monkey/monkey_screech_7.ogg')
*/
/datum/emote/living/carbon/human/scream/screech //If a human tries to screech it'll just scream.
key = "screech"
key_third_person = "screeches"
message = "screeches."
emote_type = EMOTE_AUDIBLE
vary = FALSE
/datum/emote/living/carbon/human/pale
key = "pale"
message = "goes pale for a second."
@@ -176,3 +191,44 @@
T.Entered(src)
//Ayy lmao
///Snowflake emotes only for le epic chimp
/datum/emote/living/carbon/human/monkey
/datum/emote/living/carbon/human/monkey/can_run_emote(mob/user, status_check = TRUE, intentional)
if(ismonkey(user))
return ..()
return FALSE
/datum/emote/living/carbon/human/monkey/gnarl
key = "gnarl"
key_third_person = "gnarls"
message = "gnarls and shows its teeth..."
/datum/emote/living/carbon/human/monkey/roll
key = "roll"
key_third_person = "rolls"
message = "rolls."
hands_use_check = TRUE
/datum/emote/living/carbon/human/monkey/scratch
key = "scratch"
key_third_person = "scratches"
message = "scratches."
hands_use_check = TRUE
/datum/emote/living/carbon/human/monkey/screech/roar
key = "roar"
key_third_person = "roars"
message = "roars."
/datum/emote/living/carbon/human/monkey/tail
key = "tail"
message = "waves their tail."
/datum/emote/living/carbon/human/monkeysign
key = "sign"
key_third_person = "signs"
message_param = "signs the number %t."
hands_use_check = TRUE
@@ -23,7 +23,6 @@
//AddComponent(/datum/component/footstep, FOOTSTEP_MOB_HUMAN, 1, -6) //ORIGINAL
AddComponent(/datum/component/footstep, FOOTSTEP_MOB_HUMAN, 0.6, -6) //SKYRAT EDIT CHANGE - AESTHETICS
AddComponent(/datum/component/bloodysoles/feet)
ADD_TRAIT(src, TRAIT_ADVANCEDTOOLUSER, ROUNDSTART_TRAIT)
AddElement(/datum/element/ridable, /datum/component/riding/creature/human)
GLOB.human_list += src
@@ -1154,11 +1153,17 @@
/mob/living/carbon/human/species
var/race = null
var/use_random_name = TRUE
/mob/living/carbon/human/species/Initialize()
. = ..()
INVOKE_ASYNC(src, .proc/set_species, race)
/mob/living/carbon/human/species/set_species(datum/species/mrace, icon_update, pref_load)
. = ..()
if(use_random_name)
fully_replace_character_name(real_name, dna.species.random_name())
/mob/living/carbon/human/species/abductor
race = /datum/species/abductor
@@ -213,7 +213,7 @@
var/mob/living/carbon/human/H = user
dna.species.spec_attack_hand(H, src)
/mob/living/carbon/human/attack_paw(mob/living/carbon/monkey/M)
/mob/living/carbon/human/attack_paw(mob/living/carbon/human/M)
var/dam_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
if(!affecting)
@@ -249,7 +249,7 @@
if(can_inject(M, 1, affecting))//Thick suits can stop monkey bites.
if(..()) //successful monkey bite, this handles disease contraction.
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
var/damage = rand(M.dna.species.punchdamagelow, M.dna.species.punchdamagehigh)
if(!damage)
return
if(check_shields(M, damage, "the [M.name]"))
@@ -177,7 +177,7 @@ There are several things that need to be remembered:
var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_GLOVES) + 1]
inv.update_icon()
if(!gloves && blood_in_hands)
if(!gloves && blood_in_hands && !(NOBLOODOVERLAY in dna.species.species_traits))
var/mutable_appearance/bloody_overlay = mutable_appearance('icons/effects/blood.dmi', "bloodyhands", -GLOVES_LAYER)
if(num_hands < 2)
if(has_left_hand(FALSE))
@@ -1,6 +1,37 @@
/mob/living/carbon/monkey/punpun //except for a few special persistence features, pun pun is just a normal monkey
/mob/living/carbon/human/species/monkey
race = /datum/species/monkey
ai_controller = /datum/ai_controller/monkey
faction = list("neutral", "monkey")
/mob/living/carbon/human/species/monkey/Initialize(mapload, cubespawned=FALSE, mob/spawner)
if (cubespawned)
var/cap = CONFIG_GET(number/monkeycap)
if (LAZYLEN(SSmobs.cubemonkeys) > cap)
if (spawner)
to_chat(spawner, "<span class='warning'>Bluespace harmonics prevent the spawning of more than [cap] monkeys on the station at one time!</span>")
return INITIALIZE_HINT_QDEL
SSmobs.cubemonkeys += src
return ..()
/mob/living/carbon/human/species/monkey/Destroy()
SSmobs.cubemonkeys -= src
return ..()
/mob/living/carbon/human/species/monkey/angry
ai_controller = /datum/ai_controller/monkey/angry
/mob/living/carbon/human/species/monkey/angry/Initialize()
. = ..()
if(prob(10))
var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src)
equip_to_slot_or_del(helmet,ITEM_SLOT_HEAD)
helmet.attack_self(src) // todo encapsulate toggle
/mob/living/carbon/human/species/monkey/punpun //except for a few special persistence features, pun pun is just a normal monkey
name = "Pun Pun" //C A N O N
unique_name = 0
unique_name = FALSE
use_random_name = FALSE
/// If we had one of the rare names in a past life
var/ancestor_name
/// The number of times Pun Pun has died since he was last gibbed
@@ -9,18 +40,23 @@
var/relic_mask
var/memory_saved = FALSE
/mob/living/carbon/monkey/punpun/Initialize()
/mob/living/carbon/human/species/monkey/punpun/Initialize()
Read_Memory()
var/name_to_use = name
if(ancestor_name)
name = ancestor_name
name_to_use = ancestor_name
if(ancestor_chain > 1)
name += " \Roman[ancestor_chain]"
name_to_use += " \Roman[ancestor_chain]"
else if(prob(10))
name = pick(list("Professor Bobo", "Deempisi's Revenge", "Furious George", "King Louie", "Dr. Zaius", "Jimmy Rustles", "Dinner", "Lanky"))
if(name == "Furious George")
name_to_use = pick(list("Professor Bobo", "Deempisi's Revenge", "Furious George", "King Louie", "Dr. Zaius", "Jimmy Rustles", "Dinner", "Lanky"))
if(name_to_use == "Furious George")
ai_controller = /datum/ai_controller/monkey/angry //hes always mad
. = ..()
fully_replace_character_name(real_name, name_to_use)
//These have to be after the parent new to ensure that the monkey
//bodyparts are actually created before we try to equip things to
//those slots
@@ -31,18 +67,18 @@
if(relic_mask)
equip_to_slot_or_del(new relic_mask, ITEM_SLOT_MASK)
/mob/living/carbon/monkey/punpun/Life()
/mob/living/carbon/human/species/monkey/punpun/Life()
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
Write_Memory(FALSE, FALSE)
memory_saved = TRUE
..()
/mob/living/carbon/monkey/punpun/death(gibbed)
/mob/living/carbon/human/species/monkey/punpun/death(gibbed)
if(!memory_saved)
Write_Memory(TRUE, gibbed)
..()
/mob/living/carbon/monkey/punpun/proc/Read_Memory()
/mob/living/carbon/human/species/monkey/punpun/proc/Read_Memory()
if(fexists("data/npc_saves/Punpun.sav")) //legacy compatability to convert old format to new
var/savefile/S = new /savefile("data/npc_saves/Punpun.sav")
S["ancestor_name"] >> ancestor_name
@@ -60,7 +96,7 @@
relic_hat = json["relic_hat"]
relic_mask = json["relic_hat"]
/mob/living/carbon/monkey/punpun/proc/Write_Memory(dead, gibbed)
/mob/living/carbon/human/species/monkey/punpun/proc/Write_Memory(dead, gibbed)
var/json_file = file("data/npc_saves/Punpun.json")
var/list/file_data = list()
if(gibbed)
@@ -67,6 +67,14 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/list/list/mutant_bodyparts = list() //SKYRAT EDIT CHANGE - CUSTOMIZATION (typed list)
///Internal organs that are unique to this race, like a tail.
var/list/mutant_organs = list()
///The bodyparts this species uses. assoc of bodypart string - bodypart type. Make sure all the fucking entries are in or I'll skin you alive.
var/list/bodypart_overides = list(
BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm,\
BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm,\
BODY_ZONE_HEAD = /obj/item/bodypart/head,\
BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg,\
BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg,\
BODY_ZONE_CHEST = /obj/item/bodypart/chest)
///Multiplier for the race's speed. Positive numbers make it move slower, negative numbers make it move faster.
var/speedmod = 0
///Percentage modifier for overall defense of the race, or less defense, if it's negative.
@@ -129,7 +137,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
///Species-only traits. Can be found in [code/__DEFINES/DNA.dm]
var/list/species_traits = list()
///Generic traits tied to having the species.
var/list/inherent_traits = list()
var/list/inherent_traits = list(TRAIT_ADVANCEDTOOLUSER)
/// List of biotypes the mob belongs to. Used by diseases.
var/inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
///List of factions the mob gain upon gaining this species.
@@ -144,6 +152,11 @@ GLOBAL_LIST_EMPTY(roundstart_races)
///What gas does this species breathe? Used by suffocation screen alerts, most of actual gas breathing is handled by mutantlungs. See [life.dm][code/modules/mob/living/carbon/human/life.dm]
var/breathid = "o2"
///What anim to use for dusting
var/dust_anim = "dust-h"
///What anim to use for gibbing
var/gib_anim = "gibbed-h"
//Do NOT remove by setting to null. use OR make a RESPECTIVE TRAIT (removing stomach? add the NOSTOMACH trait to your species)
//why does it work this way? because traits also disable the downsides of not having an organ, removing organs but not having the trait will make your species die
@@ -175,6 +188,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
///For custom overrides for species ass images
var/icon/ass_image
///List of results you get from knife-butchering. null means you cant butcher it. Associated by resulting type - value of amount
var/list/knife_butcher_results
///////////
// PROCS //
///////////
@@ -349,6 +365,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(DIGITIGRADE in species_traits)
C.Digitigrade_Leg_Swap(FALSE)
fix_non_native_limbs(C)
C.mob_biotypes = inherent_biotypes
regenerate_organs(C,old_species)
@@ -752,6 +770,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "tail_human"
if("tail_monkey" in mutant_bodyparts)
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
bodyparts_to_add -= "tail_monkey"
if(mutant_bodyparts["waggingtail_human"])
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT))
@@ -868,13 +890,15 @@ GLOBAL_LIST_EMPTY(roundstart_races)
S = GLOB.moth_antennae_list[H.dna.features["moth_antennae"]]
if("caps")
S = GLOB.caps_list[H.dna.features["caps"]]
if("tail_monkey")
S = GLOB.tails_list_monkey[H.dna.features["tail_monkey"]]
if(!S || S.icon_state == "none")
continue
var/mutable_appearance/accessory_overlay = mutable_appearance(S.icon, layer = -layer)
//A little rename so we don't have to use tail_lizard or tail_human when naming the sprites.
if(bodypart == "tail_lizard" || bodypart == "tail_human")
if(bodypart == "tail_lizard" || bodypart == "tail_human" || bodypart == "tail_monkey")
bodypart = "tail"
else if(bodypart == "waggingtail_lizard" || bodypart == "waggingtail_human")
bodypart = "waggingtail"
@@ -1330,6 +1354,11 @@ GLOBAL_LIST_EMPTY(roundstart_races)
user.do_attack_animation(target, ATTACK_EFFECT_CLAW)
if(ATTACK_EFFECT_SMASH)
user.do_attack_animation(target, ATTACK_EFFECT_SMASH)
if(ATTACK_EFFECT_BITE)
if(user.is_mouth_covered(FALSE, TRUE))
to_chat(user, "<span class='warning'>You can't bite with your mouth covered!</span>")
return FALSE
user.do_attack_animation(target, ATTACK_EFFECT_BITE)
else
user.do_attack_animation(target, ATTACK_EFFECT_PUNCH)
@@ -2119,3 +2148,19 @@ GLOBAL_LIST_EMPTY(roundstart_races)
. |= BIO_JUST_FLESH
if(HAS_BONE in species_traits)
. |= BIO_JUST_BONE
///Species override for unarmed attacks because the attack_hand proc was made by a mouth-breathing troglodyte on a tricycle. Also to whoever thought it would be a good idea to make it so the original spec_unarmedattack was not actually linked to unarmed attack needs to be checked by a doctor because they clearly have a vast empty space in their head.
/datum/species/proc/spec_unarmedattack(mob/living/carbon/human/user, atom/target)
return FALSE
///Removes any non-native limbs from the mob
/datum/species/proc/fix_non_native_limbs(mob/living/carbon/human/H)
for(var/X in H.bodyparts)
var/obj/item/bodypart/current_part = X
var/obj/item/bodypart/species_part = bodypart_overides[current_part.body_zone]
if(current_part.type == species_part)
continue
current_part.change_bodypart(species_part)
@@ -4,7 +4,7 @@
say_mod = "gibbers"
sexes = FALSE
species_traits = list(NOBLOOD,NOEYESPRITES)
inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_CHUNKYFINGERS,TRAIT_NOHUNGER,TRAIT_NOBREATH)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_VIRUSIMMUNE,TRAIT_CHUNKYFINGERS,TRAIT_NOHUNGER,TRAIT_NOBREATH)
mutanttongue = /obj/item/organ/tongue/abductor
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
ass_image = 'icons/ass/assgrey.png'
@@ -3,7 +3,7 @@
id = "android"
say_mod = "states"
species_traits = list(NOBLOOD)
inherent_traits = list(TRAIT_NOMETABOLISM,TRAIT_TOXIMMUNE,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT,TRAIT_NOCLONELOSS)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOMETABOLISM,TRAIT_TOXIMMUNE,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_NOFIRE,TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_LIMBATTACHMENT,TRAIT_NOCLONELOSS)
inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID
meat = null
damage_overlay_type = "synth"
@@ -3,7 +3,7 @@
id = "dullahan"
default_color = "FFFFFF"
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS, HAS_FLESH, HAS_BONE)
inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOHUNGER,TRAIT_NOBREATH)
mutant_bodyparts = list("tail_human" = "None", "ears" = "None", "wings" = "None")
use_skintones = TRUE
mutantbrain = /obj/item/organ/brain/dullahan
@@ -18,7 +18,7 @@
species_traits = list(DYNCOLORS, AGENDER, NO_UNDERWEAR, HAIR, HAS_FLESH, HAS_BONE) // i mean i guess they have blood so they can have wounds too
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
species_language_holder = /datum/language_holder/ethereal
inherent_traits = list(TRAIT_NOHUNGER)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOHUNGER)
sexes = FALSE //no fetish content allowed
toxic_food = NONE
// Body temperature for ethereals is much higher then humans as they like hotter environments
@@ -3,7 +3,7 @@
name = "Golem"
id = "iron golem"
species_traits = list(NOBLOOD,MUTCOLORS,NO_UNDERWEAR)
inherent_traits = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
inherent_biotypes = MOB_HUMANOID|MOB_MINERAL
mutant_organs = list(/obj/item/organ/adamantine_resonator)
speedmod = 2
@@ -88,7 +88,7 @@
fixed_mut_color = "a3d"
meat = /obj/item/stack/ore/plasma
//Can burn and takes damage from heat
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) //no RESISTHEAT, NOFIRE
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER) //no RESISTHEAT, NOFIRE
info_text = "As a <span class='danger'>Plasma Golem</span>, you burn easily. Be careful, if you get hot enough while burning, you'll blow up!"
heatmod = 0 //fine until they blow up
prefix = "Plasma"
@@ -277,7 +277,7 @@
fixed_mut_color = "9E704B"
meat = /obj/item/stack/sheet/mineral/wood
//Can burn and take damage from heat
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
armor = 30
burnmod = 1.25
heatmod = 1.5
@@ -615,7 +615,7 @@
sexes = FALSE
info_text = "As a <span class='danger'>Runic Golem</span>, you possess eldritch powers granted by the Elder Goddess Nar'Sie."
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES) //no mutcolors
inherent_traits = list(TRAIT_NOFLASH,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOFLASH,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
inherent_biotypes = MOB_HUMANOID|MOB_MINERAL
prefix = "Runic"
special_names = null
@@ -670,7 +670,7 @@
info_text = "As a <span class='danger'>Cloth Golem</span>, you are able to reform yourself after death, provided your remains aren't burned or destroyed. You are, of course, very flammable. \
Being made of cloth, your body is magic resistant and faster than that of other golems, but weaker and less resilient."
species_traits = list(NOBLOOD,NO_UNDERWEAR) //no mutcolors, and can burn
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_CHUNKYFINGERS)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_CHUNKYFINGERS)
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
armor = 15 //feels no pain, but not too resistant
burnmod = 2 // don't get burned
@@ -869,7 +869,7 @@
special_names = list("Box")
info_text = "As a <span class='danger'>Cardboard Golem</span>, you aren't very strong, but you are a bit quicker and can easily create more brethren by using cardboard on yourself."
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES)
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_NOFLASH)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_NOFLASH)
limbs_id = "c_golem" //special sprites
attack_verb = "whips"
attack_sound = 'sound/weapons/whip.ogg'
@@ -914,7 +914,7 @@
name = "Leather Golem"
id = "leather golem"
special_names = list("Face", "Man", "Belt") //Ah dude 4 strength 4 stam leather belt AHHH
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_STRONG_GRABBER)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_STRONG_GRABBER)
prefix = "Leather"
fixed_mut_color = "624a2e"
info_text = "As a <span class='danger'>Leather Golem</span>, you are flammable, but you can grab things with incredible ease, allowing all your grabs to start at a strong level."
@@ -929,7 +929,7 @@
special_names = list("Boll","Weave")
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES)
fixed_mut_color = null
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_NOFLASH)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOBREATH, TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER, TRAIT_NOFLASH)
info_text = "As a <span class='danger'>Durathread Golem</span>, your strikes will cause those your targets to start choking, but your woven body won't withstand fire as well."
/datum/species/golem/durathread/spec_unarmedattacked(mob/living/carbon/human/user, mob/living/carbon/human/target)
@@ -951,7 +951,7 @@
mutantstomach = /obj/item/organ/stomach/bone
sexes = FALSE
fixed_mut_color = null
inherent_traits = list(TRAIT_NOFLASH,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_FAKEDEATH)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOFLASH,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_FAKEDEATH)
species_language_holder = /datum/language_holder/golem/bone
info_text = "As a <span class='danger'>Bone Golem</span>, You have a powerful spell that lets you chill your enemies with fear, and milk heals you! Just make sure to watch our for bone-hurting juice."
var/datum/action/innate/bonechill/bonechill
@@ -1041,7 +1041,7 @@
prefix = "Snow"
special_names = list("Flake", "Blizzard", "Storm")
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES) //no mutcolors, no eye sprites
inherent_traits = list(TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER)
var/obj/effect/proc_holder/spell/targeted/conjure_item/snowball/ball
var/obj/effect/proc_holder/spell/aimed/cryo/cryo
@@ -1088,7 +1088,7 @@
info_text = "As a <span class='danger'>Metallic Hydrogen Golem</span>, you were forged in the highest pressures and the highest heats. Your unique mineral makeup makes you immune to most types of damages."
prefix = "Metallic Hydrogen"
special_names = null
inherent_traits = list(TRAIT_NOFLASH, TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_NODISMEMBER,TRAIT_CHUNKYFINGERS)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOFLASH, TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_NODISMEMBER,TRAIT_CHUNKYFINGERS)
/datum/species/golem/mhydrogen/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
@@ -5,7 +5,7 @@
default_color = "00FF90"
say_mod = "chirps"
species_traits = list(MUTCOLORS,EYECOLOR,NOBLOOD)
inherent_traits = list(TRAIT_TOXINLOVER)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_TOXINLOVER)
mutantlungs = /obj/item/organ/lungs/slime
meat = /obj/item/food/meat/slab/human/mutant/slime
exotic_blood = /datum/reagent/toxin/slimejelly
@@ -113,5 +113,5 @@ Lizard subspecies: ASHWALKERS
id = "ashlizard"
limbs_id = "lizard"
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,DIGITIGRADE,HAS_FLESH,HAS_BONE)
inherent_traits = list(TRAIT_CHUNKYFINGERS,TRAIT_NOBREATH)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_CHUNKYFINGERS,TRAIT_NOBREATH)
species_language_holder = /datum/language_holder/lizard/ash
@@ -0,0 +1,92 @@
/datum/species/monkey
name = "Monkey"
id = "monkey"
say_mod = "chimpers"
attack_verb = "bite"
attack_sound = 'sound/weapons/bite.ogg'
miss_sound = 'sound/weapons/bite.ogg'
mutant_organs = list(/obj/item/organ/tail/monkey)
mutant_bodyparts = list("tail_monkey" = "Monkey")
skinned_type = /obj/item/stack/sheet/animalhide/monkey
meat = /obj/item/food/meat/slab/monkey
knife_butcher_results = list(/obj/item/food/meat/slab/monkey = 5, /obj/item/stack/sheet/animalhide/monkey = 1)
species_traits = list(HAS_FLESH,HAS_BONE,NO_UNDERWEAR,LIPS,NOEYESPRITES,NOBLOODOVERLAY,NOTRANSSTING, NOAUGMENTS)
inherent_traits = list(TRAIT_MONKEYLIKE)
no_equip = list(ITEM_SLOT_EARS, ITEM_SLOT_EYES, ITEM_SLOT_OCLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING, ITEM_SLOT_SUITSTORE)
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | ERT_SPAWN | SLIME_EXTRACT
liked_food = MEAT | FRUIT
limbs_id = "monkey"
damage_overlay_type = "monkey"
sexes = FALSE
punchdamagelow = 1
punchdamagehigh = 3
punchstunthreshold = 4 // no stun punches
species_language_holder = /datum/language_holder/monkey
bodypart_overides = list(
BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/monkey,\
BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/monkey,\
BODY_ZONE_HEAD = /obj/item/bodypart/head/monkey,\
BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/monkey,\
BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/monkey,\
BODY_ZONE_CHEST = /obj/item/bodypart/chest/monkey)
dust_anim = "dust-m"
gib_anim = "gibbed-m"
payday_modifier = 1.5
/datum/species/monkey/random_name(gender,unique,lastname)
var/randname = "monkey ([rand(1,999)])"
return randname
/datum/species/monkey/on_species_gain(mob/living/carbon/human/H, datum/species/old_species)
. = ..()
H.ventcrawler = VENTCRAWLER_NUDE
H.pass_flags |= PASSTABLE
H.butcher_results = knife_butcher_results
if(!H.dna.features["tail_monkey"] || H.dna.features["tail_monkey"] == "None")
H.dna.features["tail_monkey"] = "Monkey"
handle_mutant_bodyparts(H)
H.dna.add_mutation(RACEMUT, MUT_NORMAL)
H.dna.activate_mutation(RACEMUT)
/datum/species/monkey/on_species_loss(mob/living/carbon/C)
. = ..()
C.ventcrawler = initial(C.ventcrawler)
C.pass_flags = initial(C.pass_flags)
C.butcher_results = null
C.dna.remove_mutation(RACEMUT)
/datum/species/monkey/spec_unarmedattack(mob/living/carbon/human/user, atom/target)
. = ..()
if(HAS_TRAIT(user, TRAIT_HANDS_BLOCKED))
if(!iscarbon(target))
return TRUE
var/mob/living/carbon/victim = target
if(user.a_intent != INTENT_HARM || user.is_muzzled())
return TRUE
var/obj/item/bodypart/affecting = null
if(ishuman(victim))
var/mob/living/carbon/human/human_victim = victim
affecting = human_victim.get_bodypart(pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
var/armor = victim.run_armor_check(affecting, MELEE)
if(prob(25))
victim.visible_message("<span class='danger'>[user]'s bite misses [victim]!</span>",
"<span class='danger'>You avoid [user]'s bite!</span>", "<span class='hear'>You hear jaws snapping shut!</span>", COMBAT_MESSAGE_RANGE, user)
to_chat(user, "<span class='danger'>Your bite misses [victim]!</span>")
return TRUE
victim.apply_damage(rand(punchdamagelow, punchdamagehigh), BRUTE, affecting, armor)
victim.visible_message("<span class='danger'>[name] bites [victim]!</span>",
"<span class='userdanger'>[name] bites you!</span>", "<span class='hear'>You hear a chomp!</span>", COMBAT_MESSAGE_RANGE, name)
to_chat(user, "<span class='danger'>You bite [victim]!</span>")
if(armor >= 2)
return TRUE
for(var/d in user.diseases)
var/datum/disease/bite_infection = d
victim.ForceContractDisease(bite_infection)
return TRUE
target.attack_paw(user)
return TRUE
@@ -10,7 +10,7 @@
say_mod = "poofs" //what does a mushroom sound like
species_traits = list(MUTCOLORS, NOEYESPRITES, NO_UNDERWEAR, HAS_FLESH, HAS_BONE)
inherent_traits = list(TRAIT_NOBREATH, TRAIT_NOFLASH)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOBREATH, TRAIT_NOFLASH)
inherent_factions = list("mushroom")
speedmod = 1.5 //faster than golems but not by much
@@ -6,7 +6,8 @@
meat = /obj/item/stack/sheet/mineral/plasma
species_traits = list(NOBLOOD,NOTRANSSTING, HAS_BONE)
// plasmemes get hard to wound since they only need a severe bone wound to dismember, but unlike skellies, they can't pop their bones back into place
inherent_traits = list(TRAIT_RESISTCOLD, TRAIT_RADIMMUNE, TRAIT_GENELESS, TRAIT_NOHUNGER, TRAIT_HARDLY_WOUNDED)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_RESISTCOLD, TRAIT_RADIMMUNE, TRAIT_GENELESS, TRAIT_NOHUNGER, TRAIT_HARDLY_WOUNDED)
inherent_biotypes = MOB_HUMANOID|MOB_MINERAL
mutantlungs = /obj/item/organ/lungs/plasmaman
mutanttongue = /obj/item/organ/tongue/bone/plasmaman
@@ -8,7 +8,7 @@
sexes = 0
meat = /obj/item/food/meat/slab/human/mutant/shadow
species_traits = list(NOBLOOD,NOEYESPRITES)
inherent_traits = list(TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_NOBREATH)
inherent_factions = list("faithless")
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC
mutanteyes = /obj/item/organ/eyes/night_vision
@@ -37,7 +37,7 @@
burnmod = 1.5
no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING, ITEM_SLOT_SUITSTORE)
species_traits = list(NOBLOOD,NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYESPRITES)
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_CHUNKYFINGERS,TRAIT_RADIMMUNE,TRAIT_VIRUSIMMUNE,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOHUNGER)
mutanteyes = /obj/item/organ/eyes/night_vision/nightmare
mutantheart = /obj/item/organ/heart/nightmare
mutantbrain = /obj/item/organ/brain/nightmare
@@ -6,7 +6,7 @@
sexes = 0
meat = /obj/item/food/meat/slab/human/mutant/skeleton
species_traits = list(NOBLOOD, HAS_BONE, NOEYESPRITES)
inherent_traits = list(TRAIT_NOMETABOLISM,TRAIT_TOXIMMUNE,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,\
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOMETABOLISM,TRAIT_TOXIMMUNE,TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,\
TRAIT_PIERCEIMMUNE,TRAIT_NOHUNGER,TRAIT_EASYDISMEMBER,TRAIT_LIMBATTACHMENT,TRAIT_FAKEDEATH,TRAIT_XENO_IMMUNE,TRAIT_NOCLONELOSS)
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
mutanttongue = /obj/item/organ/tongue/bone
@@ -4,7 +4,7 @@
offset_features = list(OFFSET_UNIFORM = list(0,0), OFFSET_ID = list(0,0), OFFSET_GLOVES = list(0,0), OFFSET_GLASSES = list(0,4), OFFSET_EARS = list(0,0), OFFSET_SHOES = list(0,0), OFFSET_S_STORE = list(0,0), OFFSET_FACEMASK = list(0,0), OFFSET_HEAD = list(0,0), OFFSET_FACE = list(0,0), OFFSET_BELT = list(0,0), OFFSET_BACK = list(0,0), OFFSET_SUIT = list(0,0), OFFSET_NECK = list(0,0))
default_color = "336600" //vomit green
species_traits = list(MUTCOLORS, NO_UNDERWEAR, HAS_FLESH, HAS_BONE)
inherent_traits = list(TRAIT_NOSLIPALL)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER, TRAIT_NOSLIPALL)
attack_verb = "slap"
say_mod = "slurs"
coldmod = 0.5 //snails only come out when its cold and wet
@@ -4,7 +4,7 @@
say_mod = "beep boops" //inherited from a user's real species
sexes = 0
species_traits = list(NOTRANSSTING) //all of these + whatever we inherit from the real species
inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER,TRAIT_NOBREATH)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_VIRUSIMMUNE,TRAIT_NODISMEMBER,TRAIT_NOLIMBDISABLE,TRAIT_NOHUNGER,TRAIT_NOBREATH)
inherent_biotypes = MOB_ROBOTIC|MOB_HUMANOID
meat = null
damage_overlay_type = "synth"
@@ -3,7 +3,7 @@
id = "vampire"
default_color = "FFFFFF"
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,DRINKSBLOOD, HAS_FLESH, HAS_BONE)
inherent_traits = list(TRAIT_NOHUNGER,TRAIT_NOBREATH)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOHUNGER,TRAIT_NOBREATH)
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
mutant_bodyparts = list("tail_human" = "None", "ears" = "None", "wings" = "None")
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | ERT_SPAWN
@@ -8,7 +8,7 @@
sexes = 0
meat = /obj/item/food/meat/slab/human/mutant/zombie
species_traits = list(NOBLOOD,NOZOMBIE,NOTRANSSTING, HAS_FLESH, HAS_BONE)
inherent_traits = list(TRAIT_NOMETABOLISM,TRAIT_TOXIMMUNE,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_EASYDISMEMBER,TRAIT_EASILY_WOUNDED,TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH,TRAIT_NODEATH,TRAIT_FAKEDEATH,TRAIT_NOCLONELOSS)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_NOMETABOLISM,TRAIT_TOXIMMUNE,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_EASYDISMEMBER,TRAIT_EASILY_WOUNDED,TRAIT_LIMBATTACHMENT,TRAIT_NOBREATH,TRAIT_NODEATH,TRAIT_FAKEDEATH,TRAIT_NOCLONELOSS)
inherent_biotypes = MOB_UNDEAD|MOB_HUMANOID
mutanttongue = /obj/item/organ/tongue/zombie
var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg')
@@ -100,6 +100,6 @@
mutanttongue = /obj/item/organ/tongue/zombie
changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN
species_traits = list(HAS_FLESH, HAS_BONE)
inherent_traits = list(TRAIT_EASILY_WOUNDED)
inherent_traits = list(TRAIT_ADVANCEDTOOLUSER,TRAIT_EASILY_WOUNDED)
#undef REGENERATION_DELAY
@@ -1,9 +0,0 @@
/mob/living/carbon/monkey/gib_animation()
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-m")
/mob/living/carbon/monkey/dust_animation()
new /obj/effect/temp_visual/dust_animation(loc, "dust-m")
/mob/living/carbon/monkey/death(gibbed)
walk(src,0) // Stops dead monkeys from fleeing their attacker or climbing out from inside His Grace
. = ..()
@@ -1,34 +0,0 @@
/mob/living/carbon/monkey/can_equip(obj/item/I, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE)
switch(slot)
if(ITEM_SLOT_HANDS)
if(get_empty_held_indexes())
return TRUE
return FALSE
if(ITEM_SLOT_MASK)
if(wear_mask)
return FALSE
if( !(I.slot_flags & ITEM_SLOT_MASK) )
return FALSE
return TRUE
if(ITEM_SLOT_NECK)
if(wear_neck)
return FALSE
if( !(I.slot_flags & ITEM_SLOT_NECK) )
return FALSE
return TRUE
if(ITEM_SLOT_HEAD)
if(head)
return FALSE
if( !(I.slot_flags & ITEM_SLOT_HEAD) )
return FALSE
return TRUE
if(ITEM_SLOT_BACK)
if(back)
return FALSE
if( !(I.slot_flags & ITEM_SLOT_BACK) )
return FALSE
return TRUE
return FALSE //Unsupported slot
@@ -1,135 +0,0 @@
/mob/living/carbon/monkey
/mob/living/carbon/monkey/handle_mutations_and_radiation()
if(radiation)
if(radiation > RAD_MOB_KNOCKDOWN && prob(RAD_MOB_KNOCKDOWN_PROB))
if(!IsParalyzed())
emote("collapse")
Paralyze(RAD_MOB_KNOCKDOWN_AMOUNT)
to_chat(src, "<span class='danger'>You feel weak.</span>")
if(radiation > RAD_MOB_MUTATE)
if(prob(1))
to_chat(src, "<span class='danger'>You mutate!</span>")
easy_randmut(NEGATIVE+MINOR_NEGATIVE)
emote("gasp")
domutcheck()
if(radiation > RAD_MOB_MUTATE * 2 && prob(50))
gorillize()
return
if(radiation > RAD_MOB_VOMIT && prob(RAD_MOB_VOMIT_PROB))
vomit(10, TRUE)
return ..()
/mob/living/carbon/monkey/handle_breath_temperature(datum/gas_mixture/breath)
if(abs(get_body_temp_normal() - breath.temperature) > 50)
switch(breath.temperature)
if(-INFINITY to 120)
adjustFireLoss(3)
if(120 to 200)
adjustFireLoss(1.5)
if(200 to 260)
adjustFireLoss(0.5)
if(360 to 400)
adjustFireLoss(2)
if(400 to 1000)
adjustFireLoss(3)
if(1000 to INFINITY)
adjustFireLoss(8)
. = ..() // interact with body heat after dealing with the hot air
/mob/living/carbon/monkey/handle_environment(datum/gas_mixture/environment)
// Run base mob body temperature proc before taking damage
// this balances body temp to the environment and natural stabilization
. = ..()
if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !HAS_TRAIT(src, TRAIT_RESISTHEAT))
switch(bodytemperature)
if(360 to 400)
throw_alert("temp", /atom/movable/screen/alert/hot, 1)
apply_damage(HEAT_DAMAGE_LEVEL_1, BURN)
if(400 to 460)
throw_alert("temp", /atom/movable/screen/alert/hot, 2)
apply_damage(HEAT_DAMAGE_LEVEL_2, BURN)
if(460 to INFINITY)
throw_alert("temp", /atom/movable/screen/alert/hot, 3)
if(on_fire)
apply_damage(HEAT_DAMAGE_LEVEL_3, BURN)
else
apply_damage(HEAT_DAMAGE_LEVEL_2, BURN)
else if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !HAS_TRAIT(src, TRAIT_RESISTCOLD))
if(!istype(loc, /obj/machinery/atmospherics/components/unary/cryo_cell))
switch(bodytemperature)
if(200 to 260)
throw_alert("temp", /atom/movable/screen/alert/cold, 1)
apply_damage(COLD_DAMAGE_LEVEL_1, BURN)
if(120 to 200)
throw_alert("temp", /atom/movable/screen/alert/cold, 2)
apply_damage(COLD_DAMAGE_LEVEL_2, BURN)
if(-INFINITY to 120)
throw_alert("temp", /atom/movable/screen/alert/cold, 3)
apply_damage(COLD_DAMAGE_LEVEL_3, BURN)
else
clear_alert("temp")
else
clear_alert("temp")
//Account for massive pressure differences
var/pressure = environment.return_pressure()
var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
switch(adjusted_pressure)
if(HAZARD_HIGH_PRESSURE to INFINITY)
adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) )
throw_alert("pressure", /atom/movable/screen/alert/highpressure, 2)
if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE)
throw_alert("pressure", /atom/movable/screen/alert/highpressure, 1)
if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE)
clear_alert("pressure")
if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
throw_alert("pressure", /atom/movable/screen/alert/lowpressure, 1)
else
adjustBruteLoss( LOW_PRESSURE_DAMAGE )
throw_alert("pressure", /atom/movable/screen/alert/lowpressure, 2)
return
/mob/living/carbon/monkey/handle_random_events()
if (prob(1) && prob(2))
emote("scratch")
/mob/living/carbon/monkey/has_smoke_protection()
if(wear_mask)
if(wear_mask.clothing_flags & BLOCK_GAS_SMOKE_EFFECT)
return 1
/mob/living/carbon/monkey/handle_fire()
. = ..()
if(.) //if the mob isn't on fire anymore
return
//the fire tries to damage the exposed clothes and items
var/list/burning_items = list()
//HEAD//
var/obscured = check_obscured_slots(TRUE)
if(wear_mask && !(obscured & ITEM_SLOT_MASK))
burning_items += wear_mask
if(wear_neck && !(obscured & ITEM_SLOT_NECK))
burning_items += wear_neck
if(head)
burning_items += head
if(back)
burning_items += back
for(var/X in burning_items)
var/obj/item/I = X
I.fire_act((fire_stacks * 50)) //damage taken is reduced to 2% of this value by fire_act()
adjust_bodytemperature(BODYTEMP_HEATING_MAX)
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire)

Some files were not shown because too many files have changed in this diff Show More