postmortem
This is just a bunch of random thoughts. I wasn't able to edit it into something more coherent. Don't feel like you need to read it.
This entry was important for me. It assuaged the frustration I felt after The Forgotten Angel, my PyWeek 19 entry. That was supposed to be a plot-heavy action game, of limited difficulty, with a mysterious, unfolding storyline. Although the core mechanics were implemented, only about half the plot was there, and there were a lot of rough edges. I had voiceover planned, but I ran out of time. Beyond the Horizon had many of the same goals as The Forgotten Angel, but it was actually complete. Overall I'm happy with how it turned out.
One thing I always aim for is introducing material (both story and mechanics) as you go along, instead of one big dump at the beginning or end. This requires a lot of care: if you mess up, players don't have all the information when they need it. But I think it makes a big difference in immersion. Beyond the Horizon actually has a playable cold open, which is a first for me. It's great from a dramatic perspective because it means the player is paying attention for the title screen (and I put a lot of effort into the title screen this time).
Another thing I aim for (not always successfully) is economy of controls. I want to make the controls as simple as possible. Usually that means keyboard or mouse only, not both. When it is keyboard, arrow keys plus one action key, maybe two. Midway through this time I realized I was up to four action keys, but I was able to bring that down. I combined two into one by making hold and tap of one key do different things. And I eliminated another by making different ships each do a single action. I was happy with that. I don't know how much of a difference it makes in the end, but I feel like it's worth it. It's so easy to let controls get overly complex.
I had voiceover for the first time in PyWeek this time! Voiceover is great, because then people can't skip the story, and you don't need to write the later part wondering if they heard the beginning. I think it's also easier for people to absorb. But, obviously, it's a lot of work. When you're coordinating with different people, things serialize, which makes the deadlines that much tighter. I needed to have all the game mechanics decided on Tuesday, so the story could be finished by Wednesday, so the voice actors could be done by Friday. And of course it helps the artist to know what the characters sound like, and vice versa. By the time the playtester got the game on Saturday, there was absolutely no way to change the core mechanics in a way that would be reflected in the dialogue. (There was one minor thing I needed to change to prevent the game from getting into an unwinnable state, but it contradicts the dialogue. I just changed it and hoped nobody noticed that the dialogue was slightly wrong.)
So the game mechanics and story were a bit rushed. I originally wanted you to have to build a network of connections between the surface and objectives, and to fill in your map as you explore. I felt like this wasn't really coming together, so I dropped it on Wednesday in favor of simply locating objectives. And instead of you finding or placing things and having them added to the map, stuff just shows up on the map and you go to it.
That was probably the main thing I wish I could have spent more time on. The sense of exploration and discovery was not as great as it could have been. At one point in the game, you start locating what are called "convergences". Originally you would need to follow the pattern of bubbles in the background and look for where they come together. But, I was worried this was way too subtle, and I couldn't think of a good way to hint at it without running the risk of players completely missing it. So now convergences just get added to your map and you go there. (Actually, the follow-the-bubbles thing is still in there, and you can use it to find convergences that aren't on your map, but I'm guessing nobody noticed.)
So the gameplay didn't hold as much of a sense of mystery as I originally wanted, but I think the game still has that sense, with the storyline, the special effects, and especially the music. I think marybee did a great job on the music. The main game theme is accomplished with three channels of sound of increasing drama and fullness, all of which are looping throughout the whole game. Their volume is varied to crossfade between them, depending on how dramatic the scene is supposed to be.
As I said earlier, the storyline was rushed, but it's okay. I wanted to foreshadow the ending, so that it wasn't that confusing, but I think I overdid it and now it's too obvious. There's also a couple plot holes I didn't have time to deal with. One thing my playtester pointed out, that I feel dumb for not realizing, was the fact that I have two things called a "horizon" and it wasn't clear from the dialogue that they're different. It was too late to change the dialogue, so I just labeled them on the map. This alone made having a playtester worthwhile, for me, since something like that can completely confuse players. I also wasn't sure that people would know the astrophysical term "horizon" to mean a boundary. I figured people had heard of an "event horizon" but might not know what it is. Hopefully the title screen helped with that, but I don't really know.
The core teleportation mechanic and the circular geometry were pretty much unchanged from the very beginning. Even though I had to change some mechanics, I feel like I lucked out with the teleportation. Not only did it work from a gameplay perspective, but it complemented the storyline well. I wanted teleportation to feel liberating, while flying ships felt stifling. I wanted players, by the end of the game, to feel comfortable hopping from ship to ship quickly, so that you sympathize with the main character. The mechanic of different ships only having limited abilities is important here, as it forces players to teleport even when they don't need to move up. I always make it a point to start with my core mechanics inspired directly by the theme. Sometimes I wind up adding on enough other stuff that it's not obvious, but this time I think the connection to the theme remained pretty apparent.
On the technical side, I used two new libraries that I wrote since last PyWeek, enco and ptext. I really like them. I know everyone really likes their own libraries, but what are you gonna do? If you think the text in this game is well done, I do recommend checking out ptext. I thought of a couple features to add to each one, too. I'm pleased that I was able to support arbitrary resolutions. I think I've got a good technique for it now, but it definitely needs to be a decision you make from the very beginning. This was my first time supporting Python 3 as well. There's really not much to it, but I still haven't worked out a satisfactory import setup that works for both 2 and 3. Maybe by next time.
All right, like I said, that's just a bunch of random thoughts. Thanks to everyone who played!
(log in to comment)
I had high expectations for the game and it delivered! I was very impressed by the voice over and dynamic music. I was blown away that this entry and a few others were able to include those. I know how much work it is to do just the main storyline so I can only imagine how time consuming it is to record, edit, and tune actual voice acting. I must admit that the circular geometry threw me quite a bit. I only seemed obvious when looking at the map and so I was continually switching between the map and main screen. I think some visual cues on the main screen would have helped - maybe they were there and I missed them! Thanks, I'm interested in your feedback about the circular geometry. I mostly decided to do it that way for narrative reasons. I wanted there to be a definite transition in mood between the top and the bottom (hence the dynamic music), with the top feeling relatively safe and calm, and the bottom feeling more intense and exotic. This was due to the mechanic being that motion upward was impossible, so the core feels like a place you're being drawn to. Furthermore, the geometry means that the curvature is subtle at the top, but becomes more and more explicit as you go down. At the very bottom it should be quite blatant that you're spinning around the core. The center is the only distinct point on the circle, so it's a clear destination right from the very beginning. I also kind of like that no matter where you are, going down will take you to the same place. I like the tableau at the bottom, where you're surrounded by streams of ships falling past you.
Having said all that, those are all just narrative reasons for the geometry. I didn't give a whole lot of thought to how it affected the gameplay before deciding to use it. It didn't occur to me that there might not be enough visual cues. The fact that the horizon at the top is curved, the minimap when you're in a survey ship shows curves, and you can see ships to your left and right tilting away from you seem like visual cues to me. I'm not sure what else you have in mind, but I'd definitely be interested to hear suggestions!
I think my confusion was compounded because I went down quickly (hiding the horizon) and didn't find a map ship for quite a while so I lost the two biggest cues! The space curvature is very clear (and nicely done) near the center but its quite subtle at the edges once the horizon is off the screen. Maybe some radial banding or circumferential lines would help a bit.Comments
# python run_game.py --1080
Traceback (most recent call last):
File "run_game.py", line 9, in
from src import main
File "C:\...\beyond-the-horizon-wav\src\main.py", line 123, in
s.draw()
File "C:\.\beyond-the-horizon-wav\src\scenes\play.py", line 329, in draw
obj.draw()
File "C:\...\beyond-the-horizon-wav\src\enco.py", line 12, in func
ret = method(*args, **kwargs)
File "C:\...\beyond-the-horizon-wav\src\thing.py", line 633, in draw
image.worlddraw(iname, X, y, s, rotate = False, alpha = alpha)
File "C:\...\beyond-the-horizon-wav\src\image.py", line 53, in worlddraw
img = get(filename, s, angle, alpha)
File "C:\...\beyond-the-horizon-wav\src\image.py", line 17, in get
img = get(filename, s, angle).copy()
pygame.error: Out of memory
gummbum on 2015/08/29 19:29:
Here is a little more for your posty morty, friend. Looks like a memory leak. Sorry I only just found it today. Hope you can learn from it. I'm appreciating the save game feature right now! Keep making better games. =) python run_game.py --1080 Traceback (most recent call last): File "run_game.py", line 9, in from src import main File "C:\...\beyond-the-horizon-wav\src\main.py", line 123, in s.draw() File "C:\...\beyond-the-horizon-wav\src\scenes\play.py", line 329, in draw obj.draw() File "C:\.\beyond-the-horizon-wav\src\enco.py", line 12, in func ret = method(*args, **kwargs) File "C:\...\beyond-the-horizon-wav\src\thing.py", line 633, in draw image.worlddraw(iname, X, y, s, rotate = False, alpha = alpha) File "C:\...\beyond-the-horizon-wav\src\image.py", line 53, in worlddraw img = get(filename, s, angle, alpha) File "C:\...\beyond-the-horizon-wav\src\image.py", line 17, in get img = get(filename, s, angle).copy() pygame.error: Out of memory