mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-10 06:34:45 +01:00
add tech storage spawners, improve spawner pixel offsets (#28935)
* add tech storage spawners, improve spawner pixel offsets * fix missing pipe
This commit is contained in:
committed by
GitHub
parent
6c67ba12ef
commit
8dbbc06f3d
@@ -17,10 +17,12 @@
|
||||
var/spawn_loot_count = 1
|
||||
/// If the same item can be spawned twice
|
||||
var/spawn_loot_double = TRUE
|
||||
/// Whether the items should be distributed to offsets 0,1,-1,2,-2,3,-3.. This overrides pixel_x/y on the spawner itself
|
||||
/// Whether the items should be staggered visually on their location.
|
||||
var/spawn_loot_split = FALSE
|
||||
/// The pixel x/y divider offsets for spawn_loot_split (spaced 1 pixel apart by default)
|
||||
/// The pixel x/y divider offsets for spawn_loot_split (spaced 2 pixels apart by default)
|
||||
var/spawn_loot_split_pixel_offsets = 2
|
||||
/// The placer for loot when `spawn_loot_split` is enabled
|
||||
var/datum/spawner_pixel_placer/pixel_placer
|
||||
/// Whether the spawner should spawn all the loot in the list
|
||||
var/spawn_all_loot = FALSE
|
||||
/// The chance for the spawner to create loot (ignores spawn_loot_count)
|
||||
@@ -51,6 +53,10 @@
|
||||
spawn_loot()
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/obj/effect/spawner/random/Destroy()
|
||||
. = ..()
|
||||
qdel(pixel_placer)
|
||||
|
||||
/obj/effect/spawner/random/proc/generate_loot_list()
|
||||
if(loot_type_path)
|
||||
loot += typesof(loot_type_path)
|
||||
@@ -82,9 +88,11 @@
|
||||
var/list/loot_list = generate_loot_list()
|
||||
var/safe_failure_count = 0
|
||||
|
||||
if(spawn_loot_split)
|
||||
pixel_placer = new(spawn_loot_split_pixel_offsets, spawn_random_offset_max_pixels)
|
||||
|
||||
if(length(loot_list))
|
||||
var/loot_spawned = 0
|
||||
var/pixel_divider = FLOOR(spawn_random_offset_max_pixels / spawn_loot_split_pixel_offsets, 1)
|
||||
while((spawn_loot_count-loot_spawned) && length(loot_list) && safe_failure_count <= 10)
|
||||
loot_spawned++
|
||||
var/lootspawn = pick_weight_recursive(loot_list)
|
||||
@@ -122,16 +130,12 @@
|
||||
else if(spawn_random_offset)
|
||||
spawned_loot.pixel_x = rand(-spawn_random_offset_max_pixels, spawn_random_offset_max_pixels)
|
||||
spawned_loot.pixel_y = rand(-spawn_random_offset_max_pixels, spawn_random_offset_max_pixels)
|
||||
else if(spawn_loot_split)
|
||||
if(loot_spawned)
|
||||
var/column = FLOOR(loot_spawned / pixel_divider, 1)
|
||||
spawned_loot.pixel_x = spawn_loot_split_pixel_offsets * (loot_spawned % pixel_divider) + (column * spawn_loot_split_pixel_offsets)
|
||||
spawned_loot.pixel_y = spawn_loot_split_pixel_offsets * (loot_spawned % pixel_divider)
|
||||
else if(spawn_loot_split && loot_spawned)
|
||||
pixel_placer.place(spawned_loot, loot_spawned)
|
||||
|
||||
if(container)
|
||||
spawned_loot.forceMove(container)
|
||||
|
||||
|
||||
/**
|
||||
* Makes the actual item related to our spawner. If `record_spawn` is `TRUE`,
|
||||
* this is when the items spawned are recorded to blackbox (except for `/obj/effect`s).
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
/// For use when arranging items on a tile with a staggered visual
|
||||
/// appearance. Initially for use with [/obj/effect/spawner/random]s.
|
||||
/datum/spawner_pixel_placer
|
||||
/// The pixel x/y divider offsets between items.
|
||||
var/pixel_offsets = 2
|
||||
/// Maximum offset distance from the center of a tile.
|
||||
var/max_pixel_offset = 16
|
||||
/// For tracking if we're staggering from the top left or bottom right.
|
||||
var/static/list/offsets = list(1, -1)
|
||||
var/offset_multiplier = 0
|
||||
var/pixel_divider
|
||||
/// The items we've added so far. Used to perform one
|
||||
/// last visual arrangement in z-order once complete.
|
||||
var/list/added_items
|
||||
|
||||
/datum/spawner_pixel_placer/New(pixel_offsets_, max_pixel_offset_)
|
||||
. = ..()
|
||||
pixel_offsets = pixel_offsets_
|
||||
max_pixel_offset = max_pixel_offset_
|
||||
pixel_divider = FLOOR(max_pixel_offset * 2 / pixel_offsets, 1)
|
||||
|
||||
/datum/spawner_pixel_placer/proc/place(atom/item, count)
|
||||
if(count == 1)
|
||||
added_items = list(item)
|
||||
return
|
||||
|
||||
var/offset = offsets[(count % 2) + 1]
|
||||
if(offset == 1)
|
||||
added_items.Add(item)
|
||||
offset_multiplier++
|
||||
else
|
||||
added_items.Insert(1, item)
|
||||
var/column = FLOOR(count / pixel_divider, 1)
|
||||
var/loot_pixel_x = offset * (pixel_offsets * (offset_multiplier % pixel_divider) + (column * pixel_offsets))
|
||||
var/loot_pixel_y = offset * (pixel_offsets * (offset_multiplier % pixel_divider))
|
||||
item.pixel_x = loot_pixel_x
|
||||
item.pixel_y = -loot_pixel_y
|
||||
|
||||
/datum/spawner_pixel_placer/Destroy(force, ...)
|
||||
. = ..()
|
||||
|
||||
// Once we've placed all our items, arrange them visually from top to bottom.
|
||||
if(!isnull(added_items))
|
||||
for(var/i in 1 to length(added_items))
|
||||
var/atom/A = added_items[i]
|
||||
A.layer += 0.001 * i
|
||||
|
||||
added_items.Cut()
|
||||
@@ -0,0 +1,95 @@
|
||||
/obj/effect/spawner/random/tech_storage
|
||||
name = "generic circuit board spawner"
|
||||
icon = 'icons/effects/random_spawners.dmi'
|
||||
icon_state = "circuit_board"
|
||||
spawn_loot_split = TRUE
|
||||
spawn_loot_split_pixel_offsets = 3
|
||||
spawn_all_loot = TRUE
|
||||
|
||||
/obj/effect/spawner/random/tech_storage/medical
|
||||
name = "medical circuit boards spawner"
|
||||
loot = list(
|
||||
/obj/item/circuitboard/bodyscanner,
|
||||
/obj/item/circuitboard/clonepod,
|
||||
/obj/item/circuitboard/clonescanner,
|
||||
/obj/item/circuitboard/cloning,
|
||||
/obj/item/circuitboard/cryo_tube,
|
||||
/obj/item/circuitboard/pandemic,
|
||||
/obj/item/circuitboard/sleeper,
|
||||
)
|
||||
|
||||
/obj/effect/spawner/random/tech_storage/security
|
||||
name = "security circuit boards spawner"
|
||||
loot = list(
|
||||
/obj/item/circuitboard/camera,
|
||||
/obj/item/circuitboard/prisoner,
|
||||
/obj/item/circuitboard/secure_data,
|
||||
)
|
||||
|
||||
/obj/effect/spawner/random/tech_storage/engineering
|
||||
name = "engineering circuit boards spawner"
|
||||
loot = list(
|
||||
/obj/item/circuitboard/atmos_alert,
|
||||
/obj/item/circuitboard/powermonitor,
|
||||
/obj/item/circuitboard/smes,
|
||||
/obj/item/circuitboard/stationalert,
|
||||
)
|
||||
|
||||
/obj/effect/spawner/random/tech_storage/teleporter
|
||||
name = "teleporter circuit boards spawner"
|
||||
loot = list(
|
||||
/obj/item/circuitboard/teleporter_station,
|
||||
/obj/item/circuitboard/teleporter_hub,
|
||||
/obj/item/circuitboard/teleporter,
|
||||
/obj/item/circuitboard/message_monitor,
|
||||
)
|
||||
|
||||
/obj/effect/spawner/random/tech_storage/supply
|
||||
name = "supply circuit boards spawner"
|
||||
loot = list(
|
||||
/obj/item/circuitboard/ore_redemption,
|
||||
/obj/item/circuitboard/autolathe,
|
||||
)
|
||||
|
||||
/obj/effect/spawner/random/tech_storage/research
|
||||
name = "research circuit boards spawner"
|
||||
loot = list(
|
||||
/obj/item/circuitboard/protolathe,
|
||||
/obj/item/circuitboard/scientific_analyzer,
|
||||
/obj/item/circuitboard/rdserver,
|
||||
/obj/item/circuitboard/rdconsole,
|
||||
/obj/item/circuitboard/aifixer,
|
||||
)
|
||||
|
||||
/obj/effect/spawner/random/tech_storage/robotics
|
||||
name = "robotics circuit boards spawner"
|
||||
loot = list(
|
||||
/obj/item/circuitboard/mechfab,
|
||||
/obj/item/circuitboard/mech_recharger,
|
||||
/obj/item/circuitboard/mech_bay_power_console,
|
||||
/obj/item/circuitboard/cyborgrecharger,
|
||||
)
|
||||
|
||||
/obj/effect/spawner/random/tech_storage/silicon
|
||||
name = "secure silicon circuit boards spawner"
|
||||
loot = list(
|
||||
/obj/item/circuitboard/aicore,
|
||||
/obj/item/circuitboard/aiupload,
|
||||
/obj/item/circuitboard/borgupload,
|
||||
)
|
||||
|
||||
/obj/effect/spawner/random/tech_storage/comms
|
||||
name = "secure command circuit boards spawner"
|
||||
loot = list(
|
||||
/obj/item/circuitboard/card,
|
||||
/obj/item/circuitboard/communications,
|
||||
)
|
||||
|
||||
/obj/effect/spawner/random/tech_storage/rnd
|
||||
name = "secure science circuit boards spawner"
|
||||
loot = list(
|
||||
/obj/item/circuitboard/rnd_network_controller,
|
||||
/obj/item/circuitboard/rnd_backup_console,
|
||||
/obj/item/circuitboard/mecha_control,
|
||||
/obj/item/circuitboard/robotics,
|
||||
)
|
||||
Reference in New Issue
Block a user