Thanks for this incredible write-up — easily the most thorough playtest I've gotten, and writing a kiting bot + headless runs over 20 seeds per setting is way beyond what I expected from a jam comment. You're officially my favorite QA.
I've fixed all of this locally and it'll go live as soon as uploads reopen after the jam:
- iOS filter: switched ctx.filter to canvas.style.filter = 'saturate(N%)'. Safari supports it, and it composites the finished frame once instead of per draw call. Color challenge should now work on iPhones.
- Upgrade eating the pull: instead of cancelling a held pull when the card pops, it now detonates it — you keep the blast damage, no free cooldown penalty. Same fix applies to pause.
- Upgrade grace period: picking an upgrade now grants 1.2s of invincibility (same length as holdMax), so you have time to get your thumb back on the stick and re-orient before the next bullet connects. That 0.2s death should no longer happen.
- Color reward feeling invisible: each restored color tier now adds +1 chain damage alongside the extra hop. At tier 2 chain damage equals blast damage, so the chain actually clears enemies instead of pinging them for 1.
- The double title in the English start card is gone, and the pause button is now 36px.
Really glad the core loop felt tight — the pull-as-decision feedback was exactly what I needed to hear. Good luck with Greystack!