mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
Malignant organs + Selling organs (#9744)
This commit is contained in:
@@ -127,6 +127,22 @@ SUBSYSTEM_DEF(supply)
|
||||
EC.contents[EC.contents.len]["value"] = salvagedStuff.worth
|
||||
// CHOMPAdd End
|
||||
|
||||
// CHOMPedit begin - Selling engineered organs
|
||||
if(istype(A, /obj/item/organ/internal))
|
||||
var/obj/item/organ/internal/organ_stuff = A
|
||||
if(!istype(CR,/obj/structure/closet/crate/freezer))
|
||||
EC.contents = list(
|
||||
"error" = "Error: Product was improperly packaged. Send contents in freezer crate to preserve contents for transport."
|
||||
)
|
||||
else if(organ_stuff.health != initial(organ_stuff.health) )
|
||||
EC.contents = list(
|
||||
"error" = "Error: Product was damaged on arrival."
|
||||
)
|
||||
else
|
||||
EC.contents[EC.contents.len]["value"] = organ_stuff.supply_conversion_value
|
||||
EC.value += EC.contents[EC.contents.len]["value"]
|
||||
// CHOMPedit end
|
||||
|
||||
|
||||
// Make a log of it, but it wasn't shipped properly, and so isn't worth anything
|
||||
else
|
||||
|
||||
@@ -504,6 +504,7 @@
|
||||
else
|
||||
dat += "<td>[e.name]</td><td>-</td><td>-</td><td>Not Found</td>"
|
||||
dat += "</tr>"
|
||||
var/hasMalignants = "" //CHOMPedit - malignant organs
|
||||
for(var/obj/item/organ/i in occupant.internal_organs)
|
||||
var/mech = ""
|
||||
var/i_dead = ""
|
||||
@@ -535,6 +536,12 @@
|
||||
if(A.inflamed)
|
||||
infection = "Inflammation detected!"
|
||||
|
||||
// CHOMPedit begin - malignant organs
|
||||
if(istype(i, /obj/item/organ/internal/malignant))
|
||||
var/obj/item/organ/internal/ORG = occupant.organs_by_name[i.parent_organ]
|
||||
hasMalignants += span_red(" -[ORG.name]") + "<BR>"
|
||||
// CHOMPedit end
|
||||
|
||||
dat += "<tr>"
|
||||
dat += "<td>[i.name]</td><td>N/A</td><td>[i.damage]</td><td>[infection]:[mech][i_dead]</td><td></td>"
|
||||
dat += "</tr>"
|
||||
@@ -543,6 +550,10 @@
|
||||
dat += span_red("Cataracts detected.") + "<BR>"
|
||||
if(occupant.disabilities & NEARSIGHTED)
|
||||
dat += span_red("Retinal misalignment detected.") + "<BR>"
|
||||
//CHOMPedit begin - malignant organs
|
||||
if(hasMalignants != "")
|
||||
dat += span_red("Unknown anatomy detected!") + "<BR>[hasMalignants]"
|
||||
//CHOMPedit end
|
||||
if(HUSK in occupant.mutations) // VOREstation edit
|
||||
dat += span_red("Anatomical structure lost, resuscitation not possible!") + "<BR>"
|
||||
else
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
|
||||
var/anomalous_organs = FALSE // Can it print anomalous organs?
|
||||
|
||||
var/engineered_organs = FALSE // CHOMPedit - Can it print advanced engineered organs that any species can use (Abductor gameplay)
|
||||
|
||||
// These should be subtypes of /obj/item/organ
|
||||
// Costs roughly 20u Phoron (1 sheet) per internal organ, limbs are 60u for limb and extremity
|
||||
var/list/products = list(
|
||||
@@ -43,7 +45,8 @@
|
||||
"Foot, Left" = list(/obj/item/organ/external/foot, 20),
|
||||
"Foot, Right" = list(/obj/item/organ/external/foot/right, 20),
|
||||
"Hand, Left" = list(/obj/item/organ/external/hand, 20),
|
||||
"Hand, Right" = list(/obj/item/organ/external/hand/right, 20)
|
||||
"Hand, Right" = list(/obj/item/organ/external/hand/right, 20),
|
||||
"Organ Lattice" = list(/obj/item/organ/internal/malignant/engineered/lattice, 30) // CHOMPedit - Bioprinting engineered lattice organs
|
||||
)
|
||||
|
||||
var/list/complex_products = list(
|
||||
@@ -58,6 +61,24 @@
|
||||
"Adrenal Valve Cluster" = list(/obj/item/organ/internal/heart/replicant/rage, 80)
|
||||
)
|
||||
|
||||
// CHOMPadd begin - engineered organs
|
||||
var/list/engineered_products = list(
|
||||
"Phoroketic Gland" = list(/obj/item/organ/internal/malignant/engineered/chemorgan/phoron, 90),
|
||||
"Trioketic Gland" = list(/obj/item/organ/internal/malignant/engineered/chemorgan/tricord, 90),
|
||||
"Tramoketic Gland" = list(/obj/item/organ/internal/malignant/engineered/chemorgan/tramadol, 90),
|
||||
"Dylovetic Gland" = list(/obj/item/organ/internal/malignant/engineered/chemorgan/dylovene, 90),
|
||||
"Citometic Gland" = list(/obj/item/organ/internal/malignant/engineered/chemorgan/citalopram, 90),
|
||||
"Bicordic Gland" = list(/obj/item/organ/internal/malignant/engineered/chemorgan/bicaridine, 90),
|
||||
"Dermalic Gland" = list(/obj/item/organ/internal/malignant/engineered/chemorgan/dermaline, 90),
|
||||
"Kelovetic Gland" = list(/obj/item/organ/internal/malignant/engineered/chemorgan/kelotane, 90),
|
||||
"Dexalic Gland" = list(/obj/item/organ/internal/malignant/engineered/chemorgan/dexalin, 90),
|
||||
"Hypalic Gland" = list(/obj/item/organ/internal/malignant/engineered/chemorgan/hyperzine, 90),
|
||||
"Spaceacilic Gland" = list(/obj/item/organ/internal/malignant/engineered/chemorgan/spaceacillin, 90),
|
||||
"Inaprovic Gland" = list(/obj/item/organ/internal/malignant/engineered/chemorgan/inaprovaline, 90),
|
||||
"Euphorian" = list(/obj/item/organ/internal/malignant/engineered/chemorgan/bliss, 90)
|
||||
)
|
||||
// CHOMPadd end
|
||||
|
||||
/obj/machinery/organ_printer/attackby(var/obj/item/O, var/mob/user)
|
||||
if(default_deconstruction_screwdriver(user, O))
|
||||
updateUsrDialog()
|
||||
@@ -151,6 +172,11 @@
|
||||
if(anomalous_organs)
|
||||
possible_list |= anomalous_products
|
||||
|
||||
// CHOMPedit begin - engineered organs
|
||||
if(engineered_organs)
|
||||
possible_list |= engineered_products
|
||||
// CHOMPedit end
|
||||
|
||||
var/choice = tgui_input_list(user, "What would you like to print?", "Print Choice", possible_list)
|
||||
|
||||
if(!choice || printing || (stat & (BROKEN|NOPOWER)))
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#define TOXIN_DAMAGE 0x40
|
||||
#define OXY_DAMAGE 0x80
|
||||
#define HUSKED_BODY 0x100
|
||||
#define WEIRD_ORGANS 0x200 //CHOMPedit malignant
|
||||
|
||||
/obj/machinery/medical_kiosk
|
||||
name = "medical kiosk"
|
||||
@@ -126,6 +127,10 @@
|
||||
problems |= SERIOUS_INTERNAL_DAMAGE
|
||||
if(I.status & ORGAN_BLEEDING)
|
||||
problems |= INTERNAL_BLEEDING
|
||||
//CHOMPedit begin- malignants
|
||||
if(istype(I,/obj/item/organ/internal/malignant))
|
||||
problems |= WEIRD_ORGANS
|
||||
//CHOMPedit end
|
||||
|
||||
if(HUSK in user.mutations)
|
||||
problems |= HUSKED_BODY
|
||||
@@ -162,6 +167,10 @@
|
||||
problem_text += "<br>" + span_warning("Exposure to toxic materials detected - induce vomiting if you have consumed anything recently.")
|
||||
if(problems & OXY_DAMAGE)
|
||||
problem_text += "<br>" + span_warning("Blood/air perfusion level is below acceptable norms - use concentrated oxygen if necessary.")
|
||||
//CHOMPedit begin malignants
|
||||
if(problems & WEIRD_ORGANS)
|
||||
problem_text += "<br>" + span_warning("Anatomical irregularities detected - Please see a medical professional.")
|
||||
//CHOMPedit end
|
||||
if(problems & HUSKED_BODY)
|
||||
problem_text += "<br>" + span_danger("Anatomical structure lost, resuscitation not possible!")
|
||||
|
||||
@@ -192,3 +201,4 @@
|
||||
#undef TOXIN_DAMAGE
|
||||
#undef OXY_DAMAGE
|
||||
#undef HUSKED_BODY
|
||||
#undef WEIRD_ORGANS // CHOMPedit - malignants
|
||||
|
||||
@@ -279,6 +279,29 @@
|
||||
dat += "<br>"
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
//CHOMPedit begin - malignant organs
|
||||
for(var/obj/item/organ/internal/io in H.internal_organs)
|
||||
if(istype(io,/obj/item/organ/internal/appendix))
|
||||
var/obj/item/organ/internal/appendix/a = io
|
||||
var/severity = ""
|
||||
if(a.inflamed > 3)
|
||||
severity = "Severe"
|
||||
else if(a.inflamed > 2)
|
||||
severity = "Moderate"
|
||||
else if(a.inflamed >= 1)
|
||||
severity = "Mild"
|
||||
if(severity)
|
||||
dat += span_warning("[severity] inflammation detected in subject [a.name].")
|
||||
dat += "<br>"
|
||||
else if(istype(io,/obj/item/organ/internal/malignant))
|
||||
if(advscan >= 2)
|
||||
var/obj/item/organ/internal/ORG = H.organs_by_name[io.parent_organ]
|
||||
dat += span_warning("Anatomical irregularities detected in subject's [ORG.name].")
|
||||
dat += "<br>"
|
||||
else
|
||||
dat += span_warning("Anatomical irregularities detected in subject.")
|
||||
dat += "<br>"
|
||||
//CHOMPedit end
|
||||
for(var/obj/item/organ/internal/appendix/a in H.internal_organs)
|
||||
var/severity = ""
|
||||
if(a.inflamed > 3)
|
||||
|
||||
@@ -1472,6 +1472,18 @@
|
||||
nutriment_desc = list("bun" = 2, "clown shoe" = 3)
|
||||
bitesize = 2
|
||||
|
||||
// CHOMPedit begin - honkwork infection
|
||||
/obj/item/reagent_containers/food/snacks/clownburger/Initialize()
|
||||
. = ..()
|
||||
reagents.add_reagent("protein", 2) // needed to call On_Consume()... Is this actually an issue?
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/clownburger/On_Consume(var/mob/living/user)
|
||||
if(user && ishuman(user) && prob(3))
|
||||
var/mob/living/carbon/human/H = user
|
||||
H.malignant_organ_spawn( /obj/item/organ/internal/malignant/parasite/honker )
|
||||
. = ..()
|
||||
// CHOMPedit end
|
||||
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/mimeburger
|
||||
name = JOB_MIME + " Burger"
|
||||
|
||||
@@ -370,6 +370,12 @@
|
||||
to_chat(src, span_warning("You feel horribly ill."))
|
||||
AdjustWeakened(3)
|
||||
if(prob(5) && internal_organs.len)
|
||||
// CHOMPedit begin - organ mutations
|
||||
if(prob(2))
|
||||
// random organ time!
|
||||
random_malignant_organ(TRUE,FALSE,prob(40))
|
||||
// CHOMPedit end
|
||||
else
|
||||
I = pick(internal_organs) //Internal organ damage...Not good. Not good at all.
|
||||
if(istype(I)) I.add_autopsy_data("Radiation Induced Cancerous Growth", damage)
|
||||
I.take_damage(damage * species.radiation_mod * RADIATION_SPEED_COEFFICIENT)
|
||||
@@ -401,6 +407,11 @@
|
||||
to_chat(src, span_critical("Your entire body feels like it's on fire!"))
|
||||
adjustHalLoss(5)
|
||||
if(prob(10) && internal_organs.len)
|
||||
if(prob(2))
|
||||
// CHOMPedit begin - organ mutations
|
||||
random_malignant_organ(TRUE,FALSE,prob(60))
|
||||
// CHOMPedit end
|
||||
else
|
||||
I = pick(internal_organs) //Internal organ damage...Not good. Not good at all.
|
||||
if(istype(I)) I.add_autopsy_data("Radiation Induced Cancerous Growth", damage)
|
||||
I.take_damage(damage * species.radiation_mod * RADIATION_SPEED_COEFFICIENT)
|
||||
@@ -432,6 +443,12 @@
|
||||
to_chat(src, span_danger("Your hand won't respond properly, you drop what you're holding!"))
|
||||
drop_item()
|
||||
if(internal_organs.len)
|
||||
// CHOMPedit begin - organ mutations
|
||||
if(prob(2))
|
||||
// random organ time!
|
||||
random_malignant_organ(prob(40),FALSE,TRUE)
|
||||
// CHOMPedit end
|
||||
else
|
||||
I = pick(internal_organs) //Internal organ damage...Not good. Not good at all.
|
||||
if(istype(I)) I.add_autopsy_data("Radiation Induced Cancerous Growth", damage * species.radiation_mod * RADIATION_SPEED_COEFFICIENT)
|
||||
I.take_damage(damage * species.radiation_mod * RADIATION_SPEED_COEFFICIENT)
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
/obj/item/organ/internal
|
||||
var/dead_icon // Icon to use when the organ has died.
|
||||
|
||||
var/supply_conversion_value = 0 //CHOMPedit Selling Engineered Organs
|
||||
|
||||
/obj/item/organ/internal/die()
|
||||
..()
|
||||
if((status & ORGAN_DEAD) && dead_icon)
|
||||
|
||||
@@ -7,15 +7,18 @@
|
||||
desc = "A pair of rubber balls used for receiving optical information."
|
||||
can_reject = FALSE
|
||||
icon_state = "eyes_grey"
|
||||
supply_conversion_value = 10 // CHOMPedit - Selling engineered organs
|
||||
|
||||
/obj/item/organ/internal/brain/replicant
|
||||
name = "replicant brain"
|
||||
desc = "A juicy piece of.. rubber, found in someone's head?"
|
||||
can_reject = FALSE
|
||||
icon_state = "brain_grey"
|
||||
supply_conversion_value = 10 // CHOMPedit - Selling engineered organs
|
||||
|
||||
/obj/item/organ/internal/brain/replicant/torso
|
||||
parent_organ = BP_TORSO
|
||||
supply_conversion_value = 10 // CHOMPedit - Selling engineered organs
|
||||
|
||||
/obj/item/organ/internal/voicebox/replicant
|
||||
name = "replicant voicebox"
|
||||
@@ -28,30 +31,35 @@
|
||||
can_reject = FALSE
|
||||
icon_state = "heart_grey-on"
|
||||
dead_icon = "heart_grey-off"
|
||||
supply_conversion_value = 10 // CHOMPedit - Selling engineered organs
|
||||
|
||||
/obj/item/organ/internal/lungs/replicant
|
||||
name = "replicant lungs"
|
||||
desc = "A pair of rubbery sacs used for respiration."
|
||||
can_reject = FALSE
|
||||
icon_state = "lungs_grey"
|
||||
supply_conversion_value = 10 // CHOMPedit - Selling engineered organs
|
||||
|
||||
/obj/item/organ/internal/liver/replicant
|
||||
name = "replicant liver"
|
||||
desc = "A mass of rubber used for filtering and breaking down chemicals."
|
||||
can_reject = FALSE
|
||||
icon_state = "liver_grey"
|
||||
supply_conversion_value = 10 // CHOMPedit - Selling engineered organs
|
||||
|
||||
/obj/item/organ/internal/kidneys/replicant
|
||||
name = "replicant kidneys"
|
||||
desc = "A pair of small sacs used for filtering chemicals."
|
||||
can_reject = FALSE
|
||||
icon_state = "kidneys_grey"
|
||||
supply_conversion_value = 10 // CHOMPedit - Selling engineered organs
|
||||
|
||||
/obj/item/organ/internal/xenos/plasmavessel/replicant
|
||||
name = "replicant phorogenic sac"
|
||||
desc = "A bulbous rubbery mass that converts nutrients from the host into a biological compound eerily similar to phoron."
|
||||
can_reject = FALSE
|
||||
icon_state = "plasma_grey"
|
||||
supply_conversion_value = 50 // CHOMPedit - Selling engineered organs
|
||||
|
||||
/obj/item/organ/internal/xenos/plasmavessel/replicant/crew/handle_organ_proc_special()
|
||||
if(!istype(owner))
|
||||
@@ -91,6 +99,7 @@
|
||||
icon_state = "immunehub"
|
||||
|
||||
var/rejection_adjust = 10
|
||||
supply_conversion_value = 50 // CHOMPedit - Selling engineered organs
|
||||
|
||||
/obj/item/organ/internal/immunehub/replicant
|
||||
name = "replicant assimilation web"
|
||||
@@ -119,6 +128,7 @@
|
||||
organ_verbs = list(
|
||||
/mob/living/proc/ventcrawl
|
||||
)
|
||||
supply_conversion_value = 10 // CHOMPedit - Selling engineered organs
|
||||
|
||||
/obj/item/organ/internal/metamorphgland/replicant
|
||||
name = "replicant malleoshift node"
|
||||
@@ -138,6 +148,7 @@
|
||||
organ_verbs = list(
|
||||
/mob/living/carbon/human/proc/exit_vr
|
||||
)
|
||||
supply_conversion_value = 50 // CHOMPedit - Selling engineered organs
|
||||
|
||||
/*
|
||||
* These subtypes are used by the Replicant species, and provide bonuses to their owners. Even when transplanted!
|
||||
@@ -149,6 +160,7 @@
|
||||
description_info = "This organ, when connected properly to the body, will attempt to induce an adrenaline surge in the implantee."
|
||||
var/prev_damage_tally = 0
|
||||
var/last_activation_time = 0
|
||||
supply_conversion_value = 10 // CHOMPedit - Selling engineered organs
|
||||
|
||||
/obj/item/organ/internal/heart/replicant/rage/handle_organ_proc_special()
|
||||
if(!owner)
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
name = "xeno organ"
|
||||
icon = 'icons/obj/surgery.dmi'
|
||||
desc = "It smells like an accident in a chemical factory."
|
||||
supply_conversion_value = 50 // CHOMPedit - Selling engineered organs
|
||||
|
||||
/obj/item/organ/internal/xenos/eggsac
|
||||
name = "egg sac"
|
||||
|
||||
@@ -186,6 +186,19 @@
|
||||
if(istype(target, /obj/item/implantcase/chem))
|
||||
return
|
||||
|
||||
// CHOMPedit begin - Engineered organ training
|
||||
if(istype(target, /obj/item/organ/internal/malignant/engineered/lattice))
|
||||
var/datum/reagent/R = pick(reagents.reagent_list)
|
||||
if(R)
|
||||
var/obj/item/organ/internal/malignant/engineered/lattice/LAT = target
|
||||
var/success = LAT.make_mutoid(R.id)
|
||||
to_chat(user, span_notice("You inject \the [target] with \the [src], and [success ? "it begins to mutate!" : "nothing seems to happen."]"))
|
||||
reagents.clear_reagents()
|
||||
mode = SYRINGE_DRAW
|
||||
update_icon()
|
||||
return
|
||||
// CHOMPedit end
|
||||
|
||||
if(!target.is_open_container() && !ismob(target) && !istype(target, /obj/item/reagent_containers/food) && !istype(target, /obj/item/slime_extract) && !istype(target, /obj/item/clothing/mask/smokable/cigarette) && !istype(target, /obj/item/storage/fancy/cigarettes) && !istype(target, /obj/item/clothing/mask/chewable)) // CHOMPEdit
|
||||
to_chat(user, span_notice("You cannot directly fill this object."))
|
||||
return
|
||||
|
||||
@@ -395,6 +395,18 @@
|
||||
user.balloon_alert(user, "There is a [o_a][O.organ_tag] already!") // CHOMPEdit
|
||||
return SURGERY_FAILURE
|
||||
|
||||
// CHOMPadd begin - Malignant organs
|
||||
if(O && istype(O,/obj/item/organ/internal/malignant))
|
||||
// malignant organs use a whitelist for allowed locations, and may be placed anywhere in it, not just one organ slot!
|
||||
var/obj/item/organ/internal/malignant/ML = O
|
||||
if(affected.organ_tag in ML.surgeryAllowedSites)
|
||||
ML.parent_organ = affected.organ_tag
|
||||
organ_compatible = 1
|
||||
else
|
||||
to_chat(user, "<span class='warning'>\The [O] won't fit in \the [affected.name].</span>")
|
||||
return SURGERY_FAILURE
|
||||
// CHOMPadd end
|
||||
|
||||
if(O && affected.organ_tag == O.parent_organ)
|
||||
organ_compatible = 1
|
||||
|
||||
|
||||
@@ -10,3 +10,11 @@
|
||||
cost = 15
|
||||
containertype = /obj/structure/closet/crate/nanotrasen
|
||||
containername = "Postal Service crate"
|
||||
|
||||
/datum/supply_pack/supply/freezer
|
||||
name = "Freezer crate"
|
||||
desc = "An empty freezer for storing perishable items."
|
||||
contains = list()
|
||||
cost = 20
|
||||
containertype = /obj/structure/closet/crate/freezer
|
||||
containername = "Freezer crate"
|
||||
|
||||
@@ -103,6 +103,7 @@
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Dust", /datum/event/dust, 0, list(ASSIGNMENT_ENGINEER = 20), 1, 0, 50),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spacefish Migration", /datum/event/spacefish_migration, 0, list(ASSIGNMENT_SECURITY = 40, ASSIGNMENT_MEDICAL = 5), 1, min_jobs = list(ASSIGNMENT_SECURITY = 3)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, -20, list(ASSIGNMENT_SECURITY = 30, ASSIGNMENT_HOS = 20, ASSIGNMENT_WARDEN = 20), 0, min_jobs = list(ASSIGNMENT_SECURITY = 1)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spontaneous Malignant Organ", /datum/event/spontaneous_malignant_organ, -30, list(ASSIGNMENT_MEDICAL = 30), 1, min_jobs = list(ASSIGNMENT_MEDICAL = 2)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, 0, list(ASSIGNMENT_MEDICAL = 100), 1, min_jobs = list(ASSIGNMENT_MEDICAL = 1)),
|
||||
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Wormholes", /datum/event/wormholes, 20, list(ASSIGNMENT_ANY = 5)),
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
/datum/event/spontaneous_malignant_organ/start()
|
||||
for(var/mob/living/carbon/human/H in shuffle(living_mob_list))
|
||||
var/area/A = get_area(H)
|
||||
if(!A)
|
||||
continue
|
||||
// Dont give bellied people and antags cancer
|
||||
if(player_is_antag(H.mind) || isbelly(H.loc))
|
||||
continue
|
||||
if(H.species.virus_immune)
|
||||
continue
|
||||
/*
|
||||
if(!(A.z in using_map.event_levels))
|
||||
continue
|
||||
//Not needed for us
|
||||
if(H.job == JOB_STOWAWAY && prob(90)) // stowaways only have a 10% chance to proc
|
||||
continue
|
||||
*/
|
||||
if(H.client && H.random_malignant_organ(TRUE,TRUE,prob(20)))
|
||||
break
|
||||
|
||||
/datum/event/spontaneous_malignant_organ/only_tumor/start()
|
||||
for(var/mob/living/carbon/human/H in shuffle(living_mob_list))
|
||||
if(H.client && H.random_malignant_organ(TRUE,FALSE,FALSE))
|
||||
break
|
||||
|
||||
/datum/event/spontaneous_malignant_organ/only_para/start()
|
||||
for(var/mob/living/carbon/human/H in shuffle(living_mob_list))
|
||||
if(H.client && H.random_malignant_organ(FALSE,TRUE,FALSE))
|
||||
break
|
||||
|
||||
/datum/event/spontaneous_malignant_organ/only_engineered/start()
|
||||
for(var/mob/living/carbon/human/H in shuffle(living_mob_list))
|
||||
if(H.client && H.random_malignant_organ(FALSE,FALSE,TRUE))
|
||||
break
|
||||
@@ -0,0 +1,808 @@
|
||||
// malignant organs! Develops randomly from radiation exposure and events!
|
||||
/obj/item/organ/internal/malignant
|
||||
organ_tag = "malignant" // gets a random number after, to allow multiple organs!
|
||||
icon = 'modular_chomp/icons/obj/surgery_op.dmi'
|
||||
var/validBPspawns = list(BP_GROIN, BP_TORSO, BP_HEAD, BP_L_ARM, BP_R_ARM, BP_L_HAND, BP_R_HAND, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG) // copy of BP_ALL
|
||||
var/surgeryAllowedSites = list(BP_GROIN, BP_TORSO, BP_HEAD, BP_L_ARM, BP_R_ARM, BP_L_HAND, BP_R_HAND, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG) // everything except engineered uses a BP_ALL copy
|
||||
|
||||
var/cooldown = 0
|
||||
var/cooldownmin = 0
|
||||
var/cooldownmax = 0
|
||||
|
||||
origin_tech = list(TECH_BIO = 5)
|
||||
|
||||
/obj/item/organ/internal/malignant/New(var/mob/living/holder, var/internal, var/force_location = null, var/forcetag = null)
|
||||
organ_tag = "[initial(organ_tag)]_[rand(1,9999)]"
|
||||
if(forcetag)
|
||||
organ_tag = forcetag
|
||||
if(!istype(src,/obj/item/organ/internal/malignant/engineered))
|
||||
// choose a random site for us to grow in before calling parent
|
||||
var/i = 0
|
||||
if(!force_location)
|
||||
while(++i < 10)
|
||||
// done here, because New() does all the setup for placing the organ...
|
||||
// attempt to select a valid exterior organ that isn't synthetic!
|
||||
parent_organ = pick(validBPspawns)
|
||||
if(isliving(holder))
|
||||
var/obj/item/organ/checklimb = holder.organs_by_name[parent_organ]
|
||||
if(checklimb)
|
||||
// valid limb, check if organic!
|
||||
if(checklimb.status == 0 && checklimb.robotic < ORGAN_ROBOT)
|
||||
return ..( holder, internal)
|
||||
else
|
||||
parent_organ = force_location
|
||||
return ..( holder, internal)
|
||||
// invalid, spawn as dead...
|
||||
status = ORGAN_DEAD
|
||||
else
|
||||
// engineered ones don't do all of the above
|
||||
if(force_location)
|
||||
parent_organ = force_location
|
||||
return ..( holder, internal)
|
||||
|
||||
/mob/living/carbon/human/proc/random_malignant_organ( var/allowtumors = TRUE, var/allowparasites = TRUE, var/allowengineered = TRUE)
|
||||
// get a list of valid malignant organs and spawn one
|
||||
var/list/paths = list()
|
||||
if(allowtumors)
|
||||
paths += subtypesof(/obj/item/organ/internal/malignant/tumor)
|
||||
if(allowparasites)
|
||||
paths += subtypesof(/obj/item/organ/internal/malignant/parasite)
|
||||
if(allowengineered)
|
||||
paths += subtypesof(/obj/item/organ/internal/malignant/engineered)
|
||||
paths -= /obj/item/organ/internal/malignant/engineered/chemorgan // Don't use this one
|
||||
return malignant_organ_spawn(pick(paths)) // place in body
|
||||
|
||||
/mob/living/carbon/human/proc/malignant_organ_spawn(var/type_path)
|
||||
if(!type_path)
|
||||
return FALSE
|
||||
if(stat == DEAD)
|
||||
return FALSE
|
||||
if(isSynthetic())
|
||||
return FALSE
|
||||
if(!species)
|
||||
return FALSE
|
||||
if(species.name == SPECIES_VOX \
|
||||
|| species.name == SPECIES_PROMETHEAN \
|
||||
|| species.name == SPECIES_PROTEAN \
|
||||
|| species.name == SPECIES_REPLICANT)
|
||||
return FALSE
|
||||
if(mind && mind.changeling)
|
||||
return FALSE
|
||||
|
||||
var/obj/item/organ/internal/malignant/neworgan = new type_path( src, TRUE)
|
||||
if(neworgan.status == 0) // healthy new organ spawned... Otherwise this is a failure...
|
||||
return TRUE
|
||||
|
||||
// welp, clean up.
|
||||
neworgan.Destroy()
|
||||
return FALSE
|
||||
|
||||
|
||||
|
||||
/obj/item/organ/internal/malignant/tumor
|
||||
name = "tumor"
|
||||
icon_state = "tumor"
|
||||
//dead_icon = "tumor-dead"
|
||||
|
||||
var/stage = 1
|
||||
var/stage_progress = 0
|
||||
|
||||
|
||||
|
||||
/obj/item/organ/internal/malignant/parasite
|
||||
name = "parasite"
|
||||
icon_state = "parasite"
|
||||
dead_icon = "parasite-dead"
|
||||
|
||||
validBPspawns = list(BP_GROIN, BP_TORSO, BP_HEAD) // unlike tumors, we like certain other places!
|
||||
can_reject = 0
|
||||
|
||||
var/feedchance = 1 // fixed chance that parasite will feed this loop
|
||||
var/growth = 1 // some parasites grow! the feedmod vars get multiplied by it as it does!
|
||||
var/feedmodmin = 1
|
||||
var/feedmodmax = 2
|
||||
|
||||
/obj/item/organ/internal/malignant/parasite/process()
|
||||
. = ..()
|
||||
|
||||
if(cooldown > 0)
|
||||
cooldown--
|
||||
return
|
||||
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
if(prob(feedchance))
|
||||
cooldown = rand(cooldownmin,cooldownmax)
|
||||
if(feed())
|
||||
growth++
|
||||
|
||||
/obj/item/organ/internal/malignant/parasite/proc/feed()
|
||||
// perform actions based on the parasite
|
||||
if(feedmodmax > 0)
|
||||
if(owner.nutrition > 0)
|
||||
owner.nutrition = max(owner.nutrition - rand( growth * feedmodmin, growth * feedmodmax),0)
|
||||
else
|
||||
owner.remove_blood(1 + rand( growth * feedmodmin, growth * feedmodmax))
|
||||
// by default, don't grow. Other parasites might thought!
|
||||
return FALSE
|
||||
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered
|
||||
name = "engineered"
|
||||
icon_state = "engineered"
|
||||
dead_icon = "engineered-dead"
|
||||
can_reject = 0
|
||||
surgeryAllowedSites = list(BP_GROIN, BP_TORSO) // Lets keep these a little more restricted, due to size and complexity
|
||||
supply_conversion_value = 100
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/proc/update_degeneration(var/degradechance, var/intensity)
|
||||
if(degradechance == 0)
|
||||
return FALSE
|
||||
if(prob(degradechance))
|
||||
damage += intensity
|
||||
add_autopsy_data("Programmed degeneration", intensity)
|
||||
if(prob(damage * 2))
|
||||
return TRUE // do handle_sideeffects proc
|
||||
return FALSE
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/proc/handle_sideeffects(var/base_mult)
|
||||
if(damage < min_bruised_damage)
|
||||
// skip any major effects if under bruise damage
|
||||
return
|
||||
else
|
||||
if(prob(45))
|
||||
owner.AdjustWeakened(3 * base_mult)
|
||||
if(prob(75))
|
||||
owner.AdjustConfused(4 * base_mult)
|
||||
var/obj/item/organ/O = owner.organs_by_name[parent_organ]
|
||||
if(damage >= min_broken_damage)
|
||||
owner.custom_pain("<span class='warning'>You feel a painful sensation in your [O.name].</span>",damage,TRUE)
|
||||
owner.AdjustBlinded(6 * base_mult)
|
||||
owner.adjustToxLoss(4 * base_mult)
|
||||
else
|
||||
owner.custom_pain("<span class='warning'>You feel a strange sensation in your [O.name].</span>",damage / 10,TRUE)
|
||||
|
||||
/****************************************************
|
||||
Tumor varients
|
||||
these eventually kill you in some strange unique way.
|
||||
****************************************************/
|
||||
|
||||
// cancer! *party blower*! Causes various bad symptoms, and eventually internally bleeds you to death.
|
||||
/obj/item/organ/internal/malignant/tumor/cancer
|
||||
name = "tumor"
|
||||
cooldownmin = 15
|
||||
cooldownmax = 25
|
||||
|
||||
/obj/item/organ/internal/malignant/tumor/cancer/process()
|
||||
. = ..()
|
||||
|
||||
if(cooldown > 0)
|
||||
cooldown--
|
||||
return
|
||||
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
if(++stage_progress > 300)
|
||||
++stage
|
||||
stage_progress = rand(100,200)
|
||||
|
||||
if(stage == 1)
|
||||
if(prob(1))
|
||||
owner.Weaken(2)
|
||||
cooldown = rand(cooldownmin,cooldownmax)
|
||||
if(stage > 1)
|
||||
if(prob(1))
|
||||
owner.Weaken(3)
|
||||
owner.adjustToxLoss(3)
|
||||
owner.nutrition = max(owner.nutrition - rand(1,5),0)
|
||||
cooldown = rand(cooldownmin,cooldownmax)
|
||||
if(stage > 2)
|
||||
if(prob(1))
|
||||
switch(parent_organ)
|
||||
if(BP_GROIN)
|
||||
owner.vomit()
|
||||
if(BP_HEAD)
|
||||
if(prob(30))
|
||||
owner.vomit()
|
||||
else if(prob(30))
|
||||
owner.make_dizzy(90)
|
||||
else
|
||||
owner.Confuse(20)
|
||||
owner.nutrition = max(owner.nutrition - rand(1,5),0)
|
||||
cooldown = rand(cooldownmin,cooldownmax)
|
||||
if(stage > 3)
|
||||
if(prob(1))
|
||||
var/obj/item/organ/external/bodypart = owner.get_organ(parent_organ)
|
||||
var/datum/wound/W = new /datum/wound/internal_bleeding(2)
|
||||
bodypart.wounds += W
|
||||
owner.Weaken(10)
|
||||
owner.adjustToxLoss(20)
|
||||
owner.nutrition = max(owner.nutrition - rand(1,5),0)
|
||||
cooldown = rand(cooldownmin,cooldownmax)
|
||||
|
||||
|
||||
// WHERE SOIL. Simple toxin damage that makes you throwup and lose nutrition sometimes
|
||||
/obj/item/organ/internal/malignant/tumor/potato
|
||||
name = "mimetic potato"
|
||||
icon_state = "potato"
|
||||
validBPspawns = list(BP_GROIN, BP_TORSO)
|
||||
cooldownmin = 15
|
||||
cooldownmax = 35
|
||||
supply_conversion_value = 10
|
||||
|
||||
/obj/item/organ/internal/malignant/tumor/potato/process()
|
||||
. = ..()
|
||||
|
||||
if(cooldown > 0)
|
||||
cooldown--
|
||||
return
|
||||
|
||||
if(prob(3))
|
||||
owner.adjustToxLoss(2)
|
||||
owner.nutrition = max(owner.nutrition - rand(1,5),0)
|
||||
|
||||
if(prob(2))
|
||||
owner.vomit()
|
||||
cooldown = rand(cooldownmin,cooldownmax)
|
||||
|
||||
/obj/item/organ/internal/malignant/tumor/potato/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(istype(W,/obj/item/material/knife))
|
||||
new /obj/item/reagent_containers/food/snacks/rawsticks(get_turf(src))
|
||||
to_chat(user, "<span class='notice'>You cut the mimetic potato.</span>")
|
||||
qdel(src)
|
||||
return
|
||||
if(istype(W, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/C = W
|
||||
if(C.use(5))
|
||||
//TODO: generalize this.
|
||||
to_chat(user, "<span class='notice'>You add some cable to the [src.name] and slide it inside the battery casing.</span>")
|
||||
var/obj/item/cell/potato/pocell = new /obj/item/cell/potato(get_turf(user))
|
||||
if(src.loc == user && ishuman(user))
|
||||
user.put_in_hands(pocell)
|
||||
pocell.maxcharge = 2000 // same as potato
|
||||
pocell.charge = pocell.maxcharge
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
. = ..()
|
||||
|
||||
|
||||
|
||||
|
||||
// pinata makes you eventually explode into candy
|
||||
/obj/item/organ/internal/malignant/tumor/pinata
|
||||
name = "pinata gland"
|
||||
icon_state = "pinata"
|
||||
|
||||
/obj/item/organ/internal/malignant/tumor/pinata/process()
|
||||
. = ..()
|
||||
|
||||
if(stage_progress == 0)
|
||||
stage_progress = rand(10,60)
|
||||
stage_progress++
|
||||
|
||||
if(cooldown > 0)
|
||||
cooldown--
|
||||
return
|
||||
|
||||
if(stage_progress > 350)
|
||||
pop()
|
||||
return
|
||||
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
if(prob(2))
|
||||
if(prob(30))
|
||||
owner.vomit()
|
||||
else if(prob(30))
|
||||
owner.make_dizzy(20)
|
||||
else
|
||||
owner.Confuse(30)
|
||||
|
||||
if(prob(2))
|
||||
var/obj/item/organ/O = owner.organs_by_name[parent_organ]
|
||||
if(stage_progress > 200)
|
||||
owner.custom_pain("<span class='warning'>You feel bloated. The pain in your [O.name] is agonizing.</span>",20,TRUE)
|
||||
owner.custom_emote(VISIBLE_MESSAGE, "winces slightly.")
|
||||
else if(stage_progress > 100)
|
||||
owner.custom_pain("<span class='warning'>You feel a pressure inside your [O.name].</span>",5,TRUE)
|
||||
owner.custom_emote(VISIBLE_MESSAGE, "winces painfully.")
|
||||
else
|
||||
owner.custom_pain("<span class='danger'>The pressure inside your [O.name] hurts.</span>",1,TRUE)
|
||||
owner.custom_emote(VISIBLE_MESSAGE, "winces painfully.")
|
||||
|
||||
/obj/item/organ/internal/malignant/tumor/pinata/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(can_puncture(W))
|
||||
pop()
|
||||
return
|
||||
. = ..()
|
||||
|
||||
/obj/item/organ/internal/malignant/tumor/pinata/proc/pop()
|
||||
// place a ton of candy at location, then delete organ!
|
||||
var/count = rand(20,30)
|
||||
while(count-- > 0)
|
||||
var/picker = pick(/obj/item/clothing/mask/chewable/candy/gum,/obj/item/clothing/mask/chewable/candy/lolli,/obj/item/reagent_containers/food/snacks/candy/gummy,/obj/item/reagent_containers/food/snacks/candy_corn)
|
||||
var/obj/item/newcandy = new picker()
|
||||
newcandy.loc = src.loc
|
||||
|
||||
var/turf/T = loc
|
||||
if(owner)
|
||||
// SURPRISE!
|
||||
playsound(owner, 'sound/items/confetti.ogg', 75, 1)
|
||||
playsound(src, 'sound/effects/snap.ogg', 50, 1)
|
||||
owner.gib()
|
||||
T = owner.loc
|
||||
else
|
||||
// only the organ pops!
|
||||
playsound(src, 'sound/items/confetti.ogg', 75, 1)
|
||||
playsound(src, 'sound/effects/snap.ogg', 50, 1)
|
||||
|
||||
// YAYYYYY
|
||||
if(!turf_clear(T))
|
||||
T = get_turf(src)
|
||||
new /obj/effect/decal/cleanable/confetti(T)
|
||||
Destroy()
|
||||
|
||||
|
||||
// Teleports you randomly, until it gets you killed
|
||||
/obj/item/organ/internal/malignant/tumor/bluespace
|
||||
name = "bluespace tumor"
|
||||
icon_state = "bluetumor"
|
||||
validBPspawns = list(BP_GROIN, BP_TORSO)
|
||||
cooldownmin = 25
|
||||
cooldownmax = 65
|
||||
supply_conversion_value = 50
|
||||
|
||||
/obj/item/organ/internal/malignant/tumor/bluespace/process()
|
||||
. = ..()
|
||||
|
||||
if(cooldown > 0)
|
||||
cooldown--
|
||||
return
|
||||
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
if(stage_progress == 0)
|
||||
stage_progress = rand(10,60)
|
||||
stage_progress++
|
||||
|
||||
if(stage_progress > 300 && stage < 6)
|
||||
stage++
|
||||
stage_progress = 0
|
||||
|
||||
if(prob(stage * 2))
|
||||
var/outer_teleport_radius = stage * 2
|
||||
var/inner_teleport_radius = stage / 2
|
||||
|
||||
var/list/turfs = list()
|
||||
if(inner_teleport_radius > 0)
|
||||
for(var/turf/T in orange(owner,outer_teleport_radius))
|
||||
if(get_dist(owner,T) >= inner_teleport_radius)
|
||||
turfs |= T
|
||||
|
||||
if(turfs.len)
|
||||
// Moves the mob, causes sparks.
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(3, 1, get_turf(owner))
|
||||
s.start()
|
||||
var/turf/picked = get_turf(pick(turfs)) // Just in case...
|
||||
owner.loc = picked // And teleport them to the chosen location.
|
||||
cooldown = rand(cooldownmin,cooldownmax)
|
||||
|
||||
|
||||
// Get you drunk constantly until liver failure
|
||||
/obj/item/organ/internal/malignant/tumor/beerbelly
|
||||
name = "beerbelly"
|
||||
icon_state = "beerbelly"
|
||||
validBPspawns = list(BP_GROIN)
|
||||
cooldownmin = 25
|
||||
cooldownmax = 95
|
||||
supply_conversion_value = 50
|
||||
|
||||
/obj/item/organ/internal/malignant/tumor/beerbelly/process()
|
||||
. = ..()
|
||||
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
if(cooldown > 0)
|
||||
cooldown--
|
||||
return
|
||||
|
||||
if(stage_progress == 0)
|
||||
stage_progress = rand(10,60)
|
||||
stage_progress++
|
||||
|
||||
if(stage_progress > 350 && stage < 10)
|
||||
stage++
|
||||
stage_progress = 0
|
||||
|
||||
if(prob(12))
|
||||
owner.bloodstr.add_reagent( "ethanol", stage * 2)
|
||||
cooldown = rand(cooldownmin,cooldownmax)
|
||||
|
||||
|
||||
// Prints money until you explode
|
||||
/obj/item/organ/internal/malignant/tumor/moneyorgan
|
||||
name = "crypto-cache"
|
||||
icon_state = "crypto"
|
||||
cooldownmin = 15
|
||||
cooldownmax = 25
|
||||
var/thalers = 0
|
||||
supply_conversion_value = 25
|
||||
|
||||
/obj/item/organ/internal/malignant/tumor/moneyorgan/process()
|
||||
. = ..()
|
||||
|
||||
if(!owner)
|
||||
return
|
||||
|
||||
if(cooldown > 0)
|
||||
cooldown--
|
||||
return
|
||||
|
||||
stage_progress++
|
||||
if(stage_progress > 150 && stage < 100)
|
||||
stage++
|
||||
stage_progress = 0
|
||||
|
||||
if(prob(6))
|
||||
thalers += stage
|
||||
supply_conversion_value = initial(supply_conversion_value) + ((thalers * SSsupply.points_per_money))
|
||||
|
||||
if(prob(2))
|
||||
var/obj/item/organ/O = owner.organs_by_name[parent_organ]
|
||||
if(thalers < 100)
|
||||
|
||||
else if(thalers < 500)
|
||||
owner.custom_pain("<span class='warning'>You feel bloated.</span>",1,TRUE)
|
||||
owner.custom_emote(VISIBLE_MESSAGE, "winces slightly.")
|
||||
else if(thalers < 1000)
|
||||
owner.custom_pain("<span class='warning'>You feel a pressure inside your [O.name].</span>",6,TRUE)
|
||||
owner.custom_emote(VISIBLE_MESSAGE, "winces painfully.")
|
||||
if(prob(30))
|
||||
owner.vomit()
|
||||
else if(prob(30))
|
||||
owner.make_dizzy(10)
|
||||
else
|
||||
owner.Confuse(15)
|
||||
else if(thalers < 5000)
|
||||
owner.custom_pain("<span class='danger'>The pressure inside your [O.name] hurts.</span>",15,TRUE)
|
||||
owner.custom_emote(VISIBLE_MESSAGE, "winces painfully.")
|
||||
owner.Weaken(3)
|
||||
if(prob(30))
|
||||
owner.Stun(10)
|
||||
owner.Paralyse(4)
|
||||
if(prob(30))
|
||||
owner.vomit()
|
||||
else if(prob(30))
|
||||
owner.make_dizzy(20)
|
||||
else
|
||||
owner.Confuse(30)
|
||||
else
|
||||
pop()
|
||||
cooldown = rand(cooldownmin,cooldownmax)
|
||||
|
||||
/obj/item/organ/internal/malignant/tumor/moneyorgan/attackby(obj/item/W as obj, mob/user as mob)
|
||||
if(can_puncture(W))
|
||||
pop()
|
||||
return
|
||||
. = ..()
|
||||
|
||||
/obj/item/organ/internal/malignant/tumor/moneyorgan/proc/pop()
|
||||
if(owner)
|
||||
owner.gib() //Kaboom!
|
||||
|
||||
playsound(src, 'sound/effects/snap.ogg', 50, 1)
|
||||
|
||||
// place a ton of money at location, then delete organ!
|
||||
while(thalers > 1000)
|
||||
thalers -= 1000
|
||||
spawn_money(1000, src.loc)
|
||||
while(thalers > 500)
|
||||
thalers -= 500
|
||||
spawn_money(500, src.loc)
|
||||
while(thalers > 50)
|
||||
thalers -= 50
|
||||
spawn_money(50, src.loc)
|
||||
while(thalers > 5)
|
||||
thalers -= 5
|
||||
spawn_money(5, src.loc)
|
||||
while(thalers > 1)
|
||||
thalers -= 1
|
||||
spawn_money(1, src.loc)
|
||||
Destroy()
|
||||
|
||||
|
||||
/****************************************************
|
||||
Parasite varients
|
||||
these produce something into your bloodstream.
|
||||
consuming nutrition, blood instead if starving
|
||||
****************************************************/
|
||||
|
||||
// Makes all pain go away, gets greedy for food!
|
||||
/obj/item/organ/internal/malignant/parasite/painleech
|
||||
name = "suffering-sucker"
|
||||
feedchance = 4
|
||||
feedmodmin = 6
|
||||
feedmodmax = 11
|
||||
cooldownmin = 20
|
||||
cooldownmax = 50
|
||||
|
||||
/obj/item/organ/internal/malignant/parasite/painleech/feed()
|
||||
..()
|
||||
owner.add_chemical_effect(CE_PAINKILLER, 10 + (growth * 20))
|
||||
return prob(10) && growth < 10
|
||||
|
||||
|
||||
// honks and tells you jokes in your head
|
||||
/obj/item/organ/internal/malignant/parasite/honker
|
||||
name = "honkworm"
|
||||
//icon_state = "honker"
|
||||
feedchance = 4
|
||||
feedmodmin = 2
|
||||
feedmodmax = 3
|
||||
cooldownmin = 30
|
||||
cooldownmax = 60
|
||||
|
||||
/obj/item/organ/internal/malignant/parasite/honker/feed()
|
||||
..()
|
||||
if(prob(80))
|
||||
var/sound = pick( list('sound/misc/sadtrombone.ogg','sound/items/bikehorn.ogg','sound/effects/clownstep1.ogg','sound/effects/clownstep2.ogg'))
|
||||
playsound(owner, sound, 50, 1)
|
||||
else
|
||||
// obnoxious, terrible jokes that'll get you punched by a vox
|
||||
var/jokelist = list("honk", \
|
||||
"hehe", \
|
||||
"Don't worry, my jokes have the same opinion about you!", \
|
||||
"Wowie, was that yours or the space asshole's?",
|
||||
"Space lube the airlock, engineers love it!", \
|
||||
"What does a vox choir sound like? ... Sorry I can't hear you.", \
|
||||
"How many teshari does it take to screw in a lightbulb? However many it takes to fit on the ladder.", \
|
||||
"Why does security wear red? So your blood stains won't get noticed!", \
|
||||
"I got some space wind for ya!", \
|
||||
"Honk ya mother!", \
|
||||
"Nice medbay! Now where's the survivors, doc?", \
|
||||
"What's that borgi? The captain fell down the well!? Quickly, to the bar!")
|
||||
owner.say((prob(40) ? ";" : "") + "[pick(jokelist)]")
|
||||
return prob(5) && growth < 3
|
||||
|
||||
|
||||
// Makes you high periodically
|
||||
/obj/item/organ/internal/malignant/parasite/gethigh
|
||||
name = "woggler"
|
||||
feedchance = 4
|
||||
feedmodmin = 6
|
||||
feedmodmax = 11
|
||||
cooldownmin = 10
|
||||
cooldownmax = 40
|
||||
|
||||
/obj/item/organ/internal/malignant/parasite/gethigh/feed()
|
||||
..()
|
||||
owner.druggy = max(owner.druggy, 10 + (growth * 20))
|
||||
return prob(6) && growth < 5
|
||||
|
||||
|
||||
/****************************************************
|
||||
Engineered varients
|
||||
specialized organs, made to be surgically grafted into people.
|
||||
Will find lots of use with abductors in the future!
|
||||
****************************************************/
|
||||
|
||||
// Basic lattice, needs to grow in a host for a bit
|
||||
/obj/item/organ/internal/malignant/engineered/lattice
|
||||
name = "organ lattice"
|
||||
icon_state = "lattice"
|
||||
desc = "A cellular framework made for engineering organs, it needs to grow before it can be mutated."
|
||||
var/growth = 0 // grows until it hits trigger
|
||||
var/growth_trigger = 1
|
||||
var/prepared = FALSE
|
||||
var/chem_target = null
|
||||
supply_conversion_value = 0
|
||||
|
||||
origin_tech = list(TECH_BIO = 3)
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/lattice/New(var/mob/living/holder, var/internal, var/force_location = null, var/forcetag = null)
|
||||
growth_trigger = rand(150,200)
|
||||
return ..( holder, internal, force_location, forcetag)
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/lattice/process()
|
||||
. = ..()
|
||||
if(cooldown > 0)
|
||||
cooldown--
|
||||
return
|
||||
if(!owner)
|
||||
return
|
||||
if(chem_target)
|
||||
// finished, ready to TRANSFORM
|
||||
if(owner.radiation > 20)
|
||||
growth++
|
||||
owner.nutrition -= rand(1,3)
|
||||
if(owner.nutrition > 20)
|
||||
if(growth > growth_trigger)
|
||||
// spawn new organ, delete us
|
||||
var/newpath = get_mutation_result(chem_target)
|
||||
if(newpath)
|
||||
var/ourowner = owner
|
||||
var/ourloc = parent_organ
|
||||
var/ourtag = organ_tag
|
||||
Destroy()
|
||||
new newpath(ourowner, TRUE, ourloc, ourtag)
|
||||
cooldown = rand(2,5)
|
||||
else
|
||||
damage += 1
|
||||
add_autopsy_data("Apoptotic training cells", 3)
|
||||
cooldown = rand(5,10)
|
||||
|
||||
else if(!prepared)
|
||||
owner.nutrition -= rand(1,3)
|
||||
if(owner.nutrition > 20)
|
||||
growth++
|
||||
if(growth > growth_trigger)
|
||||
name = "proto-organ"
|
||||
icon_state = "lattice-grown"
|
||||
desc = "A half grown proto-organ ready for chemical injection."
|
||||
prepared = TRUE
|
||||
growth = 0
|
||||
update_icon()
|
||||
cooldown = rand(2,6)
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/lattice/proc/get_mutation_result(var/reagent)
|
||||
var/newpath = null
|
||||
switch(reagent)
|
||||
if(REAGENT_ID_PHORON)
|
||||
newpath = /obj/item/organ/internal/malignant/engineered/chemorgan/phoron
|
||||
if(REAGENT_ID_TRICORDRAZINE, REAGENT_ID_TRICORLIDAZE)
|
||||
newpath = /obj/item/organ/internal/malignant/engineered/chemorgan/tricord
|
||||
if(REAGENT_ID_TRAMADOL)
|
||||
newpath = /obj/item/organ/internal/malignant/engineered/chemorgan/tramadol
|
||||
if(REAGENT_ID_ANTITOXIN)
|
||||
newpath = /obj/item/organ/internal/malignant/engineered/chemorgan/dylovene
|
||||
if(REAGENT_ID_CITALOPRAM)
|
||||
newpath = /obj/item/organ/internal/malignant/engineered/chemorgan/citalopram
|
||||
if(REAGENT_ID_BICARIDINE, REAGENT_ID_BICARIDAZE)
|
||||
newpath = /obj/item/organ/internal/malignant/engineered/chemorgan/bicaridine
|
||||
if(REAGENT_ID_DERMALINE, REAGENT_ID_DERMALAZE)
|
||||
newpath = /obj/item/organ/internal/malignant/engineered/chemorgan/dermaline
|
||||
if(REAGENT_ID_KELOTANE)
|
||||
newpath = /obj/item/organ/internal/malignant/engineered/chemorgan/kelotane
|
||||
if(REAGENT_ID_DEXALIN, REAGENT_ID_DEXALINP)
|
||||
newpath = /obj/item/organ/internal/malignant/engineered/chemorgan/dexalin
|
||||
if(REAGENT_ID_HYPERZINE)
|
||||
newpath = /obj/item/organ/internal/malignant/engineered/chemorgan/hyperzine
|
||||
if(REAGENT_ID_SPACEACILLIN)
|
||||
newpath = /obj/item/organ/internal/malignant/engineered/chemorgan/spaceacillin
|
||||
if(REAGENT_ID_INAPROVALINE, REAGENT_ID_INAPROVALAZE)
|
||||
newpath = /obj/item/organ/internal/malignant/engineered/chemorgan/inaprovaline
|
||||
if(REAGENT_ID_BLISS)
|
||||
newpath = /obj/item/organ/internal/malignant/engineered/chemorgan/bliss
|
||||
if(REAGENT_ID_ETHANOL)
|
||||
newpath = /obj/item/organ/internal/malignant/tumor/beerbelly
|
||||
if(REAGENT_POTATOJUICE)
|
||||
newpath = /obj/item/organ/internal/malignant/tumor/potato
|
||||
|
||||
return newpath
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/lattice/proc/make_mutoid(var/reagent)
|
||||
if(!prepared)
|
||||
return FALSE
|
||||
if(chem_target)
|
||||
return FALSE
|
||||
if(!get_mutation_result(reagent))
|
||||
return FALSE
|
||||
// BEGIN MUTATION PROCESS
|
||||
chem_target = reagent
|
||||
name = "mutoid"
|
||||
icon_state = "crypto" // TEMP TODO: "lattice-mutated"
|
||||
desc = "A fully grown mutoid ready for radiation training."
|
||||
growth = 0
|
||||
growth_trigger = rand(160,210) // we will quickly start dying now unless trained
|
||||
update_icon()
|
||||
return TRUE
|
||||
|
||||
// Chemical dispensing organs, USES SUB TYPES
|
||||
/obj/item/organ/internal/malignant/engineered/chemorgan
|
||||
name = "chem organ DO NOT USE THIS"
|
||||
var/chemid = null
|
||||
var/deg_chance = 2
|
||||
var/deg_intensity = 1
|
||||
var/side_effect_multiplier = 1
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/chemorgan/process()
|
||||
. = ..()
|
||||
if(cooldown > 0)
|
||||
cooldown--
|
||||
return
|
||||
if(!owner)
|
||||
return
|
||||
if(!chemid)
|
||||
return
|
||||
if(prob(15))
|
||||
// stacked rng to lower the damage over the round
|
||||
if(update_degeneration( deg_chance, deg_intensity))
|
||||
handle_sideeffects(side_effect_multiplier)
|
||||
else
|
||||
// process the chems!
|
||||
if(owner.bloodstr.get_reagent_amount(chemid) < 5)
|
||||
if(prob(10))
|
||||
owner.nutrition = max(owner.nutrition - 1,0) // num num
|
||||
owner.bloodstr.add_reagent(chemid,rand(5,10))
|
||||
cooldown = rand(5,10)
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/chemorgan/phoron
|
||||
name = "phoroketic gland"
|
||||
icon_state = "chem_phoron"
|
||||
chemid = REAGENT_ID_PHORON
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/chemorgan/tricord
|
||||
name = "trioketic gland"
|
||||
icon_state = "chem_tricord"
|
||||
chemid = REAGENT_ID_TRICORDRAZINE
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/chemorgan/tramadol
|
||||
name = "tramoketic gland"
|
||||
icon_state = "chem_tramadol"
|
||||
chemid = REAGENT_ID_TRAMADOL
|
||||
deg_chance = 3
|
||||
deg_intensity = 2
|
||||
side_effect_multiplier = 1
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/chemorgan/dylovene
|
||||
name = "dylovetic gland"
|
||||
icon_state = "chem_dylo"
|
||||
chemid = REAGENT_ID_ANTITOXIN
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/chemorgan/citalopram
|
||||
name = "citometic gland"
|
||||
icon_state = "chem_cita"
|
||||
chemid = REAGENT_ID_CITALOPRAM
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/chemorgan/bicaridine
|
||||
name = "bicordic gland"
|
||||
icon_state = "chem_bicar"
|
||||
chemid = REAGENT_ID_BICARIDINE
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/chemorgan/dermaline
|
||||
name = "dermalic gland"
|
||||
icon_state = "chem_derma"
|
||||
chemid = REAGENT_ID_DERMALINE
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/chemorgan/kelotane
|
||||
name = "kelovetic gland"
|
||||
icon_state = "chem_kelo"
|
||||
chemid = REAGENT_ID_KELOTANE
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/chemorgan/dexalin
|
||||
name = "dexalic gland"
|
||||
icon_state = "chem_dexa"
|
||||
chemid = REAGENT_ID_DEXALIN
|
||||
deg_chance = 5
|
||||
deg_intensity = 1
|
||||
side_effect_multiplier = 2
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/chemorgan/hyperzine
|
||||
name = "hypalic gland"
|
||||
icon_state = "chem_hyper"
|
||||
chemid = REAGENT_ID_HYPERZINE
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/chemorgan/spaceacillin
|
||||
name = "spaceacilic gland"
|
||||
icon_state = "chem_cillin"
|
||||
chemid = REAGENT_ID_SPACEACILLIN
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/chemorgan/inaprovaline
|
||||
name = "inaprovic gland"
|
||||
icon_state = "chem_inapro"
|
||||
chemid = REAGENT_ID_INAPROVALINE
|
||||
|
||||
/obj/item/organ/internal/malignant/engineered/chemorgan/bliss
|
||||
name = "euphorian"
|
||||
icon_state = "chem_bliss"
|
||||
chemid = REAGENT_ID_BLISS
|
||||
deg_chance = 5
|
||||
deg_intensity = 3
|
||||
side_effect_multiplier = 2
|
||||
BIN
modular_chomp/icons/obj/surgery_op.dmi
Normal file
BIN
modular_chomp/icons/obj/surgery_op.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 8.0 KiB |
@@ -4958,6 +4958,7 @@
|
||||
#include "modular_chomp\code\modules\event\meatyores.dm"
|
||||
#include "modular_chomp\code\modules\event\metroid_infestation.dm"
|
||||
#include "modular_chomp\code\modules\event\mutants.dm"
|
||||
#include "modular_chomp\code\modules\event\spontaneous_malignant_organ.dm"
|
||||
#include "modular_chomp\code\modules\exploration\bossloots.dm"
|
||||
#include "modular_chomp\code\modules\exploration\lootsafe.dm"
|
||||
#include "modular_chomp\code\modules\exploration\tyr_tribal_gear.dm"
|
||||
@@ -5110,6 +5111,7 @@
|
||||
#include "modular_chomp\code\modules\mob\new_player\sprite_accessories_taur.dm"
|
||||
#include "modular_chomp\code\modules\mob\new_player\sprite_accessories_wing.dm"
|
||||
#include "modular_chomp\code\modules\organs\organ_icon.dm"
|
||||
#include "modular_chomp\code\modules\organs\internal\malignant\malignant.dm"
|
||||
#include "modular_chomp\code\modules\overmap\dynamic_sector.dm"
|
||||
#include "modular_chomp\code\modules\paperwork\faxmachine.dm"
|
||||
#include "modular_chomp\code\modules\paperwork\filingcabinet.dm"
|
||||
|
||||
Reference in New Issue
Block a user