mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
Adds a verb used by humanoid mobs that have mechanical eyes, which allows them to pick a new color, and have it applied instantly. Adds some helper functions, specifically hex2rgb(), to convert hexadecimal colors to a list of numbers for r, g, and b.
277 lines
7.3 KiB
Plaintext
277 lines
7.3 KiB
Plaintext
#define PROCESS_ACCURACY 10
|
|
|
|
/****************************************************
|
|
INTERNAL ORGANS DEFINES
|
|
****************************************************/
|
|
/obj/item/organ/internal
|
|
var/dead_icon // Icon to use when the organ has died.
|
|
|
|
/obj/item/organ/internal/die()
|
|
..()
|
|
if((status & ORGAN_DEAD) && dead_icon)
|
|
icon_state = dead_icon
|
|
|
|
/obj/item/organ/internal/Destroy()
|
|
if(owner)
|
|
owner.internal_organs.Remove(src)
|
|
owner.internal_organs_by_name[organ_tag] = null
|
|
owner.internal_organs_by_name -= organ_tag
|
|
while(null in owner.internal_organs)
|
|
owner.internal_organs -= null
|
|
var/obj/item/organ/external/E = owner.organs_by_name[parent_organ]
|
|
if(istype(E)) E.internal_organs -= src
|
|
return ..()
|
|
|
|
/obj/item/organ/internal/remove_rejuv()
|
|
if(owner)
|
|
owner.internal_organs -= src
|
|
owner.internal_organs_by_name[organ_tag] = null
|
|
owner.internal_organs_by_name -= organ_tag
|
|
while(null in owner.internal_organs)
|
|
owner.internal_organs -= null
|
|
var/obj/item/organ/external/E = owner.organs_by_name[parent_organ]
|
|
if(istype(E)) E.internal_organs -= src
|
|
..()
|
|
|
|
// Brain is defined in brain_item.dm.
|
|
/obj/item/organ/internal/heart
|
|
name = "heart"
|
|
icon_state = "heart-on"
|
|
organ_tag = O_HEART
|
|
parent_organ = BP_TORSO
|
|
dead_icon = "heart-off"
|
|
|
|
/obj/item/organ/internal/lungs
|
|
name = "lungs"
|
|
icon_state = "lungs"
|
|
gender = PLURAL
|
|
organ_tag = O_LUNGS
|
|
parent_organ = BP_TORSO
|
|
|
|
/obj/item/organ/internal/lungs/process()
|
|
..()
|
|
|
|
if(!owner)
|
|
return
|
|
|
|
if (germ_level > INFECTION_LEVEL_ONE)
|
|
if(prob(5))
|
|
owner.emote("cough") //respitory tract infection
|
|
|
|
if(is_bruised())
|
|
if(prob(2))
|
|
spawn owner.emote("me", 1, "coughs up blood!")
|
|
owner.drip(10)
|
|
if(prob(4))
|
|
spawn owner.emote("me", 1, "gasps for air!")
|
|
owner.losebreath += 15
|
|
|
|
/obj/item/organ/internal/kidneys
|
|
name = "kidneys"
|
|
icon_state = "kidneys"
|
|
gender = PLURAL
|
|
organ_tag = O_KIDNEYS
|
|
parent_organ = BP_GROIN
|
|
|
|
/obj/item/organ/internal/kidneys/process()
|
|
|
|
..()
|
|
|
|
if(!owner)
|
|
return
|
|
|
|
// Coffee is really bad for you with busted kidneys.
|
|
// This should probably be expanded in some way, but fucked if I know
|
|
// what else kidneys can process in our reagent list.
|
|
var/datum/reagent/coffee = locate(/datum/reagent/drink/coffee) in owner.reagents.reagent_list
|
|
if(coffee)
|
|
if(is_bruised())
|
|
owner.adjustToxLoss(0.1 * PROCESS_ACCURACY)
|
|
else if(is_broken())
|
|
owner.adjustToxLoss(0.3 * PROCESS_ACCURACY)
|
|
|
|
/obj/item/organ/internal/eyes
|
|
name = "eyeballs"
|
|
icon_state = "eyes"
|
|
gender = PLURAL
|
|
organ_tag = O_EYES
|
|
parent_organ = BP_HEAD
|
|
var/list/eye_colour = list(0,0,0)
|
|
|
|
/obj/item/organ/internal/eyes/robotize()
|
|
..()
|
|
name = "optical sensor"
|
|
icon = 'icons/obj/robot_component.dmi'
|
|
icon_state = "camera"
|
|
dead_icon = "camera_broken"
|
|
verbs |= /obj/item/organ/internal/eyes/proc/change_eye_color
|
|
|
|
/obj/item/organ/internal/eyes/robot
|
|
name = "optical sensor"
|
|
|
|
/obj/item/organ/internal/eyes/robot/New()
|
|
..()
|
|
robotize()
|
|
|
|
/obj/item/organ/internal/eyes/proc/change_eye_color()
|
|
set name = "Change Eye Color"
|
|
set desc = "Changes your robotic eye color instantly."
|
|
set category = "IC"
|
|
set src in usr
|
|
|
|
var/current_color = rgb(eye_colour[1],eye_colour[2],eye_colour[3])
|
|
var/new_color = input("Pick a new color for your eyes.","Eye Color", current_color) as null|color
|
|
if(new_color && owner)
|
|
// input() supplies us with a hex color, which we can't use, so we convert it to rbg values.
|
|
var/list/new_color_rgb_list = hex2rgb(new_color)
|
|
// First, update mob vars.
|
|
owner.r_eyes = new_color_rgb_list[1]
|
|
owner.g_eyes = new_color_rgb_list[2]
|
|
owner.b_eyes = new_color_rgb_list[3]
|
|
// Now sync the organ's eye_colour list.
|
|
update_colour()
|
|
// Finally, update the eye icon on the mob.
|
|
owner.update_eyes()
|
|
|
|
/obj/item/organ/internal/eyes/replaced(var/mob/living/carbon/human/target)
|
|
|
|
// Apply our eye colour to the target.
|
|
if(istype(target) && eye_colour)
|
|
target.r_eyes = eye_colour[1]
|
|
target.g_eyes = eye_colour[2]
|
|
target.b_eyes = eye_colour[3]
|
|
target.update_eyes()
|
|
..()
|
|
|
|
/obj/item/organ/internal/eyes/proc/update_colour()
|
|
if(!owner)
|
|
return
|
|
eye_colour = list(
|
|
owner.r_eyes ? owner.r_eyes : 0,
|
|
owner.g_eyes ? owner.g_eyes : 0,
|
|
owner.b_eyes ? owner.b_eyes : 0
|
|
)
|
|
|
|
/obj/item/organ/internal/eyes/take_damage(amount, var/silent=0)
|
|
var/oldbroken = is_broken()
|
|
..()
|
|
if(is_broken() && !oldbroken && owner && !owner.stat)
|
|
owner << "<span class='danger'>You go blind!</span>"
|
|
|
|
/obj/item/organ/internal/eyes/process() //Eye damage replaces the old eye_stat var.
|
|
..()
|
|
if(!owner)
|
|
return
|
|
if(is_bruised())
|
|
owner.eye_blurry = 20
|
|
if(is_broken())
|
|
owner.eye_blind = 20
|
|
|
|
/obj/item/organ/internal/liver
|
|
name = "liver"
|
|
icon_state = "liver"
|
|
organ_tag = "liver"
|
|
parent_organ = BP_GROIN
|
|
|
|
/obj/item/organ/internal/liver/process()
|
|
|
|
..()
|
|
|
|
if(!owner)
|
|
return
|
|
|
|
if (germ_level > INFECTION_LEVEL_ONE)
|
|
if(prob(1))
|
|
owner << "<span class='danger'>Your skin itches.</span>"
|
|
if (germ_level > INFECTION_LEVEL_TWO)
|
|
if(prob(1))
|
|
spawn owner.vomit()
|
|
|
|
if(owner.life_tick % PROCESS_ACCURACY == 0)
|
|
|
|
//High toxins levels are dangerous
|
|
if(owner.getToxLoss() >= 60 && !owner.reagents.has_reagent("anti_toxin"))
|
|
//Healthy liver suffers on its own
|
|
if (src.damage < min_broken_damage)
|
|
src.damage += 0.2 * PROCESS_ACCURACY
|
|
//Damaged one shares the fun
|
|
else
|
|
var/obj/item/organ/internal/O = pick(owner.internal_organs)
|
|
if(O)
|
|
O.damage += 0.2 * PROCESS_ACCURACY
|
|
|
|
//Detox can heal small amounts of damage
|
|
if (src.damage && src.damage < src.min_bruised_damage && owner.reagents.has_reagent("anti_toxin"))
|
|
src.damage -= 0.2 * PROCESS_ACCURACY
|
|
|
|
if(src.damage < 0)
|
|
src.damage = 0
|
|
|
|
// Get the effectiveness of the liver.
|
|
var/filter_effect = 3
|
|
if(is_bruised())
|
|
filter_effect -= 1
|
|
if(is_broken())
|
|
filter_effect -= 2
|
|
|
|
// Do some reagent processing.
|
|
if(owner.chem_effects[CE_ALCOHOL_TOXIC])
|
|
if(filter_effect < 3)
|
|
owner.adjustToxLoss(owner.chem_effects[CE_ALCOHOL_TOXIC] * 0.1 * PROCESS_ACCURACY)
|
|
else
|
|
take_damage(owner.chem_effects[CE_ALCOHOL_TOXIC] * 0.1 * PROCESS_ACCURACY, prob(1)) // Chance to warn them
|
|
|
|
/obj/item/organ/internal/appendix
|
|
name = "appendix"
|
|
icon_state = "appendix"
|
|
parent_organ = BP_GROIN
|
|
organ_tag = "appendix"
|
|
var/inflamed = 0
|
|
var/inflame_progress = 0
|
|
|
|
/mob/living/carbon/human/proc/appendicitis()
|
|
if(stat == DEAD)
|
|
return 0
|
|
var/obj/item/organ/internal/appendix/A = internal_organs_by_name[O_APPENDIX]
|
|
if(istype(A) && !A.inflamed)
|
|
A.inflamed = 1
|
|
return 1
|
|
return 0
|
|
|
|
/obj/item/organ/internal/appendix/process()
|
|
if(!inflamed || !owner)
|
|
return
|
|
|
|
if(++inflame_progress > 200)
|
|
++inflamed
|
|
inflame_progress = 0
|
|
|
|
if(inflamed == 1)
|
|
if(prob(5))
|
|
owner << "<span class='warning'>You feel a stinging pain in your abdomen!</span>"
|
|
owner.emote("me", 1, "winces slightly.")
|
|
if(inflamed > 1)
|
|
if(prob(3))
|
|
owner << "<span class='warning'>You feel a stabbing pain in your abdomen!</span>"
|
|
owner.emote("me", 1, "winces painfully.")
|
|
owner.adjustToxLoss(1)
|
|
if(inflamed > 2)
|
|
if(prob(1))
|
|
owner.vomit()
|
|
if(inflamed > 3)
|
|
if(prob(1))
|
|
owner << "<span class='danger'>Your abdomen is a world of pain!</span>"
|
|
owner.Weaken(10)
|
|
|
|
var/obj/item/organ/external/groin = owner.get_organ(BP_GROIN)
|
|
var/datum/wound/W = new /datum/wound/internal_bleeding(20)
|
|
owner.adjustToxLoss(25)
|
|
groin.wounds += W
|
|
inflamed = 0
|
|
|
|
/obj/item/organ/internal/appendix/removed()
|
|
if(inflamed)
|
|
icon_state = "appendixinflamed"
|
|
name = "inflamed appendix"
|
|
..()
|