Merge branch 'master' into reaction-scaling

This commit is contained in:
lass9030
2018-10-21 14:36:32 +02:00
132 changed files with 4007 additions and 3881 deletions
+15
View File
@@ -683,6 +683,16 @@ var/const/INGEST = 2
stuff += A.id
return english_list(stuff)
/datum/reagents/proc/log_list()
if(!length(reagent_list))
return "no reagents"
var/list/data = list()
for(var/r in reagent_list) //no reagents will be left behind
var/datum/reagent/R = r
data += "[R.id] ([round(R.volume, 0.1)]u)"
//Using IDs because SOME chemicals (I'm looking at you, chlorhydrate-beer) have the same names as other chemicals.
return english_list(data)
//two helper functions to preserve data across reactions (needed for xenoarch)
/datum/reagents/proc/get_data(reagent_id)
for(var/datum/reagent/D in reagent_list)
@@ -744,6 +754,11 @@ var/const/INGEST = 2
break
return result
/datum/reagents/proc/holder_full()
if(total_volume >= maximum_volume)
return TRUE
return FALSE
/datum/reagents/Destroy()
. = ..()
processing_objects -= src
@@ -378,7 +378,7 @@
/obj/machinery/chem_master/proc/chemical_safety_check(datum/reagents/R)
var/all_safe = 1
for(var/datum/reagent/A in R.reagent_list)
if(!safe_chem_list.Find(A.id))
if(!GLOB.safe_chem_list.Find(A.id))
all_safe = 0
return all_safe
@@ -30,7 +30,6 @@
if(BL.data && BL.data["viruses"])
var/list/viruses = BL.data["viruses"]
return viruses[index]
return null
/obj/machinery/computer/pandemic/proc/GetResistancesByIndex(index)
if(beaker && beaker.reagents)
@@ -40,13 +39,11 @@
if(BL.data && BL.data["resistances"])
var/list/resistances = BL.data["resistances"]
return resistances[index]
return null
/obj/machinery/computer/pandemic/proc/GetVirusTypeByIndex(index)
var/datum/disease/D = GetVirusByIndex(index)
if(D)
return D.GetDiseaseID()
return null
/obj/machinery/computer/pandemic/proc/replicator_cooldown(waittime)
wait = 1
@@ -175,7 +172,6 @@
return
add_fingerprint(usr)
return
//Prints a nice virus release form. Props to Urbanliner for the layout
/obj/machinery/computer/pandemic/proc/print_form(var/datum/disease/advance/D, mob/living/user)
@@ -319,12 +315,12 @@
popup.set_content(dat)
popup.open(0)
onclose(user, "pandemic")
return
/obj/machinery/computer/pandemic/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/reagent_containers) && (I.flags & OPENCONTAINER))
if(stat & (NOPOWER|BROKEN)) return
if(istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER))
if(stat & (NOPOWER|BROKEN))
return
if(beaker)
to_chat(user, "<span class='warning'>A beaker is already loaded into the machine!</span>")
return
@@ -112,7 +112,7 @@
if(default_unfasten_wrench(user, I))
return
if (istype(I, /obj/item/reagent_containers) && (I.flags & OPENCONTAINER) )
if (istype(I, /obj/item/reagent_containers) && (I.container_type & OPENCONTAINER) )
if (!beaker)
if(!user.drop_item())
return 1
@@ -238,12 +238,4 @@ About the Tools:
It simply tells us how much to transfer when
'pouring' our reagents into something else.
atom/proc/is_open_container()
Checks atom/var/flags & OPENCONTAINER.
If this returns 1 , you can use syringes, beakers etc
to manipulate the contents of this object.
If it's 0, you'll need to write your own custom reagent
transfer code since you will not be able to use the standard
tools to manipulate it.
*/
@@ -551,10 +551,10 @@
update_flags |= M.AdjustEyeBlurry(-1, FALSE)
update_flags |= M.AdjustEarDamage(-1, FALSE)
if(prob(50))
update_flags |= M.CureNearsighted(FALSE)
update_flags |= M.CureNearsighted()
if(prob(30))
update_flags |= M.CureBlind(FALSE)
update_flags |= M.SetEyeBlind(0, FALSE)
update_flags |= M.CureBlind()
update_flags |= M.SetEyeBlind(0)
if(M.ear_damage <= 25)
if(prob(30))
M.SetEarDeaf(0)
@@ -7,7 +7,7 @@
/datum/reagent/toxin/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
update_flags |= M.adjustToxLoss(2, FALSE)
update_flags |= M.adjustToxLoss(2*REAGENTS_EFFECT_MULTIPLIER, FALSE)
return ..() | update_flags
/datum/reagent/spider_venom
@@ -61,14 +61,6 @@
/obj/item/reagent_containers/afterattack(obj/target, mob/user , flag)
return
/obj/item/reagent_containers/proc/reagentlist() //Return reagents in a reagent_container, default to source
var/data
if(reagents && reagents.reagent_list && reagents.reagent_list.len) //find a reagent list if there is and check if it has entries
for(var/datum/reagent/R in reagents.reagent_list) //no reagents will be left behind
data += "[R.id]([R.volume] units); " //Using IDs because SOME chemicals(I'm looking at you, chlorhydrate-beer) have the same names as other chemicals.
return data
else return "No reagents"
/obj/item/reagent_containers/wash(mob/user, atom/source)
if(is_open_container())
if(reagents.total_volume >= volume)
@@ -85,7 +85,7 @@
var/datum/reagent/injected = GLOB.chemical_reagents_list[reagent_ids[mode]]
var/contained = injected.name
var/trans = R.trans_to(M, amount_per_transfer_from_this)
add_attack_logs(M, user, "Injected with [name] containing [contained], transfered [trans] units")
add_attack_logs(user, M, "Injected with [name] containing [contained], transfered [trans] units")
M.LAssailant = user
to_chat(user, "<span class='notice'>[trans] units injected. [R.total_volume] units remaining.</span>")
return
@@ -9,7 +9,7 @@
item_state = "atoxinbottle"
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25,30)
flags = OPENCONTAINER
container_type = OPENCONTAINER
volume = 30
/obj/item/reagent_containers/glass/bottle/on_reagent_change()
@@ -108,4 +108,37 @@
icon_state = "pipette"
amount_per_transfer_from_this = 1
possible_transfer_amounts = list(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1)
volume = 1
volume = 1
//Syndicate item. Virus transmitting mini hypospray
/obj/item/reagent_containers/dropper/precision/viral_injector
/obj/item/reagent_containers/dropper/precision/viral_injector/attack(mob/living/M, mob/living/user, def_zone)
if(M.can_inject(user, 1))
to_chat(user, "<span class='warning'>You stab [M] with the [src].</span>")
if(reagents.total_volume && M.reagents)
var/list/injected = list()
for(var/datum/reagent/R in reagents.reagent_list)
injected += R.name
var/datum/reagent/blood/B = R
if(istype(B) && B.data["viruses"])
var/virList = list()
for(var/dis in B.data["viruses"])
var/datum/disease/D = dis
var/virusData = D.name
var/english_symptoms = list()
var/datum/disease/advance/A = D
if(A)
for(var/datum/symptom/S in A.symptoms)
english_symptoms += S.name
virusData += " ([english_list(english_symptoms)])"
virList += virusData
var/str = english_list(virList)
add_attack_logs(user, M, "Infected with [str].")
reagents.reaction(M, INGEST, reagents.total_volume)
reagents.trans_to(M, 1)
var/contained = english_list(injected)
add_attack_logs(user, M, "Injected with [src] containing ([contained])")
@@ -11,7 +11,7 @@
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25,30,50)
volume = 50
flags = OPENCONTAINER
container_type = OPENCONTAINER
var/label_text = ""
// the fucking asshole who designed this can go die in a fire - Iamgoofball
@@ -59,10 +59,10 @@
..()
if(is_open_container())
to_chat(usr, "<span class='notice'>You put the lid on [src].</span>")
flags ^= OPENCONTAINER
container_type ^= REFILLABLE | DRAINABLE
else
to_chat(usr, "<span class='notice'>You take the lid off [src].</span>")
flags |= OPENCONTAINER
container_type |= REFILLABLE | DRAINABLE
update_icon()
/obj/item/reagent_containers/glass/afterattack(obj/target, mob/user, proximity)
@@ -262,7 +262,7 @@
volume = 100
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25,30,50,100)
flags = OPENCONTAINER
container_type = OPENCONTAINER
/obj/item/reagent_containers/glass/beaker/vial
name = "vial"
@@ -272,7 +272,7 @@
volume = 25
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25)
flags = OPENCONTAINER
container_type = OPENCONTAINER
can_assembly = 0
/obj/item/reagent_containers/glass/beaker/drugs
@@ -282,7 +282,7 @@
amount_per_transfer_from_this = 2
possible_transfer_amounts = 2
volume = 10
flags = OPENCONTAINER
container_type = OPENCONTAINER
can_assembly = 0
/obj/item/reagent_containers/glass/beaker/noreact
@@ -293,7 +293,7 @@
volume = 50
amount_per_transfer_from_this = 10
origin_tech = "materials=2;engineering=3;plasmatech=3"
flags = OPENCONTAINER
container_type = OPENCONTAINER
/obj/item/reagent_containers/glass/beaker/noreact/New()
..()
@@ -307,7 +307,7 @@
volume = 300
amount_per_transfer_from_this = 10
possible_transfer_amounts = list(5,10,15,25,30,50,100,300)
flags = OPENCONTAINER
container_type = OPENCONTAINER
origin_tech = "bluespace=5;materials=4;plasmatech=4"
/obj/item/reagent_containers/glass/beaker/cryoxadone
@@ -337,7 +337,7 @@
volume = 120
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
slot_flags = SLOT_HEAD
flags = OPENCONTAINER
container_type = OPENCONTAINER
/obj/item/reagent_containers/glass/bucket/equipped(mob/user, slot)
..()
@@ -11,7 +11,7 @@
amount_per_transfer_from_this = 5
volume = 30
possible_transfer_amounts = list(1,2,3,4,5,10,15,20,25,30)
flags = OPENCONTAINER
container_type = OPENCONTAINER
slot_flags = SLOT_BELT
var/ignore_flags = FALSE
var/emagged = FALSE
@@ -52,7 +52,7 @@
if(safety_hypo && !emagged)
var/found_forbidden_reagent = FALSE
for(var/datum/reagent/R in reagents.reagent_list)
if(!safe_chem_list.Find(R.id))
if(!GLOB.safe_chem_list.Find(R.id))
reagents.del_reagent(R.id)
found_forbidden_reagent = TRUE
if(found_forbidden_reagent)
@@ -4,7 +4,8 @@
icon = 'icons/obj/janitor.dmi'
icon_state = "cleaner"
item_state = "cleaner"
flags = OPENCONTAINER | NOBLUDGEON
flags = NOBLUDGEON
container_type = OPENCONTAINER
slot_flags = SLOT_BELT
throwforce = 0
w_class = WEIGHT_CLASS_SMALL
@@ -16,6 +16,7 @@
volume = 15
w_class = WEIGHT_CLASS_TINY
sharp = 1
container_type = TRANSPARENT
var/busy = 0
var/mode = SYRINGE_DRAW
var/projectile_type = /obj/item/projectile/bullet/dart/syringe
@@ -78,7 +79,7 @@
switch(mode)
if(SYRINGE_DRAW)
if(reagents.total_volume >= reagents.maximum_volume)
if(reagents.holder_full())
to_chat(user, "<span class='notice'>The syringe is full.</span>")
return
@@ -91,7 +92,7 @@
if(!do_mob(user, target))
busy = 0
return
if(reagents.total_volume >= reagents.maximum_volume)
if(reagents.holder_full())
return
busy = 0
if(L.transfer_blood_to(src, drawn_amount))
@@ -104,14 +105,14 @@
to_chat(user, "<span class='warning'>[target] is empty!</span>")
return
if(!target.is_open_container() && !istype(target,/obj/structure/reagent_dispensers) && !istype(target,/obj/item/slime_extract))
if(!target.is_drawable())
to_chat(user, "<span class='warning'>You cannot directly remove reagents from [target]!</span>")
return
var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) // transfer from, transfer to - who cares?
to_chat(user, "<span class='notice'>You fill [src] with [trans] units of the solution.</span>")
if(reagents.total_volume >= reagents.maximum_volume)
if(reagents.holder_full())
mode=!mode
update_icon()
@@ -120,7 +121,7 @@
to_chat(user, "<span class='notice'>[src] is empty.</span>")
return
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/cigarette) && !istype(target, /obj/item/storage/fancy/cigarettes))
if(!L && !target.is_injectable())
to_chat(user, "<span class='warning'>You cannot directly fill [target]!</span>")
return
if(target.reagents.total_volume >= target.reagents.maximum_volume)
+5 -11
View File
@@ -6,28 +6,22 @@
density = 1
anchored = 0
pressure_resistance = 2*ONE_ATMOSPHERE
container_type = DRAINABLE | AMOUNT_VISIBLE
var/tank_volume = 1000 //In units, how much the dispenser can hold
var/reagent_id = "water" //The ID of the reagent that the dispenser uses
var/lastrigger = "" // The last person to rig this fuel tank - Stored with the object. Only the last person matter for investigation
/obj/structure/reagent_dispensers/attackby(obj/item/W, mob/user, params)
return
/obj/structure/reagent_dispensers/attackby(obj/item/I, mob/user, params)
. = ..()
if(I.is_refillable())
return FALSE //so we can refill them via their afterattack.
/obj/structure/reagent_dispensers/New()
create_reagents(tank_volume)
reagents.add_reagent(reagent_id, tank_volume)
..()
/obj/structure/reagent_dispensers/examine(mob/user)
if(!..(user, 2))
return
if(reagents.total_volume)
to_chat(user, "<span class='notice'>It has [reagents.total_volume] units left.</span>")
else
to_chat(user, "<span class='danger'>It's empty.</span>")
/obj/structure/reagent_dispensers/proc/boom()
visible_message("<span class='danger'>[src] ruptures!</span>")
chem_splash(loc, 5, list(reagents))