Bugs EVERYWHERE (and Replay Despair)

This week I finished writing and implementing all the vital dialogue, and started finally, actually testing Bleed 2 on Steam!! Exciting times!! The number of bugs that were revealed was… large. Here’s some descriptions of builds I’ve uploaded in the last few days:

So up until a few days ago, Challenge Mode arenas had no music. Your scores weren’t being sent to the leaderboards when you beat Arcade Mode. You could click a locked box on the character select screen and it’d let you play as them anyway. You could run through the game with “infinite health” on and it’d let you submit the score like it was the most legit thing ever. Etc etc etc. Before this week, I honestly thought I’d found all the bugs in the game! Not so much.

In addition to those bugs, some other interesting exploits(?) were brought to light — for example, the pistols/katana combo weapon.

The idea behind the combo is that the katana is good for reflecting bullets and taking out minor baddies up-close, but the pistols are the better overall damage-dealer and safer option. A combination of defense and offense! HOWEVER. If you have good timing, you can swing the katana at max speed while firing pistol shots in between to get this unholy combination that eats the individual weapons alive, in terms of damage.

I’m not sure yet what to do with this one. I mean, I have a solution — just make the first few pistol shots do a bit less damage. It brings the DPS of the frenetic spam way down, while barely affecting the pistols’ DPS overall — and I made sure anything they killed in one hit still dies, even to the weak bullets. The question isn’t really if I can, but if I should.

I worry that if I take out too many things like this, it’ll make the game rigid or mechanically shallow or not as fun to explore for a certain kind of player. I don’t want the average player to think they have to do this kind of thing to excel, but at the same time, I’m sure a vast majority of “average players” won’t even think about it and will enjoy the game whatever way they want to. Maybe it’s not worth it to ruin the fun of a different kind of player, like (potentially) a speedrunner. There are other things like this that I’ve already chosen to leave in, but this is one I want to think more about.

That aside, I also put replays in (for testing purposes, is what I tell myself.) I even added a fast-forward feature! It’s oddly satisfying to watch.

Unfortunately, I also tested replays a bunch, and right now they’re just not up to par. You can record a replay and it plays back fine — come back a few days later (using the same build) and it no longer works. I’ve been banging my head against this for a few days now, even going so far as to print out each random number with a timestamp to compare when replays work to when they don’t.

So here, for example. Four enemies are supposed to request random integers (resulting in 12, 32, 46 and 19) but sometimes only three of them do. It creates a domino effect where the next object to ask for a random float was supposed to get 0.6815746 (the next random number after 19) but it gets 0.4345093 instead, leading to different behaviour, and so on and so forth for every other object and enemy after it.

For any programmer-types reading this: I’m not using any threading. The replay breaks at this same spot when played back at 1x, 2x, 10x, etc (although at SOME speeds it works here, but then consistently breaks in a later area.) The game is locked at 60fps and even when the game lags it still thinks 1 frame = 16.667ms, so timers shouldn’t be breaking. If I actually step-through debug this code, it always works, but running the debug build without stepping through desyncs. My best (uninformed) guess at this point is that it’s floats breaking down (although I don’t understand why it’s so consistent in when it occurs???) If anyone has any ideas, feel free to email me. I’m at the end of my rope with this one.

In non-programmer speak: I’m giving up on replays, at least for now.

BUT!! I’m still going to ship them in the game. Ha-HAAAA!! I’ve decided it’ll be a hidden feature you can opt-in to with a command-line argument. You know the risks, so you can’t complain if they break. I just think it’s a neat feature and secretly hope I can get it fully working one day (and so I can watch some co-op arcade runs!)

All this has been generally productive (the replays, debatably so) but it’s time to stop procrastinating and just do the art for the credits.

Till next time!