diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 4dd72c012ce..c59d39dc14c 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -198,6 +198,7 @@ #define TURF_WET_WATER 1 #define TURF_WET_LUBE 2 #define TURF_WET_ICE 3 +#define TURF_WET_PERMAFROST 4 #define APPEARANCE_UI_IGNORE_ALPHA RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|RESET_ALPHA diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 3f3c394a7e6..e9c6ed12c8e 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -565,6 +565,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) cost = 11 surplus = 0 +/datum/uplink_item/dangerous/grenadier + name = "Grenadier's belt" + desc = "A belt containing 25 lethally dangerous and destructive grenades." + item = /obj/item/storage/belt/grenade/full + cost = 30 + surplus = 0 + gamemodes = list(/datum/game_mode/nuclear) + /datum/uplink_item/dangerous/emp name = "EMP Grenades and Implanter Kit" desc = "A box that contains two EMP grenades and an EMP implant. Useful to disrupt communication, \ diff --git a/code/game/objects/explosion.dm b/code/game/objects/explosion.dm index 13583310630..9c457e43b6a 100644 --- a/code/game/objects/explosion.dm +++ b/code/game/objects/explosion.dm @@ -1,6 +1,6 @@ //TODO: Flash range does nothing currently -/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0 ,silent = 0, smoke = 1, cause = null) +/proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1, ignorecap = 0, flame_range = 0 ,silent = 0, smoke = 1, cause = null, breach = TRUE) src = null //so we don't abort once src is deleted epicenter = get_turf(epicenter) @@ -132,7 +132,10 @@ if(AM && AM.simulated) AM.ex_act(dist) CHECK_TICK - T.ex_act(dist) + if(breach) + T.ex_act(dist) + else + T.ex_act(3) CHECK_TICK //--- THROW ITEMS AROUND --- diff --git a/code/game/objects/items/weapons/grenades/atmosgrenade.dm b/code/game/objects/items/weapons/grenades/atmosgrenade.dm index d24db633c87..02e21e31d39 100644 --- a/code/game/objects/items/weapons/grenades/atmosgrenade.dm +++ b/code/game/objects/items/weapons/grenades/atmosgrenade.dm @@ -2,7 +2,7 @@ /obj/item/grenade/gas - name = "Plasma Fire Grenade" + name = "plasma fire grenade" desc = "A compressed plasma grenade, used to start horrific plasma fires." origin_tech = "materials=3;magnets=4;syndicate=3" icon = 'icons/obj/grenade.dmi' @@ -18,7 +18,33 @@ target_turf.air_update_turf() qdel(src) +/obj/item/grenade/gas/plasma + icon_state = "plasma" + /obj/item/grenade/gas/knockout - name = "Knockout Grenade" + name = "knockout grenade" desc = "A grenade that completely removes all air and heat from its detonation area." - spawn_contents = SPAWN_20C | SPAWN_N2O \ No newline at end of file + spawn_contents = SPAWN_20C | SPAWN_N2O + +/obj/item/grenade/gluon + desc = "An advanced grenade that releases a harmful stream of gluons inducing radiation in those nearby. These gluon streams will also make victims feel exhausted, and induce shivering. This extreme coldness will also wet any nearby floors." + name = "gluon grenade" + icon = 'icons/obj/grenade.dmi' + icon_state = "gluon" + item_state = "flashbang" + var/range = 4 + var/rad_damage = 60 + var/stamina_damage = 30 + +/obj/item/grenade/gluon/prime() + update_mob() + playsound(loc, 'sound/effects/empulse.ogg', 50, 1) + for(var/turf/T in view(range, loc)) + if(isfloorturf(T)) + var/turf/simulated/F = T + F.MakeSlippery(TURF_WET_PERMAFROST) + for(var/mob/living/carbon/L in T) + L.adjustStaminaLoss(stamina_damage) + L.apply_effect(rad_damage, IRRADIATE) + L.adjust_bodytemperature(-230) + qdel(src) \ No newline at end of file diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 2f5b48ff329..863b2f915b3 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -526,20 +526,20 @@ update_icon() /obj/item/grenade/chem_grenade/facid - name = "acid grenade" - desc = "Used for melting armoured opponents." + payload_name = "acid smoke" + desc = "Use to chew up opponents from the inside out." stage = READY /obj/item/grenade/chem_grenade/facid/New() ..() - var/obj/item/reagent_containers/glass/beaker/bluespace/B1 = new(src) - var/obj/item/reagent_containers/glass/beaker/bluespace/B2 = new(src) + var/obj/item/reagent_containers/glass/beaker/large/B1 = new(src) + var/obj/item/reagent_containers/glass/beaker/large/B2 = new(src) - B1.reagents.add_reagent("facid", 280) + B1.reagents.add_reagent("facid", 80) B1.reagents.add_reagent("potassium", 20) B2.reagents.add_reagent("phosphorus", 20) B2.reagents.add_reagent("sugar", 20) - B2.reagents.add_reagent("facid", 260) + B2.reagents.add_reagent("facid", 60) beakers += B1 beakers += B2 diff --git a/code/game/objects/items/weapons/grenades/frag.dm b/code/game/objects/items/weapons/grenades/frag.dm new file mode 100644 index 00000000000..db7943ca7d9 --- /dev/null +++ b/code/game/objects/items/weapons/grenades/frag.dm @@ -0,0 +1,50 @@ +/obj/item/grenade/frag + name = "frag grenade" + desc = "Fire in the hole." + icon_state = "frag" + item_state = "flashbang" + origin_tech = "materials=3;magnets=4" + var/range = 5 + var/max_shrapnel = 4 + var/embed_prob = 100 //reduced by armor + var/embedded_type = /obj/item/embedded/shrapnel + +/obj/item/grenade/frag/prime() + update_mob() + var/turf/epicenter = get_turf(src) + for(var/mob/living/carbon/human/H in epicenter) + if(H.resting) //grenade is jumped on but get real fucked up + embed_shrapnel(H, max_shrapnel) + range = 1 + explosion(loc, 0, 1, range, breach = FALSE) + for(var/turf/T in view(range, loc)) + for(var/mob/living/carbon/human/H in T) + var/shrapnel_amount = max_shrapnel - T.Distance(epicenter) + if(shrapnel_amount > 0) + embed_shrapnel(H, shrapnel_amount) + qdel(src) + +/obj/item/grenade/frag/proc/embed_shrapnel(mob/living/carbon/human/H, amount) + for(var/i = 0, i < amount, i++) + if(prob(embed_prob - H.getarmor(null, "bomb"))) + var/obj/item/embedded/S = new embedded_type(src) + H.hitby(S, skipcatch = 1) + S.throwforce = 1 + S.throw_speed = 1 + S.sharp = FALSE + else + to_chat(H, "Shrapnel bounces off your armor!") + +/obj/item/embedded/shrapnel + name = "shrapnel" + icon = 'icons/obj/shards.dmi' + throwforce = 10 + throw_speed = EMBED_THROWSPEED_THRESHOLD + embed_chance = 100 + embedded_fall_chance = 0 + w_class = WEIGHT_CLASS_SMALL + sharp = TRUE + hitsound = 'sound/weapons/pierce.ogg' + +/obj/item/embedded/shrapnel/New() + icon_state = pick("shrapnel1", "shrapnel2", "shrapnel3") diff --git a/code/game/objects/items/weapons/grenades/syndieminibomb.dm b/code/game/objects/items/weapons/grenades/syndieminibomb.dm index cf281b6ec8a..0292b8f9eba 100644 --- a/code/game/objects/items/weapons/grenades/syndieminibomb.dm +++ b/code/game/objects/items/weapons/grenades/syndieminibomb.dm @@ -8,5 +8,5 @@ /obj/item/grenade/syndieminibomb/prime() update_mob() - explosion(src.loc,1,2,4,flame_range = 2) - qdel(src) + explosion(loc, 1, 2, 4, flame_range = 2) + qdel(src) \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 3d9471c3f02..83494366d38 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -302,6 +302,48 @@ item_state = "utility" use_item_overlays = 1 // So it will still show tools in it in case sec get lazy and just glance at it. +/obj/item/storage/belt/grenade + name = "grenadier belt" + desc = "A belt for holding grenades." + icon_state = "assaultbelt" + item_state = "assault" + storage_slots = 30 + max_combined_w_class = 60 + display_contents_with_number = 1 + can_hold = list( + /obj/item/grenade, + /obj/item/lighter, + /obj/item/reagent_containers/food/drinks/bottle/molotov + ) + +/obj/item/storage/belt/grenade/full/New() + ..() + new /obj/item/grenade/smokebomb(src) //4 + new /obj/item/grenade/smokebomb(src) + new /obj/item/grenade/smokebomb(src) + new /obj/item/grenade/smokebomb(src) + new /obj/item/grenade/empgrenade(src) //2 + new /obj/item/grenade/empgrenade(src) + new /obj/item/grenade/gluon(src) //4 + new /obj/item/grenade/gluon(src) + new /obj/item/grenade/gluon(src) + new /obj/item/grenade/gluon(src) + new /obj/item/grenade/chem_grenade/facid(src) //1 + new /obj/item/grenade/gas/plasma(src) //2 + new /obj/item/grenade/gas/plasma(src) + new /obj/item/grenade/frag(src) //10 + new /obj/item/grenade/frag(src) + new /obj/item/grenade/frag(src) + new /obj/item/grenade/frag(src) + new /obj/item/grenade/frag(src) + new /obj/item/grenade/frag(src) + new /obj/item/grenade/frag(src) + new /obj/item/grenade/frag(src) + new /obj/item/grenade/frag(src) + new /obj/item/grenade/frag(src) + new /obj/item/grenade/syndieminibomb(src) //2 + new /obj/item/grenade/syndieminibomb(src) + /obj/item/storage/belt/military/abductor name = "agent belt" desc = "A belt used by abductor agents." diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index 21dbdb9e024..51549c1a563 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -20,7 +20,7 @@ /turf/simulated/proc/burn_tile() -/turf/simulated/proc/MakeSlippery(wet_setting = TURF_WET_WATER) // 1 = Water, 2 = Lube, 3 = Ice +/turf/simulated/proc/MakeSlippery(wet_setting = TURF_WET_WATER) // 1 = Water, 2 = Lube, 3 = Ice, 4 = Permafrost if(wet >= wet_setting) return wet = wet_setting @@ -30,7 +30,10 @@ wet_overlay = null var/turf/simulated/floor/F = src if(istype(F)) - wet_overlay = image('icons/effects/water.dmi', src, "wet_floor_static") + if(wet_setting >= TURF_WET_ICE) + wet_overlay = image('icons/effects/water.dmi', src, "ice_floor") + else + wet_overlay = image('icons/effects/water.dmi', src, "wet_floor_static") else wet_overlay = image('icons/effects/water.dmi', src, "wet_static") overlays += wet_overlay @@ -83,6 +86,9 @@ if(!(prob(30) && M.slip("icy floor", 4, 2, tilesSlipped = 1, walkSafely = 1))) M.inertia_dir = 0 + if(TURF_WET_PERMAFROST) // Permafrost + M.slip("icy floor", 0, 5, tilesSlipped = 1, walkSafely = 0, slipAny = 1) + /turf/simulated/ChangeTurf(var/path) . = ..() queue_smooth_neighbors(src) diff --git a/icons/effects/water.dmi b/icons/effects/water.dmi index 1bccfad7773..f0368e72852 100644 Binary files a/icons/effects/water.dmi and b/icons/effects/water.dmi differ diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi index be866dc4275..e1b2164a39a 100644 Binary files a/icons/obj/grenade.dmi and b/icons/obj/grenade.dmi differ diff --git a/icons/obj/shards.dmi b/icons/obj/shards.dmi index 5ce7113bf88..20927b8dd79 100644 Binary files a/icons/obj/shards.dmi and b/icons/obj/shards.dmi differ diff --git a/paradise.dme b/paradise.dme index fcc4aa9c054..37f2287fb15 100644 --- a/paradise.dme +++ b/paradise.dme @@ -925,6 +925,7 @@ #include "code\game\objects\items\weapons\grenades\custom_grenades.dm" #include "code\game\objects\items\weapons\grenades\emgrenade.dm" #include "code\game\objects\items\weapons\grenades\flashbang.dm" +#include "code\game\objects\items\weapons\grenades\frag.dm" #include "code\game\objects\items\weapons\grenades\ghettobomb.dm" #include "code\game\objects\items\weapons\grenades\grenade.dm" #include "code\game\objects\items\weapons\grenades\smokebomb.dm"