Explode proc set up

This commit is contained in:
Fermi
2019-05-18 01:19:04 +01:00
parent cabf490134
commit 2f75f861ce
5 changed files with 155 additions and 47 deletions
+6 -3
View File
@@ -547,7 +547,7 @@ im
var/list/cached_required_reagents = C.required_reagents//update reagents list
var/list/cached_results = C.results//resultant chemical list
var/multiplier = INFINITY
var/special_react_result = C.check_special_react(src)
//var/special_react_result = C.check_special_react(src) Only add if I add in the fermi-izer chem
message_admins("updating targetVol from [targetVol]")
for(var/B in cached_required_reagents) //
@@ -620,16 +620,19 @@ im
if (chem_temp > C.ExplodeTemp)
//go to explode proc
message_admins("temperature is over limit: [C.ExplodeTemp] Current temperature: [chem_temp]")
C.FermiExplode(src, (reactedVol+targetVol), chem_temp, pH)
C.FermiExplode(src, my_atom, (reactedVol+targetVol), chem_temp, pH)
if (pH > 14)
pH = 14
message_admins("pH is lover limit, cur pH: [pH]")
else if (pH < 0)
pH = 0
//Create chemical sludge eventually(for now just destroy the beaker I guess?)
//TODO Strong acids eat glass, make it so you NEED plastic beakers for superacids(for some reactions)
message_admins("pH is lover limit, cur pH: [pH]")
if ((purity < C.PurityMin) && (!C.PurityMin == 0))//If purity is below the min, blow it up.
C.FermiExplode(src, (reactedVol+targetVol), chem_temp, pH, C)
//For now, purity is handled elsewhere
@@ -823,7 +826,7 @@ im
if (D.id == "water") //Do like an otter, add acid to water.
if (pH <= 2)
var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new
s.set_up(, total_volume, pH*10, src)
s.set_up("fermiAcid", total_volume, pH*10, src)
s.start()
remove_any(amount/10)
return
+1 -4
View File
@@ -18,7 +18,6 @@
var/mix_sound = 'sound/effects/bubbles.ogg' //The sound played upon mixing, if applicable
//FermiChem!
var/OptimalTempMin = 200 // Lower area of bell curve for determining heat based rate reactions
var/OptimalTempMax = 800
var/ExplodeTemp = 900 //If any reaction is this hot, it explodes!
@@ -34,9 +33,7 @@
var/RateUpLim = 10
var/FermiChem = FALSE //If the chemical uses the Fermichem reaction mechanics
var/FermiExplode = FALSE //If the chemical explodes in a special way as a result of
var/ImpureChem = "toxin" //What chemical is produced with an inpure reaction
var/InverseChemVal = 0.3
var/InverseChem = "toxin"
var/PurityMin = 0.15 //If purity is below 0.15, it explodes too. Set to 0 to disable this.
/datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume, specialreact)
+5 -3
View File
@@ -1,3 +1,5 @@
#define LUNGS_MAX_HEALTH 500
/obj/item/organ/lungs
name = "lungs"
icon_state = "lungs"
@@ -55,11 +57,11 @@
var/crit_stabilizing_reagent = "epinephrine"
//health
var/maxHealth = 500
var/maxHealth = LUNGS_MAX_HEALTH
var/damage = 0
//TODO: lung health affects lung function
/obj/item/organ/lungs/proc/adjustLungLoss(mob/living/carbon/human/M, damage_mod)
/obj/item/organ/lungs/proc/adjustLungLoss(mob/living/carbon/M, damage_mod)
if (maxHealth == "plasma")
return
if(damage+damage_mod < 0)
@@ -69,7 +71,7 @@
damage += damage_mod
if ((damage / maxHealth) > 1)
to_chat(M, "<span class='userdanger'>You feel your lungs collapse within your chest as you gasp for air, unable to inflate them anymore!</span>")
M.emote("cough")
M.emote("gasp")
qdel(src)
else if ((damage / maxHealth) > 0.75)
to_chat(M, "<span class='warning'>It's getting really hard to breathe!!</span>")
@@ -16,41 +16,45 @@
var/ImpureChem = "toxin" // What chemical is metabolised with an inpure reaction
var/InverseChemVal = 0 // If the impurity is below 0.5, replace ALL of the chem with InverseChem upon metabolising
var/InverseChem = "Initropidril" // What chem is metabolised when purity is below InverseChemVal, this shouldn't be made, but if it does, well, I guess I'll know about it.
var/DoNotSplit = FALSE // If impurity is handled within the main chem itself
///datum/reagent/fermi/on_mob_life(mob/living/carbon/M)
//current_cycle++
//holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency, FALSE) //fermi reagents stay longer if you have a better metabolism
//return ..()
//Called when reaction stops.
//Called when reaction stops. #STOP_PROCESSING
/datum/reagent/fermi/proc/FermiFinish(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW???
return
//Called when added to a beaker without the reagent added.
//Called when added to a beaker without any of the reagent present. #add_reagent
/datum/reagent/fermi/proc/FermiNew(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW???
return
//This should process fermichems to find out how pure they are and what effect to do.
//TODO: add this to the main on_mob_add proc, and check if Fermichem = TRUE
/datum/reagent/fermi/on_mob_add(mob/living/carbon/M)
message_admins("purity of chem is [src.purity]")
if(src.purity < 0)
CRASH("Purity below 0 for chem: [src.id], Please let Fermis Know!")
if (src.purity == 1)
if (src.purity == 1 || src.DoNotSplit == TRUE)
return
else if (src.InverseChemVal > src.purity)
holder.remove_reagent(src.id, volume, FALSE)
holder.add_reagent(src.InverseChem, volume, FALSE)
M.reagents.remove_reagent(src.id, volume, FALSE)
M.reagents.add_reagent(src.InverseChem, volume, FALSE)
message_admins("all convered to []")
return
else
var/pureVol = volume * purity
var/impureVol = volume * (1 - pureVol)
holder.remove_reagent(src.id, (volume*impureVol), FALSE)
holder.add_reagent(src.ImpureChem, impureVol, FALSE)
M.reagents.remove_reagent(src.id, (volume*impureVol), FALSE)
M.reagents.add_reagent(src.ImpureChem, impureVol, FALSE)
return
///datum/reagent/fermi/overdose_start(mob/living/carbon/M)
//current_cycle++
@@ -1023,16 +1027,15 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
description = "A forbidden deep red mixture that overwhelms a foreign body with waves of pleasure, intoxicating them into servitude. When taken by the creator, it will enhance the draw of their voice to those affected by it."
color = "#2C051A" // rgb: , 0, 255
taste_description = "synthetic chocolate, a base tone of alcohol, and high notes of roses"
//metabolization_rate = 0.5
overdose_threshold = 100 //If this is too easy to get 100u of this, then double it please.
//addiction_threshold = 30
//addiction_stage1_end = 9999//Should never end.
DoNotSplit = TRUE
var/creatorID //ckey
var/creatorGender
var/creatorName
var/mob/living/creator
/datum/reagent/fermi/enthrall/FermiFinish()
/datum/reagent/fermi/enthrall/FermiNew()
message_admins("On new for enthral proc'd")
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list
//var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list
@@ -1050,6 +1053,8 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
. = ..()
if(!creatorID)
CRASH("Something went wrong in enthral creation")
if(purity < 0.5)//Impure chems don't function as you expect
return
else if(M.key == creatorID && creatorName == M.real_name) //same name AND same player - same instance of the player. (should work for clones?)
var/obj/item/organ/vocal_cords/Vc = M.getorganslot(ORGAN_SLOT_VOICE)
var/obj/item/organ/vocal_cords/nVc = new /obj/item/organ/vocal_cords/velvet
@@ -1067,12 +1072,26 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
/datum/reagent/fermi/enthrall/on_mob_life(mob/living/carbon/M)
if(purity < 0.5)//Placeholder for now. I'd like to get this done.
if (M.key == creatorID && creatorName == M.real_name)//If the creator drinks it, they fall in love randomly. If someone else drinks it, the creator falls in love with them.
var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers
if(!seen)
return
M.reagents.remove_reagent(src.id, src.volume)
FallInLove(M, seen)
return
else // If someone else drinks it, the creator falls in love with them!
var/mob/living/carbon/C = get_mob_by_key(creatorID)
if(C in viewers(7, get_turf(M)))
M.reagents.remove_reagent(src.id, src.volume)
FallInLove(C, M)
return
var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall)
E.enthrallTally += 1
M.adjustBrainLoss(0.1)
..()
/datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M)
/datum/reagent/fermi/enthrall/overdose_start(mob/living/carbon/M)//I have no idea what happens if you OD yourself honestly.
. = ..()
M.add_trait(TRAIT_PACIFISM, "MKUltra")
var/datum/status_effect/chem/enthrall/E = M.has_status_effect(/datum/status_effect/chem/enthrall)
@@ -1092,6 +1111,18 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
M.adjustBrainLoss(0.2)
..()
/datum/reagent/fermi/enthrall/proc/FallInLove(mob/living/carbon/Lover, mob/living/carbon/Love)
if(Lover.has_status_effect(STATUS_EFFECT_INLOVE))
to_chat(Lover, "<span class='warning'>You are already fully devoted to your love!</span>")
return
to_chat(Lover, "<span class='notice'>You develop feelings for [Love], and anyone they like.</span>")
if(Lover.mind)
Lover.mind.store_memory("You are in love with [Love].")
Lover.faction |= "[REF(Love)]"
Lover.apply_status_effect(STATUS_EFFECT_INLOVE, Love)
forge_valentines_objective(Lover, Love)
return
//Requires player to be within vicinity of creator
//bonuses to mood
//gives creator a silver(velvet?) tongue
@@ -1116,6 +1147,7 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
taste_description = "like jerky, whiskey and an off aftertaste of a crypt"
overdose_threshold = 100
var/obj/item/clothing/head/hattip/hat
DoNotSplit = TRUE
/datum/reagent/fermi/hatmium/on_mob_add(mob/living/carbon/human/M)
@@ -1130,13 +1162,11 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
/datum/reagent/fermi/hatmium/on_mob_life(mob/living/carbon/human/M)
//hat.armor = list("melee" = (1+(current_cycle/20)), "bullet" = (1+(current_cycle/20)), "laser" = (1+(current_cycle/20)), "energy" = (1+(current_cycle/20)), "bomb" = (1+(current_cycle/20)), "bio" = (1+(current_cycle/20)), "rad" = (1+(current_cycle/20)), "fire" = (1+(current_cycle/20)), "acid" = (1+(current_cycle/20)))
var/hatArmor = (1+(current_cycle/10))
var/hatArmor = (1+(current_cycle/10))*purity
if(!overdosed)
for (var/i in hat.armor)
hat.armor = list("melee" = hatArmor, "bullet" = hatArmor, "laser" = hatArmor, "energy" = hatArmor, "bomb" = hatArmor, "bio" = hatArmor, "rad" = hatArmor, "fire" = hatArmor)
hat.armor = list("melee" = hatArmor, "bullet" = hatArmor, "laser" = hatArmor, "energy" = hatArmor, "bomb" = hatArmor, "bio" = hatArmor, "rad" = hatArmor, "fire" = hatArmor)
else
for (var/i in hat.armor)
hat.armor = list("melee" = -hatArmor, "bullet" = -hatArmor, "laser" = -hatArmor, "energy" = -hatArmor, "bomb" = -hatArmor, "bio" = -hatArmor, "rad" = -hatArmor, "fire" = -hatArmor)
hat.armor = list("melee" = -hatArmor, "bullet" = -hatArmor, "laser" = -hatArmor, "energy" = -hatArmor, "bomb" = -hatArmor, "bio" = -hatArmor, "rad" = -hatArmor, "fire" = -hatArmor)
..()
////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1154,6 +1184,9 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
description = "OwO whats this?"
color = "#H04044" // rgb: , 0, 255
taste_description = "dewicious degenyewacy"
InverseChemVal = 0
var/obj/item/organ/tongue/nT
DoNotSplit = TRUE
/datum/reagent/fermi/furranium/on_mob_life(mob/living/carbon/M)
@@ -1188,38 +1221,78 @@ And as stated earlier, this chem is hard to make, and is punishing on failure. Y
if(prob(20))
var/list/seen = viewers(5, get_turf(M))//Sound and sight checkers
//for(var/victim in seen)
to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]")
if(seen)
to_chat(M, "You notice [pick(seen)]'s bulge [pick("OwO!", "uwu!")]")
nT.maxHealth += purity //I like to have some reason for purity..!
..()
///////////////////////////////////////////////////////////////////////////////////////////////
/* Needs to be fixed, I cannot get it to work and it's giving me compile errors aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
//Needs to be fixed, I cannot get it to work and it's giving me compile errors aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
//Nanite removal
//Writen by Trilby!!
//Status: Done - needs bug test
/datum/reagent/fermi/naninte_b_gone
name = "Naninte bain"
id = "naninte_b_gone"
description = "A rather simple toxin to small nano machines that will kill them off at a rapid rate well in system."
color = "#5a7267" // rgb: 90, 114, 103
overdose_threshold = 25
v/component/nanites/nan
overdose_threshold = 15
ImpureChem = "naninte_b_goneTox" //If you make an inpure chem, it stalls growth
InverseChemVal = 0.25
InverseChem = "naninte_b_goneTox" //At really impure vols, it just becomes 100% inverse
/datum/reagent/fermi/naninte_b_gone/on_mob_life(mob/living/carbon/C)
var/component/nanites/nane = C.GetComponent(/component/nanites)
if(isnull(nane))
//var/component/nanites/N = M.GetComponent(/datum/component/nanites)
GET_COMPONENT_FROM(N, /datum/component/nanites, C)
if(isnull(N))
return
nane.regen_rate = -5.0//This seems really high
N.regen_rate = -0.25//This seems really high
..()
/datum/reagent/fermi/naninte_b_gone/overdose_start(mob/living/carbon/C)
var/component/nanites/nane = C.GetComponent(/component/nanites)
if(isnull(nane))
//var/component/nanites/N = M.GetComponent(/datum/component/nanites)
GET_COMPONENT_FROM(N, /datum/component/nanites, C)
if(isnull(N))
return
nane.regen_rate = -7.5//12.5 seems crazy high?
*/
N.regen_rate = -1//12.5 seems crazy high?
if(prob(20))
to_chat(C, "<span class='warning'>The residual voltage from the nanites causes you to seize up!</b></span>")
C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE)
if(prob(10))
empulse((get_turf(C)), 3, 2)//So the nanites randomize
to_chat(C, "<span class='warning'>The nanintes short circuit within your system!</b></span>")
..()
/*
_________________________________________
||Fermichem toxic / impure chems here. ||
|| ||
||_______________________________________||
*/
//Unobtainable, used if SDGF is impure but not too impure
/datum/reagent/fermi/naninte_b_goneTox
name = "Naninte bain"
id = "naninte_b_goneTox"
description = "Poorly made, and shocks you!"
metabolization_rate = 1
//Increases shock events.
/datum/reagent/fermi/naninte_b_goneTox/on_mob_life(mob/living/carbon/C)//Damages the taker if their purity is low. Extended use of impure chemicals will make the original die. (thus can't be spammed unless you've very good)
if(prob(20))
to_chat(C, "<span class='warning'>The residual voltage in your system causes you to seize up!</b></span>")
C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE)
if(prob(10))
empulse((get_turf(C)), 2, 1, 1)//So the nanites randomize
to_chat(C, "<span class='warning'>You feel your hair stand on end as you glow brightly for a moment!</b></span>")
..()
///////////////////////////////////////////////////////////////////////////////////////////////
/datum/reagent/fermi/fermiAcid
name = "Acid vapour"
id = "fermiAcid"
description = "Someone didn't do like an otter, and add acid to water."
/datum/reagent/fermi/fermiAcid/on_mob_life(mob/living/carbon/C)
var/target = C.get_bodypart(BODY_ZONE_CHEST)
if(prob(20))
to_chat(C, "<span class='warning'>You can feel your lungs burning!</b></span>")
C.apply_damage(2, BURN, target)
var/obj/item/organ/lungs/L = C.getorganslot(ORGAN_SLOT_LUNGS)
L.adjustLungLoss(2)
@@ -4,8 +4,41 @@
/datum/chemical_reaction/fermi/proc/FermiCreate(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW???
return
//Called for every reaction step
/datum/chemical_reaction/fermi/proc/FermiExplode(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW???
//Called when temperature is above a certain threshold
//....Is this too much?
/datum/chemical_reaction/fermi/proc/FermiExplode(src, datum/reagents/holder, volume, temp, pH, Reaction) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW???
var/Svol = volume
var/turf/T = get_turf(holder.my_atom)
if(temp>600)//if hot, start a fire
switch(temp)
if (601 to 800)
for(var/turf/turf in range(1,T))
new /obj/effect/hotspot(turf)
volume /= 3
if (801 to 1100)
for(var/turf/turf in range(2,T))
new /obj/effect/hotspot(turf)
volume /= 4
if (1101 to INFINITY)
for(var/turf/turf in range(3,T))
new /obj/effect/hotspot(turf)
volume /= 5
var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new
if(pH < 2.5)
s.set_up("fermiAcid", (volume/3), pH*10, T)
volume /=3
for (var/reagent in holder.reagent_list)
var/datum/reagent/R = reagent
s.set_up(R.id, R.volume/3, pH*10, T)
//R.on_reaction(T, volume/10) //Uneeded, I think (hope)
s.start()
if (pH > 12)
var/datum/effect_system/reagents_explosion/e = new()
e.set_up(round(volume/Svol, 1), T, 0, 0)
e.start()
message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], containing [holder.reagent_list]")
return
/datum/chemical_reaction/fermi/eigenstate
@@ -30,6 +63,7 @@
FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics
FermiExplode = FALSE //If the chemical explodes in a special way
/datum/chemical_reaction/fermi/eigenstate/FermiCreate(datum/reagents/holder)
var/location = get_turf(holder.my_atom)
var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in holder.reagent_list
@@ -99,7 +133,6 @@
RateUpLim = 5
FermiChem = TRUE
FermiExplode = FALSE
ImpureChem = "carpotoxin"
/datum/chemical_reaction/enthral
name = "need a name"