Files
Bubberstation/code/controllers/subsystem/queuelinks.dm
SkyratBot 2eac95b7a1 [MIRROR] Adds a small cafeteria behind the right wing shutters of the museum. (#26766)
* Adds a small cafeteria behind the right wing shutters of the museum. (#81465)

## About The Pull Request
I was thinking to contribute something to the new away mission map to
make it better. Mapping and all takes too much time for me, so I could
do little. Though it comes with its own unique gimmicks.

To reach the cafeteria, one has to complete a couple puzzles.
The first set is opened by inputing the correct PIN on the password
panel beside it. There're several clues to help you guess this fairly
easy puzzle, in the form of several number graffitis, a scrapped piece
of paper full of numbers, and a board filled with colored dots also
found just beside the panel.
The second one is opened by a keycard, and is generally lazier. To find
it, you'll need to do a bit of (toilet) searching.

As for the unique things this PR adds:
- A fire extinguisher... that actually contains welding fuel
- A (dirt-cheap) hotdog vending machine*
- A completely ornamental maneki-neko (that's the name of the
luck-bringing, paw-waving cat figurine)
- A piggy bank that carries money between rounds. It has a cap of 10k
credits worth of holochips, cash and coins, which is pretty high, but
I'm confident people will just destroy it for its contents the moment
they find it. His name is Pigston Swinelord VI.
- More, totally legit and not actually fake bombable walls :^)

*By the by, you can also find it during the national hotdog day.

Screenshots of the new location:
![museum
cafe](https://github.com/tgstation/tgstation/assets/42542238/1c0d93b7-90d5-4459-a48d-81430f0d3613)
![museum
restrooms](https://github.com/tgstation/tgstation/assets/42542238/5a9e049d-6acc-464b-998d-901e43154bae)

## Why It's Good For The Game
You know how most away missions are not that special at all? Yeah,
@ mc-oofert set an example of a pretty decent one actually, if not a tad
small. I thought it could use a touch of another mind actually
contributing to it too, because it deserves it.

Also, this sets the basis for other persistent piggy banks. I don't
think they should all have that 10k cap like this one, perhaps 1k is
enough. Beside, the code that mothblocks did for json database datum is
pretty good, so there is not a whole lot of shitcode here.

## Changelog

🆑
add: Added a cafeteria to the museum away mission, with a few special
things to it. To reach it, you'll have to complete a couple puzzles
however.
map: The museum away mission now has a couple restrooms.
add: Hotdog vending machines may spawn during the National Hot Dog Day.
/🆑

* Adds a small cafeteria behind the right wing shutters of the museum.

---------

Co-authored-by: Ghom <42542238+Ghommie@users.noreply.github.com>
2024-03-07 08:53:28 -06:00

83 lines
2.2 KiB
Plaintext

/atom/proc/MatchedLinks(id, list/partners)
SUBSYSTEM_DEF(queuelinks)
name = "Queue Links"
flags = SS_NO_FIRE
init_order = INIT_ORDER_QUEUELINKS
///assoc list of pending queues, id = /datum/queue_link
var/list/queues = list()
/datum/controller/subsystem/queuelinks/Initialize()
return SS_INIT_SUCCESS
///Creates or adds to a queue with the id supplied, if the queue is now or above the size of the queue, calls MatchedLinks and clears queue.
/// queues with a size of 0 wait never pop until something is added with an actual queue_max
/datum/controller/subsystem/queuelinks/proc/add_to_queue(atom/what, id, queue_max = 0)
if(!isatom(what))
CRASH("Attempted to add a non-atom to queue; [what]!")
if(isnull(id))
CRASH("Attempted to add to queue with no ID; [what]")
var/datum/queue_link/link = queues[id]
if(isnull(link))
link = new /datum/queue_link(id)
queues[id] = link
if(link.add(what, queue_max))
queues -= id
/**
* Pop a queue link without waiting for it to reach its max size.
* This is useful for those links that do not have a fixed size and thus may not pop.
*/
/datum/controller/subsystem/queuelinks/proc/pop_link(id)
if(isnull(id))
CRASH("Attempted to pop a queue with no ID")
var/datum/queue_link/link = queues[id]
if(isnull(queues[id]))
CRASH("Attempted to pop a non-existant queue: [id]")
link.pop()
queues -= id
/datum/queue_link
/// atoms in our queue
var/list/partners = list()
/// how much length until we pop, only incrementable, 0 means the queue will not pop until a maximum is set
var/queue_max = 0
/// id
var/id
/datum/queue_link/New(new_id)
id = new_id
return ..()
///adds an atom to the queue, if we are popping this returns TRUE
/datum/queue_link/proc/add(atom/what, max = 0)
. = FALSE
if(what in partners)
return
partners += what
if(queue_max != 0 && max != 0 && max != queue_max)
CRASH("Tried to change queue size to [max] from [queue_max]!")
else if(!queue_max)
queue_max = max
if(!queue_max || length(partners) < queue_max)
return
pop()
return TRUE
/datum/queue_link/proc/pop()
for(var/atom/item as anything in partners)
item.MatchedLinks(id, partners - item)
qdel(src)
/datum/queue_link/Destroy()
. = ..()
partners = null