diff --git a/code/datums/supplypacks/supply.dm b/code/datums/supplypacks/supply.dm index d80f7d1bc4..a6825b32ef 100644 --- a/code/datums/supplypacks/supply.dm +++ b/code/datums/supplypacks/supply.dm @@ -57,6 +57,7 @@ /obj/item/weapon/reagent_containers/spray/cleaner, /obj/item/weapon/reagent_containers/glass/rag, /obj/item/weapon/grenade/chem_grenade/cleaner = 3, + /obj/item/device/vac_attachment, //CHOMPAdd /obj/structure/mopbucket ) cost = 10 diff --git a/code/game/objects/structures/crates_lockers/closets/job_closets.dm b/code/game/objects/structures/crates_lockers/closets/job_closets.dm index 86cb04e20d..0492608962 100644 --- a/code/game/objects/structures/crates_lockers/closets/job_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/job_closets.dm @@ -80,6 +80,7 @@ /obj/item/device/lightreplacer, /obj/item/weapon/storage/bag/trash, /obj/item/weapon/storage/belt/janitor, + /obj/item/device/vac_attachment, //CHOMPAdd /obj/item/clothing/shoes/galoshes ) diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index 142e130493..63c117a8fa 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -43,6 +43,9 @@ var/recycles = FALSE var/medsensor = TRUE //Does belly sprite come with patient ok/dead light? var/obj/item/device/healthanalyzer/med_analyzer = null + var/ore_storage = FALSE //CHOMPAdd + var/max_ore_storage = 500 //CHOMPAdd + var/current_capacity = 0 //CHOMPAdd /obj/item/device/dogborg/sleeper/New() ..() @@ -281,6 +284,9 @@ dat += "Current load: [length(contents)] / [max_item_count] objects.
" dat += "([contents.Join(", ")])

" + if(ore_storage) //CHOMPAdd + dat += "Current ore capacity: [current_capacity] / [max_ore_storage].
" + if(delivery && length(contents)) dat += "Current load: [length(contents)] / [max_item_count] objects.
" dat += "Cargo compartment slot: Cargo 1.
" @@ -769,10 +775,53 @@ /obj/item/device/dogborg/sleeper/compactor/supply //Miner borg belly name = "Supply Satchel" - desc = "A mounted survival unit with fuel processor." + desc = "A mounted survival unit with fuel processor and ore storage." //CHOMPEdit Start icon_state = "sleeperc" injection_chems = list("glucose","inaprovaline","tricordrazine") - max_item_count = 1 + max_item_count = 20 + ore_storage = TRUE + var/list/stored_ore = list( + "sand" = 0, + "hematite" = 0, + "carbon" = 0, + "raw copper" = 0, + "raw tin" = 0, + "void opal" = 0, + "painite" = 0, + "quartz" = 0, + "raw bauxite" = 0, + "phoron" = 0, + "silver" = 0, + "gold" = 0, + "marble" = 0, + "uranium" = 0, + "diamond" = 0, + "platinum" = 0, + "lead" = 0, + "mhydrogen" = 0, + "verdantium" = 0, + "rutile" = 0) + +/obj/item/device/dogborg/sleeper/compactor/supply/Entered(atom/movable/thing, atom/OldLoc) + . = ..() + if(istype(thing, /obj/item/weapon/ore)) + var/obj/item/weapon/ore/ore = thing + stored_ore[ore.material]++ + current_capacity++ + qdel(ore) + +/obj/structure/ore_box/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/device/dogborg/sleeper/compactor/supply)) + var/obj/item/device/dogborg/sleeper/compactor/supply/S = W + for(var/ore in S.stored_ore) + if(S.stored_ore[ore] > 0) + var/ore_amount = S.stored_ore[ore] // How many ores does the satchel have? + stored_ore[ore] += ore_amount // Add the ore to the machine. + S.stored_ore[ore] = 0 // Set the value of the ore in the satchel to 0. + S.current_capacity = 0 // Set the amount of ore in the satchel to 0. + to_chat(user, "You empty the satchel into the box.") + return + ..() //CHOMPEdit End /obj/item/device/dogborg/sleeper/command //Command borg belly //CHOMP addition name = "Bluespace Filing Belly" diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index 6b6a5cb9c6..8f2f79bc48 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -593,6 +593,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/mop(src) src.modules += new /obj/item/pupscrubber(src) src.modules += new /obj/item/device/lightreplacer(src) + src.modules += new /obj/item/device/vac_attachment(src) //CHOMPAdd src.emag = new /obj/item/weapon/reagent_containers/spray(src) src.emag.reagents.add_reagent("lube", 250) src.emag.name = "Lube spray" @@ -766,6 +767,7 @@ var/global/list/robot_modules = list( src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src) src.modules += new /obj/item/weapon/gripper/miner(src) src.modules += new /obj/item/weapon/mining_scanner(src) + src.modules += new /obj/item/device/vac_attachment(src) //CHOMPAdd // New Emag gear for the minebots! src.emag = new /obj/item/weapon/kinetic_crusher/machete/dagger(src) diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm index 29d56e57b5..df844ca6a1 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station_vr.dm @@ -525,6 +525,7 @@ src.modules += new /obj/item/weapon/dogborg/jaws/small(src) src.modules += new /obj/item/device/dogborg/boop_module(src) src.modules += new /obj/item/pupscrubber(src) + src.modules += new /obj/item/device/vac_attachment(src) //CHOMPAdd src.emag = new /obj/item/weapon/dogborg/pounce(src) //Pounce //Starts empty. Can only recharge with recycled material. @@ -951,6 +952,7 @@ src.modules += new /obj/item/weapon/mining_scanner(src) src.modules += new /obj/item/weapon/dogborg/jaws/small(src) src.modules += new /obj/item/weapon/gun/energy/locked/phasegun/unlocked/mounted/cyborg(src) //Chompedit To let the borg defend themselves + src.modules += new /obj/item/device/vac_attachment(src) //CHOMPAdd // New Emag gear for the minebots! src.emag = new /obj/item/weapon/kinetic_crusher/machete/dagger(src) diff --git a/modular_chomp/code/game/objects/items/devices/vacpack.dm b/modular_chomp/code/game/objects/items/devices/vacpack.dm new file mode 100644 index 0000000000..a1d3df449c --- /dev/null +++ b/modular_chomp/code/game/objects/items/devices/vacpack.dm @@ -0,0 +1,235 @@ +//Vac attachment +/obj/item/device/vac_attachment + name = "Vac-Pack attachment" + desc = "Useful for slurping mess off the floors. Even things and stuff depending on settings. Can be connected to a trash bag or vore belly. On-mob sprites can be toggled via verb in Objects tab." + icon = 'modular_chomp/icons/mob/vacpack.dmi' + icon_override = 'modular_chomp/icons/mob/vacpack.dmi' + icon_state = "sucker_drop" + item_state = "sucker" + var/vac_power = 0 + var/output_dest = null + var/list/vac_settings = list( + "power off" = 0, + "dust and grime" = 1, + "tiny objects" = 2, + "pests and small objects" = 3, + "medium objects" = 4, + "large objects" = 5, + "large pests" = 6, + "output destination" = 7, + ) + +/obj/item/device/vac_attachment/New() + ..() + flags |= NOBLUDGEON //No more attack messages + +/obj/item/device/vac_attachment/attack_self(mob/living/user) + var/set_input = null + if(!output_dest) + set_input = "output destination" + if(!set_input) + set_input = tgui_input_list(user, "Set your vacuum attachment's power level or output mode.", "Vac Settings", vac_settings) + if(set_input) + if(set_input == "output destination") + var/set_output = tgui_input_list(user, "Set your vacuum attachment's connection port", "Vac Settings", list("Vore Belly", "Borg Belly", "Trash Bag")) + if(set_output) + if(set_output == "Borg Belly") + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + var/obj/item/weapon/robot_module/M = R.module + for(var/obj/item/device/dogborg/sleeper/S in M.modules) + if(istype(S)) + output_dest = S + return + to_chat(user, "Borg belly not found.") + if(set_output == "Trash Bag") + if(isrobot(user)) + var/mob/living/silicon/robot/R = user + var/obj/item/weapon/robot_module/M = R.module + for(var/obj/item/weapon/storage/bag/trash/T in M.modules) + if(istype(T)) + output_dest = T + return + for(var/obj/item/weapon/storage/bag/trash/T in user.contents) + if(istype(T)) + output_dest = T + return + to_chat(user, "Trash bag not found.") + if(set_output == "Vore Belly") + if(user.vore_selected) + output_dest = user.vore_selected + return + else + vac_power = vac_settings[set_input] + icon_state = "sucker-[vac_power]" + +/obj/item/device/vac_attachment/afterattack(atom/target, mob/living/user, proximity) + if(vac_power < 1) + return + if(!proximity) + return + if(!output_dest) + return + if(istype(output_dest,/obj/item/weapon/storage/bag/trash)) + if(get_turf(output_dest) != get_turf(user)) + vac_power = 0 + icon_state = "sucker-0" + output_dest = null + to_chat(user, "Trash bag not found. Shutting down.") + return + var/obj/item/weapon/storage/bag/trash/B = output_dest + if(LAZYLEN(B.contents) >= B.max_storage_space) //A bit more lenient than the w_class system to avoid complicated spaghetti. + to_chat(user, "Trash bag full. Empty trash bag contents to continue.") + return + if(istype(output_dest,/obj/item/device/dogborg/sleeper)) + var/obj/item/device/dogborg/sleeper/B = output_dest + if(LAZYLEN(B.contents) >= B.max_item_count) + to_chat(user, "[B.name] full. Empty or process contents to continue.") + return + if(B.ore_storage) + if(B.current_capacity >= B.max_ore_storage) + to_chat(user, "Ore storage full. Deposit ore contents to a box continue.") + return + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + if(isturf(target)) + user.visible_message("[user] begins vacuuming the mess off \the [target.name]...", "You begin vacuuming the mess off \the [target.name]...") + var/list/suckables = list() + if(vac_power >= 1) + for(var/obj/effect/decal/cleanable/C in target) + suckables |= C + if(vac_power >= 2) + for(var/obj/item/I in target) + if(I.anchored || I.w_class > 1) + continue + else + suckables |= I + if(vac_power >= 3) + for(var/obj/item/I in target) + if(I.anchored || I.w_class > 2) + continue + else + suckables |= I + for(var/mob/living/L in target) + if(L.anchored || !L.devourable || L == user || L.buckled) + continue + if(L.size_multiplier < 0.5) + suckables |= L + if(istype(L,/mob/living/simple_mob/animal/passive/mouse) || istype(L,/mob/living/simple_mob/animal/passive/lizard) || istype(L,/mob/living/simple_mob/animal/passive/cockroach)) + suckables |= L + if(vac_power >= 4) + for(var/obj/item/I in target) + if(I.anchored || I.w_class > 3) + continue + else + suckables |= I + if(vac_power >= 5) + for(var/obj/item/I in target) + if(I.anchored) + continue + else + suckables |= I + if(vac_power >= 6) + for(var/mob/living/L in target) + if(L.anchored || !L.devourable || L == user || L.buckled) + continue + suckables |= L + if(LAZYLEN(suckables)) + playsound(src, 'sound/machines/kitchen/candymaker/candymaker-mid1.ogg', vac_power * 20, 1, -1) + var/vac_conga = 0 + for(var/atom/movable/F in suckables) + if(is_type_in_list(F,item_vore_blacklist) || F.loc != target) + continue + if(istype(F,/obj/effect/decal/cleanable)) + qdel(F) + continue + if(vac_conga < 100) + vac_conga += 3 + spawn(3 + vac_conga) + if(!F.Adjacent(user) || src.loc != user || vac_power < 2) //Cancel if moved/unpowered/dropped + break + F.SpinAnimation(5,1) + spawn(5) + if(F.loc == target) + if(isitem(F)) + var/obj/item/I = F + if(I.drop_sound) + playsound(src, I.drop_sound, vac_power * 5, 1, -1) + playsound(src, 'sound/rakshasa/corrosion3.ogg', vac_power * 15, 1, -1) + F.forceMove(output_dest) + if(istype(target, /turf/simulated)) + var/turf/simulated/T = target + T.dirt = 0 + T.clean_blood() + return + if(!isturf(target.loc)) + return + if(istype(target,/obj/item)) + var/obj/item/I = target + if(is_type_in_list(I,item_vore_blacklist)) + return + if(vac_power > I.w_class) + playsound(src, 'sound/machines/kitchen/candymaker/candymaker-mid1.ogg', vac_power * 20, 1, -1) + user.visible_message("[user] vacuums up \the [target.name].", "You vacuum up \the [target.name]...") + I.SpinAnimation(5,1) + spawn(5) + if(I.drop_sound) + playsound(src, I.drop_sound, vac_power * 5, 1, -1) + playsound(src, 'sound/rakshasa/corrosion3.ogg', vac_power * 15, 1, -1) + I.forceMove(output_dest) + else if(istype(target,/obj/effect/decal/cleanable)) + playsound(src, 'sound/machines/kitchen/candymaker/candymaker-mid1.ogg', vac_power * 20, 1, -1) + user.visible_message("[user] vacuums up \the [target.name].", "You vacuum up \the [target.name]...") + qdel(target) + else if(isliving(target)) + var/mob/living/L = target + var/valid_to_suck = FALSE + if(L.anchored || !L.devourable || L == user || L.buckled) + return + if(vac_power >= 3) + if(L.size_multiplier > 0.5 || istype(L,/mob/living/simple_mob/animal/passive/mouse) || istype(L,/mob/living/simple_mob/animal/passive/lizard)) + valid_to_suck = TRUE + if(vac_power >= 6) + valid_to_suck = TRUE + if(valid_to_suck) + playsound(src, 'sound/machines/kitchen/candymaker/candymaker-mid1.ogg', vac_power * 20, 1, -1) + user.visible_message("[user] vacuums up \the [target.name].", "You vacuum up \the [target.name]...") + L.SpinAnimation(5,1) + spawn(5) + playsound(src, 'sound/rakshasa/corrosion3.ogg', vac_power * 15, 1, -1) + L.forceMove(output_dest) + return + +/obj/item/device/vac_attachment/resolve_attackby(atom/A, mob/user, var/attack_modifier = 1, var/click_parameters) + if(istype(A,/obj/structure) && vac_power > 0) + afterattack(A.loc, user, click_parameters) + return TRUE + return ..() + +/obj/item/device/vac_attachment/pickup(mob/user) + .=..() + icon_state = "sucker-[vac_power]" + +/obj/item/device/vac_attachment/dropped(mob/user as mob) + .=..() + icon_state = "sucker_drop" + +/obj/item/device/vac_attachment/verb/hide_pack() + set name = "Toggle Vac-Pack Sprites" + set desc = "Toggle Vac-Pack sprite visibility" + set category = "Object" + var/choice = tgui_input_list(usr, "Vac-Pack Visibility Options", "Vac-Pack Visibility Options", list("Show Pack", "Show Tube", "Hidden")) + if(choice == "Show Pack") + item_state = "sucker" + if(choice == "Show Tube") + item_state = "sucker_nobag" + if(choice == "Hidden") + item_state = null + usr.update_inv_r_hand() + usr.update_inv_l_hand() + +/obj/item/weapon/storage/Entered(atom/movable/thing, atom/OldLoc) //Holder the mob so they don't get stuck in trashbags etc. + . = ..() + if(isliving(thing)) + var/mob/living/L = thing + var/mob_holder_type = L.holder_type || /obj/item/weapon/holder + new mob_holder_type(src, L) \ No newline at end of file diff --git a/modular_chomp/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/modular_chomp/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 54465130be..d9ad755156 100644 --- a/modular_chomp/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/modular_chomp/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -610,4 +610,4 @@ /obj/item/weapon/handcuffs, /obj/item/toy, /obj/item/petrifier - ) \ No newline at end of file + ) diff --git a/modular_chomp/icons/mob/vacpack.dmi b/modular_chomp/icons/mob/vacpack.dmi new file mode 100644 index 0000000000..644b09f83d Binary files /dev/null and b/modular_chomp/icons/mob/vacpack.dmi differ diff --git a/vorestation.dme b/vorestation.dme index d6d6ed0d14..b1b4c640ae 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -4552,6 +4552,7 @@ #include "modular_chomp\code\game\objects\items\petrifier.dm" #include "modular_chomp\code\game\objects\items\clockwork\ratvarian_spear.dm" #include "modular_chomp\code\game\objects\items\devices\flipper.dm" +#include "modular_chomp\code\game\objects\items\devices\vacpack.dm" #include "modular_chomp\code\game\objects\items\weapons\capture_crystal.dm" #include "modular_chomp\code\game\objects\random\mapping.dm" #include "modular_chomp\code\game\objects\structures\desert_planet_structures.dm"