diff --git a/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm b/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm index 3ac6de20314..26414bff313 100644 --- a/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm +++ b/_maps/map_files/RandomRuins/SpaceRuins/deepstorage.dmm @@ -1284,6 +1284,7 @@ /area/ruin/space/deepstorage) "gq" = ( /obj/structure/rack, +/obj/effect/spawner/lootdrop/bluespace_tap/cultural, /turf/simulated/floor/plasteel{ dir = 6; icon_state = "vault" @@ -2664,9 +2665,10 @@ }, /area/ruin/space/deepstorage) "pk" = ( -/obj/structure/table/reinforced, /obj/effect/decal/cleanable/dirt, -/obj/item/salvage/ruin/russian, +/obj/structure/rack, +/obj/item/stack/spacecash/c500, +/obj/effect/spawner/lootdrop/bluespace_tap/cultural, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "vault" @@ -2675,9 +2677,8 @@ "ps" = ( /obj/structure/rack, /obj/effect/turf_decal/delivery/hollow, -/obj/item/grenade/confetti, -/obj/item/grenade/confetti, -/obj/item/grenade/confetti, +/obj/item/stack/spacecash/c500, +/obj/effect/spawner/lootdrop/bluespace_tap/organic, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "vault" @@ -3939,8 +3940,10 @@ /turf/simulated/floor/plasteel, /area/ruin/space/deepstorage) "ye" = ( -/obj/structure/table/reinforced, -/obj/item/salvage/ruin/russian, +/obj/structure/rack, +/obj/item/grenade/confetti, +/obj/item/grenade/confetti, +/obj/item/grenade/confetti, /turf/simulated/floor/plasteel{ dir = 6; icon_state = "vault" @@ -4673,10 +4676,10 @@ /turf/simulated/floor/catwalk, /area/ruin/space/deepstorage) "Cn" = ( -/obj/structure/safe, /obj/effect/turf_decal/delivery/hollow, -/obj/item/stack/spacecash/c500, -/obj/effect/spawner/random/deepstorage_award, +/obj/structure/rack, +/obj/effect/spawner/random/deepstorage_reward, +/obj/effect/spawner/random/deepstorage_reward, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "vault" @@ -5482,8 +5485,8 @@ /area/ruin/space/deepstorage) "IR" = ( /obj/effect/turf_decal/delivery/hollow, -/obj/structure/safe, -/obj/item/stack/spacecash/c500, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/bluespace_tap/organic, /turf/simulated/floor/plasteel{ dir = 6; icon_state = "vault" @@ -6016,6 +6019,7 @@ /obj/structure/rack, /obj/item/paper/researchnotes, /obj/effect/turf_decal/delivery/hollow, +/obj/effect/spawner/random/deepstorage_reward/main, /turf/simulated/floor/plasteel{ dir = 6; icon_state = "vault" @@ -7685,7 +7689,7 @@ /area/ruin/space/deepstorage) "Yk" = ( /obj/structure/table/reinforced, -/obj/item/salvage/ruin/nanotrasen, +/obj/item/paper/researchnotes, /turf/simulated/floor/plasteel{ dir = 6; icon_state = "vault" diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 109c1f92d60..633683cc3fd 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -12,7 +12,7 @@ active_power_consumption = 200 pass_flags = PASSTABLE - var/list/allowed_devices = list(/obj/item/gun/energy, /obj/item/melee/baton, /obj/item/rcs, /obj/item/bodyanalyzer, /obj/item/handheld_chem_dispenser, /obj/item/clothing/suit/armor/reactive) + var/list/allowed_devices = list(/obj/item/gun/energy, /obj/item/melee/baton, /obj/item/rcs, /obj/item/bodyanalyzer, /obj/item/handheld_chem_dispenser, /obj/item/clothing/suit/armor/reactive, /obj/item/wormhole_jaunter/wormhole_weaver) var/recharge_coeff = 1 var/obj/item/charging = null // The item that is being charged @@ -203,6 +203,10 @@ var/obj/item/clothing/suit/armor/reactive/A = I return A.cell + if(istype(I, /obj/item/wormhole_jaunter/wormhole_weaver)) + var/obj/item/wormhole_jaunter/wormhole_weaver/W = I + return W.wcell + return null /obj/machinery/recharger/proc/check_cell_needs_recharging(obj/item/stock_parts/cell/C) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 3baacc32877..2517b3a3749 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -214,6 +214,8 @@ continue if(!is_teleport_allowed(T.z) && !R.cc_beacon) continue + if(R.wormhole_weaver) + continue if(R.syndicate && !emagged) continue var/tmpname = T.loc.name diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 498e3c41aba..b09a7739b99 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -15,6 +15,7 @@ var/syndicate = FALSE var/area_bypass = FALSE var/cc_beacon = FALSE //set if allowed to teleport to even if on zlevel2 + var/wormhole_weaver = FALSE // special beacons for wormwhole weaver /obj/item/beacon/Initialize() . = ..() @@ -169,3 +170,9 @@ /obj/item/beacon/engine/sing name = "Engine Beacon for Singularity" enginetype = list(ENGTYPE_SING) + +/obj/item/beacon/wormhole_weaver + name = "prototype beacon" + desc = "A beacon used by a prototype wormhole device." + wormhole_weaver = TRUE + icon_state = "beacon_wormhole_weaver" diff --git a/code/modules/awaymissions/mission_code/ruins/deepstorage.dm b/code/modules/awaymissions/mission_code/ruins/deepstorage.dm index dfb0931dbe0..2da93a61bfd 100644 --- a/code/modules/awaymissions/mission_code/ruins/deepstorage.dm +++ b/code/modules/awaymissions/mission_code/ruins/deepstorage.dm @@ -282,6 +282,26 @@ name = "portal" desc = "Good luck." +// loot spawners + +/obj/effect/spawner/random/deepstorage_reward + name = "warehouse fashion reward" + loot = list( + /obj/item/storage/box/syndie_kit/chameleon, + /obj/item/clothing/suit/pimpcoat, + /obj/item/melee/skateboard/hoverboard, + /obj/item/clothing/glasses/sunglasses/yeah + ) + +/obj/effect/spawner/random/deepstorage_reward/main + name = "warehouse main reward" + loot = list( + /obj/item/storage/belt/champion/wrestling, + /obj/item/storage/box/weaver_kit, + /obj/item/gun/medbeam, + /obj/item/storage/lockbox/experimental_weapon + ) + // paper stuff & lore /obj/item/paper/fluff/ruins/deepstorage/log1 @@ -376,15 +396,5 @@ name = "attention" info = {"As per administration's order, unauthorized entry to supply storage is forbidden. Make your requests from the guard wing if you have a pending delivery."} -/obj/effect/spawner/random/deepstorage_award - name = "boss award" - icon_state = "questionmark" - loot = list( - /obj/item/rod_of_asclepius = 3, - /obj/item/storage/box/syndie_kit/chameleon = 3, - /obj/item/storage/belt/champion/wrestling = 1, - /obj/item/storage/box/telescience = 1, - ) - #undef DS_BOSS_STORAGE #undef DS_ENGINEERING diff --git a/code/modules/mining/equipment/wormhole_jaunter.dm b/code/modules/mining/equipment/wormhole_jaunter.dm index 05f37e93c82..5d3911d07f3 100644 --- a/code/modules/mining/equipment/wormhole_jaunter.dm +++ b/code/modules/mining/equipment/wormhole_jaunter.dm @@ -1,3 +1,6 @@ +// the stuff used for wormhole weaver +GLOBAL_LIST_EMPTY(wormhole_effect) + /**********************Jaunter**********************/ /obj/item/wormhole_jaunter name = "wormhole jaunter" @@ -227,3 +230,197 @@ new /obj/effect/portal/jaunt_tunnel(drunken_opening, drunk_dial, src, 100, thrower) new /obj/effect/temp_visual/thunderbolt(drunken_opening) qdel(src) + +/obj/item/wormhole_jaunter/wormhole_weaver + name = "wormhole weaver" + icon = 'icons/obj/device.dmi' + icon_state = "wormhole_weaver" + item_state = "electronic" + desc = "This peculiar device is a prototype from a discontinued project. It was designed as an alternative to jaunters, offering more precise teleportation. However, as a prototype, it drains its entire battery with a single wormhole and can only target the beacons included in the kit." + /// Where are we teleporting to? + var/destination + /// Power cell (10000W). + var/obj/item/stock_parts/cell/high/wcell = null + /// The amount it costs to use this. + var/chargecost = 10000 + var/icon_state_inactive = "wormhole_weaver_inactive" + /// Used for icon update check. + var/inactive = FALSE + /// Is user re-activating the device? + var/currently_reactivating = FALSE + /// Does the user already have the teleportation menu open? + var/menu_open = FALSE + /// Did we get hit by EMP? + var/emp_inflicted = FALSE + /// The turf where we activated the wormwhole. + var/wormhole_loc + +/obj/item/wormhole_jaunter/wormhole_weaver/attack_self(mob/user) + activate(user, TRUE) + +/obj/item/wormhole_jaunter/wormhole_weaver/emp_act(severity) + + if(!emp_inflicted) + playsound(loc, 'sound/machines/shut_down.ogg', 50, TRUE) + visible_message("A malfunction detected in the weaver's subsystems. Initiating safety protocols.") + emp_inflicted = TRUE + inactive = TRUE + icon_state = icon_state_inactive + for(var/obj/O in contents) + O.emp_act(severity) + for(var/obj/effect/temp_visual/thunderbolt_targeting/wormhole_weaver/E in GLOB.wormhole_effect) + if(E) + qdel(E) + visible_message("Wormhole marker disappears!") + do_sparks(5, FALSE, wormhole_loc) + +/obj/item/wormhole_jaunter/wormhole_weaver/proc/prepare_foractivation(mob/user) + if(do_after(user, 3 SECONDS, target = src)) + playsound(loc, 'sound/machines/twobeep.ogg', 50, TRUE) + to_chat(user, "The weaver is now ready for use.") + inactive = FALSE + emp_inflicted = FALSE + currently_reactivating = FALSE + icon_state = initial(icon_state) + else + currently_reactivating = FALSE + +/obj/item/wormhole_jaunter/wormhole_weaver/get_destinations(mob/user) + var/list/destinations = list() + + for(var/obj/item/beacon/B in GLOB.beacons) + if(B.wormhole_weaver) + destinations += B + + return destinations + +/obj/item/wormhole_jaunter/wormhole_weaver/activate(mob/user) + if(wcell.charge < chargecost) + to_chat(user, "Device isn't charged enough to be used at this time.") + return + + if(inactive || emp_inflicted) + if(currently_reactivating) + to_chat(user, "You are already reactivating the device!") + return + currently_reactivating = TRUE + prepare_foractivation(user) + return + + var/list/C = get_destinations(user) + if(!length(C)) + to_chat(user, "[src] found no beacons in the world to anchor a wormhole to.") + return + + if(menu_open) + return + + var/list/L = list() + var/list/areaindex = list() + menu_open = TRUE + + for(var/obj/item/beacon/R in GLOB.beacons) + var/turf/T = get_turf(R) + if(!T) + continue + if(!R.wormhole_weaver) + continue + var/tmpname = T.loc.name + if(areaindex[tmpname]) + tmpname = "[tmpname] ([++areaindex[tmpname]])" + else + areaindex[tmpname] = 1 + L[tmpname] = R + + var/desc = tgui_input_list(user, "Please select a location to target.", "Device Target Interface", L) + if(!desc) + menu_open = FALSE + return + + if(user.stat || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED) || !turf_check(user) || !Adjacent(user)) + menu_open = FALSE + return + + wormhole_loc = get_turf(src) + new /obj/effect/temp_visual/thunderbolt_targeting/wormhole_weaver(wormhole_loc) + destination = L[desc] + user.visible_message( + "[user] pulls out a black colored device and points it to the floor.", + "You activate the wormhole weaver, it will take some time until device assembles a wormhole link." + ) + wcell.use(chargecost) + icon_state = icon_state_inactive + inactive = TRUE + menu_open = FALSE + + sleep(5 SECONDS) + if(emp_inflicted) + return + + create_wormhole(wormhole_loc, destination) + +/obj/item/wormhole_jaunter/wormhole_weaver/proc/create_wormhole(used_turf, turf/destination) + new /obj/effect/portal/jaunt_tunnel(used_turf, get_turf(destination), src, 100) + do_sparks(5, FALSE, used_turf) + +// overridden because we don't need this +/obj/item/wormhole_jaunter/wormhole_weaver/chasm_react(mob/user) + return + +/obj/item/wormhole_jaunter/wormhole_weaver/emag_act(mob/user) + to_chat(user, "Emagging [src] has no effect.") + +/obj/effect/temp_visual/thunderbolt_targeting/wormhole_weaver + duration = 5 SECONDS + +/obj/effect/temp_visual/thunderbolt_targeting/wormhole_weaver/Initialize() + . = ..() + GLOB.wormhole_effect += src + playsound(loc, 'sound/machines/twobeep.ogg', 50, TRUE) + set_light(2, l_color = "#FFD165") + +/obj/effect/temp_visual/thunderbolt_targeting/wormhole_weaver/Destroy() + GLOB.wormhole_effect -= src + return ..() + +// below here is recharge code for wormhole weaver, taken from rcs code +/obj/item/wormhole_jaunter/wormhole_weaver/get_cell() + return wcell + +/obj/item/wormhole_jaunter/wormhole_weaver/New() + ..() + wcell = new(src) + +/obj/item/wormhole_jaunter/wormhole_weaver/examine(mob/user) + . = ..() + . += "Device currently has [chargecost > wcell.charge ? "insufficient" : "sufficient"] power. You can recharge it with a recharger." + +/obj/item/wormhole_jaunter/wormhole_weaver/Destroy() + QDEL_NULL(wcell) + return ..() + +/obj/item/paper/fluff/weaver_instruction + name = "prototype guideline" + info = {"