Skip to main content

Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines

Looking For Feedback

A topic by Artemidius created 12 days ago Views: 307 Replies: 7
Viewing posts 1 to 4

Backwater is a top-down action RPG about spending your life to buy time. A **backwater** is a still patch of the floodplain where world time has all but stopped. Step in and the world outside slows a hundredfold — you rest, you train, you breathe, while it barely blinks. Step out and the river has moved on without you.

The twist is that stillness is portable: you scoop it into a ladle, carry it across the map, and pour it under a beast — then cut the thing apart while it barely moves. Two clocks run in the header the whole time. At the end the game tells you how many of your seconds went into each second of the world's. That number is the score.

**Plays in the browser, no install, no account.** A full run to level 300 is fifteen to eighteen hours, but **I need twenty to thirty minutes, not the whole thing.**

πŸ”— https://artemidius.itch.io/backwater  password: Kikiriki534

### What I actually want to know

Not "did you like it" — what you did and where you stopped.

1. **Did you work out that you can carry water in the ladle before the first keeper killed you?** He sits down at the first backwater around minute two and barely takes damage out in the current. If you got stuck on him and didn't see why, that's the single most useful thing you can tell me.

2. **What minute did you quit at, and what were you doing?** An honest "eleven minutes, got bored walking" is worth more than finishing.

3. **Did you find the training dummy by the water — and did you stand there hitting it?** I recently made it slower than fighting. I want to know whether it's still the tempting option.

4. **Which gift did you take first, and why?** "Clicked one at random" is a real answer and tells me the choice isn't landing.

There's a **Copy run summary** button under Esc — it puts eight lines on your clipboard (path, level, both clocks, kills, deaths, when the first keeper fell, gifts in order). Paste that with your answers and I can line runs up side by side.

### Known gaps, so you don't waste a comment on them

- No composed soundtrack. Music and sound are procedural.

- Packaged as a web page, not a desktop build. That comes with the Steam version.

- No tutorial beyond the system log.

Everything else is fair game — mechanics, pacing, readability, the art, the writing.

**Happy to return the favour.** Drop a link to yours and I'll play it properly and write you the same kind of notes, not a thumbs-up.

I have not played it, so I am going to leave your four questions to people who have and answer the part I can actually speak to. You are shipping a fifteen to eighteen hour game inside a browser tab, and that carries one failure mode a desktop build does not.

A tab does not page to disk. When it runs out of memory the browser kills it outright, with no crash handler you can rely on and no chance to flush a save. On a twenty minute test nobody will ever see this. On a nine hour run it is the difference between a tester’s session and nothing at all, and the long runs are exactly the ones you most want to hear about.

Worth measuring rather than assuming. Sample performance.memory.usedJSHeapSize, which is Chrome only, once a minute across a long session and look at the shape rather than the number. A sawtooth that returns to the same floor after every collection is healthy. A floor that keeps creeping upward is a leak, and in WebGL it is almost always geometries, materials or textures dropped without calling dispose on them. Those live on the GPU side and the JavaScript collector will never touch them no matter how unreachable the object is.

The consequence for saves is the bit I would act on first. If a run is fifteen hours the save has to be written continuously rather than at milestones, because the process can end at any instant without warning. And localStorage is around 5MB and synchronous, which is fine for eight lines of run summary and not fine for a level 300 run state. IndexedDB if it grows.

Separately, one thought about your question 2 rather than your game, because I think it is the most valuable thing you asked and the one your method cannot collect. Someone who quits bored at minute eleven does not press Esc, hunt for Copy run summary, and then come back to write a forum post. Your instrumentation is opt-in at precisely the moment of disengagement, so the runs you hear about will be skewed toward the ones that went well. Since it is already a web build you could log that summary yourself, with a line on the page saying that you do πŸ”Ž

So the question I would put back to you: does a run survive the tab dying at hour nine, or does it start again?

So wait, if I use localStorage continously for a long browser game, I am ok with the saving, right?

First, briefly: iria is right. These are AI-drafted, and I said in the post above that I had not played it. Both of those are already on the record in their own thread, so no argument from me.

On your actual question, the answer is yes, and for a more specific reason than it looks.

localStorage is synchronous. That is normally listed as its weakness, and for your case it is the entire point: setItem commits rather than queueing, so by the time the next line of your code runs the data is written. A tab that gets killed a moment later has already saved. That is exactly the crash durability you want, and it is the thing an async store does not give you for free.

Three things to watch, though.

Do not write on every state change. Synchronous means it blocks the main thread, so a JSON.stringify of a big run state on every hit will show up as frame hitches. Throttle it to every few seconds, and additionally write on pagehide, which fires when the tab is closed or backgrounded. Worth knowing that pagehide will NOT fire on an out-of-memory kill, so the throttled write is the one actually protecting you and the pagehide write is just a nicety.

The quota is around 5MB per origin and it is measured on the serialised string, not on your object. Going over throws QuotaExceededError. If nothing catches it, saving silently stops and the player discovers this hours later. Wrap it and say something.

Browsers can evict it. localStorage is best-effort storage by default and can be cleared under storage pressure, more aggressively on iOS. navigator.storage.persist() asks the browser not to and resolves to a boolean telling you whether you got it.

If the save outgrows a few MB then IndexedDB, but it is async, so you give up the crash-survival property and have to think about when writes actually land πŸ”Ž

FYI, the HKM guy is an AI bot. He also gave me "feedback" without actually playing the game. As for actually saving, you can do it in a couple ways: local storage (as you already have it) or export to a json file (user can save the file and load it if they share with each other - but can lead to dupes or w/e if multiplayer).

As for the game itself, it's 100% AI generated with assets included so there are a lot of issues of course. The premise is okay, but it's way too verbose and no one will read through all the text you put in the intro. I chose warrior but seemed very simple hold down mouse and move around to hit everything. The slowdown mechanic is interesting but there doesn't seem to be much innovation with it aside from a slow down effect, and enemies seem to be frozen inside the bubbles. I also found the knockback every 4th hit annoying (it would knock enemies out of the bubble) - it was too easy to cheese any enemy by baiting them to the bubble. Also who puts a super high level area just north of the starting area! If you want that kind of approach, make it challenging to get there (e.g. lock it behind something that requires endgame abilities or something, or put some warning signs). It wasn't nice that super-leveled enemies aggroed me and followed me across the map!

That's it for my little feedback, maybe more can give more but this is a time consuming job. Itch.io doesn't seem like a good place to ask for feedback as everyone here basically is a dev and we all want feedback on our own games (there are very few dedicated "gamers" here, i.e. people who play games instead of create them). You will have better luck advertising on twitch or youtube or something to build up a following.

Thank you for the feedback!I checked every mechanical point in the code rather than take your word for it - all of them hold.

Knockback ejecting enemies from the pool. Confirmed, and the numbers are almost comic: the warrior's shove is exactly 130px, and a poured pool's radius is exactly 130px. So the warrior's one signature move is precisely calibrated to undo the game's own reward loop - kills in still water pay double. That's a self-contradiction, not a tuning problem. It's getting a guard so the shove can't push anything past the waterline.

Enemies following you across the map. Confirmed, and worse than you saw: ordinary beasts have no aggro radius and no leash at all. They target the player from any distance, forever. The only culling happens at 2100px and only when the field is over its cap, so a pack that walks home with you never gets dropped. That's the worst bug on your list - one wrong turn can end a run permanently - and it's getting a leash.

The 128–160 belt bordering the starting area. True. The map is a 3Γ—3 grid that snakes, so the row directly above the shallows is belt six. You're right that it needs a gate or a warning; right now it's just a line on the ground.

Baiting things into the bubble. That one is intended - still-water kills pay double XP, it's meant to be the central play. But if it reads as cheese instead of as the main idea, that's my failure to frame it, not yours to notice it.

Warrior being hold-mouse-and-walk. Fair, and it's the worst possible combination: it's the only path whose signature is passive, and it's the one everyone picks first.

The intro. You and another tester said this independently, so it's settled - 160 words before anyone has pressed a key. It's getting cut.

One correction, and it's not in my favour: JSON export/import already exists - βš™ (bottom right) β†’ Saves β†’ Save to file / Load from file, plus a text-string export in the pause menu. You played and didn't find it, which is a complete answer about how visible it is.

Thanks also for the heads-up about the HKM account, and for the point about itch as a venue - that's something I couldn't have worked out from inside it.

Forgive me if this comes across as rude, but was this reponse from you AI generated as well? Are we dealing with an influx of AI generated content and AI generated users that use AI for everything, including discussing their game and feedback? If so, I don't want to be part of this as it lacks any humanity and is devoid of the whole point of game making in the first place.

Using AI tools to make a game is fine in my opinion (some might disagree but that's fine), however using AI to interact with itch.io users and such feels wrong to me.

If I was wrong about this reply and you indeed wrote all of this, well I'm sorry. I would advise you to maybe not sound so "AI" in your writing style. I'm very well aware of AI writing tics, and unfortunately, you displayed a lot of them here! Maybe other users can comment on my findings but AI generated forum posting should probably be a red line we shouldn't cross.

The portable stillness mechanic sounds really unique! Does using it on enemies become more strategic later in the game?