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
|
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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)))
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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)),
|
||||||
|
|||||||
@@ -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\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"
|
||||||
|
|||||||
Reference in New Issue
Block a user