e26d78b2b9
About The Pull Request Reagents' TOUCH reactions are very stupid game design wise and do not account impermeability by default unlike VAPOR, yet both are pretty much interchangeably used. But not going to fix it today and debate how features and gameplay mechanics branched off this crooked fallacy should be adjusted. So forgive me for lines 134 and 135. Nevertheless this should stop splashed frying oil from bypassing bio impermeability and thus every sort of protection. Plus message spam reduction. Also slighty raised the damage cap of sizzling cooking oil to partially counter the mild bio protection gained from the average crewmember's attire. Why It's Good For The Game I have used the pneumatic cannon deepfrying meme before, it requires some time and welding spamclicking, but it's pretty much a victory against anyone if the shots hit. Changelog cl fix: Fixes splashed cooking oil bypassing any sort of mob impermeability. Also cut off message/sound spam from being repeatedly splashed within a minimal delay. balance: Upped the cooking oil damage cap from 35 to 38 to account the mild bio protection of the average crewmember's attire. Also made hot deep fryer swirlies account the user's head covering gear's impermeability. refactor: Standarized monkeys/humans get_permeability_coefficient(). /cl
171 lines
5.7 KiB
Plaintext
171 lines
5.7 KiB
Plaintext
/mob/living/carbon/monkey
|
|
name = "monkey"
|
|
verb_say = "chimpers"
|
|
initial_language_holder = /datum/language_holder/monkey
|
|
icon = 'icons/mob/monkey.dmi'
|
|
icon_state = "monkey1"
|
|
gender = NEUTER
|
|
pass_flags = PASSTABLE
|
|
ventcrawler = VENTCRAWLER_NUDE
|
|
mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
|
|
butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/monkey = 5, /obj/item/stack/sheet/animalhide/monkey = 1)
|
|
type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab/monkey
|
|
gib_type = /obj/effect/decal/cleanable/blood/gibs
|
|
unique_name = TRUE
|
|
bodyparts = list(/obj/item/bodypart/chest/monkey, /obj/item/bodypart/head/monkey, /obj/item/bodypart/l_arm/monkey,
|
|
/obj/item/bodypart/r_arm/monkey, /obj/item/bodypart/r_leg/monkey, /obj/item/bodypart/l_leg/monkey)
|
|
hud_type = /datum/hud/monkey
|
|
|
|
/mob/living/carbon/monkey/Initialize(mapload, cubespawned=FALSE, mob/spawner)
|
|
verbs += /mob/living/proc/mob_sleep
|
|
verbs += /mob/living/proc/lay_down
|
|
|
|
if(unique_name) //used to exclude pun pun
|
|
gender = pick(MALE, FEMALE)
|
|
real_name = name
|
|
|
|
//initialize limbs
|
|
create_bodyparts()
|
|
create_internal_organs()
|
|
|
|
. = ..()
|
|
|
|
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
|
|
|
|
create_dna(src)
|
|
dna.initialize_dna(random_blood_type())
|
|
|
|
/mob/living/carbon/monkey/Destroy()
|
|
SSmobs.cubemonkeys -= src
|
|
return ..()
|
|
|
|
/mob/living/carbon/monkey/create_internal_organs()
|
|
internal_organs += new /obj/item/organ/appendix
|
|
internal_organs += new /obj/item/organ/lungs
|
|
internal_organs += new /obj/item/organ/heart
|
|
internal_organs += new /obj/item/organ/brain
|
|
internal_organs += new /obj/item/organ/tongue
|
|
internal_organs += new /obj/item/organ/eyes
|
|
internal_organs += new /obj/item/organ/ears
|
|
internal_organs += new /obj/item/organ/liver
|
|
internal_organs += new /obj/item/organ/stomach
|
|
..()
|
|
|
|
/mob/living/carbon/monkey/on_reagent_change()
|
|
. = ..()
|
|
remove_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE)
|
|
var/amount
|
|
if(reagents.has_reagent(/datum/reagent/medicine/morphine))
|
|
amount = -1
|
|
if(reagents.has_reagent(/datum/reagent/consumable/nuka_cola))
|
|
amount = -1
|
|
if(amount)
|
|
add_movespeed_modifier(MOVESPEED_ID_MONKEY_REAGENT_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = amount)
|
|
|
|
/mob/living/carbon/monkey/updatehealth()
|
|
. = ..()
|
|
var/slow = 0
|
|
if(!HAS_TRAIT(src, TRAIT_IGNOREDAMAGESLOWDOWN))
|
|
var/health_deficiency = (maxHealth - health)
|
|
if(health_deficiency >= 45)
|
|
slow += (health_deficiency / 25)
|
|
add_movespeed_modifier(MOVESPEED_ID_MONKEY_HEALTH_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = slow)
|
|
|
|
/mob/living/carbon/monkey/adjust_bodytemperature(amount)
|
|
. = ..()
|
|
var/slow = 0
|
|
if (bodytemperature < 283.222)
|
|
slow += ((283.222 - bodytemperature) / 10) * 1.75
|
|
add_movespeed_modifier(MOVESPEED_ID_MONKEY_TEMPERATURE_SPEEDMOD, TRUE, 100, override = TRUE, multiplicative_slowdown = slow)
|
|
|
|
/mob/living/carbon/monkey/Stat()
|
|
..()
|
|
if(statpanel("Status"))
|
|
stat(null, "Intent: [a_intent]")
|
|
stat(null, "Move Mode: [m_intent]")
|
|
if(client && mind)
|
|
var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
|
|
if(changeling)
|
|
stat("Chemical Storage", "[changeling.chem_charges]/[changeling.chem_storage]")
|
|
stat("Absorbed DNA", changeling.absorbedcount)
|
|
return
|
|
|
|
|
|
/mob/living/carbon/monkey/verb/removeinternal()
|
|
set name = "Remove Internals"
|
|
set category = "IC"
|
|
internal = null
|
|
return
|
|
|
|
|
|
/mob/living/carbon/monkey/IsAdvancedToolUser()//Unless its monkey mode monkeys cant use advanced tools
|
|
if(mind && is_monkey(mind))
|
|
return TRUE
|
|
return FALSE
|
|
|
|
/mob/living/carbon/monkey/reagent_check(datum/reagent/R) //can metabolize all reagents
|
|
return FALSE
|
|
|
|
/mob/living/carbon/monkey/canBeHandcuffed()
|
|
return TRUE
|
|
|
|
/mob/living/carbon/monkey/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null)
|
|
if(judgement_criteria & JUDGE_EMAGGED)
|
|
return 10 //Everyone is a criminal!
|
|
|
|
var/threatcount = 0
|
|
|
|
//Securitrons can't identify monkeys
|
|
if( !(judgement_criteria & JUDGE_IGNOREMONKEYS) && (judgement_criteria & JUDGE_IDCHECK) )
|
|
threatcount += 4
|
|
|
|
//Lasertag bullshit
|
|
if(lasercolor)
|
|
if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve
|
|
if(is_holding_item_of_type(/obj/item/gun/energy/laser/redtag))
|
|
threatcount += 4
|
|
|
|
if(lasercolor == "r")
|
|
if(is_holding_item_of_type(/obj/item/gun/energy/laser/bluetag))
|
|
threatcount += 4
|
|
|
|
return threatcount
|
|
|
|
//Check for weapons
|
|
if( (judgement_criteria & JUDGE_WEAPONCHECK) && weaponcheck )
|
|
for(var/obj/item/I in held_items) //if they're holding a gun
|
|
if(weaponcheck.Invoke(I))
|
|
threatcount += 4
|
|
if(weaponcheck.Invoke(back)) //if a weapon is present in the back slot
|
|
threatcount += 4 //trigger look_for_perp() since they're nonhuman and very likely hostile
|
|
|
|
//mindshield implants imply trustworthyness
|
|
if(HAS_TRAIT(src, TRAIT_MINDSHIELD))
|
|
threatcount -= 1
|
|
|
|
return threatcount
|
|
|
|
/mob/living/carbon/monkey/IsVocal()
|
|
if(!getorganslot(ORGAN_SLOT_LUNGS))
|
|
return 0
|
|
return 1
|
|
|
|
/mob/living/carbon/monkey/can_use_guns(obj/item/G)
|
|
return TRUE
|
|
|
|
/mob/living/carbon/monkey/angry
|
|
aggressive = TRUE
|
|
|
|
/mob/living/carbon/monkey/angry/Initialize()
|
|
. = ..()
|
|
if(prob(10))
|
|
var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src)
|
|
equip_to_slot_or_del(helmet,SLOT_HEAD)
|
|
helmet.attack_self(src) // todo encapsulate toggle
|