peeweek

LD31

Finally!!! My first compo : Through the Windows

/!\ WARNING : tl;dr INCOMING /!\

 http://ludumdare.com/compo/ludum-dare-31/?action=preview&uid=45217

Finally! I’ve made It! This is my first LD entry, and my first compo. I was quite anxious since I hadn’t really completed a project alone in such a short time period, but I guess I tried to make It right in the end. And now i’d try to make, as everybody else…

THE POSTMORTEM DAY ONE

Here in France, the subject was delivered at 3AM and I discovered when I woke up at 10AM with joy that this snowman rascal wasn’t elected at all *JOY* *JOY*. After a morning of shopping and cooking, I started to think about this subject that was clearly an invitation to create a rectangle area and throw a crateload of gameplay inside of It. At first I was confused because the subject would lead to simply abide by the rules. I tried to think about this rectangle area that we call screen, and in the case of a windowed game, this window is just a portion of a larger screen. Then eureka, the idea was born : use that window to reveal a portion of a larger screen, within the area of my main monitor.

At 4PM (around this time), I started a C# project using a previously installed monogame that I did not previously test. I really should have… I wrestled around one large hour because of my VS2010 being unable to create a content project.  Despair came poking on my shoulder, I slapped him hard then downloaded a XNA 4 as an emergency. Hopefully, no problems, and the project was started.

My first project hours were dedicated to create the backbone of the game, and the base classes in order to get graphics, animations, and input. I also added the basics of manipulating the game window, by creating a new windows every time a new room would be setup. Bad luck, XNA’s internal voodoo wouldn’t let me do the trick and I struggled around one more hour trying to figure why my new GameLoop exited at frame one >_<.

Despair poked again at my shoulder. I faced him, smiled and kicked his nuts. No way, I’m going to reuse the same window, bu updating the backbuffer size and manipulate the window as a Windows Forms C# Control. This is something I had tried a while ago by docking a XNA viewport inside a C# WinForms panel. The trick is really simple as you interpret the XNA Form not as a XNA.Window but as a System.Windows.Forms.Form, with flexibility unleashed.

The first night was going on, so I took an hour or two working on the Player Sprite and some of the Dungeon Walls and ground. I used quite rapidly to create the base classes for the animated sprites, and i derived from these static sprites as they can be interpreted as single-frame animations and save me time coding at the expense of some useless calculations. At this time I started to figure out I was going to write a ton of code to provide basic functionality to my game…. but whatever. Midnight passed and I started to code the room generation algorithm. I called it a day at 2PM, after succesfully creating a room, and implementing collisions.

THE POSTMORTEM DAY TWO:

The night was not so short, I woke up at 9AM, head full of hope since I ended last night with a positive note.  A pint of Coffee and I started to hack with the room extension algorithm. Everything went well until er… stuck on this rectangle bounding conditions and the Min/Max Size of the rooms. Dammit, I just thought this was a simple thing to achive, yet I was confused as every single attempt resulted in bugs, out of bounds indices. I spent two hours struggling again on this, writing and crinkling paper. Then I realized I only wanted to write a beatiful block of code that would solve every case beautifully. I ended up by creating a dirty, huge, unmaintainable, but fully working pile of crappy code, and promised I would never lay my eyes ever on It (and prayed for It to work eternally).  Then I took a break from 11AM to 2PM.

The afternoon was mainly to create enemies, assemble the game, and to evaluate what content was really useful to the game. I started playing around and I realized that the weapons I wanted to create at first were not necessary. The rooms were recorded in order to travel back, but as I disabled the recording, I found something interesting : I was thrilled to travel back and discover another room yet more dangerous than I imagined. I decided to cut the room recording and focus on the main concept of being unable to predict what would lie in the next room.

Around 5PM, I was playing around, proud that I could run my game without a crash, and without any blocker bugs. Then I realised the game did not have neither a goal, nor a game over. Then I started to think about simple goals that I could achieve in the late hours of the project. I added three variables to the game : player health, collectibles and difficulty. I assumed that the player would be unable to fight monsters but instead be able to escape them. As a progression I added a byte value that I incremented every room change in order to manipulate enemy stats (spawn count, velocity), and as a goal I spawned randomly crystals to collect. I started working on flames that would burn monsters, but no need, I created the graphics but never used them.

The problem is : the difficulty raises quite hard, that I kinda liked, but the crystal spawns were too sparse and increasing the rate would not be a good Idea, as the game sessions would be awfully short. Instead, I added a balancing for the player by adding randomly 1UP Hearts instead of crystals in some rooms. That would lead the player to take risks in order to extend its survivability. And so by tweaking the stats, the game was on. I struggled hard to finish a game (by chance I admit) , and decided that the balancing would do the trick, so you Hardcore players.

As I’m not a musician, I finally tried my best to create a simple layer of sound in order to sustain the improbable rhythm of the game. Using Famitracker (simple enough for the time left) and Audacity (in order to clean up the sound loops). I created really quick some short loops, jingles, and SFX. Hopefully the Low level Audio layer of XNA is simple enough to play loops and SFX so I did not struggle (even though I never coded a single line of audio in XNA). Finally the game was done. I gave the exe to my girlfriend in order to test It on some other PC, and I discovered It needed the XNAFX4 redist (pfew, included in the zip in time :))

Cool Story Bro, the game is Out. My first one. It’s really weird and hard, but Im proud of It.

-Tom-

 

WHAT I REGRET / I DID WRONG / I WILL DO BETTER NEXT TIME, PROMISE, MOM :

  • The Collision Algorithm is not quite smooth as I wanted to, but I ended up assuming its functionality and its constraints (unability to glide around walls) as a difficulty challenge for the game.
  • I always want to write clean and beautiful code: and I waste often too much time. In the end, I ended up writing KISS but working code.
  • I did not start with a full goal, but with only a piece of concept that I wanted to improve on a experimental basis: this was quite a waste of time but could have been really wrong if I
  • As my friend Dralym asked me a minute ago : My game lacks dual or triple screen support, but did not have the time to hack around and detect exotic configurations :(
  • Not using Monogame for the multi-platform :( Ill try to port It later if I’m brave enough to dive again into this.

 

SOFTWARE USED:

  • XNA Game Studio 4.0
  • Paint.NET / TileStudio
  • FamiTracker / Audacity

THIRD PARTY FREEWARE USED:

You can review my entry here : http://ludumdare.com/compo/ludum-dare-31/?action=preview&uid=45217
I have captured some minutes of gameplay and put It on youtube here : https://www.youtube.com/watch?v=giFm_z_PjY4&feature=youtu.be

Comments

07. Dec 2014 · 22:34 UTC
Congratulations! I’m trying to refrain from playing the games till voting is open, as I always forget… but a word of advice from an old XNA dev in these competitions… Make it very clear you’re running xna with detailed install instructions… a click once install is great for this. Most people just blaze on through these compo entries, and if it doesn’t work first try, they give up. (Or tell you your game is crap because it won’t work).
08. Dec 2014 · 12:10 UTC
Thanks for your advice. I had enclosed the redistribuable within the zip, next to the game executable. I also added install instructions on top of my submission page. Today I have been testing a bunch of games, but I could not test a lot of others because, indeed, many times I did not have the correct runtime (mostly java :()

Ludum Dare 47

Devlog : Postmortem of my LD47 compo

Hello Folks,

I wanted to debrief a little about my entry of the compo as I did not participate since LD31. Things have changed a lot in my life since then and also the way I approach my time management (life, kids, heh... week-end duties)

I will try not to spoil too much of the story, but I invite you to give it 5 minutes if you want to read further of this postmortem... or at least take a look at the gameplay recording below:

https://youtu.be/gYH9g_MqS8w

This being said, I had mostly my weekend free so I ended up with a clear sky to develop and think things out... last time, I had fewer experience in game engines and what it takes to make game when 1) you are not a full stack programmer and 2) your expectations have shifted.

* My LD31 Previous Entry *

My entry for LD31 was a procedural death labyrinth with many caveats, among the worst was its ridiculous collision management due to my choice of vanilla XNA (without proper collision system). This time I chose a more comfy game engine solution, which was Unity (made by the company I work for), with the help of Gameplay Ingredients, an open-source C# set of tools that I am maintaining and that focus on sparing coding time for most common tasks. The goal was to prevent the shipwreck of my previous attempt to happen... and focus on what matters to me : the actual game experience. So, no matter what, I'd use these tools as a basis to focus on gameplay.

* The initial Idea *

The theme came for me quite obviously: "A Short Psychological Horror loop where one has is balanced in a toxic affective dependency relationship", because I read a lot about that matters and the way that toxic relationships ruin people's lives and create clunky kids that grow up hurt. By exaggerating such behaviors in a toxic loop of relationships between two people, and using the daily life at home as a battleground, I wanted to emphasize on the distance between people, and the power of words.

The game was seen as a point and click game where you move your player in a top-down, isometric view and interact with objects of daily life to give meaning and make the story progress.

For the Story, I first envisioned to perform a loop of actions in a house where the player would be dragged into guilt of being overwhelmed by chores, things to fix, and try to figure out various ways out. By building a strategy in order to fight the toxicity and finally exit the loop.

Of course it was probably too much for a week-end....

* Being Pragmatic and Know your pace *

The main issue with my work at game jams is mostly optimism: I often find a good idea and try to build on it, to the point it requires to lose a bit of fat. Then comes the "I can do that in time" phase. I think that pragmatically speaking I could be doing most of what I plan if I did not spend time to play and replay over and over until I am absolutely satisfied on how the game feels and what I just implemented is OK to be left as is without retake for the submission.

Basically this, ... eats up almost 30% of my time... where I do not do anything else than playing over and over, fixing small stuff, then testing again... until I figure out I am nitpicking.

This is my worst problem when it comes to evaluate pace and time left. So I tried to keep it in mind and reduce this polishing time when I was going into circles... At least It helped me re-scope the project on Sunday Morning, so I could ship a minimal viable project that conveys the general idea.

* Programming the base Gameplay *

What's cool with Unity is you have a lot of engine features that work out-of-the-box pretty well (if you don't twist them too much), and even if there's no blueprint, C# is somehow a pretty accessible language, especially for the UnityEngine API. However, there are many things that lack and that I was redoing for all my unity projects in the past.. for instance loading scenes, using triggers, performing delays, etc. So after all this time, the Gameplay Ingredients package has become my swiss army knife as it's reliable in order to structure a game, and I can improve on it pretty easily.

There's a singleton API, all the cameras, game saves, globals, scene management, input, etc. are already handled in a reliable manner. There is also a Event > Logic > Action system that's not node-based but that does the job.

And of course every of these scripts is working in an open way so it's easy to make your game-specific ones. The actual gameplay code for my entry was around 12 C# classes, half of them were patching generic missing features of Gameplay Ingredients, I had One Player Controller, A Dialogue System made of a singleton and actions in order to sequence text, and an interaction system for objects.

It was mostly the only code I had to write, so I could focus on nitpicking game feel like making progressive text appear, animate bubbles, have better cursor. Manage text skipping, etc. As the game would rely mostly on text, It felt important that the experience was clean in order to keep the player engaged in the reading of this text.

I also added a "TapTapTapTap" sound loop that I was inspired from Final Fantasy Tactics, which I remind as a really good text-reading experience.

* Player and Interactions *

Regarding the player controller, I was pretty frustrated as I am not really able to do proper modelling. As a solution I thought about figurative abstraction and oversimplification : from Ken Perlin's experiment Polly. Simplification of a character is not a bad thing and It actually saved me as I chose to animate a Sphere... and a Capsule. 2 Animations (Idle & Walk) in a character animator did the trick.

Regarding the Bright White Head, I came with this idea after putting a point light over the head of the character to add a fill light around the character, so It could navigate in dark areas. The light was not bright at first but it was so close to the sphere that it was rendering a really bright specular dot. I found it interesting and I put the whole head as emmissive white so it embraces this fake light as credible.

I also added a recorded Tap Tap Tap loop made using a pen on my mouse pad to simulate the steps SFX.

* Choice of art style and Tools *

I work as a VFX Artist so I am not too much into modelling, 3d DCCs and texturing, nor animation. Regarding Art, My first idea was to make a Black & White game, as in photography, it is easier to compose good images when the color is out of the equation... It could also give a good emphasis on the depressing/oppressive mood while working in a Black Key ambience, mostly in shadows, with really bright blinding shades of white that are not soothing but more aggressive.

The first Idea was to use flat shading, model shapes with Probuilder and use a low-rez CRT postprocess to reduce the emptiness of the flat surfaces... After a first prototype I was pretty satisfied, until I implemented Gameplay. Short Story : the way the CRT was implemented prevented me to use raycasts and click objects in the scene... pretty rough for a narrative point & click game.

So I ended up giving up on that solution and thought about using voxel art instead. I had played around the week before with MagicaVoxel with its last release and I found it really enjoyable. Basically satisfying because you are not supposed to spend a lot of time to achieve something good.

Most of the models took me at least 1 minute to achieve in magica voxel, there are around 20~30 of them that are being reused through the level. Other primitives such as boxes were used for other purposes. Also, I wasted too much time trying to make a proper car. So I ended up making one in AssetForge, took me 1 minute.

* Filling the world with interactive stuff *

The most interesting thing was to fill the world with interactive stuff, and use level scripting to make it interactive, and trigger dialogs. I made many prefabs from the static environment and scripted the interactions so they could be done only once per loop.

A LOOP_ID was also created in order to make variations in some of the dialogues, and was incremented every loop to be tested by the level script. But was not exploited to the maximum, I think all the loops could have been slightly different, but slightly enough to give this cringe impression of deja-vu.

I also used some tricks with Global Variable facts in order to let some interactions stay after first use but end up with the character being regretful.

The wrap up of a game play loop came up very late (Sunday Afternoon), and after evaluating the game play I thought It would not require much more in its state to be consistent. So I swallowed my frustration of not putting everything in it and got over it.

* Words on Audio *

I am not a musician and making music is a bit daunting, so I instead relied on sound design with basically no editing, most of the sounds were recorded from my house, using a good digital sound recorder (TASCAM DR40X), It was pretty fun doing the recording and integrating it in the game.

* Final Wrap-Up *

  • Pretty satisfied of the project, My software choices enabled me focusing on what was important
  • Stuck a little into technical issues (Retroizer Shader), but was able to let it go.
  • Had a good "less is more" character idea.
  • Could focus more on story and making the world interactive, but was good enough (I think) for the compo.
  • Loved doing Sound Design by Recording things around my house
  • Would probably enjoy spending more time into making a Post-LD game