diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 5a0132f6bd8..a44b3d20450 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -104,7 +104,7 @@ icon_state = "green slime extract" /obj/item/organ/brain/golem - name = "chem" + name = "Runic mind" desc = "A tightly furled roll of paper, covered with indecipherable runes." icon = 'icons/obj/wizard.dmi' icon_state = "scroll" diff --git a/code/modules/mob/living/carbon/human/species/skeleton.dm b/code/modules/mob/living/carbon/human/species/skeleton.dm index 7c813b4b1be..713a83d1180 100644 --- a/code/modules/mob/living/carbon/human/species/skeleton.dm +++ b/code/modules/mob/living/carbon/human/species/skeleton.dm @@ -31,8 +31,31 @@ heat_level_2 = 999999999 heat_level_3 = 999999999 heat_level_3_breathe = 999999999 - + suicide_messages = list( "is snapping their own bones!", "is collapsing into a pile!", - "is twisting their skull off!") \ No newline at end of file + "is twisting their skull off!") + has_organ = list( + "brain" = /obj/item/organ/brain/golem, + ) + +/datum/species/skeleton/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R) + // Crazylemon is still silly + if(R.id == "milk") + H.heal_overall_damage(4,4) + if(prob(5)) // 5% chance per proc to find a random limb, and mend it + var/list/our_organs = H.organs.Copy() + shuffle(our_organs) + for(var/obj/item/organ/external/L in our_organs) + if(istype(L)) + if(L.brute_dam < L.min_broken_damage) + L.status &= ~ORGAN_BROKEN + L.status &= ~ORGAN_SPLINTED + L.perma_injury = 0 + break // We're only checking one limb here, bucko + if(prob(3)) + H.say(pick("Thanks Mr Skeltal", "Thank for strong bones", "Doot doot!")) + return 1 + + return ..() \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index cfb04c5427d..e84e7f209e8 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -613,4 +613,11 @@ It'll return null if the organ doesn't correspond, so include null checks when u /datum/species/proc/return_organ(var/organ_slot) if(!(organ_slot in has_organ)) return null - return has_organ[organ_slot] \ No newline at end of file + return has_organ[organ_slot] + +// Do species-specific reagent handling here +// Return 1 if it should do normal processing too +// Return 0 if it shouldn't deplete and do its normal effect +// Other return values will cause weird badness +/datum/species/proc/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R) + return 1 \ No newline at end of file diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index f6c08a20d84..f80e1975b76 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -566,7 +566,11 @@ Note that amputating the affected organ does in fact remove the infection from t if(!(status & ORGAN_ROBOT) && W.bleeding()) W.bleed_timer-- - status |= ORGAN_BLEEDING + if(H && (H.species.flags & NO_BLOOD)) // Bloodless organic races are finicky + W.clamped = 1 + W.bleed_timer = 0 + else + status |= ORGAN_BLEEDING clamped |= W.clamped diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm index 92aa05c0280..40a4905e0ef 100644 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -32,9 +32,14 @@ datum/reagents/proc/metabolize(var/mob/M) //Species with PROCESS_DUO are only affected by reagents that affect both organics and synthetics, like acid and hellwater if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_DUO)) can_process = 1 + + //If handle_reagents returns 0, it's doing the reagent removal on its own + var/species_handled = !(H.species.handle_reagents(H, R)) + can_process = can_process && !species_handled //If the mob can't process it, remove the reagent at it's normal rate without doing any addictions, overdoses, or on_mob_life() for the reagent if(can_process == 0) - R.holder.remove_reagent(R.id, R.metabolization_rate) + if(!species_handled) + R.holder.remove_reagent(R.id, R.metabolization_rate) continue //We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption) else