mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-25 04:57:12 +01:00
Merge pull request #12245 from Fox-McCloud/universal-damage
Universal Object Damage
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user