Malignant organs + Selling organs (#9744)

This commit is contained in:
tacoguy7765093
2025-01-08 12:09:47 -06:00
committed by GitHub
parent 495ed7adf2
commit 78c6862211
18 changed files with 1018 additions and 10 deletions

View File

@@ -127,6 +127,22 @@ SUBSYSTEM_DEF(supply)
EC.contents[EC.contents.len]["value"] = salvagedStuff.worth EC.contents[EC.contents.len]["value"] = salvagedStuff.worth
// CHOMPAdd End // 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 // Make a log of it, but it wasn't shipped properly, and so isn't worth anything
else else

View File

@@ -504,6 +504,7 @@
else else
dat += "<td>[e.name]</td><td>-</td><td>-</td><td>Not Found</td>" dat += "<td>[e.name]</td><td>-</td><td>-</td><td>Not Found</td>"
dat += "</tr>" dat += "</tr>"
var/hasMalignants = "" //CHOMPedit - malignant organs
for(var/obj/item/organ/i in occupant.internal_organs) for(var/obj/item/organ/i in occupant.internal_organs)
var/mech = "" var/mech = ""
var/i_dead = "" var/i_dead = ""
@@ -535,6 +536,12 @@
if(A.inflamed) if(A.inflamed)
infection = "Inflammation detected!" 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 += "<tr>"
dat += "<td>[i.name]</td><td>N/A</td><td>[i.damage]</td><td>[infection]:[mech][i_dead]</td><td></td>" dat += "<td>[i.name]</td><td>N/A</td><td>[i.damage]</td><td>[infection]:[mech][i_dead]</td><td></td>"
dat += "</tr>" dat += "</tr>"
@@ -543,6 +550,10 @@
dat += span_red("Cataracts detected.") + "<BR>" dat += span_red("Cataracts detected.") + "<BR>"
if(occupant.disabilities & NEARSIGHTED) if(occupant.disabilities & NEARSIGHTED)
dat += span_red("Retinal misalignment detected.") + "<BR>" 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 if(HUSK in occupant.mutations) // VOREstation edit
dat += span_red("Anatomical structure lost, resuscitation not possible!") + "<BR>" dat += span_red("Anatomical structure lost, resuscitation not possible!") + "<BR>"
else else

View File

@@ -25,6 +25,8 @@
var/anomalous_organs = FALSE // Can it print anomalous organs? 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 // These should be subtypes of /obj/item/organ
// Costs roughly 20u Phoron (1 sheet) per internal organ, limbs are 60u for limb and extremity // Costs roughly 20u Phoron (1 sheet) per internal organ, limbs are 60u for limb and extremity
var/list/products = list( var/list/products = list(
@@ -43,7 +45,8 @@
"Foot, Left" = list(/obj/item/organ/external/foot, 20), "Foot, Left" = list(/obj/item/organ/external/foot, 20),
"Foot, Right" = list(/obj/item/organ/external/foot/right, 20), "Foot, Right" = list(/obj/item/organ/external/foot/right, 20),
"Hand, Left" = list(/obj/item/organ/external/hand, 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( var/list/complex_products = list(
@@ -58,6 +61,24 @@
"Adrenal Valve Cluster" = list(/obj/item/organ/internal/heart/replicant/rage, 80) "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) /obj/machinery/organ_printer/attackby(var/obj/item/O, var/mob/user)
if(default_deconstruction_screwdriver(user, O)) if(default_deconstruction_screwdriver(user, O))
updateUsrDialog() updateUsrDialog()
@@ -151,6 +172,11 @@
if(anomalous_organs) if(anomalous_organs)
possible_list |= anomalous_products 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) var/choice = tgui_input_list(user, "What would you like to print?", "Print Choice", possible_list)
if(!choice || printing || (stat & (BROKEN|NOPOWER))) if(!choice || printing || (stat & (BROKEN|NOPOWER)))

View File

@@ -7,6 +7,7 @@
#define TOXIN_DAMAGE 0x40 #define TOXIN_DAMAGE 0x40
#define OXY_DAMAGE 0x80 #define OXY_DAMAGE 0x80
#define HUSKED_BODY 0x100 #define HUSKED_BODY 0x100
#define WEIRD_ORGANS 0x200 //CHOMPedit malignant
/obj/machinery/medical_kiosk /obj/machinery/medical_kiosk
name = "medical kiosk" name = "medical kiosk"
@@ -126,6 +127,10 @@
problems |= SERIOUS_INTERNAL_DAMAGE problems |= SERIOUS_INTERNAL_DAMAGE
if(I.status & ORGAN_BLEEDING) if(I.status & ORGAN_BLEEDING)
problems |= INTERNAL_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) if(HUSK in user.mutations)
problems |= HUSKED_BODY 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.") problem_text += "<br>" + span_warning("Exposure to toxic materials detected - induce vomiting if you have consumed anything recently.")
if(problems & OXY_DAMAGE) if(problems & OXY_DAMAGE)
problem_text += "<br>" + span_warning("Blood/air perfusion level is below acceptable norms - use concentrated oxygen if necessary.") 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) if(problems & HUSKED_BODY)
problem_text += "<br>" + span_danger("Anatomical structure lost, resuscitation not possible!") problem_text += "<br>" + span_danger("Anatomical structure lost, resuscitation not possible!")
@@ -192,3 +201,4 @@
#undef TOXIN_DAMAGE #undef TOXIN_DAMAGE
#undef OXY_DAMAGE #undef OXY_DAMAGE
#undef HUSKED_BODY #undef HUSKED_BODY
#undef WEIRD_ORGANS // CHOMPedit - malignants

View File

@@ -279,6 +279,29 @@
dat += "<br>" dat += "<br>"
if(ishuman(M)) if(ishuman(M))
var/mob/living/carbon/human/H = 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) for(var/obj/item/organ/internal/appendix/a in H.internal_organs)
var/severity = "" var/severity = ""
if(a.inflamed > 3) if(a.inflamed > 3)

View File

@@ -1472,6 +1472,18 @@
nutriment_desc = list("bun" = 2, "clown shoe" = 3) nutriment_desc = list("bun" = 2, "clown shoe" = 3)
bitesize = 2 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 /obj/item/reagent_containers/food/snacks/mimeburger
name = JOB_MIME + " Burger" name = JOB_MIME + " Burger"

View File

@@ -370,9 +370,15 @@
to_chat(src, span_warning("You feel horribly ill.")) to_chat(src, span_warning("You feel horribly ill."))
AdjustWeakened(3) AdjustWeakened(3)
if(prob(5) && internal_organs.len) if(prob(5) && internal_organs.len)
I = pick(internal_organs) //Internal organ damage...Not good. Not good at all. // CHOMPedit begin - organ mutations
if(istype(I)) I.add_autopsy_data("Radiation Induced Cancerous Growth", damage) if(prob(2))
I.take_damage(damage * species.radiation_mod * RADIATION_SPEED_COEFFICIENT) // 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)
else if (radiation >= 400 && radiation < 1500) //Equivalent of 8.0 to 30 Gy. else if (radiation >= 400 && radiation < 1500) //Equivalent of 8.0 to 30 Gy.
@@ -401,9 +407,14 @@
to_chat(src, span_critical("Your entire body feels like it's on fire!")) to_chat(src, span_critical("Your entire body feels like it's on fire!"))
adjustHalLoss(5) adjustHalLoss(5)
if(prob(10) && internal_organs.len) if(prob(10) && internal_organs.len)
I = pick(internal_organs) //Internal organ damage...Not good. Not good at all. if(prob(2))
if(istype(I)) I.add_autopsy_data("Radiation Induced Cancerous Growth", damage) // CHOMPedit begin - organ mutations
I.take_damage(damage * species.radiation_mod * RADIATION_SPEED_COEFFICIENT) 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)
else if (radiation >= 1500) //Above 30Gy. You had to get absolutely blasted with rads for this. else if (radiation >= 1500) //Above 30Gy. You had to get absolutely blasted with rads for this.
damage = 30 damage = 30
@@ -432,9 +443,15 @@
to_chat(src, span_danger("Your hand won't respond properly, you drop what you're holding!")) to_chat(src, span_danger("Your hand won't respond properly, you drop what you're holding!"))
drop_item() drop_item()
if(internal_organs.len) if(internal_organs.len)
I = pick(internal_organs) //Internal organ damage...Not good. Not good at all. // CHOMPedit begin - organ mutations
if(istype(I)) I.add_autopsy_data("Radiation Induced Cancerous Growth", damage * species.radiation_mod * RADIATION_SPEED_COEFFICIENT) if(prob(2))
I.take_damage(damage * species.radiation_mod * RADIATION_SPEED_COEFFICIENT) // 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)
/* //Not-so-sparkledog code. TODO: Make a pref for 'special game interactions' that allows interactions that align with prefs to occur. /* //Not-so-sparkledog code. TODO: Make a pref for 'special game interactions' that allows interactions that align with prefs to occur.
if(radiation >= 250) //Special effect stuff that occurs at certain rad levels. if(radiation >= 250) //Special effect stuff that occurs at certain rad levels.

View File

@@ -4,6 +4,8 @@
/obj/item/organ/internal /obj/item/organ/internal
var/dead_icon // Icon to use when the organ has died. 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() /obj/item/organ/internal/die()
..() ..()
if((status & ORGAN_DEAD) && dead_icon) if((status & ORGAN_DEAD) && dead_icon)

View File

@@ -7,15 +7,18 @@
desc = "A pair of rubber balls used for receiving optical information." desc = "A pair of rubber balls used for receiving optical information."
can_reject = FALSE can_reject = FALSE
icon_state = "eyes_grey" icon_state = "eyes_grey"
supply_conversion_value = 10 // CHOMPedit - Selling engineered organs
/obj/item/organ/internal/brain/replicant /obj/item/organ/internal/brain/replicant
name = "replicant brain" name = "replicant brain"
desc = "A juicy piece of.. rubber, found in someone's head?" desc = "A juicy piece of.. rubber, found in someone's head?"
can_reject = FALSE can_reject = FALSE
icon_state = "brain_grey" icon_state = "brain_grey"
supply_conversion_value = 10 // CHOMPedit - Selling engineered organs
/obj/item/organ/internal/brain/replicant/torso /obj/item/organ/internal/brain/replicant/torso
parent_organ = BP_TORSO parent_organ = BP_TORSO
supply_conversion_value = 10 // CHOMPedit - Selling engineered organs
/obj/item/organ/internal/voicebox/replicant /obj/item/organ/internal/voicebox/replicant
name = "replicant voicebox" name = "replicant voicebox"
@@ -28,30 +31,35 @@
can_reject = FALSE can_reject = FALSE
icon_state = "heart_grey-on" icon_state = "heart_grey-on"
dead_icon = "heart_grey-off" dead_icon = "heart_grey-off"
supply_conversion_value = 10 // CHOMPedit - Selling engineered organs
/obj/item/organ/internal/lungs/replicant /obj/item/organ/internal/lungs/replicant
name = "replicant lungs" name = "replicant lungs"
desc = "A pair of rubbery sacs used for respiration." desc = "A pair of rubbery sacs used for respiration."
can_reject = FALSE can_reject = FALSE
icon_state = "lungs_grey" icon_state = "lungs_grey"
supply_conversion_value = 10 // CHOMPedit - Selling engineered organs
/obj/item/organ/internal/liver/replicant /obj/item/organ/internal/liver/replicant
name = "replicant liver" name = "replicant liver"
desc = "A mass of rubber used for filtering and breaking down chemicals." desc = "A mass of rubber used for filtering and breaking down chemicals."
can_reject = FALSE can_reject = FALSE
icon_state = "liver_grey" icon_state = "liver_grey"
supply_conversion_value = 10 // CHOMPedit - Selling engineered organs
/obj/item/organ/internal/kidneys/replicant /obj/item/organ/internal/kidneys/replicant
name = "replicant kidneys" name = "replicant kidneys"
desc = "A pair of small sacs used for filtering chemicals." desc = "A pair of small sacs used for filtering chemicals."
can_reject = FALSE can_reject = FALSE
icon_state = "kidneys_grey" icon_state = "kidneys_grey"
supply_conversion_value = 10 // CHOMPedit - Selling engineered organs
/obj/item/organ/internal/xenos/plasmavessel/replicant /obj/item/organ/internal/xenos/plasmavessel/replicant
name = "replicant phorogenic sac" name = "replicant phorogenic sac"
desc = "A bulbous rubbery mass that converts nutrients from the host into a biological compound eerily similar to phoron." desc = "A bulbous rubbery mass that converts nutrients from the host into a biological compound eerily similar to phoron."
can_reject = FALSE can_reject = FALSE
icon_state = "plasma_grey" icon_state = "plasma_grey"
supply_conversion_value = 50 // CHOMPedit - Selling engineered organs
/obj/item/organ/internal/xenos/plasmavessel/replicant/crew/handle_organ_proc_special() /obj/item/organ/internal/xenos/plasmavessel/replicant/crew/handle_organ_proc_special()
if(!istype(owner)) if(!istype(owner))
@@ -91,6 +99,7 @@
icon_state = "immunehub" icon_state = "immunehub"
var/rejection_adjust = 10 var/rejection_adjust = 10
supply_conversion_value = 50 // CHOMPedit - Selling engineered organs
/obj/item/organ/internal/immunehub/replicant /obj/item/organ/internal/immunehub/replicant
name = "replicant assimilation web" name = "replicant assimilation web"
@@ -119,6 +128,7 @@
organ_verbs = list( organ_verbs = list(
/mob/living/proc/ventcrawl /mob/living/proc/ventcrawl
) )
supply_conversion_value = 10 // CHOMPedit - Selling engineered organs
/obj/item/organ/internal/metamorphgland/replicant /obj/item/organ/internal/metamorphgland/replicant
name = "replicant malleoshift node" name = "replicant malleoshift node"
@@ -138,6 +148,7 @@
organ_verbs = list( organ_verbs = list(
/mob/living/carbon/human/proc/exit_vr /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! * 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." 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/prev_damage_tally = 0
var/last_activation_time = 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() /obj/item/organ/internal/heart/replicant/rage/handle_organ_proc_special()
if(!owner) if(!owner)

View File

@@ -3,6 +3,7 @@
name = "xeno organ" name = "xeno organ"
icon = 'icons/obj/surgery.dmi' icon = 'icons/obj/surgery.dmi'
desc = "It smells like an accident in a chemical factory." desc = "It smells like an accident in a chemical factory."
supply_conversion_value = 50 // CHOMPedit - Selling engineered organs
/obj/item/organ/internal/xenos/eggsac /obj/item/organ/internal/xenos/eggsac
name = "egg sac" name = "egg sac"

View File

@@ -186,6 +186,19 @@
if(istype(target, /obj/item/implantcase/chem)) if(istype(target, /obj/item/implantcase/chem))
return 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 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.")) to_chat(user, span_notice("You cannot directly fill this object."))
return return

View File

@@ -395,6 +395,18 @@
user.balloon_alert(user, "There is a [o_a][O.organ_tag] already!") // CHOMPEdit user.balloon_alert(user, "There is a [o_a][O.organ_tag] already!") // CHOMPEdit
return SURGERY_FAILURE 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) if(O && affected.organ_tag == O.parent_organ)
organ_compatible = 1 organ_compatible = 1

View File

@@ -10,3 +10,11 @@
cost = 15 cost = 15
containertype = /obj/structure/closet/crate/nanotrasen containertype = /obj/structure/closet/crate/nanotrasen
containername = "Postal Service crate" 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"

View File

@@ -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, "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, "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, "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, "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, "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)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Wormholes", /datum/event/wormholes, 20, list(ASSIGNMENT_ANY = 5)),

View File

@@ -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

View File

@@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

View File

@@ -4958,6 +4958,7 @@
#include "modular_chomp\code\modules\event\meatyores.dm" #include "modular_chomp\code\modules\event\meatyores.dm"
#include "modular_chomp\code\modules\event\metroid_infestation.dm" #include "modular_chomp\code\modules\event\metroid_infestation.dm"
#include "modular_chomp\code\modules\event\mutants.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\bossloots.dm"
#include "modular_chomp\code\modules\exploration\lootsafe.dm" #include "modular_chomp\code\modules\exploration\lootsafe.dm"
#include "modular_chomp\code\modules\exploration\tyr_tribal_gear.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_taur.dm"
#include "modular_chomp\code\modules\mob\new_player\sprite_accessories_wing.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\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\overmap\dynamic_sector.dm"
#include "modular_chomp\code\modules\paperwork\faxmachine.dm" #include "modular_chomp\code\modules\paperwork\faxmachine.dm"
#include "modular_chomp\code\modules\paperwork\filingcabinet.dm" #include "modular_chomp\code\modules\paperwork\filingcabinet.dm"