From b5ffe2624ec9f91c74462cf164c30d94736fd07e Mon Sep 17 00:00:00 2001 From: BurgerLUA <8602857+BurgerLUA@users.noreply.github.com> Date: Thu, 19 Oct 2023 16:58:44 -0700 Subject: [PATCH] Improves Trash Piles (#610) Tested fully but there might be funny issues (who knows). ## About The Pull Request The rarity of maintenance loot in trash piles (structure) is at least uncommon. Adds funny searching effects to maintenance loot. Generally improves the performance and code of trash piles. ## Why It's Good For The Game Trash piles were pretty useless because of my maint loot PR. This PR makes them better. Also better code is good. ## Changelog :cl: BurgerBB balance: The rarity of maintenance loot in trash piles (structure) is at least uncommon. add: Adds funny searching effects to maintenance loot. /:cl: --- .../game/objects/structures/trash_pile.dm | 5 + .../_globalvars/lists/~maintenance_loot.dm | 7 + .../spawners/random/burgerstation_random.dm | 3 +- .../game/objects/structures/trash_pile.dm | 228 ++++++++++++++++++ tgstation.dme | 1 + 5 files changed, 243 insertions(+), 1 deletion(-) create mode 100644 modular_zubbers/code/game/objects/structures/trash_pile.dm diff --git a/modular_skyrat/master_files/code/game/objects/structures/trash_pile.dm b/modular_skyrat/master_files/code/game/objects/structures/trash_pile.dm index 3232ba6acc4..ee8eff90778 100644 --- a/modular_skyrat/master_files/code/game/objects/structures/trash_pile.dm +++ b/modular_skyrat/master_files/code/game/objects/structures/trash_pile.dm @@ -1,3 +1,5 @@ +/* BUBBERSTATION CHANGE START: MOVED BETTER CODE TO MODULAR + /obj/structure/trash_pile name = "trash pile" desc = "A heap of garbage, but maybe there's something interesting inside?" @@ -33,6 +35,7 @@ "brokecomp", ) + /obj/structure/trash_pile/proc/do_search(mob/user) if(contents.len) // There's something hidden var/atom/hidden_atom = contents[contents.len] // Get the most recent hidden thing @@ -138,3 +141,5 @@ /obj/structure/trash_pile/relaymove(mob/user) container_resist_act(user) + +BUBBERSTATION CHANGE END */ \ No newline at end of file diff --git a/modular_zubbers/code/_globalvars/lists/~maintenance_loot.dm b/modular_zubbers/code/_globalvars/lists/~maintenance_loot.dm index 03f61a03d85..ab51f630c6e 100644 --- a/modular_zubbers/code/_globalvars/lists/~maintenance_loot.dm +++ b/modular_zubbers/code/_globalvars/lists/~maintenance_loot.dm @@ -6,3 +6,10 @@ GLOBAL_LIST_INIT(maintenance_loot, list( GLOB.rarity_loot = maint_rarity_weight, GLOB.oddity_loot = maint_oddity_weight )) + + +GLOBAL_LIST_INIT(trash_pile_loot, list( + GLOB.uncommon_loot = maint_uncommon_weight, + GLOB.rarity_loot = maint_rarity_weight, + GLOB.oddity_loot = maint_oddity_weight +)) diff --git a/modular_zubbers/code/game/objects/effects/spawners/random/burgerstation_random.dm b/modular_zubbers/code/game/objects/effects/spawners/random/burgerstation_random.dm index f6fc43ad756..c8795a6a7ca 100644 --- a/modular_zubbers/code/game/objects/effects/spawners/random/burgerstation_random.dm +++ b/modular_zubbers/code/game/objects/effects/spawners/random/burgerstation_random.dm @@ -48,6 +48,7 @@ /obj/effect/mine/stun = 1, /obj/effect/mine/sound/bwoink = 1, /obj/effect/mine/kickmine = 1, + /obj/structure/trash_pile = 100 ) /obj/effect/spawner/random/burgerstation/loot @@ -60,7 +61,7 @@ /obj/effect/spawner/random/burgerstation/atmos = 500, /obj/effect/spawner/random/burgerstation/liquid = 300, /obj/effect/spawner/random/burgerstation/power = 100, - /obj/structure/trash_pile = 1000, + /obj/structure/trash_pile = 1500, /obj/structure/closet/crate/trashcart/filled = 400, /obj/item/storage/bag/trash/filled = 100, /obj/effect/decal/cleanable/garbage = 100, diff --git a/modular_zubbers/code/game/objects/structures/trash_pile.dm b/modular_zubbers/code/game/objects/structures/trash_pile.dm new file mode 100644 index 00000000000..a786bad46c8 --- /dev/null +++ b/modular_zubbers/code/game/objects/structures/trash_pile.dm @@ -0,0 +1,228 @@ +/obj/structure/trash_pile + name = "trash pile" + desc = "A heap of dense garbage. Perhaps there is something interesting inside?" + icon = 'modular_skyrat/master_files/icons/obj/trash_piles.dmi' + icon_state = "randompile" + density = TRUE + anchored = TRUE + layer = TABLE_LAYER + obj_flags = CAN_BE_HIT + pass_flags = LETPASSTHROW + + max_integrity = 50 + + var/hide_person_time = 3 SECONDS + var/hide_item_time = 1 SECONDS + + var/list/searched_by_ckeys = list() //Assoc list of people who searched this trash pile (value is 1), or started searching (value is 0) + + var/trash_delay = 0.25 SECONDS + var/funny_sound_delay = 0.1 SECONDS + + COOLDOWN_DECLARE(trash_cooldown) + COOLDOWN_DECLARE(funny_sound_cooldown) + + var/static/list/funny_sounds = list( //Assoc list of funny sounds (funny sound to weight) + 'sound/effects/adminhelp.ogg' = 1, + 'sound/effects/footstep/clownstep1.ogg' = 5, + 'sound/effects/footstep/clownstep2.ogg' = 5, + 'sound/effects/footstep/meowstep1.ogg' = 1, + 'sound/effects/attackblob.ogg' = 10, + 'sound/effects/bang.ogg' = 10, + 'sound/effects/bin_close.ogg' = 20, + 'sound/effects/bin_open.ogg' = 20, + 'sound/effects/boing.ogg' = 5, + 'sound/effects/cartoon_splat.ogg' = 1, + 'sound/effects/cashregister.ogg' = 1, + 'sound/effects/glassbash.ogg' = 50, + 'sound/effects/glassbr1.ogg' = 20, + 'sound/effects/glassbr2.ogg' = 20, + 'sound/effects/glassbr3.ogg' = 20, + 'sound/effects/grillehit.ogg' = 20, + 'sound/effects/hit_on_shattered_glass.ogg' = 20, + 'sound/effects/jingle.ogg' = 50, + 'sound/effects/meatslap.ogg' = 50, + 'sound/effects/quack.ogg' = 20, + 'sound/effects/rustle1.ogg' = 100, + 'sound/effects/rustle2.ogg' = 100, + 'sound/effects/rustle3.ogg' = 100, + 'sound/effects/rustle4.ogg' = 100, + 'sound/effects/rustle5.ogg' = 100, + ) + +/obj/structure/trash_pile/Destroy() + + var/turf/T = get_turf(src) + + if(T) + for(var/atom/movable/M in contents) + M.forceMove(T) + + . = ..() + +/obj/structure/trash_pile/Initialize(mapload) + . = ..() + AddElement(/datum/element/climbable) + icon_state = pick( + "pile1", + "pile2", + "pilechair", + "piletable", + "pilevending", + "brtrashpile", + "microwavepile", + "rackpile", + "boxfort", + "trashbag", + "brokecomp", + ) + +/obj/structure/trash_pile/attack_hand(mob/living/user) + + if(user in contents) + eject_mob(user) + return + + if(!ishuman(user) || user.combat_mode || !user.ckey) + return ..() + + user.visible_message("[user] searches through \the [src]...", span_notice("You search through \the [src]...")) + + playsound(get_turf(src), pick('sound/effects/rustle1.ogg','sound/effects/rustle2.ogg','sound/effects/rustle3.ogg','sound/effects/rustle4.ogg','sound/effects/rustle5.ogg'), 50) + + var/content_length = length(contents) + if(content_length) //Something hidden inside (mob/item) + var/atom/hidden_atom = contents[content_length] // Get the most recent hidden thing + if(!do_after(user,3 SECONDS, target = src, extra_checks = CALLBACK(src,PROC_REF(throw_trash),user))) + if(!isnum(searched_by_ckeys[user.ckey])) + searched_by_ckeys[user.ckey] = 0 + return + else + if(!isnum(searched_by_ckeys[user.ckey])) + searched_by_ckeys[user.ckey] = 0 + if(istype(hidden_atom, /mob/living)) + var/mob/living/hidden_mob = hidden_atom + balloon_alert(user, "someone is inside!") + eject_mob(hidden_mob) + else if (istype(hidden_atom, /obj/item)) + var/obj/item/hidden_item = hidden_atom + balloon_alert(user, "found something!") + hidden_item.forceMove(get_turf(src)) + return + + if(!do_after(user,3 SECONDS, target = src, extra_checks = CALLBACK(src,PROC_REF(throw_trash),user))) + if(!isnum(searched_by_ckeys[user.ckey])) + searched_by_ckeys[user.ckey] = 0 + return + + if(searched_by_ckeys[user.ckey]) + balloon_alert(user, "empty...") + return TRUE + var/obj/item/spawned_item = produce_item_from_list(get_turf(src),GLOB.trash_pile_loot) + if(spawned_item) + balloon_alert(user, "found [spawned_item.name]!") + else + balloon_alert(user, "found nothing...") + + searched_by_ckeys[user.ckey] = 1 + +/obj/structure/trash_pile/attackby(obj/item/attacking_item, mob/living/user, params) + + if(user in contents) + eject_mob(user) + return + + if(user.combat_mode) + return ..() + + if(length(contents) >= 10) + balloon_alert(user, "it's full!") + return + + balloon_alert(user, "hiding item...") + if(!do_after(user, hide_item_time, user)) + return + + if(QDELETED(src)) + return + + if(user.transferItemToLoc(attacking_item, src)) + balloon_alert(user, "item hidden!") + +/obj/structure/trash_pile/MouseDrop_T(atom/movable/dropped_atom, mob/user) + + if(user != dropped_atom || !iscarbon(dropped_atom)) + return ..() + + var/mob/living/carbon/dropped_mob = dropped_atom + if(!dropped_mob.mobility_flags & MOBILITY_MOVE) + return + + user.visible_message( + span_warning("[user] starts diving into [src]."), + span_notice("You start diving into [src]...") + ) + + var/adjusted_dive_time = hide_person_time + if(HAS_TRAIT(user, TRAIT_RESTRAINED)) // hiding takes twice as long when restrained. + adjusted_dive_time *= 2 + + if(!do_after(user, adjusted_dive_time, user)) + return + + if(QDELETED(src)) + return + + for(var/mob/hidden_mob in contents) + balloon_alert(user, "someone is inside!") + eject_mob(hidden_mob) + return + + user.forceMove(src) + +/obj/structure/trash_pile/container_resist_act(mob/user) + user.forceMove(src.loc) + +/obj/structure/trash_pile/relaymove(mob/user) + container_resist_act(user) + +/obj/structure/trash_pile/proc/produce_item_from_list(turf/spawn_loc,list/list_to_use) + var/lootspawn = pick_weight(list_to_use) + while(islist(lootspawn)) + lootspawn = pick_weight(lootspawn) + var/obj/item/hidden_item = new lootspawn(spawn_loc) + return hidden_item + +/obj/structure/trash_pile/proc/throw_trash(mob/user) + + if(QDELETED(src) || QDELETED(user)) //Check if valid. + return FALSE + + if(isnum(searched_by_ckeys[user.ckey])) //Don't spawn trash! + return TRUE + + var/turf/T + if(COOLDOWN_FINISHED(src, trash_cooldown)) + COOLDOWN_START(src, trash_cooldown, trash_delay*0.5 + rand()*trash_delay) // x0.5 to x1.5 + if(!T) + T = get_turf(user) + var/obj/item/spawned_item = produce_item_from_list(T,GLOB.trash_loot) + if(spawned_item) + var/turf/throw_at = get_ranged_target_turf_direct(src, user, 7, rand(-60,60)) + if(spawned_item.safe_throw_at(throw_at, rand(2,4), rand(1,3), user, spin = TRUE)) + playsound(T, 'sound/weapons/punchmiss.ogg', 10) + + if(COOLDOWN_FINISHED(src,funny_sound_cooldown)) + COOLDOWN_START(src, funny_sound_cooldown, funny_sound_delay*0.5 + rand()*funny_sound_delay) // x0.5 to x1.5 + if(!T) + T = get_turf(user) + playsound(T,pick_weight(funny_sounds), 25) + + return TRUE + +/obj/structure/trash_pile/proc/eject_mob(mob/living/hidden_mob) + var/turf/T = get_turf(src) + hidden_mob.forceMove(T) + playsound(T, 'sound/machines/chime.ogg', 50, FALSE, -5) + hidden_mob.do_alert_animation(hidden_mob) + return TRUE diff --git a/tgstation.dme b/tgstation.dme index 8673f5ed003..eba6d9f3afe 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7758,6 +7758,7 @@ #include "modular_zubbers\code\game\objects\items\robot\robot_upgrades\adv_plasmacutter_upgrade.dm" #include "modular_zubbers\code\game\objects\items\storage\boxes.dm" #include "modular_zubbers\code\game\objects\items\storage\guncases.dm" +#include "modular_zubbers\code\game\objects\structures\trash_pile.dm" #include "modular_zubbers\code\game\objects\structures\plaques\static_plaques.dm" #include "modular_zubbers\code\game\traits\negative.dm" #include "modular_zubbers\code\game\traits\neutral.dm"