Liveblogging Ludum Dare #33

Hi! Guess who’s liveblogging Ludum Dare?

The correct answer is probably “a lot of people”, but one of them is me.

For those unfamiliar, Ludum Dare is an international game jam. Over the course of the next 48 hours, I’m going to build a game based on this year’s theme (which is “You Are The Monster”).

I’ll keep updating here until the jam ends on Sunday, August 23 at 9 PM Eastern. Stop back any time!


9:57 PM
Sorry for going all radio silence there. Had a few problems in submission – the Windows build doesn’t like being fullscreen, and the Ludum Dare site wants web games to be < 900 x 600 (oops, too late now), and a few other oddities.

But I made it!

Play “Help, It’s A Hero!” here at Sibyl Moon! (Firefox recommended)

Admire the game’s existence at the Ludum Dare site!

9:00 PM
That’s it. Pencils down. Game done.

8:45 PM
strength = player.GetComponent<MonsterBehavior>().myParts[thisPart.GetComponent<MonsterPart>().location].GetComponent<MonsterPart>().strength;

8:38 PM
The stat change displays are bad. I care about that more than either one.

8:36 PM
I care more about whether or not the dungeon is a flat box than about whether or not all the heroes are named Rupert.

8:32 PM
Logo acquired. Not exactly great art. That’s fine.

Here’s the first screen of the tutorial.

tutorial screen

8:13 PM
Other things I can’t worry about now: way too much Arial font.

8:01 PM
Tutorial written! Now implementing.

NOT ENOUGH TIME AAAAAAAH

7:46 PM
On the up side, I killed the multiple pane problem.

Now for a fast tutorial.

7:43 PM
The prior system would have worked if I’d updated all the variables involved.

Moving right along.

7:40 PM
I’m going to check stats by hand. Not ideal, but effective.

if (stealthy > 0) {
if (stealthy <= 3) {
stealthyDisplay.SendMessage ("UpdateColor", hues[1]);
stealthyDisplay.SendMessage ("UpdateText", ("Stealthy: " + states[1]));
}
else if (stealthy <= 6) {
stealthyDisplay.SendMessage ("UpdateColor", hues[2]);
stealthyDisplay.SendMessage ("UpdateText", ("Stealthy: " + states[2]));
}
else if (stealthy <= 9) {
stealthyDisplay.SendMessage ("UpdateColor", hues[3]);
stealthyDisplay.SendMessage ("UpdateText", ("Stealthy: " + states[3]));
}
else if (stealthy <= 12) {
stealthyDisplay.SendMessage ("UpdateColor", hues[4]);
stealthyDisplay.SendMessage ("UpdateText", ("Stealthy: " + states[4]));
}
else if (stealthy > 12) {
stealthyDisplay.SendMessage ("UpdateColor", hues[5]);
stealthyDisplay.SendMessage ("UpdateText", ("Stealthy: " + states[5]));
}
}

7:35 PM
Restarting the game now works reliably. Current problem: stat displays aren’t working correctly.

7:24 PM
Restarting the game is *not* working reliably. Rats.

7:10 PM
Winning and losing are working reliably.

I have less than two hours left. From here:

  • Fix the problem with multiple panes firing at once
  • Set up a tutorial
  • Make it so every hero isn’t named “Rupert”
  • Randomize the level a bit

I think that’s all I can manage.

6:57 PM
The dog just hurled his head into my lap and heaved a sigh. Patience, honey. It’s almost over.

6:20 PM
If this game has any sound, it’s just going to be me yelling randomly into the microphone.

Truth: I feel bad that I’m making something so inaccessible here. Suspect it wouldn’t be too hard to modify this for audio cues, Robots vs Kittens 2 style, once the jam is over. I should think about that.

6:17 PM
According to the debug log, I win!

Now let’s get that win out somewhere visible.

6:15 PM
He went out, he got food, I’m back now. And hammering on the ending again.

6:03 PM
Squeaky dog wants an out and a dinner. I will oblige him.

6:01 PM
There are helpful warnings to let you know how far you are from the end. Right now, they fire every 5 turns, but that’ll be different later.

somewhere a hero

5:54 PM
I’ve realized that I need to adjust the “hey, here’s what this item will give you” information to account for stat loss as well as stat gain. Drat.

Need to get through the end of this sequence first, though.

5:40 PM
This would be that part of the jam where my brain is turning to mush but less than four hours left go go go!

(Despite this, I have to feed the dog soon. And maybe even me.)

5:22 PM
Coding heroes. Listening to Yasmine Hamdan.

5:09 PM
Even if they are called “classes” in D&D, Unity is a bad place to make a “class” enum.

5:06 PM
I remember! It was to help with drag-and-drop.

Not an issue any more, though.

5:05 PM
Why am I instantiating the player from a prefab?

One more for the “it’s a game jam, keep going” stack.

5:03 PM
Buttons in Unity do not have text. They have Text objects as children, and those Text children have text.

4:39 PM

void UpdateInfoText (string thisText) {
//MonsterBehavior needs this. Don't delete it again.
infoDisplay.SendMessage ("UpdateText", string thisText);
}

4:37 PM
So that thing I commented out?

…and then deleted?

Should’ve kept it commented out. Whoops.

4:25 PM
Did you notice that the last mistake I made was a design mistake, not a coding mistake?

Failure to understand the design == failure to execute the design properly.

It looks like a no-brainer when you write it out that way, but it’s easy to blame coders rather than designers at moments like this. Not so good actually.

(Of course, they’re both me in this case. Still.)

4:22 PM
Got halfway through storing something with a data-driven approach (the time warnings) before realizing why I didn’t want to do that (because I want them to be flexible based on what kind of hero is coming). Tearing it down, trying again.

4:13 PM
That looks like a redundant method. If I comment it out, does anything bad happen?

…no. Okay. Wonder what I was doing there.

3:48 PM
I made an angry rock.

angry rock

3:45 PM
AdvanceTurnCounter is a static method on GameController and that’s getting me in trouble now. Rats. De-staticking it.

3:41 PM
I didn’t know I could copy from Calc into WordPress until now. Neat!

Class Strong vs Weak vs
Cleric Cute Stealthy
Rogue Stealthy Scary
Wizard Scary Cute
Bard Cute Scary
Ranger Stealthy Cute
Warrior Scary Stealthy

3:36 PM
All heroes are not created the same. Making a list of 6 classes with strong vs and weak vs.

3:34 PM
5.5 hours to go. Time to implement an ending with win/loss state. I can tweak the specifics later.

3:33 PM
Latest comment in the source code:

//Not sure why this is necessary. Don’t care. It works when I do this.

3:31 PM
Mix-and-match monster parts now work.

I found a hat

3:26 PM
Forgot to initialize the dictionary. Kept asking Unity to look in the dictionary, and it kept saying “THERE IS NO DICTIONARY”. Hence the object reference error.

Here. Have a dictionary. Now write in it. Here’s what I want you to write….

3:24 PM
Object reference not set to an instance of an object, okay, but which object reference? I refer to multiple objects on that line….

3:21 PM
All PNGs are monster part prefabs. Yay! Working on swapping parts out now instead of layering them ad infinitum.

Also, need a little more energy, so I swapped over to Ellie Goulding.

2:40 PM
Back! Resuming the process of turning PNGs into monster part prefabs.

2:05 PM
Pausing for lunch.

1:54 PM
Must teach monsters what their parts are. I think I’m going to do this with a dictionary. (As in System.Collections.Generic, not as in Webster’s.)

1:50 PM
Looks like I can’t just create multiple prefabs for all these monster parts with copy/paste. Stuffing them all into the scene and then pulling them out as prefabs, instead.

1:46 PM
Didn’t like the cute monster’s eyeballs. New eyeballs for you, cute monster.

Cute version full 2

1:36 PM
Realized the original monster needed a little more detail than “two brown boxes”.

…but not much.

Basic version start

1:22 PM
Since I made these in layers, it’s just a matter of pulling the layers one by one and saving them into separate PNGs.

The program I’m using is Paint.NET. It’s free, it’s amazing.

save by layers

1:18 PM
And superscary monster! A little more time than I anticipated, but not much more.

I like stealthy and scary enough that I kinda wanna go back and tweak cute, but no. Ah, well.
Scary version full

12:49 PM
Superstealthy monster:

Stealthy version full

12:31 PM
This will take more than an hour, but it’ll be worth it.

Supercute monster:

Cute version full

12:04 PM
I’m cheating on my earlier priority list. I’m going to make more art now.

(But don’t expect it to come up above placeholder quality. I don’t have time for that.)

What I’m going to do is create three versions of the monster in layers – one layer for Cute, one layer for Stealthy, one layer for Scary – each one including a head, eyes, mouth, a body, arms, and feet.

I think I can knock this off within one hour. It will be worth the time investment if so.

Unrelatedly, I was all excited about Dani not being here because it meant I could listen to music without headphones. But then I realized how loud the AC is.  So – headphones.

12:01 PM
Before deciding whether you want the contents of the box, you can see what they actually do.

do you want antennae

11:32 AM
You can now locate a box, inspect the contents, and decide that you do (or don’t) want scary toes.

Or whatever else is in the box. But this time it was toes.

scary toes

11:26 AM
Found it. In the code, you have to use quotes on SendMessage, but in the editor, you can’t.

Every time I hit a problem like this, I Google it. I’m sufficiently novice with Unity that I can count on other people having found my problems before I do. In this case, I got lost in some prefab stuff before locating an answer on Reddit. But now I have the solution!

11:22 AM
Been off in a rabbit hole about whether or not I can send messages to prefabs, but I just registered that it’s not the prefab step failing – it’s the one before that. I’m trying to get this button to send a message, essentially, to itself. And it’s not.

What am I not seeing?

11:12 AM
Occasionally, I open a file, stare at it, save it without changing anything, and hope the behavior will change.

11:10 AM
I’m with you when you say SendMessage doesn’t have a receiver. But why doesn’t SendMessage have a receiver?

10:47 AM
This is a really inconvenient time to get a headache. Hooray for ibuprofen!

10:45 AM
Thank heavens for the Unity IDE autocomplete, which means I don’t have to type “Quaternion.identity” by hand over… and over… and over.

10:42 AM
The drag-and-drop On Click () system on the built-in GUI buttons looked great, right up until I realized that I couldn’t add parameters in a SendMessage from that system. (Or if I can, it’s not obvious how at a glance.)

10:34 AM
Today’s morning jamming music is Matchbox 20. Because why not.

10:16 AM
Okay, priorities time. I have 11 hours left.

  • Rip out the graphical part of the decision system. It can be done, but I can’t do it in the next 11 hours.

Originally, I thought of “drag and drop” dressup as a key part of the fun. It can’t be that now – I need another answer. So I’m going to lean on good old roguelike mechanics. Because hey.

In priority order:

  • Retrofit the decision system to be non-graphical.
  • Make the game end.
  • Make it possible to win and lose the game.
  • Walls! Fix the huge flat dungeon so that it has rooms.
  • More art – need greater variance in what monster parts exist.
  • More parts implemented – need Stealth/Sneak/Cute parts for head, body, hands, feet, eyes, mouth.
    • I think. That’s a lot of parts, now that I look at it.
    • Whatever I do implement needs both art and implementation.
    • Duplicate parts in boxes are not useful.
    • Parts in the same slot need to be able to replace each other.
  • Some kind of mechanic to make the player make choices about upgrading.
    • Locks and keys?
    • Gold and purchase?
  • Tutorial. Explain how the game works.
    • Move this up higher as time runs out. There has to be a tutorial.
  • Sound? (Probably not.)
  • Upgrade art? (Probably not.)

10:11 AM
Got distracted by the Hugo results. Sorry about that. Back now.

8:39 AM
I’m awake!

…and I woke up realizing that RenderTexture will let me show “here’s what it looks like when you get this part”, but it can’t handle “here’s what it looks like when you swap one part to another.” Because RenderTexture takes screenshots from a camera, and that’s all.

Okay. This feature has run out of time. I wanted to keep it, because I was charmed by the Spore-esque drag-and-drop idea of attaching parts in silly places, but this isn’t going to work and I have to move on.

Also, I have to train the dog, feed the dog, get COFFEE, and so on before I can do that. Back in an hour-ish.

P.S. I have no idea what blog categories to list this under. I think “liveblog” is going to have to be its own category, or “dev notes” maybe.

August 22

11:53 PM
RenderTexture looks like what I need here. I could be wrong.

I’m tired enough at this point that I don’t want to risk being wrong. Gonna get some sleep (the dog has gone to sleep long ago) and start fresh in the morning.

Revisiting my list from last night:

  • Programming – in progress
    • navigation around the level – done
    • opening boxes – done
    • getting monster parts out of boxes – in progress
    • some  kind of stat display for how you’re currently doing (scary/stealthy/cute) – done
    • drag-and-drop interface for attaching monster parts to the monster
    • game ending and resolution when hero arrives
  • Art – placeholders for everything (and looking at this list, they may not be so placeholder)
    • monster body
    • monster parts
      • antennae
      • beak
      • claws
      • eyes
    • walls
    • floor
    • boxes
  • Sound – no progress
    • music
    • box opening noise
    • maybe a “tick tick tick” when you’re running out of time
    • sounds for the various endings
  • Writing – no progress
    • tutorial
    • maybe hero dialogue

Night everyone – back tomorrow!

11:44 PM
Realized that I have a slight problem.

My plan was to show two purple blobs, one with the new part and one without, so you could compare them side by side and pick whether you wanted the new part or not.

Except that doesn’t take any other parts you’ve added into account. Drat.

Okay, new plan. Rather than using the original sprite in this image, I’m going to snapshot the new sprite from the player character and update accordingly. I don’t actually know how to snapshot the sprite, but I’m sure it’s possible.

Starting to yawn a whole lot. Bed isn’t that far off, I think.

11:34 PM
Okay, everyone does it by looking at the transforms. I can do that too. It just seems like an odd way to do it.

11:32 PM
Today’s weird discovery: there’s no easy way to start from a parent and get a list of children. (In Unity.)

11:21 PM
Scale problem resolved! Also the transparency problem that followed that. Whatever I did, I hope I don’t do it again.

Back to building the decision script.

11:18 PM
Scale. Somehow, I killed the scale connections of the decision interface. Probably by prefabbing and deprefabbing them.

Deprefabbing would be a great word on Alphabear. If it were a word, which it isn’t.

11:09 PM
Fixed: opening a box can trigger the decision interface. Hooray!

However… it looks like I screwed something up quite impressively by pulling the decision interface into and then out of the prefabs. I may have to redo the whole thing. Drat.

11:00 PM
There has got to be an easier way to do this.

10:51 PM
The decision interface needs to be inactive at the beginning of play.
The box script needs to know about the decision interface.
A prefab can’t hold references to non-prefab objects.
GameObject.FindGameObjectWithTag can’t find inactive objects.

Okay, this is not unresolvable. GameController is not a prefab. I’ll have GameController know about the decision interface, and then send boxes over there to find out where the decision interface is

Onward!

10:43 PM
Turning the decision interface (which is a GUI overlay) into a prefab was not the best plan I’ve had, because it breaks the connection between the Canvas and the overlay. Backing out, looking for a new solution.

10:29 PM
…is not that far off 10:00 PM, right?

Getting back to work!

7:02 PM
Working on getting the decision interface implemented. It’s taking a while.

I’m stepping away again to walk the dog and take an extended break. I’ll likely be back around 10 PM Eastern.

5:50 PM
You can now find antennae, a beak, eyes, or toes inside boxes. I need to modify so that you can’t find multiple copies of the same thing – that just doesn’t work well. But I need some more art before I can do that.

5:18 PM
Fixed! Go, purple thing, go!

(Which is not-so-coincidentally the name of the image below.)

go purple thing go

5:13 PM
Hooray! If you open a box, you might find antennae!

antennae

Boo! If you walk away, you’ll lose them again!

antennae over there

4:44 PM
Parents, please keep track of your children. Thank you.

(This is a bad Unity joke.)

4:39 PM
Just remembered the new messaging system hooked into EventSystem (which will eventually replace SendMessage). This could be very useful, but again – not now. Gotta get through the game jam first.

4:37 PM
Oh. Ran out of Savage Garden that I actually want to listen to. On to, uh, Semisonic. (S is a nice letter.)

4:34 PM
Okay! Back to work. Onward with the decision sequence.

3:53 PM
Working on an in-engine mockup of the decision sequence. Right now, this is not an exciting choice, but it’ll show your monster with the new addition (antennae, claws, whatever) on the left, and show your monster without the addition on the right.

There will also be information about how the change will affect your monster’s stats. I need to move the buttons down to make room for that.

This will have to wait on a break, though, as the dog is fervently explaining to me that he really would like to go outside.

decision UI

3:26 PM
The right display now has text updates and color coding as you gain stats. So does the overall assessment just below it.

…yes, this is more UI stuff. Yes, this is kind of weedy. But still! So much better with more information!

Time to put this down. It’s becoming an excuse to avoid the next part, because I think this will be messy.

I need to set things up so you can actually see what you pull out of the boxes, and then decide whether or not to use them. Here we go….

text colors added

2:49 PM
Huh. You can apparently store color components in a Vector4.

I’m not going to do it (that seems like a very odd way to pass color around), but it’s one more reminder that Vector[2, 3, 4] can be used as easy arrays instead of points in space.

2:17 PM
Back!

I lost track of time during lunch and thought I’d been away for an hour or so. It’s nice to have the last timestamp to reassure me.

1:52 PM
Getting lunch.

1:50 PM
Stat ranges: “no”, “a bit”, “kinda”, “yup”, “VERY”

1:41 PM
Briefly stuck in the UI weeds. Clawed my way out after putting this together.

So much more could be done. But so much more can wait.

from the UI weeds

1:21 PM
Note to self (and others):

In order to update UI components, make sure that you have “using UnityEngine.UI;” listed. This will make your life a whole lot easier.

text update works

12:56 PM
Used the nuclear option: made a new script, copied the existing code over. Behaved like a charm (and, more importantly, like a MonoBehaviour). Can only assume something was screwed up in the directory structure. Oh well, it works now.

12:54 PM
It wasn’t.

12:51 PM
Seriously at a loss right now. The script inherits from MonoBehaviour, but the IDE autocomplete behavior tells me something’s very wrong here. I’m forcing it, which tells me it won’t compile, but perhaps the way it doesn’t compile will be informative.

12:49 PM
Dear script: You are attached to a GameObject. You inherit from MonoBehaviour. Kindly act like you know it.

(This brought to you by attempting to update the aforementioned text.)

12:43 PM
UI progress – hooray! The dark blue strips at the top and bottom are tied to the camera position, so they’ll stay put no matter what. (The colors need some work, but please consider this all temp art.)

“Use the arrow keys to move around.” is static right now. I need it to update with “Oo, a box!”, as shown in the tiny debug text at the bottom.

Oo a box

12:04 PM
At some point, I have to deal with the part where I don’t know the new Unity GUI yet.

…that part is probably now. Uhoh.

12:01 PM
The player can open boxes and find stat changes inside them!

opening boxes

11:49 AM
I have arbitrarily decided this is a turn-based game rather than a time-based one. It can always change later. Or even be altered in the game settings on a player-by-player basis.

11:45 AM
I’m jamming to Savage Garden. Somewhere, people are sad, but it isn’t here.

11:42 AM
Instead of sending messages from the box object to the player object, I’m making static variables on my GameController object and adjusting those.

It’s a game jam. Yay shortcuts!

11:38 AM
Trying to send a message from a box to the player, to tell the player “hey, you opened this box successfully!”

Not sure why the box is doing the digital equivalent of sticking its fingers in its ears and saying “nyaah nyaah”.  SendMessage StatChange should have a receiver.

11:05 AM
Are closed boxes and open boxes the same object (with two states) or different objects? Deciding they’re the same object. But may regret this later.

11:01 AM
Most of my compile errors are “Cannot implicitly convert type ‘string’ to ‘bool'”. I blame ChoiceScript, where comparing is = instead of ==.

10:58 AM
I fixed it! Back to the game.

10:53 AM
Back from breakfast, and I remembered that you’re supposed to liveblog with the most recent entries at the top. Hang on, I’ll fix it.

10:40 AM
Houston, we have boxes. Request permission for breakfast. Over.

houston we have boxes

10:21 AM
No, I was right all along. I think. (When this is over, I’m gonna do some actual research.)

10:19 AM
Bounds.Contains was the correct answer earlier, instead of Linecast. It’s a game jam, it works, I’m moving on.

10:14 AM
That’s what I want to see!

Except for that missing corner wall. I’ll sort that out later.

monster run into walls

10:10 AM
Physics2D.LinecastAll, not Linecast. Because the line in question starting inside a collider. So all I can see is the player. Doop.

OR I could cast the line the other direction – from the potential object, to the player. And that would make more sense. So Linecast. Onward!

10:03 AM
I can tell there are better ways to do what I’m doing right now (input processing). I’m not quite familiar enough with Unity to know what the right way to do this specific input processing is.

But it’s a game jam. I’m going to do it fast instead of right.

9:46 AM
Showered, dressed, trained the dog, fed the dog, fed the plants, started laundry, started COFFEE, took the dog for a walk, drank the COFFEE, do I need food? (no, that can wait) – let’s GO!

(Being responsible in the morning costs time, but it also gives me more focus. Also, it means I’m not a bad dog mom. I consider it well worth the tradeoff.)

I decided that I needed to go to sleep last night when I flaked on how to detect what collider is at a given point before moving into that space. That would be Physics2D.Linecast.

1:09 AM
I’m halfway through the system for bumping into walls (and, shortly thereafter, boxes) but it’s obvious to me that I need some sleep. Going to turn in now. Back tomorrow!

12:42 AM
WHAT IF THE BOXES RAN AWAY FROM YOU ON TINY CUTE FEET
(answer: scope creep)

12:30 AM
That most classic of all programmer protests: “Wait, it worked a moment ago!”

“It” is the keyboard-based navigation. But I do have a (unimpressive) map for y —

NEVER MIND I SEE THE PROBLEM (to wit: “Camera” and “MainCamera” are not the same thing, and when Unity choked on my error, it stopped executing the script.)

I still have an (unimpressive) map for you. Yes, that purple thing is the PC-monster.

purple screenshot

August 21

August 21, 11:39 PM
SO MUCH PLACEHOLDER ART
wall_temp antennae_temp beak_temp box_closed_temp box_open_temp claws_temp eyes_temp monsterbody_temp tile_temp

August 21, 11:38 PM
It occurs to me that I’m making a variant on stage 2 Spore. Eh, I liked that part of Spore, I’m okay with that.

August 21, 11:13 PM
Major components of this design:

    • Programming – navigation around the level, opening boxes, getting monster parts out of boxes, some kind of stat display for how you’re currently doing (scary/stealthy/cute), drag-and-drop interface for attaching monster parts to the monster, game ending and resolution when hero arrives
    • Art – monster body, monster parts, walls, floor, boxes
    • Sound – music, box opening noise, maybe a “tick tick tick” when you’re running out of time, sounds for the various endings

– no progress

  • Writing – tutorial, maybe hero dialogue

How long does it take for the hero to come? Turns or seconds? Work this out later.
Is this a procedurally generated level, or are just the boxes procedurally placed?

August 21, 11:06 PM
Graphical. In Unity. Because dragging and dropping monster parts onto your monster would be fun. I’ll break back to GameMaker if I have to.

August 21, 11:01 PM
Initial concept: I’m making a game in which you play as a scared monster in a single-level roguelike-style dungeon. The hero is coming, you don’t wanna die, and you can avoid death by playing monster dress-up. There are boxes scattered around the level that contain different monster parts (claws, antennae, feet, etc) and if you make yourself scary, stealthy, or cute enough, the hero won’t kill you. Working title is “Help, It’s A Hero!”

August 21, 9ish PM
Going into this jam, I really wanted to do something with roguelikes. You Are The Monster is both a good idea and not a good idea for that, because on the one hand, reverse roguelike (woo!) and on the other, scope creep (argh!) Think think think think think.


Go to the top for the most recent entries!

Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *