Merge pull request #12245 from Fox-McCloud/universal-damage

Universal Object Damage
This commit is contained in:
variableundefined
2019-10-06 23:22:48 -04:00
committed by GitHub
567 changed files with 5193 additions and 5472 deletions
@@ -6,6 +6,7 @@
icon_state = "dispenser"
use_power = IDLE_POWER_USE
idle_power_usage = 40
resistance_flags = FIRE_PROOF | ACID_PROOF
var/ui_title = "Chem Dispenser 5000"
var/cell_type = /obj/item/stock_parts/cell/high
var/obj/item/stock_parts/cell/cell
@@ -55,7 +56,7 @@
/obj/machinery/chem_dispenser/mutagensaltpeter
name = "botanical chemical dispenser"
desc = "Creates and dispenses chemicals useful for botany."
can_deconstruct = FALSE
flags = NODECONSTRUCT
dispensable_reagents = list(
"mutagen",
@@ -133,16 +134,16 @@
SSnanoui.update_uis(src) // update all UIs attached to src
/obj/machinery/chem_dispenser/ex_act(severity)
switch(severity)
if(1)
qdel(src)
if(2)
if(prob(50))
qdel(src)
if(severity < 3)
if(beaker)
beaker.ex_act(severity)
..()
/obj/machinery/chem_dispenser/blob_act()
if(prob(50))
qdel(src)
/obj/machinery/chem_dispenser/handle_atom_del(atom/A)
..()
if(A == beaker)
beaker = null
overlays.Cut()
/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1)
// update the ui if it exists, returns null if no ui is passed/found
@@ -6,6 +6,7 @@
icon_state = "mixer0b"
use_power = IDLE_POWER_USE
idle_power_usage = 40
resistance_flags = FIRE_PROOF | ACID_PROOF
var/obj/item/reagent_containers/beaker = null
var/desired_temp = T0C
var/on = FALSE
@@ -74,6 +75,7 @@
to_chat(user, "<span class='notice'>You add the beaker to the machine!</span>")
icon_state = "mixer1b"
SSnanoui.update_uis(src)
return
if(default_deconstruction_screwdriver(user, "mixer0b", "mixer0b", I))
return
@@ -86,6 +88,7 @@
eject_beaker()
default_deconstruction_crowbar(I)
return 1
return ..()
/obj/machinery/chem_heater/attack_hand(mob/user)
ui_interact(user)
@@ -6,6 +6,7 @@
icon_state = "mixer0"
use_power = IDLE_POWER_USE
idle_power_usage = 20
resistance_flags = FIRE_PROOF | ACID_PROOF
var/obj/item/reagent_containers/beaker = null
var/obj/item/storage/pill_bottle/loaded_pill_bottle = null
var/mode = 0
@@ -41,12 +42,21 @@
reagents.maximum_volume += B.reagents.maximum_volume
/obj/machinery/chem_master/ex_act(severity)
switch(severity)
if(1)
qdel(src)
if(2)
if(prob(50))
qdel(src)
if(severity < 3)
if(beaker)
beaker.ex_act(severity)
if(loaded_pill_bottle)
loaded_pill_bottle.ex_act(severity)
..()
/obj/machinery/chem_master/handle_atom_del(atom/A)
..()
if(A == beaker)
beaker = null
reagents.clear_reagents()
update_icon()
else if(A == loaded_pill_bottle)
loaded_pill_bottle = null
/obj/machinery/chem_master/update_icon()
overlays.Cut()
@@ -54,7 +64,7 @@
if(powered())
overlays += "waitlight"
/obj/machinery/chem_master/blob_act()
/obj/machinery/chem_master/blob_act(obj/structure/blob/B)
if(prob(50))
qdel(src)
@@ -8,6 +8,7 @@
circuit = /obj/item/circuitboard/pandemic
use_power = IDLE_POWER_USE
idle_power_usage = 20
resistance_flags = ACID_PROOF
var/temp_html = ""
var/printing = null
var/wait = null
@@ -342,8 +343,6 @@
else if(istype(I, /obj/item/screwdriver))
if(beaker)
beaker.loc = get_turf(src)
..()
return
beaker.forceMove(get_turf(src))
else
..()
return ..()
@@ -8,6 +8,7 @@
idle_power_usage = 5
active_power_usage = 100
pass_flags = PASSTABLE
resistance_flags = ACID_PROOF
var/operating = 0
var/obj/item/reagent_containers/beaker = new /obj/item/reagent_containers/glass/beaker/large
var/limit = null
@@ -121,6 +122,11 @@
beaker.ex_act(severity)
..()
/obj/machinery/reagentgrinder/handle_atom_del(atom/A)
if(A == beaker)
beaker = null
update_icon()
/obj/machinery/reagentgrinder/update_icon()
if(beaker)
icon_state = "juicer1"
@@ -10,6 +10,9 @@
/datum/reagent/blob/reaction_mob(mob/living/M, method=TOUCH, volume, show_message, touch_protection)
return round(volume * min(1.5 - touch_protection, 1), 0.1) //full touch protection means 50% volume, any prot below 0.5 means 100% volume.
/datum/reagent/blob/proc/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) //when the blob takes damage, do this
return damage
/datum/reagent/blob/ripping_tendrils //does brute and a little stamina damage
name = "Ripping Tendrils"
description = "Deals High Brute damage, as well as Stamina damage."
@@ -282,7 +282,7 @@
return ..() | update_flags
/datum/reagent/sacid
/datum/reagent/acid
name = "Sulphuric acid"
id = "sacid"
description = "A strong mineral acid with the molecular formula H2SO4."
@@ -290,13 +290,14 @@
color = "#00FF32"
process_flags = ORGANIC | SYNTHETIC
taste_description = "<span class='userdanger'>ACID</span>"
var/acidpwr = 10 //the amount of protection removed from the armour
/datum/reagent/sacid/on_mob_life(mob/living/M)
/datum/reagent/acid/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
update_flags |= M.adjustFireLoss(1, FALSE)
return ..() | update_flags
/datum/reagent/sacid/reaction_mob(mob/living/M, method = TOUCH, volume)
/datum/reagent/acid/reaction_mob(mob/living/M, method = TOUCH, volume)
if(ishuman(M) && !isgrey(M))
var/mob/living/carbon/human/H = M
if(method == TOUCH)
@@ -325,13 +326,62 @@
H.adjustFireLoss(min(max(4, (volume - 10) * 2), 20))
H.emote("scream")
/datum/reagent/sacid/reaction_obj(obj/O, volume)
if((istype(O,/obj/item) || istype(O,/obj/structure/glowshroom)) && prob(40))
if(!O.unacidable)
var/obj/effect/decal/cleanable/molten_object/I = new/obj/effect/decal/cleanable/molten_object(O.loc)
I.desc = "Looks like this was \an [O] some time ago."
O.visible_message("<span class='warning'>[O] melts.</span>")
qdel(O)
/datum/reagent/acid/reaction_obj(obj/O, volume)
if(ismob(O.loc)) //handled in human acid_act()
return
volume = round(volume, 0.1)
O.acid_act(acidpwr, volume)
/datum/reagent/acid/reaction_turf(turf/T, volume)
if(!istype(T))
return
volume = round(volume, 0.1)
T.acid_act(acidpwr, volume)
/datum/reagent/acid/facid
name = "Fluorosulfuric Acid"
id = "facid"
description = "Fluorosulfuric acid is a an extremely corrosive super-acid."
color = "#5050FF"
acidpwr = 42
/datum/reagent/acid/facid/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
update_flags |= M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER, FALSE)
return ..() | update_flags
/datum/reagent/acid/facid/reaction_mob(mob/living/M, method = TOUCH, volume)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(method == TOUCH)
if(volume > 9)
if(!H.wear_mask && !H.head)
var/obj/item/organ/external/affecting = H.get_organ("head")
if(affecting)
affecting.disfigure()
H.adjustFireLoss(min(max(8, (volume - 5) * 3), 75))
H.emote("scream")
return
else
var/melted_something = FALSE
if(H.wear_mask && !(H.wear_mask.resistance_flags & ACID_PROOF))
qdel(H.wear_mask)
H.update_inv_wear_mask()
to_chat(H, "<span class='danger'>Your [H.wear_mask] melts away!</span>")
melted_something = TRUE
if(H.head && !(H.head.resistance_flags & ACID_PROOF))
qdel(H.head)
H.update_inv_head()
to_chat(H, "<span class='danger'>Your [H.head] melts away!</span>")
melted_something = TRUE
if(melted_something)
return
if(volume >= 5)
H.emote("scream")
H.adjustFireLoss(min(max(8, (volume - 5) * 3), 75))
to_chat(H, "<span class='warning'>The blueish acidic substance stings[volume < 5 ? " you, but isn't concentrated enough to harm you" : null]!</span>")
/datum/reagent/carpotoxin
name = "Carpotoxin"
@@ -635,62 +685,6 @@
M.emote("scream")
return ..() | update_flags
/datum/reagent/facid
name = "Fluorosulfuric Acid"
id = "facid"
description = "Fluorosulfuric acid is a an extremely corrosive super-acid."
reagent_state = LIQUID
color = "#5050FF"
process_flags = ORGANIC | SYNTHETIC
taste_description = "<span class='userdanger'>ACID</span>"
/datum/reagent/facid/on_mob_life(mob/living/M)
var/update_flags = STATUS_UPDATE_NONE
update_flags |= M.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER, FALSE)
update_flags |= M.adjustFireLoss(1, FALSE)
return ..() | update_flags
/datum/reagent/facid/reaction_mob(mob/living/M, method = TOUCH, volume)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(method == TOUCH)
if(volume > 9)
if(!H.wear_mask && !H.head)
var/obj/item/organ/external/affecting = H.get_organ("head")
if(affecting)
affecting.disfigure()
H.adjustFireLoss(min(max(8, (volume - 5) * 3), 75))
H.emote("scream")
return
else
var/melted_something = FALSE
if(H.wear_mask && !H.wear_mask.unacidable)
qdel(H.wear_mask)
H.update_inv_wear_mask()
to_chat(H, "<span class='danger'>Your [H.wear_mask] melts away!</span>")
melted_something = TRUE
if(H.head && !H.head.unacidable)
qdel(H.head)
H.update_inv_head()
to_chat(H, "<span class='danger'>Your [H.head] melts away!</span>")
melted_something = TRUE
if(melted_something)
return
if(volume >= 5)
H.emote("scream")
H.adjustFireLoss(min(max(8, (volume - 5) * 3), 75))
to_chat(H, "<span class='warning'>The blueish acidic substance stings[volume < 5 ? " you, but isn't concentrated enough to harm you" : null]!</span>")
/datum/reagent/facid/reaction_obj(obj/O, volume)
if((istype(O, /obj/item) || istype(O, /obj/structure/glowshroom)))
if(!O.unacidable)
var/obj/effect/decal/cleanable/molten_object/I = new/obj/effect/decal/cleanable/molten_object(O.loc)
I.desc = "Looks like this was \an [O] some time ago."
O.visible_message("<span class='warning'>[O] melts.</span>")
qdel(O)
/datum/reagent/initropidril
name = "Initropidril"
id = "initropidril"
@@ -24,8 +24,11 @@
/datum/reagent/water/reaction_mob(mob/living/M, method = TOUCH, volume)
M.water_act(volume, water_temperature, src, method)
/datum/reagent/water/reaction_turf(turf/simulated/T, volume)
/datum/reagent/water/reaction_turf(turf/T, volume)
T.water_act(volume, water_temperature, src)
var/obj/effect/acid/A = (locate(/obj/effect/acid) in T)
if(A)
A.acid_level = max(A.acid_level - volume* 50, 0)
/datum/reagent/water/reaction_obj(obj/O, volume)
O.water_act(volume, water_temperature, src)
+2 -1
View File
@@ -45,7 +45,8 @@ obj/item/reagent_containers/proc/add_initial_reagents()
if(reagents)
for(var/datum/reagent/R in reagents.reagent_list)
R.on_ex_act()
..()
if(!QDELETED(src))
..()
/obj/item/reagent_containers/attack_self(mob/user)
if(has_lid)
@@ -13,6 +13,7 @@
volume = 50
container_type = OPENCONTAINER
has_lid = TRUE
resistance_flags = ACID_PROOF
var/label_text = ""
// the fucking asshole who designed this can go die in a fire - Iamgoofball
@@ -343,8 +344,9 @@
amount_per_transfer_from_this = 20
possible_transfer_amounts = list(5,10,15,20,25,30,50,80,100,120)
volume = 120
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 75, "acid" = 50) //Weak melee protection, because you can wear it on your head
slot_flags = SLOT_HEAD
resistance_flags = NONE
container_type = OPENCONTAINER
/obj/item/reagent_containers/glass/bucket/wooden
@@ -352,7 +354,8 @@
icon_state = "woodbucket"
item_state = "woodbucket"
materials = null
burn_state = FLAMMABLE
armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50)
resistance_flags = FLAMMABLE
/obj/item/reagent_containers/glass/bucket/equipped(mob/user, slot)
..()
@@ -11,6 +11,7 @@
amount_per_transfer_from_this = 5
volume = 30
possible_transfer_amounts = list(1,2,3,4,5,10,15,20,25,30)
resistance_flags = ACID_PROOF
container_type = OPENCONTAINER
slot_flags = SLOT_BELT
var/ignore_flags = FALSE
@@ -78,6 +79,7 @@
/obj/item/reagent_containers/hypospray/CMO
list_reagents = list("omnizine" = 30)
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/obj/item/reagent_containers/hypospray/combat
name = "combat stimulant injector"
@@ -12,6 +12,7 @@
possible_transfer_amounts = list(1,5,10,15,20,25,30,50) // Everything above 10 is NOT usable on a person and is instead used for transfering to other containers
amount_per_transfer_from_this = 1
container_type = OPENCONTAINER
resistance_flags = ACID_PROOF
var/label_text
var/mode = IV_INJECT
var/mob/living/carbon/human/injection_target
+19 -19
View File
@@ -7,15 +7,21 @@
anchored = 0
pressure_resistance = 2*ONE_ATMOSPHERE
container_type = DRAINABLE | AMOUNT_VISIBLE
max_integrity = 300
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/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
. = ..()
if(. && obj_integrity > 0)
if(tank_volume && (damage_flag == "bullet" || damage_flag == "laser"))
boom()
/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.
. = ..()
return ..()
/obj/structure/reagent_dispensers/New()
create_reagents(tank_volume)
@@ -34,21 +40,12 @@
chem_splash(loc, 5, list(reagents))
qdel(src)
/obj/structure/reagent_dispensers/ex_act(severity)
switch(severity)
if(1)
/obj/structure/reagent_dispensers/deconstruct(disassembled = TRUE)
if(!(flags & NODECONSTRUCT))
if(!disassembled)
boom()
if(2)
if(prob(50))
boom()
if(3)
if(prob(5))
boom()
/obj/structure/reagent_dispensers/blob_act()
if(prob(50))
boom()
else
qdel(src)
//Dispensers
/obj/structure/reagent_dispensers/watertank
@@ -101,7 +98,7 @@
reagents.set_reagent_temp(1000) //uh-oh
qdel(src)
/obj/structure/reagent_dispensers/fueltank/blob_act()
/obj/structure/reagent_dispensers/fueltank/blob_act(obj/structure/blob/B)
boom()
/obj/structure/reagent_dispensers/fueltank/ex_act()
@@ -263,6 +260,8 @@
user.visible_message("[user] has secured [src]'s floor casters.", \
"<span class='notice'>You have secured [src]'s floor casters.</span>")
anchored = 1
return
return ..()
/obj/structure/reagent_dispensers/beerkeg
name = "beer keg"
@@ -270,9 +269,10 @@
icon_state = "beer"
reagent_id = "beer"
/obj/structure/reagent_dispensers/beerkeg/blob_act()
/obj/structure/reagent_dispensers/beerkeg/blob_act(obj/structure/blob/B)
explosion(loc, 0, 3, 5, 7, 10)
qdel(src)
if(!QDELETED(src))
qdel(src)
/obj/structure/reagent_dispensers/beerkeg/nuke
name = "Nanotrasen-brand nuclear fission explosive"