Vampire†Hunter - Postmortem


Warning! 

This postmortem has spoilers.

I suggest you play the game first: 
https://ebbasuke.itch.io/vampirehunter

Project Overview

Vampire†Hunter is a short visual novel made during the O2A2 (Again!) - Visual Novel Jam. The development took a week, with a somewhat relaxed schedule. I worked on this project solo, with zero budget. The goal was to publish a finished, free game at the end of the week. 

Project Details

Original game (1.0) asset estimatesFinal game (1.1) assets
a story of 900-1000 words
a story of 999 words
2 endings5 endings
two charactersone character (well, two if you count the hunter's delusion)
one character spriteone character sprite
9 expressions for the sprite11 expressions for the sprite
one black background image with a coffinone black and white background image with a casket
one "object" (the coffin lid)one "object" (the casket lid)
one ambient noise trackone ambient music track
one sound effect (coffin lid close/open, or vampire death sound)no sound effect
a main menu image that changes depending on finished endingsone static main menu image
itch.io graphicsitch.io graphics
Windows game buildWindows, Mac, Linux and web game builds

Tools

I decided to use Ren'Py as the game engine to refresh my skills. For writing the story I decided to go with Google Docs because it was the recommended software to keep an eye on the word count in the jam rules. For the graphics, I decided to use Clip Studio Paint, because it has vector line art, so it would be easy to scale afterward. I had decided before the jam that I would use free music and/or sound effects.

What changed during the jam: 

For the writing, I used Google Docs as I had planned, but around the midpoint of the jam I started to add the story to Ren'Py, so I wouldn't get lost in my interpolation spaghetti. I used color-coding in Google Docs to separate the branches mid-sentence.

I used Clip Studio Paint for the majority of the graphics, but after the jam I used Gimp to export the game graphics in .webp-format and to reduce the image file size by half for the web build.

Story

I wanted to make a game that had a conversation between a vampire and a vampire hunter. I had experienced a TTRPG where my character woke up inside a vampire's coffin, and after the first fright and shock, she had a somber conversation with the vampire. I wanted to have a similar feeling in my own game. I figured I would make a vampire hunter wake up inside the vampire's coffin, though the idea was very vague. 

To maximize the 1000 word limit, I decided to make my game like a "groundhog day", where the main character would always wake up in the same situation, and repeat the same actions, but with different outcomes. This way I could reuse the dialogue, and alter only parts of it with Ren'Py's interpolation and conditional statements.

What changed before the jam:

I realized that it would be impossible to depict two different people with only one sprite, so I scrapped the "wake up inside coffin"-idea for a bit. I changed the story so that the player would be the vampire hunter, who had fought the vampire before, and he would open the vampire's coffin to confront them. 

I thought of making the endings be either that the vampire hunter kills the vampire, or that he joins the vampire inside the coffin. However, the story felt a little lackluster to me, and I wished I could go back to the original idea. Then I figured it out: the vampire hunter is the vampire! Only he doesn't realize it unless the player picks certain choices.

What changed during the jam:

I originally wanted the player to reach an ending based on the amount of "good" and "bad" points they accumulated from choices, jumping between the Family and House routes, but it would've made the story very inconsistent.

I decided to use the scope knife and lock the two routes early on and branch them in the end. The game still has "good" and "evil" points, which change the wording depending on the choices the player makes, but the story doesn't bridge between the two routes (family and house) in the middle anymore. 

With that decision, I also locked out the sixth ending (Embrace Darkness). If the player had started the game in the House route, but crossed over to the Family route and found out that the Hunter is the vampire, the player would've had the option to choose to stay as a vampire and "Make sure my house is remembered... eternally!". It's a cool ending, and I'm sad I had to cut it.


Graphics

For the graphics, I wanted to keep the background black, with just the coffin in the middle of it. Then there would be the vampire sprite, its expressions, and if I could make it, a black, moving coffin lid made in engine, so it wouldn't count against the jam restrictions. I wanted to try making the graphics in .webp format to shrink the file size.

What changed during the jam:

The graphics had probably the greatest change during the jam. It all started with the coffin shape. I had originally wanted to make a traditional-looking coffin, and I had a placeholder for it too. I even made a main menu version, which would have a rose appear if the player finished all the endings (scrapped that early on).

Glorious coffin. How I miss thee.

The trouble started when I tried to figure out how to make a moving coffin lid (like, slide it open, slide it closed).  The jam rules allowed only one "object" graphic, and I wasn't sure if I wanted another object besides the lid, so I had to make the lid in-engine. However, I had no idea how to make a hexagonal solid shape in Ren'Py. All I could manage was a black square. -_- 

I tried it as the lid anyway, but... it didn't look right when it "opened" the coffin. It meant I had to make a square casket. Blegh, how boring. Coffins are far more elegant. Besides, a square casket looked boring in the middle of the screen. 

I had to make the scene look more interesting, so I decided to try if I could rotate the square lid... and with that, I could change the casket position. I also realized that with the square casket lid, I could now add more stuff in the background to the left of the casket!

With the square lid, I needed to leave only the right side of the casket black, so I could move the lid on and off effortlessly.

Another change to the graphics came with showing the passing of time. The story starts at midnight and ends at sunrise. I had planned on making everything black and white, so I could just make the night turn into dawn with a blueish and a yellow solid and adjusting their opacity. It didn't look good. Luckily, I found a very helpful article from Two and a Half Studios about tinting images in Ren'Py. With a little testing, I made it work!

This dialogue line is from the test version. Doesn't appear in-game, even though it's pretty accurate.

Tinting the backgrounds was way easier than doing it for the sprite! There's also the experiment on blurring the background, which I eventually replaced with the Pixellate transition.

I first saved the game graphics as .jpg and .png, because I wasn't sure I could change the image formats in Ren'Py settings, but after the jam ended and I wanted to make a web build, I made new builds with .webp images.

What Went Right

  • Preparing before the jam. If I hadn't tested out the main features with placeholders in a test project a day before the jam started, I wouldn't have made it to the deadline with the unexpected changes in my schedule. I also bookmarked some music candidates, and it saved me from a lot of stress.
  • The story. I always struggle with writing the story, and I prepared for it beforehand by using the Snowflake Method to make the story outline. Since this is a short game, I only followed the first few steps to stay within the jam rules.

Part three of the Snowflake Method.
  • Programming. Thanks to the preparation and making a test project before the jam started, I could handle most of the programming with little hassle. I scripted in the story first with interpolation, and after testing that, I scripted in the assets.

A snippet of the interpolation.
  • Graphics. Better than I had anticipated!
  • Scope-knifing. If I didn't make the decision to lock the routes, I would be still tangled in interpolation spaghetti. I also scope-knifed the vampire's death scene, and decided to just fade everything in white.
  • UI. Since I had to spend less time with coding, I could spend it on tweaking the UI just a little bit, if only by replacing the default images. I tried the changes first in the test project before implementing them in the main project in case I broke something.

What went wrong

  • Preparing before the jam. I might have excelled in preparing for the game-making part of the jam week, but I didn't prepare well enough for other duties around the house; namely, cooking. Some days during the jam I was "in the zone" and forgot to eat. Some days I resorted to ordering fast food. I should've remembered to prep something easy and quick to make to eat throughout the week. I only bought a lot of cola to survive the late nights. 
  • Schedule. I remembered that I had one TTRPG-night during the jam week, but I forgot that I had another one too. Also, I hadn't communicated about the jam well enough to my partner, who booked a family dinner party for Sunday evening, when I'd be the busiest during the jam. Luckily I had saved some time with the preparations, so my jam didn't end in a catastrophe.
  • New Game +. I couldn't figure out how to make persistent variables, so the script just takes the player back to the start label every time the coffin lid closes. It was probably a better approach since the player might've stopped playing the game after the first playthrough of the script. I would've wanted to make the main menu screen change depending on how many endings the player had reached, but ran out of time.
  • Sound effects. I didn't have time to find sound effects for my game. I also had a problem with the restriction of only one sound effect. My game could've used several (moving the lid, lid crashing on the ground, vampire's death, fighting sounds). The lack of sound effects led me to choose background music instead of ambient noise, so it wouldn't feel so off without them.
  • Branching, or "the interpolation spaghetti". I should've thought about the branching a lot earlier in the development. If I had, I might've been able to keep the idea of switching between the House and Family routes mid-game. The only remnant of that plan is how the interpolation changes the wording of the passages depending on the "good" and "bad" choices the player makes. 
  • Ending scenes. I ran out of time to make "fancy" ending scenes. I planned that I would make the ending titles in a fancy font in the middle of the screen, but I ran out of time to figure that out.
  • Marketing. I did zero marketing during the jam. Zero. I just didn't have time, and I was too focused on the development. I would've wanted to keep a devlog, but the jam rules discouraged making a game page without a playable game. Maybe I could've made them into drafts...
  • Publishing. It was very late in the evening when I published my game. I made only a Windows build of the game because I knew it worked. I knew a web build would make more visitors play the game, but I had no time to learn to make one at that point. 
  • Itch.io graphics. I had little time left, so I focused on making a passable itch.io page. I knew a character's face in the thumbnail would bring more attention to the site but opted to go with a cropped character because I didn't want to "spoil" the character's appearance in the thumbnail. Yet I did add screenshots of him. I should've just made a full-face thumbnail. >_<

 

Should've shown a bit more of that handsome face. Oh well.


Risk Management

I think I took most of the risks with the story and its branching, and I took most of them early in the development. Scope-knifing the branching into two rigid routes was a risk in itself, but it was worth it (despite making my tedious interpolation work mostly a gimmick). It made the project easier to finish at that point of development. 

I have had bad experiences with trying out stuff on the main project file, so having a test project to try risky, new, cool things on was a good call, even though nothing game-breaking happened. 

Schedule-wise I took a risk when I attended the family dinner on Sunday evening, despite knowing that the project had still ways to go. I couldn't have done that if I hadn't prioritized making the main features first. At that point, I had a game that was playable, even if it was unpolished. 

The riskiest thing with the schedule change was the publishing. I had no idea how long the build would take to make and to make the Itch.io page. After the dinner, I had about 2-3 hours until the deadline, so I made sure to prep the itch.io page as well as I could. I also had some time to tweak the UI, so it was a risk well calculated, I think. 

Conclusions

I will definitely do more playtesting with placeholders before jams, and with bigger projects, too. It helped so much during the development. I should also learn from my mistakes and take better care of myself (food-wise) during future jams. Better communication wouldn't hurt too. 

I should find a way to post more about my process during the jams. Maybe I could use Twitter for that. I also need to reserve a slot in my future jam schedule for publishing the game properly, so I can reach more players.

That's about that. Onwards to new projects!

Get Vampire†Hunter

Leave a comment

Log in with itch.io to leave a comment.