diff --git a/code/__defines/chemistry.dm b/code/__defines/chemistry.dm index c9b34fc2b6..00c7ab061d 100644 --- a/code/__defines/chemistry.dm +++ b/code/__defines/chemistry.dm @@ -33,6 +33,7 @@ #define CE_ALCOHOL "alcohol" // Liver filtering #define CE_ALCOHOL_TOXIC "alcotoxic" // Liver damage #define CE_SPEEDBOOST "gofast" // Hyperzine +#define CE_SLOWDOWN "goslow" // Slowdown #define REAGENTS_PER_SHEET 20 diff --git a/code/game/objects/items/weapons/grenades/flashbang.dm b/code/game/objects/items/weapons/grenades/flashbang.dm index e917745e0e..188262e085 100644 --- a/code/game/objects/items/weapons/grenades/flashbang.dm +++ b/code/game/objects/items/weapons/grenades/flashbang.dm @@ -3,19 +3,20 @@ icon_state = "flashbang" item_state = "flashbang" origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 1) + var/max_range = 10 //The maximum range possible, including species effect mods. Cuts off at 7 for normal humans. Should be 3 higher than your intended target range for affecting normal humans. var/banglet = 0 /obj/item/weapon/grenade/flashbang/prime() ..() - for(var/obj/structure/closet/L in hear(7, get_turf(src))) + for(var/obj/structure/closet/L in hear(max_range, get_turf(src))) if(locate(/mob/living/carbon/, L)) for(var/mob/living/carbon/M in L) bang(get_turf(src), M) - for(var/mob/living/carbon/M in hear(7, get_turf(src))) + for(var/mob/living/carbon/M in hear(max_range, get_turf(src))) bang(get_turf(src), M) - for(var/obj/structure/blob/B in hear(8,get_turf(src))) //Blob damage here + for(var/obj/structure/blob/B in hear(max_range - 2,get_turf(src))) //Blob damage here var/damage = round(30/(get_dist(B,get_turf(src))+1)) if(B.overmind) damage *= B.overmind.blob_type.burn_multiplier @@ -39,13 +40,19 @@ ear_safety = M.get_ear_protection() //Flashing everyone - if(eye_safety < 1) + var/mob/living/carbon/human/H = M + var/flash_effectiveness = 1 + var/bang_effectiveness = 1 + if(ishuman(M)) + flash_effectiveness = H.species.flash_mod + bang_effectiveness = H.species.sound_mod + if(eye_safety < 1 && get_dist(M, T) <= round(max_range * 0.7 * flash_effectiveness)) M.flash_eyes() - M.Confuse(2) - M.Weaken(5) + M.Confuse(2 * flash_effectiveness) + M.Weaken(5 * flash_effectiveness) //Now applying sound - if((get_dist(M, T) <= 2 || src.loc == M.loc || src.loc == M)) + if((get_dist(M, T) <= round(max_range * 0.3 * bang_effectiveness) || src.loc == M.loc || src.loc == M)) if(ear_safety > 0) M.Confuse(2) M.Weaken(1) @@ -58,20 +65,19 @@ M.ear_damage += rand(0, 5) M.ear_deaf = max(M.ear_deaf,15) - else if(get_dist(M, T) <= 5) + else if(get_dist(M, T) <= round(max_range * 0.5 * bang_effectiveness)) if(!ear_safety) M.Confuse(8) M.ear_damage += rand(0, 3) M.ear_deaf = max(M.ear_deaf,10) - else if(!ear_safety) + else if(!ear_safety && get_dist(M, T) <= (max_range * 0.7 * bang_effectiveness)) M.Confuse(4) M.ear_damage += rand(0, 1) M.ear_deaf = max(M.ear_deaf,5) //This really should be in mob not every check if(ishuman(M)) - var/mob/living/carbon/human/H = M var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES] if (E && E.damage >= E.min_bruised_damage) M << "Your eyes start to burn badly!" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 1cea9e2113..acca65d0d6 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -661,12 +661,13 @@ I = internal_organs_by_name[O_EYES] if(I.is_broken()) return FLASH_PROTECTION_MAJOR - else // They can't be flashed if they don't have eyes. + else if(!species.dispersed_eyes) // They can't be flashed if they don't have eyes, or widespread sensing surfaces. return FLASH_PROTECTION_MAJOR var/number = get_equipment_flash_protection() - number = I.get_total_protection(number) - I.additional_flash_effects(number) + if(I) + number = I.get_total_protection(number) + I.additional_flash_effects(number) return number #define add_clothing_protection(A) \ diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index d2150354fa..30e00f2e7a 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -107,6 +107,11 @@ tally += item_tally + if(CE_SLOWDOWN in chem_effects) + if (tally >= 0 ) + tally = (tally + tally/4) //Add a quarter of penalties on top. + tally += 1 + if(CE_SPEEDBOOST in chem_effects) if (tally >= 0) // cut any penalties in half tally = tally/2 diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index bddbf7b982..1fe73897b4 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -75,13 +75,14 @@ /datum/unarmed_attack/bite ) var/list/unarmed_attacks = null // For empty hand harm-intent attack - var/brute_mod = 1 // Physical damage multiplier. - var/burn_mod = 1 // Burn damage multiplier. - var/oxy_mod = 1 // Oxyloss modifier - var/toxins_mod = 1 // Toxloss modifier - var/radiation_mod = 1 // Radiation modifier - var/flash_mod = 1 // Stun from blindness modifier. - var/chemOD_mod = 1 // Damage modifier for overdose + var/brute_mod = 1 // Physical damage multiplier. + var/burn_mod = 1 // Burn damage multiplier. + var/oxy_mod = 1 // Oxyloss modifier + var/toxins_mod = 1 // Toxloss modifier + var/radiation_mod = 1 // Radiation modifier + var/flash_mod = 1 // Stun from blindness modifier. + var/sound_mod = 1 // Stun from sounds, I.E. flashbangs. + var/chemOD_mod = 1 // Damage modifier for overdose var/vision_flags = SEE_SELF // Same flags as glasses. // Death vars. @@ -189,6 +190,7 @@ O_EYES = /obj/item/organ/internal/eyes ) var/vision_organ // If set, this organ is required for vision. Defaults to "eyes" if the species has them. + var/dispersed_eyes // If set, the species will be affected by flashbangs regardless if they have eyes or not, as they see in large areas. var/list/has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest), diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm index 94b38d10d9..213c7c3ae3 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm @@ -5,7 +5,11 @@ var/datum/species/shapeshifter/promethean/prometheans name = SPECIES_PROMETHEAN name_plural = "Prometheans" - blurb = "What has Science done?" + blurb = "Prometheans (Macrolimus artificialis) are a species of artificially-created gelatinous humanoids, \ + chiefly characterized by their primarily liquid bodies and ability to change their bodily shape and color in order to \ + mimic many forms of life. Derived from the Aetolian giant slime (Macrolimus vulgaris) inhabiting the warm, tropical planet \ + of Aetolus, they are a relatively new lab-created sapient species, and as such many things about them have yet to be comprehensively studied. \ + What has Science done?" show_ssd = "totally quiescent" death_message = "rapidly loses cohesion, splattering across the ground..." knockout_message = "collapses inwards, forming a disordered puddle of goo." @@ -46,6 +50,8 @@ var/datum/species/shapeshifter/promethean/prometheans brute_mod = 0.75 burn_mod = 2 oxy_mod = 0 + flash_mod = 0.5 //No centralized, lensed eyes. + item_slowdown_mod = 1.33 cloning_modifier = /datum/modifier/cloning_sickness/promethean @@ -66,6 +72,9 @@ var/datum/species/shapeshifter/promethean/prometheans unarmed_types = list(/datum/unarmed_attack/slime_glomp) has_organ = list(O_BRAIN = /obj/item/organ/internal/brain/slime) // Slime core. + + dispersed_eyes = TRUE + has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest/unbreakable/slime), BP_GROIN = list("path" = /obj/item/organ/external/groin/unbreakable/slime), @@ -143,22 +152,37 @@ var/datum/species/shapeshifter/promethean/prometheans var/turf/T = H.loc if(istype(T)) var/obj/effect/decal/cleanable/C = locate() in T - if(C) - if(H.shoes || (H.wear_suit && (H.wear_suit.body_parts_covered & FEET))) - return + if(C && !(H.shoes || (H.wear_suit && (H.wear_suit.body_parts_covered & FEET)))) qdel(C) if (istype(T, /turf/simulated)) var/turf/simulated/S = T S.dirt = 0 - H.nutrition += rand(15, 45) + H.nutrition = min(500, max(0, H.nutrition + rand(15, 30))) // Heal remaining damage. if(H.fire_stacks >= 0) if(H.getBruteLoss() || H.getFireLoss() || H.getOxyLoss() || H.getToxLoss()) - H.adjustBruteLoss(-heal_rate) - H.adjustFireLoss(-heal_rate) - H.adjustOxyLoss(-heal_rate) - H.adjustToxLoss(-heal_rate) + var/nutrition_cost = 0 + var/nutrition_debt = H.getBruteLoss() + var/starve_mod = 1 + if(H.nutrition <= 25) + starve_mod = 0.75 + H.adjustBruteLoss(-heal_rate * starve_mod) + nutrition_cost += nutrition_debt - H.getBruteLoss() + + nutrition_debt = H.getFireLoss() + H.adjustFireLoss(-heal_rate * starve_mod) + nutrition_cost += nutrition_debt - H.getFireLoss() + + nutrition_debt = H.getOxyLoss() + H.adjustOxyLoss(-heal_rate * starve_mod) + nutrition_cost += nutrition_debt - H.getOxyLoss() + + nutrition_debt = H.getToxLoss() + H.adjustToxLoss(-heal_rate * starve_mod) + nutrition_cost += nutrition_debt - H.getToxLoss() + H.nutrition -= (2 * nutrition_cost) //Costs Nutrition when damage is being repaired, corresponding to the amount of damage being repaired. + H.nutrition = max(0, H.nutrition) //Ensure it's not below 0. else H.adjustToxLoss(2*heal_rate) // Doubled because 0.5 is miniscule, and fire_stacks are capped in both directions diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm index 3cf83d5185..59eba0e341 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm @@ -172,6 +172,11 @@ else ..() +/datum/reagent/water/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_SLIME) + M.visible_message("[M]'s flesh sizzles where the water touches it!", "Your flesh burns in the water!") + ..() + /datum/reagent/fuel name = "Welding fuel" id = "fuel" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm index f844407d3c..4c079ef2dc 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Dispenser.dm @@ -94,6 +94,8 @@ strength_mod *= 0.75 if(alien == IS_DIONA) strength_mod = 0 + if(alien == IS_SLIME) + M.adjustToxLoss(removed) //Sterilizing, if only by a little bit. Also already doubled above. M.add_chemical_effect(CE_ALCOHOL, 1) @@ -136,6 +138,8 @@ strength_mod *= 0.75 if(alien == IS_DIONA) strength_mod = 0 + if(alien == IS_SLIME) + M.adjustToxLoss(removed * 2) //Sterilizing, if only by a little bit. M.add_chemical_effect(CE_ALCOHOL, 1) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 853fe1cab0..0adc854b9d 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -34,7 +34,7 @@ data -= taste /datum/reagent/nutriment/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - if(!injectable) + if(!injectable && alien != IS_SLIME) M.adjustToxLoss(0.1 * removed) return affect_ingest(M, alien, removed) @@ -94,7 +94,7 @@ nutriment_factor = 10 color = "#FFFF00" -/datum/reagent/honey/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) +/datum/reagent/nutriment/honey/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() var/effective_dose = dose @@ -255,6 +255,16 @@ overdose = REAGENTS_OVERDOSE ingest_met = REM +/datum/reagent/sodiumchloride/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + ..() + if(alien == IS_SLIME) + M.adjustFireLoss(removed) + +/datum/reagent/sodiumchloride/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + var/pass_mod = rand(3,5) + var/passthrough = (removed - (removed/pass_mod)) //Some may be nullified during consumption, between one third and one fifth. + affect_blood(M, alien, passthrough) + /datum/reagent/blackpepper name = "Black Pepper" id = "blackpepper" @@ -354,6 +364,15 @@ /datum/reagent/condensedcapsaicin/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) var/eyes_covered = 0 var/mouth_covered = 0 + + var/head_covered = 0 + var/arms_covered = 0 //These are used for the effects on slime-based species. + var/legs_covered = 0 + var/hands_covered = 0 + var/feet_covered = 0 + var/chest_covered = 0 + var/groin_covered = 0 + var/obj/item/safe_thing = null var/effective_strength = 5 @@ -384,27 +403,78 @@ eyes_covered = 1 if(!safe_thing) safe_thing = H.glasses + if(alien == IS_SLIME) + for(var/obj/item/clothing/C in H.worn_clothing) + if(C.body_parts_covered & HEAD) + head_covered = 1 + if(C.body_parts_covered & UPPER_TORSO) + chest_covered = 1 + if(C.body_parts_covered & LOWER_TORSO) + groin_covered = 1 + if(C.body_parts_covered & LEGS) + legs_covered = 1 + if(C.body_parts_covered & ARMS) + arms_covered = 1 + if(C.body_parts_covered & HANDS) + hands_covered = 1 + if(C.body_parts_covered & FEET) + feet_covered = 1 + if(head_covered && chest_covered && groin_covered && legs_covered && arms_covered && hands_covered && feet_covered) + break if(eyes_covered && mouth_covered) - M << "Your [safe_thing] protects you from the pepperspray!" - return + to_chat(M, "Your [safe_thing] protects you from the pepperspray!") + if(alien != IS_SLIME) + return else if(eyes_covered) - M << "Your [safe_thing] protect you from most of the pepperspray!" + to_chat(M, "Your [safe_thing] protect you from most of the pepperspray!") M.eye_blurry = max(M.eye_blurry, effective_strength * 3) M.Blind(effective_strength) M.Stun(5) M.Weaken(5) - return - else if (mouth_covered) // Mouth cover is better than eye cover - M << "Your [safe_thing] protects your face from the pepperspray!" + if(alien != IS_SLIME) + return + else if(mouth_covered) // Mouth cover is better than eye cover + to_chat(M, "Your [safe_thing] protects your face from the pepperspray!") M.eye_blurry = max(M.eye_blurry, effective_strength) - return - else // Oh dear :D - M << "You're sprayed directly in the eyes with pepperspray!" + if(alien != IS_SLIME) + return + else// Oh dear :D + to_chat(M, "You're sprayed directly in the eyes with pepperspray!") M.eye_blurry = max(M.eye_blurry, effective_strength * 5) M.Blind(effective_strength * 2) M.Stun(5) M.Weaken(5) - return + if(alien != IS_SLIME) + return + if(alien == IS_SLIME) + if(!head_covered) + if(prob(33)) + to_chat(M, "The exposed flesh on your head burns!") + M.apply_effect(5 * effective_strength, AGONY, 0) + if(!chest_covered) + if(prob(33)) + to_chat(M, "The exposed flesh on your chest burns!") + M.apply_effect(5 * effective_strength, AGONY, 0) + if(!groin_covered && prob(75)) + if(prob(33)) + to_chat(M, "The exposed flesh on your groin burns!") + M.apply_effect(3 * effective_strength, AGONY, 0) + if(!arms_covered && prob(45)) + if(prob(33)) + to_chat(M, "The exposed flesh on your arms burns!") + M.apply_effect(3 * effective_strength, AGONY, 0) + if(!legs_covered && prob(45)) + if(prob(33)) + to_chat(M, "The exposed flesh on your legs burns!") + M.apply_effect(3 * effective_strength, AGONY, 0) + if(!hands_covered && prob(20)) + if(prob(33)) + to_chat(M, "The exposed flesh on your hands burns!") + M.apply_effect(effective_strength / 2, AGONY, 0) + if(!feet_covered && prob(20)) + if(prob(33)) + to_chat(M, "The exposed flesh on your feet burns!") + M.apply_effect(effective_strength / 2, AGONY, 0) /datum/reagent/condensedcapsaicin/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) if(ishuman(M)) @@ -437,7 +507,10 @@ var/adj_temp = 0 /datum/reagent/drink/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - M.adjustToxLoss(removed) // Probably not a good idea; not very deadly though + var/strength_mod = 1 + if(alien == IS_SLIME) + strength_mod = 3 + M.adjustToxLoss(removed * strength_mod) // Probably not a good idea; not very deadly though return /datum/reagent/drink/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) @@ -449,6 +522,8 @@ M.bodytemperature = min(310, M.bodytemperature + (adj_temp * TEMPERATURE_DAMAGE_COEFFICIENT)) if(adj_temp < 0 && M.bodytemperature > 310) M.bodytemperature = min(310, M.bodytemperature - (adj_temp * TEMPERATURE_DAMAGE_COEFFICIENT)) + if(alien == IS_SLIME) + M.adjustToxLoss(removed * 2) /datum/reagent/drink/overdose(var/mob/living/carbon/M, var/alien) //Add special interactions here in the future if desired. ..() @@ -489,7 +564,7 @@ ..() M.reagents.add_reagent("imidazoline", removed * 0.2) -/datum/reagent/drink/juice/ +/datum/reagent/drink/juice name = "Grape Juice" id = "grapejuice" description = "It's grrrrrape!" @@ -499,7 +574,7 @@ glass_name = "grape juice" glass_desc = "It's grrrrrape!" -/datum/reagent/juice/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) +/datum/reagent/drink/juice/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() var/effective_dose = dose/2 @@ -729,6 +804,24 @@ cup_name = "cup of iced tea" cup_desc = "No relation to a certain rap artist/ actor." +/datum/reagent/drink/tea/icetea/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + ..() + if(alien == IS_SLIME) + if(M.bodytemperature > T0C) + M.bodytemperature -= 0.5 + if(M.bodytemperature < T0C) + M.bodytemperature += 0.5 + M.adjustToxLoss(5 * removed) + +/datum/reagent/drink/tea/icetea/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + ..() + if(alien == IS_SLIME) + if(M.bodytemperature > T0C) + M.bodytemperature -= 0.5 + if(M.bodytemperature < T0C) + M.bodytemperature += 0.5 + M.adjustToxLoss(5 * removed) + /datum/reagent/drink/tea/minttea name = "Mint Tea" id = "minttea" @@ -825,7 +918,7 @@ if(adj_temp > 0) holder.remove_reagent("frostoil", 10 * removed) -/datum/reagent/nutriment/coffee/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) +/datum/reagent/drink/coffee/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() if(alien == IS_TAJARA) M.adjustToxLoss(2 * removed) @@ -851,6 +944,24 @@ glass_desc = "A drink to perk you up and refresh you!" glass_special = list(DRINK_ICE) +/datum/reagent/drink/coffee/icecoffee/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + ..() + if(alien == IS_SLIME) + if(M.bodytemperature > T0C) + M.bodytemperature -= 0.5 + if(M.bodytemperature < T0C) + M.bodytemperature += 0.5 + M.adjustToxLoss(5 * removed) + +/datum/reagent/drink/coffee/icecoffee/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + ..() + if(alien == IS_SLIME) + if(M.bodytemperature > T0C) + M.bodytemperature -= 0.5 + if(M.bodytemperature < T0C) + M.bodytemperature += 0.5 + M.adjustToxLoss(5 * removed) + /datum/reagent/drink/coffee/soy_latte name = "Soy Latte" id = "soy_latte" @@ -1047,13 +1158,13 @@ adj_dizzy = -5 adj_drowsy = -3 adj_sleepy = -2 - + glass_name = "Coffee Milkshake" glass_desc = "An energizing coffee milkshake, perfect for hot days at work.." /datum/reagent/drink/milkshake/coffeeshake/overdose(var/mob/living/carbon/M, var/alien) - M.make_jittery(5) + M.make_jittery(5) /datum/reagent/drink/rewriter name = "Rewriter" @@ -1309,6 +1420,24 @@ glass_desc = "Generally, you're supposed to put something else in there too..." glass_icon = DRINK_ICON_NOISY +/datum/reagent/drink/ice/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + ..() + if(alien == IS_SLIME) + if(M.bodytemperature > T0C) + M.bodytemperature -= rand(1,3) + if(M.bodytemperature < T0C) + M.bodytemperature += rand(1,3) + M.adjustToxLoss(5 * removed) + +/datum/reagent/drink/ice/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + ..() + if(alien == IS_SLIME) + if(M.bodytemperature > T0C) + M.bodytemperature -= rand(1,3) + if(M.bodytemperature < T0C) + M.bodytemperature += rand(1,3) + M.adjustToxLoss(5 * removed) + /datum/reagent/drink/nothing name = "Nothing" id = "nothing" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index d753d045d6..8410a6dbeb 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -28,8 +28,11 @@ scannable = 1 /datum/reagent/bicaridine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + var/chem_effective = 1 + if(alien == IS_SLIME) + chem_effective = 0.75 if(alien != IS_DIONA) - M.heal_organ_damage(6 * removed, 0) + M.heal_organ_damage(6 * removed * chem_effective, 0) /datum/reagent/bicaridine/overdose(var/mob/living/carbon/M, var/alien, var/removed) ..() @@ -59,8 +62,12 @@ scannable = 1 /datum/reagent/kelotane/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + var/chem_effective = 1 + if(alien == IS_SLIME) + chem_effective = 0.5 + M.adjustBruteLoss(2 * removed) //Mends burns, but has negative effects with a Promethean's skeletal structure. if(alien != IS_DIONA) - M.heal_organ_damage(0, 6 * removed) + M.heal_organ_damage(0, 6 * removed * chem_effective) /datum/reagent/dermaline name = "Dermaline" @@ -74,8 +81,11 @@ scannable = 1 /datum/reagent/dermaline/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + var/chem_effective = 1 + if(alien == IS_SLIME) + chem_effective = 0.75 if(alien != IS_DIONA) - M.heal_organ_damage(0, 12 * removed) + M.heal_organ_damage(0, 12 * removed * chem_effective) /datum/reagent/dylovene name = "Dylovene" @@ -87,10 +97,15 @@ scannable = 1 /datum/reagent/dylovene/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + var/chem_effective = 1 + if(alien == IS_SLIME) + chem_effective = 0.66 + if(dose >= 15) + M.druggy = max(M.druggy, 5) if(alien != IS_DIONA) - M.drowsyness = max(0, M.drowsyness - 6 * removed) - M.hallucination = max(0, M.hallucination - 9 * removed) - M.adjustToxLoss(-4 * removed) + M.drowsyness = max(0, M.drowsyness - 6 * removed * chem_effective = 0.66) + M.hallucination = max(0, M.hallucination - 9 * removed * chem_effective = 0.66) + M.adjustToxLoss(-4 * removed * chem_effective = 0.66) /datum/reagent/carthatoline name = "Carthatoline" @@ -114,6 +129,8 @@ return if(L.damage > 0) L.damage = max(L.damage - 2 * removed, 0) + if(alien == IS_SLIME) + H.druggy = max(M.druggy, 5) /datum/reagent/dexalin name = "Dexalin" @@ -128,6 +145,12 @@ /datum/reagent/dexalin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_VOX) M.adjustToxLoss(removed * 6) + else if(alien == IS_SLIME && dose >= 15) + M.add_chemical_effect(CE_PAINKILLER, 15) + if(prob(15)) + to_chat(M, "You have a moment of clarity as you collapse.") + M.adjustBrainLoss(-5 * removed) + M.Weaken(6) else if(alien != IS_DIONA) M.adjustOxyLoss(-15 * removed) @@ -146,6 +169,12 @@ /datum/reagent/dexalinp/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_VOX) M.adjustToxLoss(removed * 9) + else if(alien == IS_SLIME && dose >= 10) + M.add_chemical_effect(CE_PAINKILLER, 25) + if(prob(25)) + to_chat(M, "You have a moment of clarity, as you feel your tubes lose pressure rapidly.") + M.adjustBrainLoss(-8 * removed) + M.Weaken(3) else if(alien != IS_DIONA) M.adjustOxyLoss(-150 * removed) @@ -162,9 +191,12 @@ /datum/reagent/tricordrazine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien != IS_DIONA) - M.adjustOxyLoss(-3 * removed) - M.heal_organ_damage(1.5 * removed, 1.5 * removed) - M.adjustToxLoss(-1.5 * removed) + var/chem_effective = 1 + if(alien == IS_SLIME) + chem_effective = 0.5 + M.adjustOxyLoss(-3 * removed * chem_effective) + M.heal_organ_damage(1.5 * removed, 1.5 * removed * chem_effective) + M.adjustToxLoss(-1.5 * removed * chem_effective) /datum/reagent/cryoxadone name = "Cryoxadone" @@ -179,10 +211,17 @@ /datum/reagent/cryoxadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(M.bodytemperature < 170) - M.adjustCloneLoss(-10 * removed) - M.adjustOxyLoss(-10 * removed) - M.heal_organ_damage(10 * removed, 10 * removed) - M.adjustToxLoss(-10 * removed) + var/chem_effective = 1 + if(alien == IS_SLIME) + chem_effective = 0.25 + to_chat(M, "It's cold. Something causes your cellular mass to harden occasionally, resulting in vibration.") + M.Weaken(10) + M.silent = max(M.silent, 10) + M.make_jittery(4) + M.adjustCloneLoss(-10 * removed * chem_effective) + M.adjustOxyLoss(-10 * removed * chem_effective) + M.heal_organ_damage(10 * removed, 10 * removed * chem_effective) + M.adjustToxLoss(-10 * removed * chem_effective) /datum/reagent/clonexadone name = "Clonexadone" @@ -197,10 +236,18 @@ /datum/reagent/clonexadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(M.bodytemperature < 170) - M.adjustCloneLoss(-30 * removed) - M.adjustOxyLoss(-30 * removed) - M.heal_organ_damage(30 * removed, 30 * removed) - M.adjustToxLoss(-30 * removed) + var/chem_effective = 1 + if(alien == IS_SLIME) + if(prob(10)) + to_chat(M, "It's so cold. Something causes your cellular mass to harden sporadically, resulting in seizure-like twitching.") + chem_effective = 0.5 + M.Weaken(20) + M.silent = max(M.silent, 20) + M.make_jittery(4) + M.adjustCloneLoss(-30 * removed * chem_effective) + M.adjustOxyLoss(-30 * removed * chem_effective) + M.heal_organ_damage(30 * removed, 30 * removed * chem_effective) + M.adjustToxLoss(-30 * removed * chem_effective) /* Painkillers */ @@ -217,10 +264,15 @@ mrate_static = TRUE /datum/reagent/paracetamol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - M.add_chemical_effect(CE_PAINKILLER, 25) + var/chem_effective = 1 + if(alien == IS_SLIME) + chem_effective = 0.75 + M.add_chemical_effect(CE_PAINKILLER, 25 * chem_effective) /datum/reagent/paracetamol/overdose(var/mob/living/carbon/M, var/alien) ..() + if(alien == IS_SLIME) + M.add_chemical_effect(CE_SLOWDOWN, 1) M.hallucination = max(M.hallucination, 2) /datum/reagent/tramadol @@ -236,7 +288,11 @@ mrate_static = TRUE /datum/reagent/tramadol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - M.add_chemical_effect(CE_PAINKILLER, 80) + var/chem_effective = 1 + if(alien == IS_SLIME) + chem_effective = 0.8 + M.add_chemical_effect(CE_SLOWDOWN, 1) + M.add_chemical_effect(CE_PAINKILLER, 80 * chem_effective) /datum/reagent/tramadol/overdose(var/mob/living/carbon/M, var/alien) ..() @@ -255,8 +311,13 @@ mrate_static = TRUE /datum/reagent/oxycodone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) - M.add_chemical_effect(CE_PAINKILLER, 200) - M.eye_blurry = min(M.eye_blurry + 10, 250) + var/chem_effective = 1 + if(alien == IS_SLIME) + chem_effective = 0.75 + M.stuttering = min(50, max(0, M.stuttering + 5)) //If you can't feel yourself, and your main mode of speech is resonation, there's a problem. + M.add_chemical_effect(CE_SLOWDOWN, 1) + M.add_chemical_effect(CE_PAINKILLER, 200 * chem_effective) + M.eye_blurry = min(M.eye_blurry + 10, 250 * chem_effective) M.Confuse(5) /datum/reagent/oxycodone/overdose(var/mob/living/carbon/M, var/alien) @@ -278,16 +339,23 @@ scannable = 1 /datum/reagent/synaptizine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + var/chem_effective = 1 if(alien == IS_DIONA) return + if(alien == IS_SLIME) + if(dose >= 5) //Not effective in small doses, though it causes toxloss at higher ones, it will make the regeneration for brute and burn more 'efficient' at the cost of more nutrition. + M.nutrition -= removed * 2 + M.adjustBruteLoss(-2 * removed) + M.adjustFireLoss(-1 * removed) + chem_effective = 0.5 M.drowsyness = max(M.drowsyness - 5, 0) M.AdjustParalysis(-1) M.AdjustStunned(-1) M.AdjustWeakened(-1) holder.remove_reagent("mindbreaker", 5) M.hallucination = max(0, M.hallucination - 10) - M.adjustToxLoss(5 * removed) // It used to be incredibly deadly due to an oversight. Not anymore! - M.add_chemical_effect(CE_PAINKILLER, 20) + M.adjustToxLoss(5 * removed * chem_effective) // It used to be incredibly deadly due to an oversight. Not anymore! + M.add_chemical_effect(CE_PAINKILLER, 20 * chem_effective) /datum/reagent/hyperzine name = "Hyperzine" @@ -301,6 +369,10 @@ /datum/reagent/hyperzine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_TAJARA) removed *= 1.25 + if(alien == IS_SLIME) + M.make_jittery(4) //Hyperactive fluid pumping results in unstable 'skeleton', resulting in vibration. + if(dose >= 5) + M.nutrition = (M.nutrition - (removed * 2)) //Sadly this movement starts burning food in higher doses. ..() if(prob(5)) M.emote(pick("twitch", "blink_r", "shiver")) @@ -320,8 +392,16 @@ /datum/reagent/alkysine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) return - M.adjustBrainLoss(-30 * removed) - M.add_chemical_effect(CE_PAINKILLER, 10) + var/ + var/chem_effective = 1 + if(alien == IS_SLIME) + chem_effective = 0.25 + if(M.brainloss >= 10) + M.Weaken(5) + if(dose >= 10 && M.paralysis < 40) + M.AdjustParalysis(1) //Messing with the core with a simple chemical probably isn't the best idea. + M.adjustBrainLoss(-30 * removed * chem_effective) + M.add_chemical_effect(CE_PAINKILLER, 10 * chem_effective) /datum/reagent/imidazoline name = "Imidazoline" @@ -369,6 +449,10 @@ if(I.damage <= 5 && I.organ_tag == O_EYES) H.eye_blurry = min(M.eye_blurry + 10, 250) //Eyes need to reset, or something H.sdisabilities &= ~BLIND + if(alien == IS_SLIME) + H.add_chemical_effect(CE_PAINKILLER, 20) + if(prob(33)) + H.Confuse(10) /datum/reagent/osteodaxon name = "Osteodaxon" @@ -437,9 +521,35 @@ M.disabilities = 0 M.sdisabilities = 0 + var/mob/living/carbon/human/H = M + if(alien == IS_SLIME && istype(H)) //Shifts them toward white, faster than Rezadone does toward grey. + if(prob(50)) + if(H.r_skin) + H.r_skin = round((H.r_skin + 510)/3) + if(H.r_hair) + H.r_hair = round((H.r_hair + 510)/3) + if(H.r_facial) + H.r_facial = round((H.r_facial + 510)/3) + H.adjustToxLoss(6 * removed) + if(prob(50)) + if(H.g_skin) + H.g_skin = round((H.g_skin + 510)/3) + if(H.g_hair) + H.g_hair = round((H.g_hair + 510)/3) + if(H.g_facial) + H.g_facial = round((H.g_facial + 510)/3) + H.adjustToxLoss(6 * removed) + if(prob(50)) + if(H.b_skin) + H.b_skin = round((H.b_skin + 510)/3) + if(H.b_hair) + H.b_hair = round((H.b_hair + 510)/3) + if(H.b_facial) + H.b_facial = round((H.b_facial + 510)/3) + H.adjustToxLoss(6 * removed) + // Might need to update appearance for hulk etc. if(needs_update && ishuman(M)) - var/mob/living/carbon/human/H = M H.update_mutations() /datum/reagent/ethylredoxrazine @@ -513,9 +623,19 @@ mrate_static = TRUE overdose = REAGENTS_OVERDOSE scannable = 1 + data = 0 /datum/reagent/spaceacillin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() + if(alien == IS_SLIME) + if(volume <= 0.1 && data != -1) + data = -1 + to_chat(M, "You regain focus...") + else + var/delay = (5 MINUTES) + if(world.time > data + delay) + data = world.time + to_chat(M, "Your senses feel unfocused, and divided.") M.add_chemical_effect(CE_ANTIBIOTIC, dose >= overdose ? ANTIBIO_OD : ANTIBIO_NORM) /datum/reagent/corophizine @@ -528,11 +648,48 @@ mrate_static = TRUE overdose = 10 scannable = 1 + data = 0 /datum/reagent/corophizine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) ..() M.add_chemical_effect(CE_ANTIBIOTIC, ANTIBIO_SUPER) + var/mob/living/carbon/human/H = M + + if(ishuman(M) && alien == IS_SLIME) //Everything about them is treated like a targetted organism. Widespread bodily function begins to fail. + if(volume <= 0.1 && data != -1) + data = -1 + to_chat(M, "Your body ceases its revolt.") + else + var/delay = (3 MINUTES) + if(world.time > data + delay) + data = world.time + to_chat(M, "It feels like your body is revolting!") + M.Confuse(7) + M.adjustFireLoss(removed * 2) + M.adjustToxLoss(removed * 2) + if(dose >= 5 && M.toxloss >= 10) //It all starts going wrong. + M.adjustBruteLoss(removed * 3) + M.eye_blurry = min(20, max(0, M.eye_blurry + 10)) + if(prob(25)) + if(prob(25)) + to_chat(M, "Your pneumatic fluids seize for a moment.") + M.Stun(2) + spawn(30) + M.Weaken(2) + if(dose >= 10 || M.toxloss >= 25) //Internal skeletal tubes are rupturing, allowing the chemical to breach them. + M.adjustToxLoss(removed * 4) + M.make_jittery(5) + if(dose >= 20 || M.toxloss >= 60) //Core disentigration, cellular mass begins treating itself as an enemy, while maintaining regeneration. Slime-cancer. + M.adjustBrainLoss(2 * removed) + M.nutrition = max(H.nutrition - 20, 0) + if(M.bruteloss >= 60 && M.toxloss >= 60 && M.brainloss >= 30) //Total Structural Failure. Limbs start splattering. + var/obj/item/organ/external/O = pick(H.organs) + if(prob(20) && !istype(O, /obj/item/organ/external/chest/unbreakable/slime) && !istype(O, /obj/item/organ/external/groin/unbreakable/slime)) + to_chat(M, "You feel your [O] begin to dissolve, before it sloughs from your body.") + O.droplimb() //Splat. + return + //Based roughly on Levofloxacin's rather severe side-effects if(prob(20)) M.Confuse(5) @@ -545,7 +702,6 @@ //One of the levofloxacin side effects is 'spontaneous tendon rupture', which I'll immitate here. 1:1000 chance, so, pretty darn rare. if(ishuman(M) && rand(1,1000) == 1) - var/mob/living/carbon/human/H = M var/obj/item/organ/external/eo = pick(H.organs) //Misleading variable name, 'organs' is only external organs eo.fracture() @@ -558,11 +714,20 @@ color = "#C8A5DC" touch_met = 5 +/datum/reagent/sterilizine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + if(alien == IS_SLIME) + M.adjustFireLoss(removed) + M.adjustToxLoss(2 * removed) + return + /datum/reagent/sterilizine/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) M.germ_level -= min(removed*20, M.germ_level) for(var/obj/item/I in M.contents) I.was_bloodied = null M.was_bloodied = null + if(alien == IS_SLIME) + M.adjustFireLoss(removed) + M.adjustToxLoss(2 * removed) /datum/reagent/sterilizine/touch_obj(var/obj/O) O.germ_level -= min(volume*20, O.germ_level) @@ -606,6 +771,29 @@ /datum/reagent/rezadone/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) return + var/mob/living/carbon/human/H = M + if(alien == IS_SLIME && istype(H)) + if(prob(50)) + if(H.r_skin) + H.r_skin = round((H.r_skin + 50)/2) + if(H.r_hair) + H.r_hair = round((H.r_hair + 50)/2) + if(H.r_facial) + H.r_facial = round((H.r_facial + 50)/2) + if(prob(50)) + if(H.g_skin) + H.g_skin = round((H.g_skin + 50)/2) + if(H.g_hair) + H.g_hair = round((H.g_hair + 50)/2) + if(H.g_facial) + H.g_facial = round((H.g_facial + 50)/2) + if(prob(50)) + if(H.b_skin) + H.b_skin = round((H.b_skin + 50)/2) + if(H.b_hair) + H.b_hair = round((H.b_hair + 50)/2) + if(H.b_facial) + H.b_facial = round((H.b_facial + 50)/2) M.adjustCloneLoss(-20 * removed) M.adjustOxyLoss(-2 * removed) M.heal_organ_damage(20 * removed, 20 * removed) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index c377ea98c3..ac20d522eb 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -16,7 +16,10 @@ if(issmall(M)) removed *= 2 // Small bodymass, more effect from lower volume. if(alien == IS_SLIME) removed *= 0.25 // Results in half the standard tox as normal. Prometheans are 'Small' for flaps. - M.nutrition += strength * removed + if(dose >= 10) + M.nutrition += strength * removed //Body has to deal with the massive influx of toxins, rather than try using them to repair. + else + M.heal_organ_damage((10/strength) * removed, (10/strength) * removed) //Doses of toxins below 10 units, and 10 strength, are capable of providing useful compounds for repair. M.adjustToxLoss(strength * removed) /datum/reagent/toxin/plasticide @@ -73,6 +76,15 @@ spawn (0) target_tile.hotspot_expose(700, 400) remove_self(volume) +/datum/reagent/toxin/hydrophoron/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + ..() + if(alien == IS_SLIME) + M.adjust_fire_stacks(removed * 10) + if(prob(10)) + to_chat(M, "You feel something boiling within you!") + spawn(rand(30, 60)) + M.IgniteMob() + /datum/reagent/toxin/spidertoxin name = "Spidertoxin" id = "spidertoxin" @@ -107,6 +119,8 @@ if(alien == IS_VOX) M.adjustOxyLoss(-100 * removed) //5 oxyloss healed per tick. return //You're wasting plasma (a semi-limited chemical) to save someone, so it might as well be somewhat strong. + if(alien == IS_SLIME) + M.adjust_fire_stacks(removed * 3) //Not quite 'converting' it. It's like mixing fuel into a jelly. You get explosive, or at least combustible, jelly. ..() /datum/reagent/toxin/phoron/touch_turf(var/turf/simulated/T, var/amount) @@ -177,6 +191,11 @@ strength = 0 overdose = REAGENTS_OVERDOSE +/datum/reagent/toxin/potassium_chloride/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + ..() + if(alien == IS_SLIME) + M.adjustFireLoss(removed * 2) + /datum/reagent/toxin/potassium_chloride/overdose(var/mob/living/carbon/M, var/alien) ..() if(ishuman(M)) @@ -206,6 +225,8 @@ H.losebreath = max(10, M.losebreath-10) H.adjustOxyLoss(2) H.Weaken(10) + if(alien == IS_SLIME) + M.adjustFireLoss(removed * 3) /datum/reagent/toxin/zombiepowder name = "Zombie Powder" @@ -353,6 +374,13 @@ /datum/reagent/lexorin/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) if(alien == IS_DIONA) return + if(alien == IS_SLIME) + M.apply_effect(5, AGONY, 0) + M.adjustToxLoss(3 * removed) + if(prob(10)) + to_chat(M, "Your cellular mass hardens for a moment.") + M.Stun(6) + return if(alien == IS_SKRELL) M.take_organ_damage(2.4 * removed, 0) if(M.losebreath < 10) @@ -384,9 +412,34 @@ if(M.isSynthetic()) return - var/mob/living/carbon/human/H = M - if(istype(H) && (H.species.flags & NO_SCAN)) - return + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(alien == IS_SLIME && prob(25)) + var/color_shift = rand(-100, 100) + spawn(1) + if(prob(33)) + if(H.r_skin) + H.r_skin = max(0, min(255, H.r_skin + color_shift)) + if(H.r_hair) + H.r_hair = max(0, min(255, H.r_hair + color_shift)) + if(H.r_facial) + H.r_facial = max(0, min(255, H.r_facial + color_shift)) + if(prob(33)) + if(H.g_skin) + H.g_skin = max(0, min(255, H.g_skin + color_shift)) + if(H.g_hair) + H.g_hair = max(0, min(255, H.g_hair + color_shift)) + if(H.g_facial) + H.g_facial = max(0, min(255, H.g_facial + color_shift)) + if(prob(33)) + if(H.b_skin) + H.b_skin = max(0, min(255, H.b_skin + color_shift)) + if(H.b_hair) + H.b_hair = max(0, min(255, H.b_hair + color_shift)) + if(H.b_facial) + H.b_facial = max(0, min(255, H.b_facial + color_shift)) + if(H.species.flags & NO_SCAN) + return //The original coder comment here wanted it to be "Approx. one mutation per 10 injected/20 ingested/30 touching units" //The issue was, it was removed (.2) multiplied by .1, which resulted in a .02% chance per tick to have a mutation occur. Or more accurately, 5000 injected for a single mutation. diff --git a/html/changelogs/mechoid-promtweaks.yml b/html/changelogs/mechoid-promtweaks.yml new file mode 100644 index 0000000000..acfc3ee082 --- /dev/null +++ b/html/changelogs/mechoid-promtweaks.yml @@ -0,0 +1,8 @@ + +author: Mechoid + +delete-after: True + + +changes: + - tweak: "Large list of Promethean tweaks. No seriously, I'm not putting the list here." diff --git a/polaris.dme b/polaris.dme index 611d1daa6b..ce47b37d77 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1319,7 +1319,6 @@ #include "code\modules\client\preference_setup\global\01_ui.dm" #include "code\modules\client\preference_setup\global\02_settings.dm" #include "code\modules\client\preference_setup\global\03_pai.dm" -#include "code\modules\client\preference_setup\global\04_ooc.dm" #include "code\modules\client\preference_setup\global\setting_datums.dm" #include "code\modules\client\preference_setup\loadout\gear_tweaks.dm" #include "code\modules\client\preference_setup\loadout\loadout.dm"