Added some limited support for alien reagent reactions.

This commit is contained in:
Zuhayr
2014-01-08 10:26:39 +10:30
parent 1faf2ef25b
commit 049501a898
2 changed files with 69 additions and 25 deletions

View File

@@ -199,11 +199,12 @@ datum
return total_transfered
*/
metabolize(var/mob/M)
metabolize(var/mob/M,var/alien)
for(var/A in reagent_list)
var/datum/reagent/R = A
if(M && R)
R.on_mob_life(M)
R.on_mob_life(M,alien)
update_total()
conditional_update_move(var/atom/A, var/Running = 0)

View File

@@ -5,6 +5,10 @@
#define REAGENTS_OVERDOSE 30
#define REM REAGENTS_EFFECT_MULTIPLIER
//Some on_mob_life() procs check for alien races.
#define IS_DIONA 1
#define IS_VOX 2
//The reaction procs must ALWAYS set src = null, this detaches the proc from the object (the reagent)
//so that it can continue working when the reagent is deleted while the proc is still active.
@@ -68,7 +72,7 @@ datum
src = null
return
on_mob_life(var/mob/living/M as mob)
on_mob_life(var/mob/living/M as mob, var/alien)
if(!istype(M, /mob/living))
return //Noticed runtime errors from pacid trying to damage ghosts, this should fix. --NEO
if( (overdose > 0) && (volume >= overdose))//Overdosing, wooo
@@ -400,10 +404,15 @@ datum
color = "#C8A5DC" // rgb: 200, 165, 220
overdose = REAGENTS_OVERDOSE*2
on_mob_life(var/mob/living/M as mob)
on_mob_life(var/mob/living/M as mob, var/alien)
if(!M) M = holder.my_atom
if(M.losebreath >= 10)
M.losebreath = max(10, M.losebreath-5)
if(alien && alien == IS_VOX)
M.adjustToxLoss(REAGENTS_METABOLISM)
else
if(M.losebreath >= 10)
M.losebreath = max(10, M.losebreath-5)
holder.remove_reagent(src.id, 0.5 * REAGENTS_METABOLISM)
return
@@ -484,6 +493,14 @@ datum
custom_metabolism = 0.01
on_mob_life(var/mob/living/M as mob, var/alien)
if(M.stat == 2) return
if(alien && alien == IS_VOX)
M.adjustToxLoss(REAGENTS_METABOLISM)
holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears.
return
..()
copper
name = "Copper"
id = "copper"
@@ -501,6 +518,14 @@ datum
custom_metabolism = 0.01
on_mob_life(var/mob/living/M as mob, var/alien)
if(M.stat == 2) return
if(alien && alien == IS_VOX)
M.adjustOxyLoss(-2*REM)
holder.remove_reagent(src.id, REAGENTS_METABOLISM) //By default it slowly disappears.
return
..()
hydrogen
name = "Hydrogen"
id = "hydrogen"
@@ -671,7 +696,10 @@ datum
if(prob(5))
if(prob(50))
M.radiation += 50 // curing it that way may kill you instead
M.adjustToxLoss(100)
var/mob/living/carbon/human/H
if(istype(C,/mob/living/carbon/human))
H = C
if(!H || (H.species && !(H.species.flags & RAD_ABSORB))) M.adjustToxLoss(100)
M:antibodies |= V.antigen
..()
return
@@ -983,6 +1011,7 @@ datum
if(M.stat == 2.0)
return
if(!M) M = holder.my_atom
//This needs a diona check but if one is added they won't be able to heal burn damage at all.
M.heal_organ_damage(0,2*REM)
..()
return
@@ -995,11 +1024,12 @@ datum
color = "#C8A5DC" // rgb: 200, 165, 220
overdose = REAGENTS_OVERDOSE/2
on_mob_life(var/mob/living/M as mob)
on_mob_life(var/mob/living/M as mob, var/alien)
if(M.stat == 2.0) //THE GUY IS **DEAD**! BEREFT OF ALL LIFE HE RESTS IN PEACE etc etc. He does NOT metabolise shit anymore, god DAMN
return
if(!M) M = holder.my_atom
M.heal_organ_damage(0,3*REM)
if(alien && alien != IS_DIONA)
M.heal_organ_damage(0,3*REM)
..()
return
@@ -1011,11 +1041,16 @@ datum
color = "#C8A5DC" // rgb: 200, 165, 220
overdose = REAGENTS_OVERDOSE
on_mob_life(var/mob/living/M as mob)
on_mob_life(var/mob/living/M as mob, var/alien)
if(M.stat == 2.0)
return //See above, down and around. --Agouri
if(!M) M = holder.my_atom
M.adjustOxyLoss(-2*REM)
if(alien && alien == IS_VOX)
M.adjustToxLoss(2*REM)
else if(alien && alien != IS_DIONA)
M.adjustOxyLoss(-2*REM)
if(holder.has_reagent("lexorin"))
holder.remove_reagent("lexorin", 2*REM)
..()
@@ -1029,11 +1064,16 @@ datum
color = "#C8A5DC" // rgb: 200, 165, 220
overdose = REAGENTS_OVERDOSE/2
on_mob_life(var/mob/living/M as mob)
on_mob_life(var/mob/living/M as mob, var/alien)
if(M.stat == 2.0)
return
if(!M) M = holder.my_atom
M.adjustOxyLoss(-M.getOxyLoss())
if(alien && alien == IS_VOX)
M.adjustOxyLoss()
else if(alien && alien != IS_DIONA)
M.adjustOxyLoss(-M.getOxyLoss())
if(holder.has_reagent("lexorin"))
holder.remove_reagent("lexorin", 2*REM)
..()
@@ -1046,14 +1086,15 @@ datum
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
on_mob_life(var/mob/living/M as mob)
on_mob_life(var/mob/living/M as mob, var/alien)
if(M.stat == 2.0)
return
if(!M) M = holder.my_atom
if(M.getOxyLoss()) M.adjustOxyLoss(-1*REM)
if(M.getBruteLoss() && prob(80)) M.heal_organ_damage(1*REM,0)
if(M.getFireLoss() && prob(80)) M.heal_organ_damage(0,1*REM)
if(M.getToxLoss() && prob(80)) M.adjustToxLoss(-1*REM)
if(alien && alien != IS_DIONA)
if(M.getOxyLoss()) M.adjustOxyLoss(-1*REM)
if(M.getBruteLoss() && prob(80)) M.heal_organ_damage(1*REM,0)
if(M.getFireLoss() && prob(80)) M.heal_organ_damage(0,1*REM)
if(M.getToxLoss() && prob(80)) M.adjustToxLoss(-1*REM)
..()
return
@@ -1064,12 +1105,13 @@ datum
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
on_mob_life(var/mob/living/M as mob)
on_mob_life(var/mob/living/M as mob, var/alien)
if(!M) M = holder.my_atom
M.reagents.remove_all_type(/datum/reagent/toxin, 1*REM, 0, 1)
M.drowsyness = max(M.drowsyness-2*REM, 0)
M.hallucination = max(0, M.hallucination - 5*REM)
M.adjustToxLoss(-2*REM)
if(alien && alien != IS_DIONA)
M.reagents.remove_all_type(/datum/reagent/toxin, 1*REM, 0, 1)
M.drowsyness = max(M.drowsyness-2*REM, 0)
M.hallucination = max(0, M.hallucination - 5*REM)
M.adjustToxLoss(-2*REM)
..()
return
@@ -1249,11 +1291,12 @@ datum
color = "#C8A5DC" // rgb: 200, 165, 220
overdose = REAGENTS_OVERDOSE
on_mob_life(var/mob/living/M as mob)
on_mob_life(var/mob/living/M as mob, var/alien)
if(M.stat == 2.0)
return
if(!M) M = holder.my_atom
M.heal_organ_damage(2*REM,0)
if(alien != IS_DIONA)
M.heal_organ_damage(2*REM,0)
..()
return