GamesDoneQuick / gdq-break-channels

Break Screen Channels for GDQ broadcasts
Other
141 stars 45 forks source link

feat: add Dragon Warrior channel #10

Closed campaul closed 1 year ago

campaul commented 1 year ago

Description

Adds a Dragon Warrior channel. The player walks right forever on a looping background. Donations trigger "battles" where a message including the donation amount appears, then the battle UI closes after 1.5 seconds. The donation amount controls which slime appears:

Donations that come in during a battle don't trigger a new battle.

https://github.com/GamesDoneQuick/gdq-break-channels/assets/552768/a33355f7-89aa-4cf1-a0bd-0e64653a40d3

Checklist:

chrishanel commented 1 year ago

Thank you for the submission!

I think this is a really clever idea, however I feel like there's a lot more potential for taking the concept further. Would it be worth exploring building a true combat cycle into the loop? I could see it be where slimes are randomly spawned with a set HP, and then donations function as attacks worth that much damage.

campaul commented 1 year ago

I think that's a great idea, and it shouldn't be too hard to add in based on how stuff is set up. I'll get to work on that.

campaul commented 1 year ago

Updates from adding combat:

When a donation comes in, it will trigger a fight. At this point, donations will begin being queued for playback. Donations are applied from the queue until the monster has died. If the queue remains empty for 15 seconds, the monster will run away so we're not stuck on a static combat screen. Events that are in the queue when combat ends are discarded.

The monsters spawn with 2x the initiating donation amount as their HP. This seems like a good difficulty starting point to get a monster that needs more than one hit to kill but doesn't always end up running away. This parameter can be tuned with the HP_SCALE_FACTOR const.

"Attacks" now print the charity being donated to. This can be changed with the CHARITY const. Not sure if there's a better way to get the charity name so we don't risk this printing MSF during other events.

The state machine has gotten a little more complex than I'd like but it appears to work reliably. I intend to refine this after GDQ is over when I can take more time and focus more, but I don't think I can do much better if this is something we want to merge before the marathon is over.

dw_encounter dw_attack dw_victory dw_run

Suyooo commented 1 year ago

Not sure if there's a better way to get the charity name so we don't risk this printing MSF during other events.

You can get it from the currentEvent replicant! (The Oregon Trail and Papers Please channels use it, if you want to see more examples)

const [event] = usePreloadedReplicant<Event>('currentEvent');
event.beneficiaryShort; // "MSF"
campaul commented 1 year ago

I made one further behavior change beyond what I described above. Now there is a MAX_HITS number after which the fight will be won regardless of the slime's HP. This is to prevent a single large donation during a steady stream of smaller donations from resulting in a never ending fight.

campaul commented 1 year ago

I totally agree there's more that can be done with this. I've got several potential ideas I'd like to implement over the coming weeks and I'd love to hear ideas for other things to add to the list. I'll avoid working on these for the moment so there isn't too much churn in this PR, but here's what I'm planning so far:

campaul commented 1 year ago

Thanks for checking, that was intentional. I'm having some anxiety about having my name up in front of so many people so I opted to leave it out.