diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm index 04a9c886b79..76e94c9792f 100644 --- a/code/ZAS/Fire.dm +++ b/code/ZAS/Fire.dm @@ -95,6 +95,7 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) return 0 /turf/simulated/create_fire(fl) + if(fire) fire.firelevel = max(fl, fire.firelevel) return 1 @@ -111,6 +112,11 @@ turf/proc/hotspot_expose(exposed_temperature, exposed_volume, soh = 0) if(fuel) LAZYADD(zone.fuel_objs, fuel) + var/obj/effect/decal/cleanable/foam/extinguisher_foam = locate() in src + if(extinguisher_foam && extinguisher_foam.reagents) + fire.firelevel *= max(0,1 - (extinguisher_foam.reagents.total_volume*0.04)) + //25 units will eliminate the fire completely + return 0 /obj/fire diff --git a/code/__defines/chemistry.dm b/code/__defines/chemistry.dm index 19cefd82cdf..44b58252052 100644 --- a/code/__defines/chemistry.dm +++ b/code/__defines/chemistry.dm @@ -5,6 +5,10 @@ #define CHEM_BLOOD 3 #define CHEM_BREATHE 4 +#define WET_TYPE_WATER 1 +#define WET_TYPE_LUBE 2 +#define WET_TYPE_ICE 3 + #define MINIMUM_CHEMICAL_VOLUME 0.01 #define SOLID 1 diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index e6f44601f79..2069788c7d6 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -190,7 +190,7 @@ /obj/item/mecha_parts/mecha_equipment/tool/extinguisher/New() reagents = new/datum/reagents(max_water) reagents.my_atom = src - reagents.add_reagent("water", max_water) + reagents.add_reagent("monoammoniumphosphate", max_water) ..() return @@ -199,7 +199,7 @@ if(get_dist(chassis, target)>2) return set_ready_state(0) if(do_after_cooldown(target)) - if( istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(chassis,target) <= 1) + if( istype(target, /obj/structure/reagent_dispensers) && get_dist(chassis,target) <= 1) var/obj/o = target var/amount = o.reagents.trans_to_obj(src, 200) occupant_message("[amount] units transferred into internal tank.") diff --git a/code/game/mecha/equipment/tracking_beacon.dm b/code/game/mecha/equipment/tracking_beacon.dm index 6892b2443ac..afbf8bf58f9 100644 --- a/code/game/mecha/equipment/tracking_beacon.dm +++ b/code/game/mecha/equipment/tracking_beacon.dm @@ -91,7 +91,7 @@ qdel(src) return -/obj/item/mecha_parts/mecha_tracking/ex_act() +/obj/item/mecha_parts/mecha_tracking/ex_act(var/severity = 2.0) qdel(src) return diff --git a/code/game/objects/effects/chem/water.dm b/code/game/objects/effects/chem/water.dm index 33e66096b3b..1aee086a8b4 100644 --- a/code/game/objects/effects/chem/water.dm +++ b/code/game/objects/effects/chem/water.dm @@ -79,4 +79,4 @@ //used by evil things /obj/effect/effect/water/firewater name = "napalm gel" - icon_state = "mustard" \ No newline at end of file + icon_state = "mustard" diff --git a/code/game/objects/effects/decals/Cleanable/fuel.dm b/code/game/objects/effects/decals/Cleanable/fuel.dm index 5fb93e61a04..9c87636b336 100644 --- a/code/game/objects/effects/decals/Cleanable/fuel.dm +++ b/code/game/objects/effects/decals/Cleanable/fuel.dm @@ -107,4 +107,51 @@ var/sticky = min(rand(5,25), amount) if(sticky > 1) L.adjust_fire_stacks(sticky) - amount = max(1, amount - sticky) \ No newline at end of file + amount = max(1, amount - sticky) + +/obj/effect/decal/cleanable/foam //Copied from liquid fuel + name = "foam" + desc = "Some kind of extinguishing foam." + gender = PLURAL + density = 0 + anchored = 1 + layer = 2 + icon = 'icons/effects/effects.dmi' + icon_state = "white_foam" + var/amount = 1 + +/obj/effect/decal/cleanable/foam/Initialize(mapload, amt = 1, nologs = 0) + src.amount = amt + + var/has_spread = 0 + //Be absorbed by any other liquid fuel in the tile. + for(var/obj/effect/decal/cleanable/foam/other in loc) + if(other != src) + other.amount += src.amount + other.Spread() + has_spread = 1 + break + + if(!has_spread) + Spread() + QDEL_IN(src, 2 MINUTES) + else + qdel(src) + +/obj/effect/decal/cleanable/foam/proc/Spread(exclude=list()) + if(amount < 15) return + var/turf/simulated/S = loc + if(!istype(S)) return + for(var/d in cardinal) + var/turf/simulated/target = get_step(src,d) + var/turf/simulated/origin = get_turf(src) + if(origin.CanPass(null, target, 0, 0) && target.CanPass(null, origin, 0, 0)) + var/obj/effect/decal/cleanable/foam/other_foam = locate() in target + if(other_foam) + other_foam.amount += amount*0.25 + if(!(other_foam in exclude)) + exclude += src + other_foam.Spread(exclude) + else + new/obj/effect/decal/cleanable/foam(target, amount*0.25,1) + amount *= 0.75 \ No newline at end of file diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 727a59948c3..a20b6335eda 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -85,7 +85,7 @@ QDEL_IN(src, duration) -/obj/effect/overlay/temp/ex_act() +/obj/effect/overlay/temp/ex_act(var/severity = 2.0) return /obj/effect/overlay/temp/dir_setting diff --git a/code/game/objects/effects/temporary_visuals/temporary_visual.dm b/code/game/objects/effects/temporary_visuals/temporary_visual.dm index a567548c74f..b9688f5e5ac 100644 --- a/code/game/objects/effects/temporary_visuals/temporary_visual.dm +++ b/code/game/objects/effects/temporary_visuals/temporary_visual.dm @@ -20,7 +20,7 @@ /obj/effect/temp_visual/singularity_pull() return -/obj/effect/temp_visual/ex_act() +/obj/effect/temp_visual/ex_act(var/severity = 2.0) return /obj/effect/temp_visual/dir_setting diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index c45a542448c..b85ca04a883 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -109,7 +109,7 @@ M << "Your chameleon-projector deactivates." master.disrupt() -/obj/effect/dummy/chameleon/ex_act() +/obj/effect/dummy/chameleon/ex_act(var/severity = 2.0) for(var/mob/M in src) M << "Your chameleon-projector deactivates." master.disrupt() diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 3eaa2d7b349..5a7aaceb3f6 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -1,3 +1,76 @@ +/obj/item/weapon/reagent_containers/extinguisher_refill + name = "extinguisher refiller" + desc = "A one time use extinguisher refiller that allows fire extinguishers to be refilled with an aerosol mix. Just pour in the reagents and twist." + icon = 'icons/obj/items.dmi' + icon_state = "metal_canister" + item_state = "metal_canister" + hitsound = 'sound/weapons/smash.ogg' + flags = CONDUCT | OPENCONTAINER + throwforce = 8 + w_class = 4.0 // Don't want to give people free bluespace beakers. + throw_speed = 2 + throw_range = 10 + force = 8 + matter = list(DEFAULT_WALL_MATERIAL = 90) + attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed") + amount_per_transfer_from_this = 300 + possible_transfer_amounts = null + volume = 300 + +/obj/item/weapon/reagent_containers/extinguisher_refill/attackby(var/obj/O as obj, var/mob/user as mob) + + if(istype(O,/obj/item/weapon/extinguisher)) + var/obj/item/weapon/extinguisher/E = O + if(src.is_open_container()) + to_chat(user,"\The [src] needs to be secured first!") + else if(src.reagents.total_volume <= 0) + to_chat(user,"\The [src] is empty!") + else if(E.reagents.total_volume < E.reagents.maximum_volume) + src.reagents.trans_to(E, src.reagents.total_volume) + user.visible_message("[user] fills \the [E] with the [src].", "You fill \the [E] with the [src].") + playsound(E.loc, 'sound/items/stimpack.ogg', 50, 1) + else + to_chat(user,"\The [E] is full!") + return + + . = ..() + +/obj/item/weapon/reagent_containers/extinguisher_refill/attack_self(mob/user as mob) //Copied from inhalers. + if(is_open_container()) + if(reagents && reagents.reagent_list.len) + to_chat(user,"With a quick twist of the cartridge's lid, you secure the reagents inside \the [src].") + flags ^= OPENCONTAINER + else + to_chat(user,"You can't secure the cartridge without putting reagents in!") + else + to_chat(user,"\The reagents inside [src] are already secured!") + return + +/obj/item/weapon/reagent_containers/extinguisher_refill/examine(var/mob/user) //Copied from inhalers. + if(!..(user, 2)) + return + + if(is_open_container()) + if(reagents && reagents.reagent_list.len) + to_chat(user,"It contains [round(reagents.total_volume, accuracy)] units of non-aerosol mix.") + else + to_chat(user,"It is empty.") + else + if(reagents && reagents.reagent_list.len) + to_chat(user,"The reagents are secured in the aerosol mix.") + else + to_chat(user,"The cartridge seems spent.") + +/obj/item/weapon/reagent_containers/extinguisher_refill/filled + name = "extinguisher refiller (monoammonium phosphate)" + desc = "A one time use extinguisher refiller that allows fire extinguishers to be refilled with an aerosol mix. This one is contains monoammonium phosphate." + +/obj/item/weapon/reagent_containers/extinguisher_refill/filled/Initialize() + . =..() + reagents.add_reagent("monoammoniumphosphate", volume) + flags &= ~OPENCONTAINER + return + /obj/item/weapon/extinguisher name = "fire extinguisher" desc = "A traditional red fire extinguisher." @@ -16,6 +89,7 @@ var/spray_particles = 3 var/spray_amount = 10 //units of liquid per particle + var/spray_distance = 3 var/max_water = 300 var/last_use = 1.0 var/safety = 1 @@ -27,21 +101,25 @@ icon_state = "miniFE0" item_state = "miniFE" hitsound = null //it is much lighter, after all. + flags = OPENCONTAINER throwforce = 2 w_class = 2.0 - force = 3.0 - max_water = 150 - spray_particles = 3 + force = 2.0 + max_water = 60 + spray_amount = 10 + spray_particles = 1 + spray_distance = 1 sprite_name = "miniFE" /obj/item/weapon/extinguisher/New() create_reagents(max_water) - reagents.add_reagent("water", max_water) + reagents.add_reagent("monoammoniumphosphate", max_water) ..() /obj/item/weapon/extinguisher/examine(mob/user) if(..(user, 0)) - user << text("\icon[] [] contains [] units of water left!", src, src.name, src.reagents.total_volume) + to_chat(user,"The [src] contains [src.reagents.total_volume] units of reagents.") + to_chat(user,"The safety is [safety ? "on" : "off"].") return /obj/item/weapon/extinguisher/attack_self(mob/user as mob) @@ -51,6 +129,24 @@ user << "The safety is [safety ? "on" : "off"]." return +/obj/item/weapon/extinguisher/attackby(var/obj/O as obj, var/mob/user as mob) + + if(istype(O,/obj/item/weapon/reagent_containers/extinguisher_refill)) + var/obj/item/weapon/reagent_containers/extinguisher_refill/ER = O + if(ER.is_open_container()) + to_chat(user,"\The [ER] needs to be secured first!") + else if(ER.reagents.total_volume <= 0) + to_chat(user,"\The [ER] is empty!") + else if (src.reagents.total_volume < src.reagents.maximum_volume) + ER.reagents.trans_to(src, ER.reagents.total_volume) + user.visible_message("[user] fills \the [src] with the [ER].", "You fill \the [src] with the [ER].") + playsound(ER.loc, 'sound/items/stimpack.ogg', 50, 1) + else + to_chat(user,"\The [src] is full!") + return + + . = ..() + /obj/item/weapon/extinguisher/proc/propel_object(var/obj/O, mob/user, movementdirection) if(O.anchored) return @@ -70,23 +166,6 @@ sleep(3) /obj/item/weapon/extinguisher/afterattack(var/atom/target, var/mob/user, var/flag) - //TODO; Add support for reagents in water. - - if( istype(target, /obj/structure/reagent_dispensers/watertank) && flag) - var/obj/o = target - var/amount = o.reagents.trans_to_obj(src, 50) - - if (src.reagents.total_volume == 300) - user << "The fire extinguisher is full!" - return 0 - - if (o.reagents.total_volume < 1) - user << "There is nothing left in the [target]." - return 0 - else - user << "You fill [src] with [amount] units of the contents of [target]." - playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) - return if (!safety) if (src.reagents.total_volume < 1) @@ -125,7 +204,7 @@ W.create_reagents(spray_amount) reagents.trans_to_obj(W, spray_amount) W.set_color() - W.set_up(my_target) + W.set_up(my_target,spray_distance,3) if((istype(usr.loc, /turf/space)) || (usr.lastarea.has_gravity() == 0)) user.inertia_dir = get_dir(target, user) diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index b9fd028d2d6..05a3462c922 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -35,7 +35,7 @@ qdel(src) return -/obj/item/weapon/a_gift/ex_act() +/obj/item/weapon/a_gift/ex_act(var/severity = 2.0) qdel(src) return @@ -215,7 +215,7 @@ return -/obj/item/weapon/xmasgift/ex_act() +/obj/item/weapon/xmasgift/ex_act(var/severity = 2.0) qdel(src) return diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index c066182d7d3..8a27b00f4bb 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -304,7 +304,7 @@ /obj/item/weapon/grenade/chem_grenade/large/phoroncleaner name = "large cardox grenade" - desc = "A large smoke grenade containing a heavy amount of cardox. Use in case of phoron leaks. Warning: Harmful to Vaurca health." + desc = "A large chemical grenade containing a heavy amount of cardox. Use in case of phoron leaks. Warning: Harmful to Vaurca health." stage = 2 path = 1 @@ -347,3 +347,24 @@ beakers += B2 icon_state = initial(icon_state) +"_locked" +/obj/item/weapon/grenade/chem_grenade/monoammoniumphosphate + name = "extinguisher grenade" + desc = "BLAM!-brand foaming extinguisher. Incredibly useful for taking out large chemical fires at a distance." + stage = 2 + path = 1 + + Initialize() + . = ..() + var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src) + var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src) + + B1.reagents.add_reagent("surfactant", 40) + B1.reagents.add_reagent("monoammoniumphosphate", 20) + B2.reagents.add_reagent("water", 40) + B2.reagents.add_reagent("monoammoniumphosphate", 20) + + detonator = new/obj/item/device/assembly_holder/timer_igniter(src) + + beakers += B1 + beakers += B2 + icon_state = initial(icon_state) +"_locked" \ No newline at end of file diff --git a/code/game/objects/items/weapons/landmines.dm b/code/game/objects/items/weapons/landmines.dm index e4ab7294997..27e13c064e8 100644 --- a/code/game/objects/items/weapons/landmines.dm +++ b/code/game/objects/items/weapons/landmines.dm @@ -85,7 +85,7 @@ if(deployed) trigger() -/obj/item/weapon/landmine/ex_act() +/obj/item/weapon/landmine/ex_act(var/severity = 2.0) if(deployed) trigger() diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 977a8d3054a..1a352973dd5 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -342,7 +342,7 @@ message_admins("[key_name_admin(user)] triggered a fueltank explosion.") log_game("[key_name(user)] triggered a fueltank explosion with a welding tool.",ckey=key_name(user)) user << span("alert", "That was stupid of you.") - tank.explode() + tank.ex_act(3.0) return else tank.armed = 0 diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 042b84180dd..c04610ed207 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -244,7 +244,7 @@ healthcheck() return 0 -/obj/effect/energy_net/ex_act() +/obj/effect/energy_net/ex_act(var/severity = 2.0) health = 0 healthcheck() diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index bb92fdc0ead..aa781398829 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -701,3 +701,11 @@ return pickweight(random_stock_uncommon) if ("3") return pickweight(random_stock_common) + +/obj/structure/closet/crate/extinguisher_catridges + name = "crate of extinguisher cartridges" + desc = "Contains a dozen empty extinguisher cartridges." + +/obj/structure/closet/crate/extinguisher_catridges/fill() + for(var/a = 1 to 12) + new /obj/item/weapon/reagent_containers/extinguisher_refill(src) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 54fc6dc55ab..f85976b840b 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -91,7 +91,7 @@ desc = "It looks dead." dead = 1 //No complex interactions, just make them fragile -/obj/structure/flora/pottedplant/ex_act() +/obj/structure/flora/pottedplant/ex_act(var/severity = 2.0) death() return ..() diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 4f59e26688d..9047e099773 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -369,6 +369,16 @@ desc = "A sink used for washing one's hands and face." anchored = 1 var/busy = 0 //Something's being washed at the moment + var/amount_per_transfer_from_this = 10 + var/possible_transfer_amounts = list(5,10,15,25,30,50,60,100,120,250,300) + +/obj/structure/sink/verb/set_APTFT() //set amount_per_transfer_from_this + set name = "Set transfer amount" + set category = "Object" + set src in view(1) + var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts + if (N) + amount_per_transfer_from_this = N /obj/structure/sink/attack_hand(mob/user as mob) if (ishuman(user)) @@ -427,7 +437,7 @@ usr << "\The [RG] is already full." return - RG.reagents.add_reagent("water", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this)) + RG.reagents.add_reagent("water", min(RG.volume - RG.reagents.total_volume, amount_per_transfer_from_this)) oviewers(3, usr) << "[usr] fills \the [RG] using \the [src]." usr << "You fill \the [RG] using \the [src]." if ("Empty") @@ -435,9 +445,9 @@ usr << "\The [RG] is already empty." return - RG.reagents.clear_reagents() - oviewers(3, usr) << "[usr] empties \the [RG] into \the [src]." - usr << "You empty \the [RG] into \the [src]." + var/empty_amount = RG.reagents.trans_to(src, RG.amount_per_transfer_from_this) + oviewers(3, usr) << "[usr] empties [empty_amount]u of \the [RG] into \the [src]." + usr << "You empty [empty_amount]u of \the [RG] into \the [src]." return // Filling/empying Syringes diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 88c38711364..42a6b1a4fe2 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -525,7 +525,7 @@ /obj/structure/window/reinforced/crescent/attackby() return -/obj/structure/window/reinforced/crescent/ex_act() +/obj/structure/window/reinforced/crescent/ex_act(var/severity = 2.0) return /obj/structure/window/reinforced/crescent/hitby() diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index e6500518309..547e0145f70 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -1,6 +1,7 @@ /turf/simulated name = "station" - var/wet = 0 + var/wet_type = 0 + var/wet_amount = 0 var/image/wet_overlay = null //Mining resources (for the large drills). @@ -18,26 +19,53 @@ roof_type = /turf/simulated/floor/airless/ceiling -/turf/simulated/proc/wet_floor(var/wet_val = 1) - if(wet_val < wet) - return +/turf/simulated/proc/wet_floor(var/apply_type = WET_TYPE_WATER, var/amount = 1) - if(!wet) - wet = wet_val + //Wet type: + //WET_TYPE_WATER = water + //WET_TYPE_LUBE = lube + //WET_TYPE_ICE = ice + + if(!wet_type) + wet_type = apply_type + else if(apply_type != wet_type) + if(apply_type == WET_TYPE_WATER && wet_type == WET_TYPE_LUBE) + wet_type = WET_TYPE_WATER + else if(apply_type == WET_TYPE_ICE && (wet_type == WET_TYPE_WATER || wet_type == WET_TYPE_LUBE)) + wet_type = apply_type + + if(wet_amount <= 0) + wet_amount = 0 //Just in case + + if(!wet_overlay) wet_overlay = image('icons/effects/water.dmi',src,"wet_floor") add_overlay(wet_overlay, TRUE) + wet_amount += amount + + var/max_wetness = 10 //About 100 units per tile + if(wet_amount > max_wetness) + var/stored_wet = wet_amount - max_wetness + wet_amount -= max_wetness + var/wet_per_tile = stored_wet * 0.25 + for(var/d in cardinal) + var/turf/simulated/target = get_step(src,d) + if(src.CanPass(null, target, 0, 0) && target.CanPass(null, src, 0, 0)) + if(target.wet_amount) + var/edited_value = round(wet_per_tile * 0.5) //Prevent infinite loops + target.wet_floor(apply_type,edited_value) + wet_amount += edited_value + else + target.wet_floor(apply_type,wet_per_tile) + unwet_timer = addtimer(CALLBACK(src, .proc/unwet_floor), 120 SECONDS, TIMER_UNIQUE | TIMER_OVERRIDE | TIMER_STOPPABLE) /turf/simulated/proc/unwet_floor() - --wet - if (wet < 1) - wet = 0 - if(wet_overlay) - cut_overlay(wet_overlay, TRUE) - wet_overlay = null - else - unwet_timer = addtimer(CALLBACK(src, .proc/unwet_floor), 120 SECONDS, TIMER_UNIQUE | TIMER_STOPPABLE) + wet_amount = 0 + wet_type = 0 + if(wet_overlay) + cut_overlay(wet_overlay, TRUE) + wet_overlay = null /turf/simulated/clean_blood() for(var/obj/effect/decal/cleanable/blood/B in contents) @@ -112,16 +140,17 @@ bloodDNA = null - if(src.wet) + if(src.wet_type && src.wet_amount) - if(M.buckled || (src.wet == 1 && M.m_intent == "walk")) + if(M.buckled || (src.wet_type == 1 && M.m_intent == "walk")) return + //Water var/slip_dist = 1 var/slip_stun = 6 var/floor_type = "wet" - switch(src.wet) + switch(src.wet_type) if(2) // Lube floor_type = "slippery" slip_dist = 4 diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm index 654b62cbdeb..4125881b7c5 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -22,8 +22,8 @@ if (istype(src.loc.loc, /obj/structure/reagent_dispensers/fueltank/)) var/obj/structure/reagent_dispensers/fueltank/tank = src.loc.loc if (tank && tank.modded) - tank.explode() - + tank.ex_act(3.0) + spark(src, 4, cardinal) return 1 diff --git a/code/modules/mob/abstract/abstract.dm b/code/modules/mob/abstract/abstract.dm index 583701e97ac..25eeca124a8 100644 --- a/code/modules/mob/abstract/abstract.dm +++ b/code/modules/mob/abstract/abstract.dm @@ -23,7 +23,7 @@ /mob/abstract/conveyor_act() return -/mob/abstract/ex_act() +/mob/abstract/ex_act(var/severity = 2.0) return /mob/abstract/singularity_act() diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 4bb271c90c9..8dd976bd13e 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -141,7 +141,7 @@ if(M.a_intent == I_HURT) set_flee_target(M) -/mob/living/simple_animal/cat/ex_act() +/mob/living/simple_animal/cat/ex_act(var/severity = 2.0) . = ..() set_flee_target(src.loc) diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index ba78b3dae7e..23e122ec470 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -289,7 +289,7 @@ if (health < healthbefore) instant_aggro() -/mob/living/simple_animal/hostile/bear/ex_act() +/mob/living/simple_animal/hostile/bear/ex_act(var/severity = 2.0) var/healthbefore = health ..() spawn(1) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 72a23e84863..4f7e403dc3d 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -283,7 +283,7 @@ qdel(src) return TRUE -/obj/item/projectile/ex_act() +/obj/item/projectile/ex_act(var/severity = 2.0) return //explosions probably shouldn't delete projectiles //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm index 141fa1980dd..114f289523d 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm @@ -182,7 +182,7 @@ var/hotspot = (locate(/obj/fire) in T) if(hotspot && !istype(T, /turf/space)) var/datum/gas_mixture/lowertemp = T.remove_air(T:air:total_moles) - lowertemp.temperature = max(min(lowertemp.temperature-2000, lowertemp.temperature / 2), 0) + lowertemp.temperature = max(lowertemp.temperature-2000, lowertemp.temperature / 2, 0) lowertemp.react() T.assume_air(lowertemp) qdel(hotspot) @@ -194,7 +194,7 @@ T.visible_message("The water sizzles as it lands on \the [T]!") else if(volume >= 10) - T.wet_floor(1) + T.wet_floor(WET_TYPE_WATER,volume) /datum/reagent/water/touch_obj(var/obj/O) if(istype(O)) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 16a1542f5f7..7a98d65948a 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -288,7 +288,7 @@ */ if(volume >= 3) - T.wet_floor(2) + T.wet_floor(WET_TYPE_LUBE,volume) /datum/reagent/nutriment/triglyceride/oil/initialize_data(var/newdata) // Called when the reagent is created. ..() diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm index fd229d16521..eb764b5e329 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm @@ -366,7 +366,7 @@ if(!istype(T)) return if(volume >= 1) - T.wet_floor(2) + T.wet_floor(WET_TYPE_LUBE,volume) /datum/reagent/silicate name = "Silicate" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index 2f7a02bc693..43643604bea 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -259,6 +259,51 @@ name = "Robust Harvest" id = "robustharvest" +/datum/reagent/toxin/fertilizer/monoammoniumphosphate + name = "Monoammonium Phosphate" + id = "monoammoniumphosphate" + strength = 0.25 + description = "Commonly found in fire extinguishers, also works as a fertilizer." + reagent_state = SOLID + color = "#CCCCCC" + taste_description = "salty dirt" + metabolism = REM * 2 + +/datum/reagent/toxin/fertilizer/monoammoniumphosphate/touch_turf(var/turf/simulated/T) + + if(!istype(T)) + return + + var/hotspot = (locate(/obj/fire) in T) + if(hotspot && !istype(T, /turf/space)) + var/datum/gas_mixture/lowertemp = T.return_air() + lowertemp.temperature = max(min(lowertemp.temperature-2000, lowertemp.temperature / 2), 0) + lowertemp.react() + qdel(hotspot) + + var/amount_to_remove = max(1,round(volume * 0.5)) + + new /obj/effect/decal/cleanable/foam(T, amount_to_remove) + remove_self(amount_to_remove) + return + + +/datum/reagent/toxin/fertilizer/monoammoniumphosphate/touch_mob(var/mob/living/L, var/amount) + if(istype(L)) + L.adjust_fire_stacks(-amount) + if(L.fire_stacks <= 0 ) + L.fire_stacks = 0 + L.ExtinguishMob() + +/datum/reagent/toxin/fertilizer/monoammoniumphosphate/affect_touch(var/mob/living/carbon/slime/S, var/alien, var/removed) + if(istype(S)) + S.adjustToxLoss(8 * removed) + if(!S.client && S.Target) + S.Target = null + ++S.Discipline + if(dose == removed) + S.visible_message("[S]'s flesh sizzles where the liquid touches it!", "Your flesh burns in the liquid!") + /datum/reagent/toxin/plantbgone name = "Plant-B-Gone" id = "plantbgone" diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index d7810a7691e..6d6115bf9a2 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -537,6 +537,13 @@ required_reagents = list("cardox" = 0.1, "phoron" = 1) result_amount = 0 +/datum/chemical_reaction/monoammoniumphosphate + name = "Monoammoniumphosphate" + id = "monoammoniumphosphate" + result = "monoammoniumphosphate" + required_reagents = list("ammonia" = 1, "sacid" = 1, "sodium" = 1, "phosphorus" = 1) + result_amount = 4 + /datum/chemical_reaction/koispasteclean name = "Filtered K'ois" id = "koispasteclean" diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 85c1b619bcc..1c7a04c3e35 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -8,6 +8,35 @@ var/possible_transfer_amounts = list(5,10,15,25,30) var/volume = 30 var/accuracy = 1 + var/can_be_placed_into = list( + /obj/machinery/chem_master, + /obj/machinery/chemical_dispenser, + /obj/structure/reagent_dispensers, + /obj/machinery/reagentgrinder, + /obj/structure/table, + /obj/structure/closet, + /obj/structure/sink, + /obj/item/weapon/storage, + /obj/machinery/atmospherics/unary/cryo_cell, + /obj/machinery/dna_scannernew, + /obj/item/weapon/grenade/chem_grenade, + /mob/living/bot/medbot, + /obj/machinery/computer/pandemic, + /obj/item/weapon/storage/secure/safe, + /obj/machinery/iv_drip, + /obj/machinery/disease2/incubator, + /obj/machinery/disposal, + /mob/living/simple_animal/cow, + /mob/living/simple_animal/hostile/retaliate/goat, + /obj/machinery/computer/centrifuge, + /obj/machinery/sleeper, + /obj/machinery/smartfridge, + /obj/machinery/biogenerator, + /obj/machinery/constructable_frame, + /obj/machinery/radiocarbon_spectrometer, + /obj/item/weapon/storage/part_replacer + ) + //The above list a misnomer. This basically means that anything in this list has their own way of handling reagent transfers and should be ignored in afterattack. /obj/item/weapon/reagent_containers/verb/set_APTFT() //set amount_per_transfer_from_this set name = "Set transfer amount" @@ -27,19 +56,29 @@ return /obj/item/weapon/reagent_containers/attack(mob/M as mob, mob/user as mob, def_zone) - if(can_operate(M))//Checks if mob is lying down on table for surgery - if(do_surgery(M, user, src)) - return + if(can_operate(M) && do_surgery(M, user, src)) + return -/obj/item/weapon/reagent_containers/afterattack(obj/target, mob/user, flag) - return +/obj/item/weapon/reagent_containers/afterattack(var/obj/target, var/mob/user, var/proximity) + if(!proximity || !is_open_container()) + return + if(is_type_in_list(target,can_be_placed_into)) + return + if(standard_splash_mob(user, target)) + return + if(standard_feed_mob(user,target)) + return + if(standard_pour_into(user, target)) + return + if(standard_splash_obj(user, target)) + return /obj/item/weapon/reagent_containers/proc/reagentlist() // For attack logs if(reagents) return reagents.get_reagents() return "No reagent holder" -/obj/item/weapon/reagent_containers/proc/standard_dispenser_refill(var/mob/user, var/obj/structure/reagent_dispensers/target) // This goes into afterattack +/obj/item/weapon/reagent_containers/proc/standard_dispenser_refill(var/mob/user, var/obj/structure/reagent_dispensers/target) if(!istype(target)) return 0 @@ -51,14 +90,29 @@ user << "[src] is full." return 1 - var/trans = target.reagents.trans_to_obj(src, target:amount_per_transfer_from_this) + var/trans = target.reagents.trans_to_obj(src, target.amount_per_transfer_from_this) user << "You fill [src] with [trans] units of the contents of [target]." return 1 +/obj/item/weapon/reagent_containers/proc/standard_splash_obj(var/mob/user, var/target) + + if(user.a_intent != I_HURT) + return + + if(!reagents || !reagents.total_volume) + return + + user.visible_message("\The [target] has been splashed with something by \the [user]!", "You splash the solution onto \the [target].") + reagents.splash(target, reagents.total_volume) + return + /obj/item/weapon/reagent_containers/proc/standard_splash_mob(var/mob/user, var/mob/target) // This goes into afterattack if(!istype(target)) return + if(user.a_intent != I_HURT) + return + if(!reagents || !reagents.total_volume) user << "[src] is empty." return 1 @@ -67,15 +121,13 @@ user << "[target] is full." return 1 - - var/contained = reagentlist() target.attack_log += text("\[[time_stamp()]\] Has been splashed with [name] by [user.name] ([user.ckey]). Reagents: [contained]") user.attack_log += text("\[[time_stamp()]\] Used the [name] to splash [target.name] ([target.key]). Reagents: [contained]") msg_admin_attack("[user.name] ([user.ckey]) splashed [target.name] ([target.key]) with [name]. Reagents: [contained] (INTENT: [uppertext(user.a_intent)]) (JMP)",ckey=key_name(user),ckey_target=key_name(target)) - user.visible_message("[target] has been splashed with something by [user]!", "You splash the solution onto [target].") - reagents.splash(target, reagents.total_volume) + user.visible_message("\The [target] has been splashed with something by \the [user]!", "You splash the solution onto \the [target].") + reagents.splash(target, min(120,reagents.total_volume) ) //Splash Limit if (istype(target, /mob/living/silicon/robot)) var/mob/living/silicon/robot/R = target @@ -84,7 +136,7 @@ return 1 /obj/item/weapon/reagent_containers/proc/self_feed_message(var/mob/user) - user << "You eat \the [src]" + user.visible_message("\The [user] drinks from \the [src]","You drink from \the [src]") /obj/item/weapon/reagent_containers/proc/other_feed_message_start(var/mob/user, var/mob/target) user.visible_message("[user] is trying to feed [target] \the [src]!") @@ -93,7 +145,7 @@ user.visible_message("[user] has fed [target] \the [src]!") /obj/item/weapon/reagent_containers/proc/feed_sound(var/mob/user) - return + playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1) /obj/item/weapon/reagent_containers/proc/standard_feed_mob(var/mob/user, var/mob/target) // This goes into attack if(!istype(target)) @@ -121,7 +173,7 @@ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) //puts a limit on how fast people can eat/drink things self_feed_message(user) - reagents.trans_to_mob(user, amount_per_transfer_from_this, CHEM_INGEST) + reagents.trans_to_mob(user, min(10,amount_per_transfer_from_this), CHEM_INGEST) //A sane limiter. So you don't go drinking 300u all at once. feed_sound(user) return 1 else diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 48a0d053d8e..b492b0dc065 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -51,34 +51,38 @@ reagent_volumes[T] = min(reagent_volumes[T] + 5, volume) return 1 -/obj/item/weapon/reagent_containers/borghypo/attack(var/mob/living/M, var/mob/user) - if(!istype(M)) +/obj/item/weapon/reagent_containers/borghypo/afterattack(var/mob/living/M, var/mob/user, proximity) + + if(!proximity) return + if(!istype(M)) + return ..() + if(!reagent_volumes[reagent_ids[mode]]) - user << "The injector is empty." + to_chat(user,"The injector is empty.") return var/mob/living/carbon/human/H = M if(istype(H)) var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting) if(!affected) - user << "\The [H] is missing that limb!" + to_chat(user,"\The [H] is missing that limb!") return else if(affected.status & ORGAN_ROBOT) - user << "You cannot inject a robotic limb." + to_chat(user,"You cannot inject a robotic limb.") return if (M.can_inject(user, 1)) visible_message("[user] injects [M] with their hypospray!", "You inject [M] with your hypospray!") - M << "You feel a tiny prick!" + to_chat(M,"You feel a tiny prick!") if(M.reagents) var/t = min(amount_per_transfer_from_this, reagent_volumes[reagent_ids[mode]]) M.reagents.add_reagent(reagent_ids[mode], t) reagent_volumes[reagent_ids[mode]] -= t admin_inject_log(user, M, src, reagent_ids[mode], t) - user << "[t] units injected. [reagent_volumes[reagent_ids[mode]]] units remaining." + to_chat(user,"[t] units injected. [reagent_volumes[reagent_ids[mode]]] units remaining.") return /obj/item/weapon/reagent_containers/borghypo/attack_self(mob/user as mob) //Change the mode diff --git a/code/modules/reagents/reagent_containers/food.dm b/code/modules/reagents/reagent_containers/food.dm index d41ce9c683c..b37103cbb28 100644 --- a/code/modules/reagents/reagent_containers/food.dm +++ b/code/modules/reagents/reagent_containers/food.dm @@ -35,5 +35,7 @@ pixel_x = (CELLSIZE * (0.5 + cell_x)) - center_of_mass["x"] pixel_y = (CELLSIZE * (0.5 + cell_y)) - center_of_mass["y"] + . = ..() + #undef CELLS #undef CELLSIZE diff --git a/code/modules/reagents/reagent_containers/food/condiment.dm b/code/modules/reagents/reagent_containers/food/condiment.dm index c2523236508..adbdfda9f1a 100644 --- a/code/modules/reagents/reagent_containers/food/condiment.dm +++ b/code/modules/reagents/reagent_containers/food/condiment.dm @@ -29,26 +29,6 @@ if(!proximity) return - if(standard_dispenser_refill(user, target)) - return - if(standard_pour_into(user, target)) - return - - if(istype(target, /obj/item/weapon/reagent_containers/food/snacks)) // These are not opencontainers but we can transfer to them - if(!reagents || !reagents.total_volume) - user << "There is no condiment left in \the [src]." - return - - if(!target.reagents.get_free_space()) - user << "You can't add more condiment to \the [target]." - return - - var/trans = reagents.trans_to_obj(target, amount_per_transfer_from_this) - user << "You add [trans] units of the condiment to \the [target]." - -/obj/item/weapon/reagent_containers/food/condiment/feed_sound(var/mob/user) - playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1) - /obj/item/weapon/reagent_containers/food/condiment/self_feed_message(var/mob/user) user << "You swallow some of contents of \the [src]." @@ -116,11 +96,7 @@ desc = "Garlic sauce, perfect for spicing up a plate of garlic." center_of_mass = list("x"=16, "y"=6) else - name = "misc condiment bottle" - if (reagents.reagent_list.len==1) - desc = "Looks like it is [reagents.get_master_reagent_name()], but you are not sure." - else - desc = "A mixture of various condiments. [reagents.get_master_reagent_name()] is one of them." + desc = "A mixture of various condiments. [reagents.get_master_reagent_name()] is one of them." icon_state = "mixedcondiments" center_of_mass = list("x"=16, "y"=6) else diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index 0b9df0bdae6..e24581bb756 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -41,21 +41,8 @@ /obj/item/weapon/reagent_containers/food/drinks/attack(mob/M as mob, mob/user as mob, def_zone) if(force && !(flags & NOBLUDGEON) && user.a_intent == I_HURT) return ..() - - if(standard_feed_mob(user, M)) - return - return 0 -/obj/item/weapon/reagent_containers/food/drinks/afterattack(obj/target, mob/user, proximity) - if(!proximity) - return - if(standard_dispenser_refill(user, target)) - return - if(standard_pour_into(user, target)) - return - return ..() - /obj/item/weapon/reagent_containers/food/drinks/standard_feed_mob(var/mob/user, var/mob/target) if(!is_open_container()) user << "You need to open [src]!" @@ -74,12 +61,6 @@ return 1 return ..() -/obj/item/weapon/reagent_containers/food/drinks/self_feed_message(var/mob/user) - user << "You swallow a gulp from \the [src]." - -/obj/item/weapon/reagent_containers/food/drinks/feed_sound(var/mob/user) - playsound(user.loc, 'sound/items/drink.ogg', rand(10, 50), 1) - /obj/item/weapon/reagent_containers/food/drinks/examine(mob/user) if(!..(user, 1)) return diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index ed01e8550a1..773f2ef2037 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -19,34 +19,6 @@ var/label_text = "" - var/list/can_be_placed_into = list( - /obj/machinery/chem_master/, - /obj/machinery/chemical_dispenser, - /obj/machinery/reagentgrinder, - /obj/structure/table, - /obj/structure/closet, - /obj/structure/sink, - /obj/item/weapon/storage, - /obj/machinery/atmospherics/unary/cryo_cell, - /obj/machinery/dna_scannernew, - /obj/item/weapon/grenade/chem_grenade, - /mob/living/bot/medbot, - /obj/machinery/computer/pandemic, - /obj/item/weapon/storage/secure/safe, - /obj/machinery/iv_drip, - /obj/machinery/disease2/incubator, - /obj/machinery/disposal, - /mob/living/simple_animal/cow, - /mob/living/simple_animal/hostile/retaliate/goat, - /obj/machinery/computer/centrifuge, - /obj/machinery/sleeper, - /obj/machinery/smartfridge/, - /obj/machinery/biogenerator, - /obj/machinery/constructable_frame, - /obj/machinery/radiocarbon_spectrometer, - /obj/item/weapon/storage/part_replacer - ) - /obj/item/weapon/reagent_containers/glass/Initialize() . = ..() base_name = name @@ -78,26 +50,6 @@ /obj/item/weapon/reagent_containers/glass/AltClick(var/mob/user) set_APTFT() -/obj/item/weapon/reagent_containers/glass/afterattack(var/obj/target, var/mob/user, var/flag) - if(!is_open_container() || !flag) - return - - for(var/type in can_be_placed_into) - if(istype(target, type)) - return - - if(standard_splash_mob(user, target)) - return - if(standard_dispenser_refill(user, target)) - return - if(standard_pour_into(user, target)) - return - - if(reagents && reagents.total_volume) - user << "You splash the solution onto [target]." - reagents.splash(target, reagents.total_volume) - return - /obj/item/weapon/reagent_containers/glass/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/weapon/storage/part_replacer)) if(!reagents || !reagents.total_volume) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 0cfb0b41f14..dcf97311313 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -15,43 +15,35 @@ flags = OPENCONTAINER slot_flags = SLOT_BELT -///obj/item/weapon/reagent_containers/hypospray/Initialize() //comment this to make hypos start off empty -// . = ..() -// reagents.add_reagent("tricordrazine", 30) -// return - -/obj/item/weapon/reagent_containers/hypospray/attack(mob/living/M as mob, mob/user as mob, var/target_zone) - if(!reagents.total_volume) - user << "[src] is empty." - return - if (!istype(M)) - return - +/obj/item/weapon/reagent_containers/hypospray/attack(var/mob/M, var/mob/user, target_zone) + . = ..() var/mob/living/carbon/human/H = M if(istype(H)) - var/obj/item/organ/external/affected = H.get_organ(target_zone) - if(!affected) - user << "\The [H] is missing that limb!" - return - else if(affected.status & ORGAN_ROBOT) - user << "You cannot inject a robotic limb." - return - - user.visible_message("[user] is trying to inject [M] with [src]!","You are trying to inject [M] with [src].") + user.visible_message("[user] is trying to inject \the [M] with \the [src]!","You are trying to inject \the [M] with \the [src].") if(H.run_armor_check(target_zone,"melee",0,"Your armor slows down the injection!","Your armor slows down the injection!")) if(!do_mob(user, M, 60)) return +/obj/item/weapon/reagent_containers/hypospray/afterattack(var/mob/M, var/mob/user, proximity) + + if (!istype(M)) + return ..() + + if(!reagents.total_volume) + to_chat(user,"\The [src] is empty.") + return + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) user.do_attack_animation(M) - M << "You feel a tiny prick!" + to_chat(user,"You inject [M] with [src].") + to_chat(M,"You feel a tiny prick!") playsound(src, 'sound/items/hypospray.ogg',25) if(M.reagents) var/contained = reagentlist() var/trans = reagents.trans_to_mob(M, amount_per_transfer_from_this, CHEM_BLOOD) admin_inject_log(user, M, src, contained, trans) - user << "[trans] units injected. [reagents.total_volume] units remaining in \the [src]." + to_chat(user,"[trans] units injected. [reagents.total_volume] units remaining in \the [src].") return @@ -96,10 +88,10 @@ amount_per_transfer_from_this = 20 /obj/item/weapon/reagent_containers/hypospray/autoinjector/stimpack/Initialize() - . = ..() - reagents.add_reagent("hyperzine", 12) - reagents.add_reagent("tramadol", 8) - update_icon() + . = ..() + reagents.add_reagent("hyperzine", 12) + reagents.add_reagent("tramadol", 8) + update_icon() /obj/item/weapon/reagent_containers/hypospray/autoinjector/survival name = "survival autoinjector" @@ -108,13 +100,13 @@ amount_per_transfer_from_this = 35 /obj/item/weapon/reagent_containers/hypospray/autoinjector/survival/Initialize() - . = ..() - reagents.add_reagent("tricordrazine", 15) - reagents.add_reagent("inaprovaline", 5) - reagents.add_reagent("dexalinp", 5) - reagents.add_reagent("oxycodone", 5) - reagents.add_reagent("methylphenidate", 5) - update_icon() + . = ..() + reagents.add_reagent("tricordrazine", 15) + reagents.add_reagent("inaprovaline", 5) + reagents.add_reagent("dexalinp", 5) + reagents.add_reagent("oxycodone", 5) + reagents.add_reagent("methylphenidate", 5) + update_icon() /obj/item/weapon/reagent_containers/hypospray/combat name = "combat hypospray" @@ -129,5 +121,4 @@ reagents.add_reagent("synaptizine", 5) reagents.add_reagent("hyperzine", 5) reagents.add_reagent("arithrazine", 5) - - return + update_icon() diff --git a/code/modules/reagents/reagent_containers/inhaler.dm b/code/modules/reagents/reagent_containers/inhaler.dm index f1a27f0e329..9e33feffde1 100644 --- a/code/modules/reagents/reagent_containers/inhaler.dm +++ b/code/modules/reagents/reagent_containers/inhaler.dm @@ -14,26 +14,24 @@ flags = OPENCONTAINER slot_flags = SLOT_BELT -/obj/item/weapon/reagent_containers/inhaler/attack(mob/living/M as mob, mob/user as mob) +/obj/item/weapon/reagent_containers/inhaler/afterattack(var/mob/living/carbon/human/H, var/mob/user, proximity) + + if (!istype(H)) + return ..() if(!reagents.total_volume) to_chat(user,"\The [src] is empty.") return - var/mob/living/carbon/human/H = M - - if (!istype(H)) - return - if ( ((CLUMSY in user.mutations) || (DUMB in user.mutations)) && prob(10)) to_chat(user,"Your hand slips from clumsiness!") - eyestab(M,user) - if(M.reagents) + eyestab(H,user) + if(H.reagents) var/contained = reagentlist() - var/trans = reagents.trans_to_mob(M, amount_per_transfer_from_this, CHEM_TOUCH) - admin_inject_log(user, M, src, contained, trans) + var/trans = reagents.trans_to_mob(H, amount_per_transfer_from_this, CHEM_TOUCH) + admin_inject_log(user, H, src, contained, trans) playsound(src.loc, 'sound/items/stimpack.ogg', 50, 1) - user.visible_message("[user] accidentally sticks the [src] in [M]'s eyes!","You accidentally stick the [src] in [M]'s eyes!") + user.visible_message("[user] accidentally sticks the [src] in [H]'s eyes!","You accidentally stick the [src] in [H]'s eyes!") to_chat(user,"[trans] units injected. [reagents.total_volume] units remaining in \the [src].") return @@ -41,30 +39,30 @@ to_chat(user,"You don't have the dexterity to do this!") return - if(user == M) - if(!M.can_eat(src)) + if(user == H) + if(!H.can_eat(src)) return else - if(!M.can_force_feed(user, src)) + if(!H.can_force_feed(user, src)) return user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) - user.do_attack_animation(M) + user.do_attack_animation(H) - if(user == M) + if(user == H) user.visible_message("[user] injects themselves with the [src]","You stick the [src] in your mouth and press the injection button.") else - user.visible_message("[user] attempts to administer \the [src] to [M]...","You attempt to administer \the [src] to [M]...") - if (!do_after(user, 1 SECONDS, act_target = M)) + user.visible_message("[user] attempts to administer \the [src] to [H]...","You attempt to administer \the [src] to [H]...") + if (!do_after(user, 1 SECONDS, act_target = H)) to_chat(user,"You and the target need to be standing still in order to inject \the [src].") return - user.visible_message("[user] injects [M] with the [src].","You stick the [src] in [M]'s mouth and press the injection button.") + user.visible_message("[user] injects [H] with the [src].","You stick the [src] in [H]'s mouth and press the injection button.") - if(M.reagents) + if(H.reagents) var/contained = reagentlist() - var/trans = reagents.trans_to_mob(M, amount_per_transfer_from_this, CHEM_BREATHE, bypass_mask = TRUE) - admin_inject_log(user, M, src, contained, trans) + var/trans = reagents.trans_to_mob(H, amount_per_transfer_from_this, CHEM_BREATHE, bypass_mask = TRUE) + admin_inject_log(user, H, src, contained, trans) playsound(src.loc, 'sound/items/stimpack.ogg', 50, 1) to_chat(user,"[trans] units injected. [reagents.total_volume] units remaining in \the [src].") diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index e577603fd55..4ca154bfc0c 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -26,11 +26,16 @@ if(!usr || usr.stat || usr.lying || usr.restrained() || !Adjacent(usr)) return safety = !safety playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) - usr << "You twist the locking cap on the end of the nozzle, the spraybottle is now [safety ? "locked" : "unlocked"]." + usr << "You twist the locking cap on the end of the nozzle. \The [src] is now [safety ? "locked" : "unlocked"]." /obj/item/weapon/reagent_containers/spray/afterattack(atom/A as mob|obj, mob/user as mob, proximity) - if(istype(A, /obj/item/weapon/storage) || istype(A, /obj/structure/table) || istype(A, /obj/structure/closet) || istype(A, /obj/item/weapon/reagent_containers) || istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart)) + + if(istype(A, /obj/item/weapon/reagent_containers)) + . = ..() + return + + if(is_type_in_list(A,can_be_placed_into)) return if(istype(A, /mob)) @@ -58,8 +63,6 @@ playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6) - - if(reagents.has_reagent("sacid")) message_admins("[key_name_admin(user)] fired sulphuric acid from \a [src].") log_game("[key_name(user)] fired sulphuric acid from \a [src].",ckey=key_name(user)) @@ -199,7 +202,7 @@ var/turf/T2 = get_step(T,turn(direction, -90)) var/list/the_targets = list(T, T1, T2) - for(var/a = 1 to 3) + for(var/a = 1 to spray_size) spawn(0) if(reagents.total_volume < 1) break var/obj/effect/effect/water/chempuff/D = new/obj/effect/effect/water/chempuff(get_turf(src)) @@ -212,6 +215,19 @@ D.set_up(my_target, rand(6, 8), 2) return +/obj/item/weapon/reagent_containers/spray/chemsprayer/xenobiology + name = "xenoblaster" + desc = "A child's plastic watergun repurposed for the use in pacifying slimes. Has an adjustable nozzle that controls precision as well as strength." + icon = 'icons/obj/gun.dmi' + icon_state = "xenoblaster" + item_state = "xenoblaster" + origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1) + volume = 200 + spray_size = 3 + spray_sizes = list(1,3) + amount_per_transfer_from_this = 5 + possible_transfer_amounts = list(5,15) + /obj/item/weapon/reagent_containers/spray/plantbgone name = "Plant-B-Gone" desc = "Kills those pesky weeds!" diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 8f5c40daa76..7cc4194cfd9 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -1,93 +1,130 @@ - - /obj/structure/reagent_dispensers - name = "Dispenser" - desc = "..." + name = "Strange dispenser" + desc = "What the fuck is this?" icon = 'icons/obj/objects.dmi' icon_state = "watertank" density = 1 anchored = 0 + var/accept_any_reagent = TRUE var/amount_per_transfer_from_this = 10 - var/possible_transfer_amounts = list(10,25,50,100) + var/possible_transfer_amounts = list(5,10,15,25,30,50,60,100,120,250,300) var/capacity = 1000 - attackby(obj/item/weapon/W as obj, mob/user as mob) + var/can_tamper = TRUE + var/is_leaking = FALSE + +/obj/structure/reagent_dispensers/Initialize() + . = ..() + create_reagents(capacity) + if (!possible_transfer_amounts) + src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT + +/obj/structure/reagent_dispensers/examine(mob/user) + if(!..(user, 2)) return + to_chat(user,"It contains [reagents.total_volume] units of reagents.") - New() - var/datum/reagents/R = new/datum/reagents(capacity) - reagents = R - R.my_atom = src - if (!possible_transfer_amounts) - src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT - ..() +/obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this + set name = "Set transfer amount" + set category = "Object" + set src in view(1) + var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts + if (N) + amount_per_transfer_from_this = N - examine(mob/user) - if(!..(user, 2)) - return - user << "It contains:" - if(reagents && reagents.reagent_list.len) - for(var/datum/reagent/R in reagents.reagent_list) - user << "[R.volume] units of [R.name]" +/obj/structure/reagent_dispensers/ex_act(severity) + reagents.splash_turf(get_turf(src), reagents.total_volume) + visible_message(span("danger", "\The [src] bursts open, spreading reagents all over the area!")) + qdel(src) + +/obj/structure/reagent_dispensers/attackby(obj/item/O as obj, mob/user as mob) + + var/obj/item/weapon/reagent_containers/RG = O + if (istype(RG) && RG.is_open_container()) + + var/atype + if(accept_any_reagent) + atype = alert(user, "Do you want to fill or empty \the [RG] at \the [src]?", "Fill or Empty", "Fill", "Empty", "Cancel") else - user << "Nothing." + atype = alert(user, "Do you want to fill \the [RG] at \the [src]?", "Fill", "Fill", "Cancel") - verb/set_APTFT() //set amount_per_transfer_from_this - set name = "Set transfer amount" - set category = "Object" - set src in view(1) - var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts - if (N) - amount_per_transfer_from_this = N + if(!user.Adjacent(src)) return + if(RG.loc != user) return - ex_act(severity) - switch(severity) - if(1.0) - qdel(src) - return - if(2.0) - if (prob(50)) - new /obj/effect/effect/water(src.loc) - qdel(src) - return - if(3.0) - if (prob(5)) - new /obj/effect/effect/water(src.loc) - qdel(src) - return - else + switch(atype) + if ("Fill") + RG.standard_dispenser_refill(user,src) + if ("Empty") + if(is_open_container()) + RG.standard_pour_into(user,src) + else + to_chat(user,"The top cap is wrenched on tight!") return + if (iswrench(O)) + if(can_tamper && user.a_intent == I_HURT) + user.visible_message("\The [user] wrenches \the [src]'s faucet [is_leaking ? "closed" : "open"].","You wrench \the [src]'s faucet [is_leaking ? "closed" : "open"]") + is_leaking = !is_leaking + if (is_leaking) + message_admins("[key_name_admin(user)] wrench opened \the [src] at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking reagents. (JMP)") + log_game("[key_name(user)] opened \the [src] at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking reagents.",ckey=key_name(user)) + START_PROCESSING(SSprocessing,src) + else if(accept_any_reagent) + var/is_closed = flags & OPENCONTAINER + var/verb01 = is_closed ? "unwrenches" : "wrenches" + var/verb02 = (is_closed ? "open" : "shut") + user.visible_message("[user] [verb01] the top cap [verb02] from \the [src].", "You [verb01] the top cap [verb02] from \the [src].") + flags ^= OPENCONTAINER + return +/obj/structure/reagent_dispensers/process() + if(!is_leaking || reagents.total_volume <= 0) + STOP_PROCESSING(SSprocessing,src) + return - + var/splash_amount = min(amount_per_transfer_from_this,60) //Hard limit of 60 per process + reagents.trans_to_turf(get_turf(src),splash_amount) //Dispensers /obj/structure/reagent_dispensers/watertank - name = "watertank" + name = "water tank" desc = "A tank filled with water." icon = 'icons/obj/objects.dmi' icon_state = "watertank" amount_per_transfer_from_this = 10 - New() - ..() - reagents.add_reagent("water",capacity) + +/obj/structure/reagent_dispensers/watertank/Initialize() + . = ..() + reagents.add_reagent("water",capacity) + +/obj/structure/reagent_dispensers/extinguisher + name = "extinguisher tank" + desc = "A tank filled with extinguisher fluid." + icon = 'icons/obj/objects.dmi' + icon_state = "extinguisher_tank" + amount_per_transfer_from_this = 10 + +/obj/structure/reagent_dispensers/extinguisher/Initialize() + . = ..() + reagents.add_reagent("monoammoniumphosphate",capacity) /obj/structure/reagent_dispensers/fueltank name = "fuel tank" desc = "A tank filled with welding fuel." icon = 'icons/obj/objects.dmi' icon_state = "weldtank" + accept_any_reagent = FALSE amount_per_transfer_from_this = 10 var/modded = 0 var/defuse = 0 var/armed = 0 var/obj/item/device/assembly_holder/rig = null - New() - ..() - reagents.add_reagent("fuel",capacity) + +/obj/structure/reagent_dispensers/fueltank/Initialize() + . = ..() + reagents.add_reagent("fuel",capacity) /obj/structure/reagent_dispensers/fueltank/examine(mob/user) if(!..(user, 2)) @@ -97,25 +134,17 @@ if(rig) user << "There is some kind of device rigged to the tank." -/obj/structure/reagent_dispensers/fueltank/attack_hand() +/obj/structure/reagent_dispensers/fueltank/attack_hand(mob/user) if (rig) - usr.visible_message("[usr] begins to detach [rig] from \the [src].", "You begin to detach [rig] from \the [src]") - if(do_after(usr, 20)) - usr.visible_message("[usr] detaches [rig] from \the [src].", "You detach [rig] from \the [src]") - rig.forceMove(get_turf(usr)) + user.visible_message("[user] begins to detach [rig] from \the [src].", "You begin to detach [rig] from \the [src]") + if(do_after(user, 20)) + user.visible_message("[user] detaches [rig] from \the [src].", "You detach [rig] from \the [src]") + rig.forceMove(get_turf(user)) rig = null overlays = new/list() /obj/structure/reagent_dispensers/fueltank/attackby(obj/item/weapon/W as obj, mob/user as mob) src.add_fingerprint(user) - if (iswrench(W)) - user.visible_message("[user] wrenches [src]'s faucet [modded ? "closed" : "open"].", \ - "You wrench [src]'s faucet [modded ? "closed" : "open"]") - modded = modded ? 0 : 1 - if (modded) - message_admins("[key_name_admin(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel. (JMP)") - log_game("[key_name(user)] opened fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]), leaking fuel.",ckey=key_name(user)) - leak_fuel(amount_per_transfer_from_this) if (istype(W,/obj/item/device/assembly_holder)) if (rig) user << "There is another device in the way." @@ -158,12 +187,10 @@ log_game("[key_name(Proj.firer)] shot fueltank at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).",ckey=key_name(Proj.firer)) if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) - explode() + ex_act(2.0) -/obj/structure/reagent_dispensers/fueltank/ex_act() - explode() +/obj/structure/reagent_dispensers/fueltank/ex_act(var/severity = 3.0) -/obj/structure/reagent_dispensers/fueltank/proc/explode() if (QDELETED(src)) return @@ -173,31 +200,19 @@ explosion(src.loc,0,1,3) else if (reagents.total_volume > 50) explosion(src.loc,-1,1,2) - if(src) - qdel(src) + + ..() /obj/structure/reagent_dispensers/fueltank/fire_act(datum/gas_mixture/air, temperature, volume) if (modded) - explode() + ex_act(2.0) else if (temperature > T0C+500) - explode() + ex_act(2.0) return ..() /obj/structure/reagent_dispensers/fueltank/tesla_act() ..() - explode() - -/obj/structure/reagent_dispensers/fueltank/Move() - if (..() && modded) - leak_fuel(amount_per_transfer_from_this/10.0) - -/obj/structure/reagent_dispensers/fueltank/proc/leak_fuel(amount) - if (reagents.total_volume == 0) - return - - amount = min(amount, reagents.total_volume) - reagents.remove_reagent("fuel",amount) - new /obj/effect/decal/cleanable/liquid_fuel(src.loc, amount,1) + ex_act(2.0) /obj/structure/reagent_dispensers/peppertank name = "Pepper Spray Refiller" @@ -207,10 +222,11 @@ anchored = 1 density = 0 amount_per_transfer_from_this = 45 - New() - ..() - reagents.add_reagent("condensedcapsaicin",capacity) + can_tamper = FALSE +/obj/structure/reagent_dispensers/peppertank/Initialize() + . = ..() + reagents.add_reagent("condensedcapsaicin",capacity) /obj/structure/reagent_dispensers/water_cooler name = "Water-Cooler" @@ -220,12 +236,15 @@ icon_state = "water_cooler" possible_transfer_amounts = null anchored = 1 - New() - ..() - reagents.add_reagent("water",500) + capacity = 500 + can_tamper = FALSE + +/obj/structure/reagent_dispensers/water_cooler/Initialize() + . = ..() + reagents.add_reagent("water",capacity) /obj/structure/reagent_dispensers/water_cooler/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (iswrench(W)) + if (isscrewdriver(W)) src.add_fingerprint(user) playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) if(do_after(user, 20)) @@ -233,22 +252,22 @@ switch (anchored) if (0) anchored = 1 - user.visible_message("\The [user] tightens the bolts securing \the [src] to the floor.", "You tighten the bolts securing \the [src] to the floor.") + user.visible_message("\The [user] tightens the screws securing \the [src] to the floor.", "You tighten the screws securing \the [src] to the floor.") if (1) - user.visible_message("\The [user] unfastens the bolts securing \the [src] to the floor.", "You unfasten the bolts securing \the [src] to the floor.") + user.visible_message("\The [user] unfastens the screws securing \the [src] to the floor.", "You unfasten the screws securing \the [src] to the floor.") anchored = 0 return - /obj/structure/reagent_dispensers/beerkeg name = "beer keg" desc = "A beer keg" icon = 'icons/obj/objects.dmi' icon_state = "beertankTEMP" amount_per_transfer_from_this = 10 - New() - ..() - reagents.add_reagent("beer",capacity) + +/obj/structure/reagent_dispensers/beerkeg/Initialize() + . = ..() + reagents.add_reagent("beer",capacity) /obj/structure/reagent_dispensers/xuizikeg name = "xuizi juice keg" @@ -256,9 +275,10 @@ icon = 'icons/obj/objects.dmi' icon_state = "keg_xuizi" amount_per_transfer_from_this = 10 - New() - ..() - reagents.add_reagent("xuizijuice",capacity) + +/obj/structure/reagent_dispensers/xuizikeg/Initialize() + . = ..() + reagents.add_reagent("xuizijuice",capacity) /obj/structure/reagent_dispensers/virusfood name = "Virus Food Dispenser" @@ -268,10 +288,11 @@ amount_per_transfer_from_this = 10 anchored = 1 density = 0 + can_tamper = FALSE - New() - ..() - reagents.add_reagent("virusfood", capacity) +/obj/structure/reagent_dispensers/virusfood/Initialize() + . = ..() + reagents.add_reagent("virusfood", capacity) /obj/structure/reagent_dispensers/acid name = "Sulphuric Acid Dispenser" @@ -281,11 +302,11 @@ amount_per_transfer_from_this = 10 anchored = 1 density = 0 + can_tamper = FALSE - New() - ..() - reagents.add_reagent("sacid", capacity) - +/obj/structure/reagent_dispensers/acid/Initialize() + . = ..() + reagents.add_reagent("sacid", capacity) //Cooking oil refill tank /obj/structure/reagent_dispensers/cookingoil @@ -302,12 +323,4 @@ /obj/structure/reagent_dispensers/cookingoil/bullet_act(var/obj/item/projectile/Proj) if(Proj.get_structure_damage()) - explode() - -/obj/structure/reagent_dispensers/cookingoil/ex_act() - explode() - -/obj/structure/reagent_dispensers/cookingoil/proc/explode() - reagents.splash_area(get_turf(src), 3) - visible_message(span("danger", "The [src] bursts open, spreading oil all over the area.")) - qdel(src) + ex_act(2.0) diff --git a/code/modules/research/xenoarchaeology/machinery/coolant.dm b/code/modules/research/xenoarchaeology/machinery/coolant.dm index 62dde2edd56..98115d05bb4 100644 --- a/code/modules/research/xenoarchaeology/machinery/coolant.dm +++ b/code/modules/research/xenoarchaeology/machinery/coolant.dm @@ -4,16 +4,17 @@ icon = 'icons/obj/objects.dmi' icon_state = "coolanttank" amount_per_transfer_from_this = 10 - New() - ..() - reagents.add_reagent("coolant",1000) + +/obj/structure/reagent_dispensers/coolanttank/Initialize() + . = ..() + reagents.add_reagent("coolant",1000) /obj/structure/reagent_dispensers/coolanttank/bullet_act(var/obj/item/projectile/Proj) if(Proj.get_structure_damage()) if(!istype(Proj ,/obj/item/projectile/beam/lastertag) && !istype(Proj ,/obj/item/projectile/beam/practice) ) explode() -/obj/structure/reagent_dispensers/coolanttank/ex_act() +/obj/structure/reagent_dispensers/coolanttank/ex_act(var/severity = 2.0) explode() /obj/structure/reagent_dispensers/coolanttank/proc/explode() diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 4fb37bc7032..c1c53e24d85 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -96,7 +96,7 @@ /obj/machinery/computer/shuttle_control/bullet_act(var/obj/item/projectile/Proj) visible_message("\The [Proj] ricochets off \the [src]!") -/obj/machinery/computer/shuttle_control/ex_act() +/obj/machinery/computer/shuttle_control/ex_act(var/severity = 2.0) return /obj/machinery/computer/shuttle_control/emp_act() diff --git a/code/modules/spells/spell_projectile.dm b/code/modules/spells/spell_projectile.dm index 26ffcc0080e..fd1ed3927f9 100644 --- a/code/modules/spells/spell_projectile.dm +++ b/code/modules/spells/spell_projectile.dm @@ -21,7 +21,7 @@ carried = null return ..() -/obj/item/projectile/spell_projectile/ex_act() +/obj/item/projectile/spell_projectile/ex_act(var/severity = 2.0) return /obj/item/projectile/spell_projectile/before_move() diff --git a/html/changelogs/burgerbb-extinguishers.yml b/html/changelogs/burgerbb-extinguishers.yml new file mode 100644 index 00000000000..a59ac9f2d0f --- /dev/null +++ b/html/changelogs/burgerbb-extinguishers.yml @@ -0,0 +1,45 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +# balance +################################# + +# Your name. +author: BurgerBB + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Added Monoammonium Phosphate, a reagent that excels in extinguishing fires, and acts as a fertilizer. They are now found in fire extinguishers instead of water. Added Monoammonium Phosphate tanks around the station in place of some water tanks." + - rscadd: "Added a new weak chem sprayer, 'Xenoblaster', which can be found in xenobiology for xenobiologists." + - tweak: "Fire extinguishers can be filled with any reagent using an extinguisher cartridge. Extinguisher cartridges can be ordered by cargo, or found in atmospherics." + - tweak: "Reagent dispensers, such as watertanks and beer kegs, can now be filled with any reagent. Fuel tanks are an exception." + - rscadd: "Most mobile reagent dispensers can leak their contents if you use harm intent wrench on them. Changed how leaking works." + - tweak: "Reworked how reagent containers (glass beakers, drinks) behave on interaction. You can splash anyone with any container on harm intent, and drink/use them on other intents." + - maptweak: "Added a fire storage area in atmospherics that contains firefighting equipment and Monoammonium Phosphate containers." + - rscadd: "Lube and water can be spread to other tiles if there is too much water or lube on one tile." + diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 44a922abfe9..afdce76bf32 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi index 82f7e3986fa..e148910c7e4 100644 Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ diff --git a/icons/mob/items/lefthand_guns.dmi b/icons/mob/items/lefthand_guns.dmi index d0902769f47..ae2a548d25f 100644 Binary files a/icons/mob/items/lefthand_guns.dmi and b/icons/mob/items/lefthand_guns.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index 139a72b587c..e0d072c0264 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index 5287b7f2c6b..8f9f78ba869 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 64dc6577d53..6d515260b1d 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/maps/aurora/aurora-3_sublevel.dmm b/maps/aurora/aurora-3_sublevel.dmm index 3c22b666c6b..f73c99f58d1 100644 --- a/maps/aurora/aurora-3_sublevel.dmm +++ b/maps/aurora/aurora-3_sublevel.dmm @@ -18888,7 +18888,7 @@ }, /obj/structure/window/reinforced, /obj/effect/floor_decal/industrial/hatch/yellow, -/obj/structure/reagent_dispensers/watertank, +/obj/structure/reagent_dispensers/extinguisher, /turf/simulated/floor/tiled/white, /area/outpost/research/hallway) "Hr" = ( @@ -27806,6 +27806,10 @@ }, /turf/simulated/floor/reinforced, /area/rnd/xenobiology/cells/delta) +"Xg" = ( +/obj/structure/reagent_dispensers/extinguisher, +/turf/simulated/floor/plating, +/area/maintenance/sublevel) "Xh" = ( /obj/machinery/disposal/deliveryChute{ dir = 8; @@ -29268,6 +29272,12 @@ }, /turf/simulated/floor/plating, /area/maintenance/research_xenobiology) +"ZE" = ( +/obj/structure/table/standard, +/obj/item/weapon/reagent_containers/spray/chemsprayer/xenobiology, +/obj/item/weapon/reagent_containers/spray/chemsprayer/xenobiology, +/turf/simulated/floor/tiled/white, +/area/rnd/xenobiology) (1,1,1) = {" aa @@ -51522,7 +51532,7 @@ CO DT ES BW -Gz +Xg Jp Im Fa @@ -55388,7 +55398,7 @@ Pp It Vg VY -VY +ZE It It WV diff --git a/maps/aurora/aurora-4_mainlevel.dmm b/maps/aurora/aurora-4_mainlevel.dmm index 68602f70533..9549aa6b75d 100644 --- a/maps/aurora/aurora-4_mainlevel.dmm +++ b/maps/aurora/aurora-4_mainlevel.dmm @@ -648,7 +648,7 @@ /turf/simulated/floor/plating, /area/maintenance/security_starboard) "abn" = ( -/obj/structure/reagent_dispensers/watertank, +/obj/structure/reagent_dispensers/extinguisher, /turf/simulated/floor/plating, /area/maintenance/security_starboard) "abo" = ( @@ -4032,6 +4032,33 @@ }, /turf/simulated/floor/tiled, /area/security/brig) +"aih" = ( +/obj/item/stack/tile/floor, +/obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/floor/tiled, +/area/maintenance/civ) +"aii" = ( +/obj/structure/reagent_dispensers/extinguisher, +/turf/simulated/floor/plating, +/area/maintenance/engineering) +"aij" = ( +/obj/structure/reagent_dispensers/extinguisher, +/obj/effect/floor_decal/corner/blue{ + icon_state = "corner_white"; + dir = 6 + }, +/turf/simulated/floor/tiled/dark, +/area/ai_monitored/storage/eva) +"aik" = ( +/obj/item/weapon/reagent_containers/glass/bucket, +/obj/machinery/camera/network/prison{ + c_tag = "Security - Communal Brig Aft"; + dir = 1 + }, +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/floor/tiled, +/area/security/prison) "ail" = ( /obj/structure/table/standard, /obj/item/weapon/paper_bin, @@ -4414,9 +4441,22 @@ /obj/machinery/door/firedoor, /turf/simulated/floor/plating, /area/security/brig) +"aiZ" = ( +/obj/structure/reagent_dispensers/extinguisher, +/turf/simulated/floor/plating, +/area/maintenance/maintcentral) "aja" = ( /turf/simulated/wall, /area/security/main) +"ajb" = ( +/obj/item/weapon/reagent_containers/glass/bucket, +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/floor/tiled/dark, +/area/janitor) "ajc" = ( /obj/structure/window/reinforced{ icon_state = "rwindow"; @@ -4734,6 +4774,61 @@ /obj/machinery/firealarm/west, /turf/simulated/floor/tiled, /area/security/brig) +"ajI" = ( +/obj/structure/reagent_dispensers/extinguisher, +/turf/simulated/floor/plating, +/area/storage/emergency) +"ajJ" = ( +/obj/item/weapon/reagent_containers/glass/bucket, +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/floor/tiled/dark, +/area/janitor) +"ajK" = ( +/obj/structure/reagent_dispensers/extinguisher, +/turf/simulated/floor/plating, +/area/maintenance/research_port) +"ajL" = ( +/obj/structure/reagent_dispensers/extinguisher, +/obj/structure/cable/green{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plating, +/area/maintenance/medbay) +"ajM" = ( +/obj/item/weapon/reagent_containers/glass/bucket, +/obj/effect/floor_decal/corner/green{ + dir = 10 + }, +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/floor/tiled/white, +/area/rnd/xenobiology/xenoflora) +"ajN" = ( +/obj/machinery/status_display{ + pixel_x = 0; + pixel_y = 32 + }, +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/floor/tiled, +/area/hydroponics) +"ajO" = ( +/obj/effect/floor_decal/industrial/outline/yellow, +/obj/item/device/radio/intercom{ + pixel_x = 0; + pixel_y = 27 + }, +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/floor/tiled, +/area/hydroponics) "ajP" = ( /obj/structure/closet/secure_closet/security, /obj/effect/floor_decal/industrial/outline/yellow, @@ -4845,11 +4940,9 @@ /turf/simulated/floor/tiled, /area/maintenance/civ) "akb" = ( -/obj/item/stack/tile/floor, -/obj/structure/reagent_dispensers/watertank, -/obj/effect/decal/cleanable/dirt, -/turf/simulated/floor/tiled, -/area/maintenance/civ) +/obj/structure/reagent_dispensers/extinguisher, +/turf/simulated/floor/plating, +/area/maintenance/library) "akc" = ( /obj/machinery/alarm{ dir = 4; @@ -5214,6 +5307,30 @@ }, /turf/simulated/floor/tiled, /area/security/brig) +"akF" = ( +/obj/structure/window/reinforced{ + icon_state = "rwindow"; + dir = 1 + }, +/obj/structure/reagent_dispensers/watertank, +/turf/simulated/floor/grass, +/area/hydroponics) +"akG" = ( +/obj/structure/fireaxecabinet{ + pixel_x = -32 + }, +/obj/structure/closet/crate/extinguisher_catridges, +/turf/simulated/floor/tiled, +/area/engineering/atmos/storage) +"akH" = ( +/obj/structure/table/standard, +/obj/machinery/cell_charger, +/obj/structure/sign/nosmoking_2{ + pixel_x = -32 + }, +/obj/item/device/multitool, +/turf/simulated/floor/tiled, +/area/engineering/atmos/storage) "akN" = ( /obj/structure/morgue{ icon_state = "morgue1"; @@ -5419,14 +5536,6 @@ /obj/structure/cable/green, /turf/simulated/floor/plating, /area/maintenance/atmos_control) -"ali" = ( -/obj/structure/table/standard, -/obj/item/device/multitool, -/obj/structure/fireaxecabinet{ - pixel_x = -32 - }, -/turf/simulated/floor/tiled, -/area/engineering/atmos/storage) "alj" = ( /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 @@ -5811,14 +5920,6 @@ /obj/machinery/shield_gen, /turf/simulated/floor/plating, /area/engineering/storage) -"amf" = ( -/obj/structure/table/standard, -/obj/machinery/cell_charger, -/obj/structure/sign/nosmoking_2{ - pixel_x = -32 - }, -/turf/simulated/floor/tiled, -/area/engineering/atmos/storage) "amg" = ( /turf/simulated/floor/tiled, /area/engineering/atmos/storage) @@ -12859,10 +12960,6 @@ "ayE" = ( /turf/simulated/wall, /area/maintenance/substation/engineering) -"ayF" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/simulated/floor/plating, -/area/maintenance/engineering) "ayG" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, @@ -24992,14 +25089,6 @@ /obj/structure/reagent_dispensers/fueltank, /turf/simulated/floor/tiled/dark, /area/ai_monitored/storage/eva) -"aSL" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/floor_decal/corner/blue{ - icon_state = "corner_white"; - dir = 6 - }, -/turf/simulated/floor/tiled/dark, -/area/ai_monitored/storage/eva) "aSM" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -25330,15 +25419,6 @@ /obj/machinery/light, /turf/simulated/floor/tiled, /area/security/prison) -"aTp" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/item/weapon/reagent_containers/glass/bucket, -/obj/machinery/camera/network/prison{ - c_tag = "Security - Communal Brig Aft"; - dir = 1 - }, -/turf/simulated/floor/tiled, -/area/security/prison) "aTq" = ( /obj/structure/closet/crate/trashcart, /obj/item/toy/figure/secofficer{ @@ -26801,10 +26881,6 @@ /obj/structure/sign/drop, /turf/simulated/wall, /area/outpost/mining_main/eva) -"aWo" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/simulated/floor/plating, -/area/maintenance/maintcentral) "aWp" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 @@ -30105,15 +30181,6 @@ }, /turf/simulated/floor/tiled/dark, /area/janitor) -"bcb" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/item/weapon/reagent_containers/glass/bucket, -/obj/effect/floor_decal/industrial/outline/yellow, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/simulated/floor/tiled/dark, -/area/janitor) "bcc" = ( /turf/simulated/wall/r_wall, /area/storage/tech) @@ -30354,10 +30421,6 @@ }, /turf/simulated/floor/tiled, /area/hallway/primary/central_one) -"bcA" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/simulated/floor/plating, -/area/storage/emergency) "bcB" = ( /obj/machinery/space_heater, /obj/machinery/light/small, @@ -30880,12 +30943,6 @@ }, /turf/simulated/floor/tiled/dark, /area/janitor) -"bdw" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/item/weapon/reagent_containers/glass/bucket, -/obj/effect/floor_decal/industrial/outline/yellow, -/turf/simulated/floor/tiled/dark, -/area/janitor) "bdx" = ( /obj/structure/table/rack{ dir = 8; @@ -35582,10 +35639,6 @@ /obj/structure/ladder/up, /turf/simulated/floor/plating, /area/bridge/aibunker) -"bly" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/simulated/floor/plating, -/area/maintenance/research_port) "blz" = ( /obj/structure/cable{ d1 = 1; @@ -47487,14 +47540,6 @@ }, /turf/simulated/floor/tiled/white, /area/rnd/xenobiology/xenoflora) -"bFg" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/item/weapon/reagent_containers/glass/bucket, -/obj/effect/floor_decal/corner/green{ - dir = 10 - }, -/turf/simulated/floor/tiled/white, -/area/rnd/xenobiology/xenoflora) "bFh" = ( /obj/effect/floor_decal/corner/green{ icon_state = "corner_white"; @@ -53560,10 +53605,6 @@ temperature = 253.15 }, /area/crew_quarters/kitchen) -"bTi" = ( -/obj/structure/reagent_dispensers/watertank, -/turf/simulated/floor/plating, -/area/maintenance/library) "bTj" = ( /obj/machinery/door/airlock/maintenance, /obj/machinery/door/firedoor, @@ -59683,21 +59724,6 @@ }, /turf/simulated/floor/plating, /area/maintenance/medbay) -"chD" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/structure/cable/green{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 - }, -/turf/simulated/floor/plating, -/area/maintenance/medbay) "chE" = ( /obj/machinery/atmospherics/pipe/zpipe/up/scrubbers{ icon_state = "up-scrubbers"; @@ -61306,24 +61332,6 @@ }, /turf/simulated/floor/tiled, /area/hydroponics) -"coq" = ( -/obj/machinery/status_display{ - pixel_x = 0; - pixel_y = 32 - }, -/obj/effect/floor_decal/industrial/outline/yellow, -/obj/structure/reagent_dispensers/watertank, -/turf/simulated/floor/tiled, -/area/hydroponics) -"cor" = ( -/obj/effect/floor_decal/industrial/outline/yellow, -/obj/structure/reagent_dispensers/watertank, -/obj/item/device/radio/intercom{ - pixel_x = 0; - pixel_y = 27 - }, -/turf/simulated/floor/tiled, -/area/hydroponics) "cos" = ( /obj/machinery/light{ dir = 1; @@ -61738,14 +61746,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/grass, /area/hydroponics) -"cpl" = ( -/obj/structure/window/reinforced{ - icon_state = "rwindow"; - dir = 1 - }, -/obj/structure/reagent_dispensers/watertank, -/turf/simulated/floor/grass, -/area/hydroponics) "cpm" = ( /obj/structure/window/reinforced{ dir = 4 @@ -79581,7 +79581,7 @@ aYc bhv biY aKj -bly +ajK aLT aKi aaa @@ -80886,7 +80886,7 @@ baJ baJ bFV bGX -bly +ajK baJ baJ baJ @@ -81373,8 +81373,8 @@ aWU aYe aZB aZC -bcb -bdw +ajb +ajJ beK cob bhy @@ -83442,7 +83442,7 @@ aKl bpG bqP brV -bly +ajK aLT baJ baJ @@ -84171,8 +84171,8 @@ ahY aiO agD akv -ali -amf +akG +akH anh aoh ctr @@ -87534,7 +87534,7 @@ aFj aNZ aFj aFj -aSL +aij aUv aVz aXi @@ -88336,7 +88336,7 @@ bBq bCq bDj bEk -bFg +ajM bGg bHn bIu @@ -88807,7 +88807,7 @@ asf atO aos axb -ayF +aii afr aaa aDm @@ -90157,7 +90157,7 @@ coo coB coO coZ -cpl +akF cpu cqa cqa @@ -90667,7 +90667,7 @@ baK btm bAi bRL -coq +ajN coF coQ cpb @@ -90924,7 +90924,7 @@ bMD bQB bMD bRL -cor +ajO coF coR bSO @@ -91173,7 +91173,7 @@ baK baK bMC bCe -bly +ajK bMD bOW bPy @@ -96022,7 +96022,7 @@ aLc aYK aZU bbc -bcA +ajI bdV bfo bgB @@ -97607,7 +97607,7 @@ bPJ bPO bQQ bSt -bTi +akb bMi bMj bMj @@ -98842,7 +98842,7 @@ aFK aOz aQe azb -aTp +aik aPU awc aLc @@ -104498,7 +104498,7 @@ aQr aRU aTB aQt -aWo +aiZ aXD aYY bah @@ -105037,7 +105037,7 @@ bub bub bub bub -chD +ajL bok bmK biL @@ -106785,7 +106785,7 @@ aeO aeO aiy ael -akb +aih akW adl adI @@ -107077,7 +107077,7 @@ bdg aOM bfP bds -aWo +aiZ biL blh bmK diff --git a/maps/aurora/aurora-6_surface.dmm b/maps/aurora/aurora-6_surface.dmm index 7719c5e0951..c25299e1f6f 100644 --- a/maps/aurora/aurora-6_surface.dmm +++ b/maps/aurora/aurora-6_surface.dmm @@ -841,7 +841,7 @@ /turf/simulated/floor/plating, /area/tcommsat/computer) "bD" = ( -/obj/structure/reagent_dispensers/watertank, +/obj/structure/reagent_dispensers/extinguisher, /obj/effect/floor_decal/industrial/outline/yellow, /turf/simulated/floor/tiled/dark, /area/tcommsat/computer) @@ -9825,7 +9825,7 @@ /turf/simulated/floor/tiled, /area/storage/primary) "rP" = ( -/obj/structure/reagent_dispensers/watertank, +/obj/structure/reagent_dispensers/extinguisher, /turf/simulated/floor/tiled, /area/storage/primary) "rQ" = ( @@ -11670,7 +11670,7 @@ /turf/simulated/floor/tiled, /area/crew_quarters/locker) "vD" = ( -/obj/structure/reagent_dispensers/watertank, +/obj/structure/reagent_dispensers/extinguisher, /turf/simulated/floor/tiled, /area/crew_quarters/locker) "vE" = ( @@ -15327,7 +15327,7 @@ /turf/simulated/floor/tiled/dark, /area/crew_quarters/fitness) "Cg" = ( -/obj/structure/reagent_dispensers/watertank, +/obj/structure/reagent_dispensers/extinguisher, /turf/simulated/floor/plating, /area/maintenance/arrivals) "Ch" = ( @@ -15494,7 +15494,7 @@ /turf/simulated/floor/tiled, /area/storage/tools) "CF" = ( -/obj/structure/reagent_dispensers/watertank, +/obj/structure/reagent_dispensers/extinguisher, /turf/simulated/floor/tiled, /area/storage/tools) "CG" = ( @@ -16026,8 +16026,8 @@ /turf/simulated/floor/tiled, /area/hallway/secondary/entry/aft) "DQ" = ( -/obj/structure/reagent_dispensers/watertank, /obj/effect/decal/cleanable/dirt, +/obj/structure/reagent_dispensers/watertank, /turf/simulated/floor/plating, /area/hallway/secondary/entry/aft) "DR" = ( diff --git a/vueui/install b/vueui/install old mode 100644 new mode 100755