From c745a6f6b5efb6df62229c77dde1c32585f7154b Mon Sep 17 00:00:00 2001 From: Hockaa <69127651+Hockaa@users.noreply.github.com> Date: Wed, 4 Nov 2020 10:17:37 +0000 Subject: [PATCH] Adds improvised shrapnel grenades (#10392) --- code/game/machinery/autolathe_datums.dm | 5 + .../items/weapons/grenades/fragmentation.dm | 5 +- code/game/objects/items/weapons/landmines.dm | 2 +- code/game/objects/items/weapons/tools.dm | 56 ++++ .../modules/mob/living/silicon/robot/robot.dm | 2 +- .../living/simple_animal/hostile/hivebot.dm | 2 +- .../reagents/reagent_containers/food/cans.dm | 241 +++++++++++++++++- html/changelogs/hockaa-weldercansfix.yml | 7 + icons/obj/fuses.dmi | Bin 0 -> 596 bytes icons/obj/tools.dmi | Bin 11293 -> 12980 bytes 10 files changed, 304 insertions(+), 16 deletions(-) create mode 100644 html/changelogs/hockaa-weldercansfix.yml create mode 100644 icons/obj/fuses.dmi diff --git a/code/game/machinery/autolathe_datums.dm b/code/game/machinery/autolathe_datums.dm index 69dc941d9ee..8a7cbdc2022 100644 --- a/code/game/machinery/autolathe_datums.dm +++ b/code/game/machinery/autolathe_datums.dm @@ -378,6 +378,11 @@ path = /obj/item/device/destTagger category = "General" +/datum/autolathe/recipe/steelwool + name = "steel wool" + path = /obj/item/steelwool + category = "Tools" + /datum/autolathe/recipe/debugger name = "debugger" path = /obj/item/device/debugger diff --git a/code/game/objects/items/weapons/grenades/fragmentation.dm b/code/game/objects/items/weapons/grenades/fragmentation.dm index 7d37f111df3..b7545ca275a 100644 --- a/code/game/objects/items/weapons/grenades/fragmentation.dm +++ b/code/game/objects/items/weapons/grenades/fragmentation.dm @@ -1,4 +1,4 @@ -proc/fragem(var/source,var/fragx,var/fragy,var/light_dam,var/flash_dam,var/p_dam,var/p_range,var/can_cover=1) +proc/fragem(var/source,var/fragx,var/fragy,var/light_dam,var/flash_dam,var/p_dam,var/p_range,var/can_cover=TRUE,var/shard_range = 50) var/turf/O = get_turf(source) var/fragger = rand(fragx,fragy) explosion(O, -1, -1, light_dam, flash_dam) @@ -13,6 +13,7 @@ proc/fragem(var/source,var/fragx,var/fragy,var/light_dam,var/flash_dam,var/p_dam P.pellets = fragments_per_projectile P.range_step = p_range P.shot_from = source + P.range = shard_range P.name = "shrapnel" P.launch_projectile(T) @@ -55,6 +56,6 @@ proc/fragem(var/source,var/fragx,var/fragy,var/light_dam,var/flash_dam,var/p_dam set waitfor = 0 ..() - fragem(src,num_fragments,num_fragments,explosion_size,explosion_size+1,fragment_damage,damage_step,1) + fragem(src,num_fragments,num_fragments,explosion_size,explosion_size+1,fragment_damage,damage_step,TRUE) qdel(src) diff --git a/code/game/objects/items/weapons/landmines.dm b/code/game/objects/items/weapons/landmines.dm index 8cb14debfd6..d4a674ef475 100644 --- a/code/game/objects/items/weapons/landmines.dm +++ b/code/game/objects/items/weapons/landmines.dm @@ -128,7 +128,7 @@ /obj/item/landmine/frag/trigger(mob/living/L) spark(src, 3, alldirs) - fragem(src,num_fragments,num_fragments,explosion_size,explosion_size+1,fragment_damage,damage_step,1) + fragem(src,num_fragments,num_fragments,explosion_size,explosion_size+1,fragment_damage,damage_step,TRUE) qdel(src) /obj/item/landmine/radiation diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index b57b1c976f7..2f5ee70a475 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -768,3 +768,59 @@ playsound(loc, 'sound/items/change_drill.ogg', 50, 1) update_tool() return TRUE + +/obj/item/steelwool + name = "steel wool" + desc = "Harvested from the finest NanoTrasen steel sheep." + icon = 'icons/obj/tools.dmi' + icon_state = "steel_wool" + flags = NOBLUDGEON + w_class = ITEMSIZE_SMALL + var/lit + matter = list(MATERIAL_STEEL = 40) + +/obj/item/steelwool/isFlameSource() + return lit + +/obj/item/steelwool/attackby(obj/item/W, mob/user) + if(W.isFlameSource()) + ignite(W, user) + else if(istype(W, /obj/item/cell)) + var/obj/item/cell/S = W + if(S.charge) + ignite(W, user) + else + to_chat(user, SPAN_WARNING("The cell isn't charged!")) + +/obj/item/steelwool/fire_act() + ignite() + +/obj/item/steelwool/proc/ignite(var/L, mob/user) + if(lit && user) + to_chat(user, SPAN_WARNING("The steel wool is already lit!")) + return + else + lit = TRUE + if(user) + user.visible_message(SPAN_NOTICE("[user] ignites the steel wool with \the [L]."), SPAN_NOTICE("You ignite the steel wool with \the [L]"), SPAN_NOTICE("You hear a gentle flame crackling.")) + playsound(get_turf(src), 'sound/items/flare.ogg', 50) + desc += " Watch your hands!" + icon_state = "burning_wool" + set_light(2, 2, LIGHT_COLOR_LAVA) + addtimer(CALLBACK(src, .proc/endburn), 120 SECONDS, TIMER_UNIQUE) + +/obj/item/steelwool/proc/endburn() + visible_message(SPAN_NOTICE("The steel wool burns out.")) + if(ishuman(loc)) + var/mob/living/carbon/human/user = loc + if(!user.gloves) + var/UserLoc = get_equip_slot() + if(UserLoc == slot_l_hand) + user.apply_damage(5, BURN, BP_L_HAND) + to_chat(user, SPAN_DANGER("The steel wool burns your left hand!")) + else if(UserLoc == slot_r_hand) + user.apply_damage(5, BURN, BP_R_HAND) + to_chat(user, SPAN_DANGER("The steel wool burns your right hand!")) + + new /obj/effect/decal/cleanable/ash(get_turf(src)) + qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index aa916c5d949..1aaca2a2068 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1019,7 +1019,7 @@ /mob/living/silicon/robot/proc/self_destruct() density = FALSE - fragem(src, 50, 100, 2, 1, 5, 1, 0) + fragem(src, 50, 100, 2, 1, 5, 1, FALSE) gib() /mob/living/silicon/robot/update_canmove() // to fix lockdown issues w/ chairs diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 50da1d7a402..1383f22cde3 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -121,7 +121,7 @@ burst() /mob/living/simple_animal/hostile/hivebot/bomber/proc/burst() - fragem(src,10,30,2,3,5,1,0) + fragem(src,10,30,2,3,5,1,FALSE) src.gib() /mob/living/simple_animal/hostile/hivebot/range diff --git a/code/modules/reagents/reagent_containers/food/cans.dm b/code/modules/reagents/reagent_containers/food/cans.dm index b4a2105ea1f..771a78490ce 100644 --- a/code/modules/reagents/reagent_containers/food/cans.dm +++ b/code/modules/reagents/reagent_containers/food/cans.dm @@ -1,4 +1,18 @@ +#define LETHAL_FUEL_CAPACITY 21 // this many units of fuel will cause a harmful explosion +#define FUSELENGTH_MAX 10 // this is the longest a fuse can be +#define FUSELENGTH_MIN 3 // and the minimum that the builder can intentionally make +#define FUSELENGTH_SHORT 5 // the upper boundary of the short fuse +#define FUSELENGTH_LONG 6 // the lower boundary of the long fuse +#define BOMBCASING_EMPTY 0 // no grenade casing +#define BOMBCASING_LOOSE 1 // it's in a grenade casing but not secured +#define BOMBCASING_SECURE 2 // it's in a grenade casing and secured - shrapnel count increased + /obj/item/reagent_containers/food/drinks/cans + var/fuselength = 0 + var/fuselit + var/bombcasing + var/shrapnelcount = 7 + var/list/can_size_overrides = list("x" = 0, "y" = -3) // position of the can's opening - make sure to take away 16 from X and 23 from Y volume = 40 //just over one and a half cups amount_per_transfer_from_this = 5 flags = 0 //starts closed @@ -24,6 +38,210 @@ return TRUE . = ..() +/obj/item/reagent_containers/food/drinks/cans/update_icon() + cut_overlays() + if(fuselength) + var/image/fuseoverlay = image('icons/obj/fuses.dmi', icon_state = "fuse_short") + switch(fuselength) + if(FUSELENGTH_LONG to INFINITY) + fuseoverlay.icon_state = "fuse_long" + if(fuselit) + fuseoverlay.icon_state = "lit_fuse" + fuseoverlay.pixel_x = can_size_overrides["x"] + fuseoverlay.pixel_y = can_size_overrides["y"] + add_overlay(fuseoverlay) + if(bombcasing > BOMBCASING_EMPTY) + var/image/casingoverlay = image('icons/obj/fuses.dmi', icon_state = "pipe_bomb") + add_overlay(casingoverlay) + +/obj/item/reagent_containers/food/drinks/cans/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/grenade/chem_grenade/large)) + var/obj/item/grenade/chem_grenade/grenade_casing = W + if(!grenade_casing.detonator && !length(grenade_casing.beakers) && bombcasing < BOMBCASING_LOOSE) + bombcasing = BOMBCASING_LOOSE + desc = "A grenade casing with \a [name] slotted into it." + if(fuselength) + desc += " It has some steel wool stuffed into the opening." + user.visible_message(SPAN_NOTICE("[user] slots \the [grenade_casing] over \the [name]."), SPAN_NOTICE("You slot \the [grenade_casing] over \the [name].")) + desc = "A grenade casing with \a [name] slotted into it." + qdel(grenade_casing) + update_icon() + + if(W.isscrewdriver() && bombcasing > BOMBCASING_EMPTY) + if(bombcasing == BOMBCASING_LOOSE) + bombcasing = BOMBCASING_SECURE + shrapnelcount = 14 + user.visible_message(SPAN_NOTICE("[user] tightens the grenade casing around \the [name]."), SPAN_NOTICE("You tighten the grenade casing around \the [name].")) + else if(bombcasing == BOMBCASING_SECURE) + bombcasing = BOMBCASING_EMPTY + shrapnelcount = initial(shrapnelcount) + desc = initial(desc) + if(fuselength) + desc += " It has some steel wool stuffed into the opening." + user.visible_message(SPAN_NOTICE("[user] removes \the [name] from the grenade casing."), SPAN_NOTICE("You remove \the [name] from the grenade casing.")) + new /obj/item/grenade/chem_grenade/large(get_turf(src)) + playsound(loc, W.usesound, 50, 1) + update_icon() + + if(istype(W, /obj/item/steelwool)) + if(is_open_container()) + switch(fuselength) + if(-INFINITY to FUSELENGTH_MAX) + user.visible_message("[user] stuffs some steel wool into \the [name].", SPAN_NOTICE("You feed steel wool into \the [name], ruining it in the process. It will last approximately 10 seconds.")) + fuselength = FUSELENGTH_MAX + update_icon() + desc += " It has some steel wool stuffed into the opening." + if(W.isFlameSource()) + light_fuse(W, user, TRUE) + qdel(W) + if(FUSELENGTH_MAX) + to_chat(user, SPAN_WARNING("You cannot make the fuse longer than 10 seconds!")) + else + to_chat(user, SPAN_WARNING("There is no opening on \the [name] for the steel wool!")) + + else if(W.iswirecutter() && fuselength) + switch(fuselength) + if(1 to FUSELENGTH_MIN) // you can't increase the fuse with wirecutters and you can't trim it down below 3, so just remove it outright. + user.visible_message("[user] removes the steel wool from \the [name].", SPAN_NOTICE("You remove the steel wool fuse from \the [name].")) + FuseRemove() + if(4 to FUSELENGTH_MAX) + var/fchoice = alert("Do you want to shorten or remove the fuse on \the [name]?", "Shorten or Remove", "Shorten", "Remove", "Cancel") + switch(fchoice) + if("Shorten") + var/short = input("How many seconds do you want the fuse to be?", "[name] fuse") as null|num + if(!use_check_and_message(user)) + if(short < fuselength && short >= FUSELENGTH_MIN) + to_chat(user, SPAN_NOTICE("You shorten the fuse to [short] seconds.")) + FuseRemove(fuselength - short) + else if(!short && !isnull(short)) + user.visible_message("[user] removes the steel wool from \the [name]", SPAN_NOTICE("You remove the steel wool fuse from \the [name].")) + FuseRemove() + else if(short == fuselength || isnull(short)) + to_chat(user, SPAN_NOTICE("You decide against modifying the fuse.")) + else if (short > fuselength) + to_chat(user, SPAN_WARNING("You cannot make the fuse longer than it already is!")) + else if(short in list(1,2)) + to_chat(user, SPAN_WARNING("The fuse cannot be shorter than 3 seconds!")) + else + return + if("Remove") + if(!use_check_and_message(user)) + user.visible_message("[user] removes the steel wool from \the [name].", "You remove the steel wool fuse from \the [name].") + FuseRemove() + if("Cancel") + return + return + + else if(W.isFlameSource() && fuselength) + light_fuse(W, user) + . = ..() + +/obj/item/reagent_containers/food/drinks/cans/proc/light_fuse(obj/item/W, mob/user, var/premature=FALSE) + if(can_light()) + fuselit = TRUE + update_icon() + set_light(2, 2, LIGHT_COLOR_LAVA) + if(reagents.get_reagent_amount(/datum/reagent/fuel) >= LETHAL_FUEL_CAPACITY && user) + msg_admin_attack("[user] ([user.ckey]) lit the fuse on an improvised [name] grenade. (JMP)",ckey=key_name(user)) + if(fuselength >= FUSELENGTH_MIN && fuselength <= FUSELENGTH_SHORT) + user.visible_message(SPAN_DANGER("[user] accidentally takes \the [W] too close to \the [name]'s opening!")) + detonate(TRUE) // it'd be a bit dull if the toy-levels of fuel had a chance to insta-pop, it's mostly just a way to keep the grenade balance in check + if(fuselength < FUSELENGTH_MIN) + user.visible_message(SPAN_DANGER("[user] tries to light the fuse on \the [name] but it was too short!"), SPAN_DANGER("You try to light the fuse but it was too short!")) + detonate(TRUE) // if you're somehow THAT determined and/or ignorant you managed to get the fuse below 3 seconds, so be it. reap what you sow. + else + if(premature) + user.visible_message(SPAN_WARNING("[user] prematurely starts \the [name]'s fuse!"), SPAN_WARNING("You prematurely start \the [name]'s fuse!")) + else + user.visible_message(SPAN_WARNING("[user] lights the steel wool on \the [name] with \the [W]!"), SPAN_WARNING("You light the steel wool on \the [name] with the [W]!")) + playsound(get_turf(src), 'sound/items/flare.ogg', 50) + detonate(FALSE) + +/obj/item/reagent_containers/food/drinks/cans/proc/detonate(var/instant) + var/fuel = reagents.get_reagent_amount(/datum/reagent/fuel) + if(instant) + fuselength = 0 + else if(prob(fuselength * 6)) // the longer the fuse, the higher chance it will fizzle out (18% chance minimum) + var/fizzle = rand(1, fuselength - 1) + sleep(fizzle * 1 SECOND) + + fuselength -= fizzle + visible_message(SPAN_WARNING("The fuse on \the [name] fizzles out early.")) + playsound(get_turf(src), 'sound/items/cigs_lighters/cig_snuff.ogg', 50) + fuselit = FALSE + set_light(0, 0) + update_icon() + return + else + fuselength += rand(-2, 2) // if the fuse isn't fizzling out or detonating instantly, make it a little harder to predict the fuse by +2/-2 seconds + sleep(fuselength * 1 SECOND) + + switch(round(fuel)) + if(0) + visible_message(SPAN_NOTICE("\The [name]'s fuse burns out and nothing happens.")) + fuselength = 0 + fuselit = FALSE + update_icon() + set_light(0, 0) + return + if(1 to FUSELENGTH_MAX) // baby explosion. + var/obj/item/trash/can/popped_can = new(get_turf(src)) + popped_can.icon_state = icon_state + popped_can.name = "popped can" + playsound(get_turf(src), 'sound/effects/snap.ogg', 50) + visible_message(SPAN_WARNING("\The [name] pops harmlessly!")) + if(11 to 20) // slightly less baby explosion + new /obj/item/material/shard/shrapnel(get_turf(src)) + playsound(get_turf(src), 'sound/effects/bang.ogg', 50) + visible_message(SPAN_WARNING("\The [name] bursts violently into pieces!")) + if(LETHAL_FUEL_CAPACITY to INFINITY) // boom + fragem(src, shrapnelcount, shrapnelcount, 1, 0, 5, 1, TRUE, 2) // The main aim of the grenade should be to hit and wound people with shrapnel instead of causing a lot of station damage, hence the small explosion radius + playsound(get_turf(src), 'sound/effects/Explosion1.ogg', 50) + visible_message(SPAN_DANGER("\The [name] explodes!")) + fuselit = FALSE + update_icon() + qdel(src) + +/obj/item/reagent_containers/food/drinks/cans/proc/can_light() // just reverses the fuselit var to return a TRUE or FALSE, should hopefully make things a little easier if someone adds more fuse interactions later. + return !fuselit && fuselength + +/obj/item/reagent_containers/food/drinks/cans/proc/FuseRemove(var/CableRemoved = fuselength) + fuselength -= CableRemoved + update_icon() + if(!fuselength) + if(bombcasing > BOMBCASING_EMPTY) + desc = "A grenade casing with \a [name] slotted into it." + else + desc = initial(desc) + +/obj/item/reagent_containers/food/drinks/cans/bullet_act(obj/item/projectile/P) + if(P.firer && reagents.get_reagent_amount(/datum/reagent/fuel) >= LETHAL_FUEL_CAPACITY) + visible_message(SPAN_DANGER("\The [name] is hit by the [P]!")) + log_and_message_admins("shot an improvised [name] explosive", P.firer) + log_game("[key_name(P.firer)] shot improvised grenade at [loc.loc.name] ([loc.x],[loc.y],[loc.z]).",ckey=key_name(P.firer)) + detonate(TRUE) + . = ..() + +/obj/item/reagent_containers/food/drinks/cans/ex_act(severity) + detonate(TRUE) + . = ..() + +/obj/item/reagent_containers/food/drinks/cans/fire_act() + if(can_light()) + fuselit = TRUE + detonate(FALSE) + visible_message(SPAN_WARNING("\The [name]'s fuse catches on fire!")) + . = ..() + +#undef LETHAL_FUEL_CAPACITY +#undef FUSELENGTH_MAX +#undef FUSELENGTH_MIN +#undef FUSELENGTH_SHORT +#undef FUSELENGTH_LONG +#undef BOMBCASING_EMPTY +#undef BOMBCASING_LOOSE +#undef BOMBCASING_SECURE + //DRINKS /obj/item/reagent_containers/food/drinks/cans/cola @@ -118,7 +336,7 @@ desc = "A radical looking can of Phoron Punch! Phoron poisoning has never been more extreme!" icon_state = "phoron_punch" center_of_mass = list("x"=16, "y"=8) - + can_size_overrides = list("x" = 1) reagents_to_add = list(/datum/reagent/kois/clean = 10, /datum/reagent/toxin/phoron = 5) /obj/item/reagent_containers/food/drinks/cans/root_beer @@ -136,7 +354,7 @@ desc = "A can of cherry energy drink, with V'krexi additives. All good colas come in cherry." icon_state = "zoracherry" center_of_mass = list("x"=16, "y"=8) - + can_size_overrides = list("x" = 1) reagents_to_add = list(/datum/reagent/drink/zorasoda = 20, /datum/reagent/mental/vaam = 15) /obj/item/reagent_containers/food/drinks/cans/zorakois @@ -144,7 +362,7 @@ desc = "A can of K'ois flavored energy drink, with V'krexi additives. Contains no K'ois, probably contains no palatable flavor." icon_state = "koistwist" center_of_mass = list("x"=16, "y"=8) - + can_size_overrides = list("x" = 1) reagents_to_add = list(/datum/reagent/drink/zorasoda/kois = 20, /datum/reagent/mental/vaam = 15) /obj/item/reagent_containers/food/drinks/cans/zoraphoron @@ -152,7 +370,7 @@ desc = "A can of grape flavored energy drink, with V'krexi additives. Tastes nothing like phoron according to Unbound taste testers." icon_state = "phoronpassion" center_of_mass = list("x"=16, "y"=8) - + can_size_overrides = list("x" = 1) reagents_to_add = list(/datum/reagent/drink/zorasoda/phoron = 20, /datum/reagent/mental/vaam = 15) /obj/item/reagent_containers/food/drinks/cans/zorahozm @@ -160,7 +378,7 @@ desc = "A can of fizzy, acidic energy, with plenty of V'krexi additives. Tastes like impaling the bottom of your mouth with a freezing cold spear laced with bees and salt." icon_state = "hozm" center_of_mass = list("x"=16, "y"=8) - + can_size_overrides = list("x" = 1) reagents_to_add = list(/datum/reagent/drink/zorasoda/hozm = 20, /datum/reagent/mental/vaam = 15) /obj/item/reagent_containers/food/drinks/cans/zoravenom @@ -168,7 +386,7 @@ desc = "A diet can of Venom Grass flavored energy drink, with V'krexi additives. Still tastes like a cloud of stinging polytrinic bees, but calories are nowhere to be found." icon_state = "sourvenomgrass" center_of_mass = list("x"=16, "y"=8) - + can_size_overrides = list("x" = 1) reagents_to_add = list(/datum/reagent/drink/zorasoda/venomgrass = 20, /datum/reagent/mental/vaam = 15) /obj/item/reagent_containers/food/drinks/cans/zoraklax @@ -176,7 +394,7 @@ desc = "A can of orange cream flavored energy drink, with V'krexi additives. Engineered nearly to perfection." icon_state = "klaxancrush" center_of_mass = list("x"=16, "y"=8) - + can_size_overrides = list("x" = 1) reagents_to_add = list(/datum/reagent/drink/zorasoda/klax = 20, /datum/reagent/mental/vaam = 15) /obj/item/reagent_containers/food/drinks/cans/zoracthur @@ -184,7 +402,7 @@ desc = "A can of blue raspberry flavored energy drink, with V'krexi additives. You're pretty sure this was shipped by mistake, the previous K'laxan Energy Crush wrapper is still partly visible underneath the current one." icon_state = "cthurberry" center_of_mass = list("x"=16, "y"=8) - + can_size_overrides = list("x" = 1) reagents_to_add = list(/datum/reagent/drink/zorasoda/cthur = 20, /datum/reagent/mental/vaam = 15) /obj/item/reagent_containers/food/drinks/cans/zoradrone @@ -192,7 +410,7 @@ desc = "A can of some kind of industrial fluid flavored energy drink, with V'krexi additives meant for Vaurca. Known to induce vomiting in humans!." icon_state = "dronefuel" center_of_mass = list("x"=16, "y"=8) - + can_size_overrides = list("x" = 1) reagents_to_add = list(/datum/reagent/drink/zorasoda/drone = 30, /datum/reagent/mental/vaam = 10) /obj/item/reagent_containers/food/drinks/cans/zorajelly @@ -200,7 +418,7 @@ desc = "A can of... You aren't sure, but it smells pleasant already." icon_state = "royaljelly" center_of_mass = list("x"=16, "y"=8) - + can_size_overrides = list("x" = 1) reagents_to_add = list(/datum/reagent/drink/zorasoda/jelly = 30) /obj/item/reagent_containers/food/drinks/cans/adhomai_milk @@ -218,6 +436,7 @@ icon_state = "beetlemilk" center_of_mass = list("x"=17, "y"=10) reagents_to_add = list(/datum/reagent/drink/milk/beetle = 30) + can_size_overrides = list("x" = 1, "y" = -2) /obj/item/reagent_containers/food/drinks/cans/dyn name = "Cooling Breeze" @@ -231,4 +450,4 @@ desc = "A cider made on the west coast of the Moghresian Sea, this is simply one of many brands made in a region known for its craft local butanol, shipped throughout the Wasteland." icon_state = "three_towns_cider" center_of_mass = list("x"=16, "y"=10) - reagents_to_add = list(/datum/reagent/alcohol/butanol/threetownscider = 30) \ No newline at end of file + reagents_to_add = list(/datum/reagent/alcohol/butanol/threetownscider = 30) diff --git a/html/changelogs/hockaa-weldercansfix.yml b/html/changelogs/hockaa-weldercansfix.yml new file mode 100644 index 00000000000..3ff6ce363f9 --- /dev/null +++ b/html/changelogs/hockaa-weldercansfix.yml @@ -0,0 +1,7 @@ +author: Hocka, Happy_Fox + +delete-after: True + +changes: + - rscadd: "Added steel wool which can be ignited with a cell/other flame source to briefly light up an area, as well as light other things. Can be obtained via autolathe." + - rscadd: "Empty cans can now be turned into jury-rigged shrapnel grenades which are made by filling cans with welding fuel, adding a fuse with steel wool and lighting it using a flame source. Shorter fuses have a chance to instantly detonate and longer fuses can fizzle out prematurely. Large grenade casings can be used to increase the amount of shrapnel." \ No newline at end of file diff --git a/icons/obj/fuses.dmi b/icons/obj/fuses.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6525b683aa7e6553794e53e1b803a20ef56d6a41 GIT binary patch literal 596 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 h@&77U5-G5d