Wimpy

by Ron Gilbert
Mar 16, 2015

Welcome to the first narrated Thimbleweed Park video. Sit back end enjoy 4 minutes of my smooth sultry FM radio voice as I explain our latest tool: Wimpy.

This is the first time I've ever done a narrated video (for anything), so I do apologize for it being a little choppy and scattered. I'll get better. I found it odd doing narration because I'm just talking to myself. I guess it's one of those things you get used to the more you do it. Next time I might try it was someone else in the room, listening to me.

One of the challenges I face with doing narration is that I'm not naturally a talkative person. I like to sit and think about things, I can't just ramble on about stuff. And I'm OK with that in my personal life, it just makes doing fun stuff like videos and twitch streams difficult, unless you like watching a video where I sit around and think about stuff.

OK, enough about me. Let's talk about Wimpy.

Wimpy is a tool I've been working on for the past few days and it's purpose is to allow game programmers to visually define the objects that appear in a room.  They can select an object, change it's hotspot rect, use position, as well as move the image around the screen.

Up until last week, I was editing the room's .JSON files by hand, which is fine for a few test rooms, but we're starting to build the rough-cut and I need to be able to quickly get rooms defined and into the game. Our goal over the next few weeks is to have a completely walkable version of the world. This will allow us to walk around and see how the size and connectivity feels. Based on this, we might change how the map is connected, or add and remove rooms as needed. It's important to do this BEFORE you've spent the time creating final rooms.

When I started the tool, I wasn't sure if I wanted to built it into the game's run-time, or as a standalone tool that used the same library as the engine, or as a native GUI app.

Building tools into the actual game can be nice. It means when you're playing the game, you can flip it into an editor mode and change objects live. There benefits to doing tools like this, but I also feel that it can add a lot of baggage to the game's run-time and I often find that integrated editors are harder to maintain and aren't as slick as they can be when done stand-alone. I also like to keep the game's run-time code as clean as possible. There are fancy-pants ways around all this, but the end goal is to build a great adventure game, not build a toolset.

The other issue with building tools into the run-time is saving data. When the room's .JSON files are loaded into the running game, they are instantly parsed and turned into internal game structures. If the data was editable, I'd have to reconstruct the files and then save them out. The internal data structures just aren't conducive to that.

I also looked at building Wimpy as a truly native program, which would have given me access to all the list controls, buttons, menus, etc that your used to on the OS. This was problematic for a couple of reasons.

The first is I wanted Wimpy to be cross platform. Gary, David and I all work on Macs, but we might bring someone on that works on Windows and I don't want to maintain two versions of all the tools. I could have used wxWidgets or Qt, but I don't know them very well and the look and feel of the UI always seems off. No matter what OS you're running them on, it's just slightly (or more than slightly) wrong.

So, what I decided to do was build it as a separate program, but use all my engine code so it replicated the look of the game as much as possible. For the game programmer, it's important that they see things as close to how they will actually appear in the game. Wimpy reuses a lot of code for the room and object rendering, animation, and loading. It means if I change how objects are rendered or data is stored, Wimpy will get these changes as well.

Wimpy reads and writes the room .JSON files, as follows:

background: "bank"
name: "Bank"
sheet: "BankSheet"
objects: [
    {
        hotspot: "{{146,114},{171,88}}"
        name: "bankClock"
        pos: "{158,101}"
        usedir: DIR_BACK
        usepos: "{159,26}"
        zsort: 88
        animations: [
            {
                name: "state1"
                frames: [ "bank_clock1""bank_clock2""bank_clock3" ]
            }
            {
                name: "state0"
                frames: [ "bank_clock3""bank_clock2""bank_clock1" ]
            }
        ]
    }
    {
        image: "bank_rope"
        name: "bankRope"
        pos: "{300,32}"
        prop: TRUE
        zsort: 6
    }
    ...snip...
]

I know I promised to show some actual code during this weeks update, but I think I'll save that for another post. Just think of it as the first in the long line of broken Kickstarter promises.

OK, I lied. Here is a little bit of C++ code from the engine that loads objects:

void Room::loadObjectsFromArray(GGDictionaryArray *array)
{
    if (array == GGNullPtrreturn;
    for (GGDictionary *dict : *array) {
        if (dict->intForKey("prop") == true)
            continue;
        GGString *key = dict->stringForKey("name");
        Object *object = Object::findObjectWithKey(key);
        if (object == GGNullPtr) {
            object = GGAutoRelease(Object::newWithDictionary(key, dict, _sheetName));
            Object::addMasterObject(object);
        }
        _objectArray.addObjectToBack(object);
        object->createImages();
        if (object->sprite()) {
            object->sprite()->zSort(object->zSort());
            object->sprite()->position(object->roomPosition());
            addSortedRenderNode(object->sprite());
        }
    }
}

My library started out as objective-c and I converted it to C/C++ a little over a year ago. I really enjoyed objective-c's retain/release model of memory management, so I replicated it, as well as NSDictionary and NSArray (complete with verbose method names). The stl drives me crazy.

- Ron



Dan - Mar 16, 2015 at 11:08
Good morning, Ron, thank you for this very interesting post - especially with regard to the video! I think it shows that you have already done a very good job! ;-)

Iron Curtain - Mar 16, 2015 at 11:12
I think it would be a great idea if you made your tools cross-platform–or even better–publish them! It would be awesome for amateurs to make their own adventure games (you can also sell commercial licenses so they can sell their work with your tools). Just a thought.

Lucas - Mar 16, 2015 at 11:21
Nice! thanks!

Mattias Cedervall - Mar 16, 2015 at 11:34
Ron, I like it when you lie! :-) Thank you for the nice video! You should get Tim Schafer if you want a skilled rambler. :P

Franklin - Mar 16, 2015 at 11:49
No! Don't let Tim Schafer near this project! We want it to be good!

Mattias Cedervall - Mar 16, 2015 at 12:40
Don't you think he's good?

Slayer - Mar 16, 2015 at 12:57
Sad but true.

longuist - Mar 16, 2015 at 16:54
Thats not fair. Tim does no bad games. Crazy thought that if he does contribute in any way he will take over and render it bad. Not going to happen..

Mike McP - Mar 17, 2015 at 07:11
Since I made a Schafer joke on Ron's blog that was poorly thought out, I'll clear my conscience by saying "Tim is awesome!".

I don't think he's ever really made a bad game (and he has made several truly great ones), but he's no longer making the classic games that this particular audience enjoys.

Mattias Cedervall - Mar 17, 2015 at 15:44
I think that both Tim and Ron are talented game designers and has a great sense of humor and they would be worthy to join Monty Python.

Fredrik - Mar 16, 2015 at 11:41
This is great, would love to see more narrated videos.

Mattias Cedervall - Mar 16, 2015 at 11:46
Ron, what is the name of the font you use for the game's verb and so on?

Ron Gilbert - Mar 16, 2015 at 11:53
It's from this site:

http://style64.org/c64-truetype

It's nice because it's proportionally spaced, which the original C64 font was not, and that makes reading so much easier. I won't be able to use it in the final game due to licensing issues, plus it doesn't have the full Latin character set. I might have to find someone to make a TT font for the project.

Mattias Cedervall - Mar 16, 2015 at 12:36
I see it's missing the Swedish characters "å", "ä" and "ö". I would gladly create a font for the game if I had the skills (for free of course). I think the font still looks good. Maybe they can add the missing characters if you ask them? I wonder which font they used in the Swedish version of Maniac Mansion for NES... Thank you very much for your reply, Ron! :-)

Deputy - Mar 16, 2015 at 13:09
Creating a TrueType font is technically really simple, but for all I know there are some legal questions to be clarified because a font can be protected by copyright/design/patent law in some countries. Maybe it would be the best to consult an experienced font designer in this case.

Ron Gilbert - Mar 16, 2015 at 13:20
We plan on hiring someone to create our C64 font and it will include all the Latin characters (I think that is the right term), including Swedish. It's not on our schedule for 9 months, so we have time. If we find a good proportionally space C64 font will all the needed characters, and the license allows us to use it, then we will.  Part of me would rather create our own, then we can release it for free for everyone to use.

Iron Curtain - Mar 16, 2015 at 19:20
As a linguist, I can offer some insight into writing systems: when talking about the writing system that is used by speakers of English, Spanish, Swedish, German, and most of Western Europe, "Latin" is interchangeable with "Roman". So whether you call them "Latin characters" or "Roman characters", you're right!

Tom - Mar 16, 2015 at 11:53
Why not include this tool into the actual game engine. So when you playtest you can edit stuff right away and save changes. Wouldn't that be a very 2015 like thing to do? Or is there an advantage in this setup?

Keep up the good work!

Ron Gilbert - Mar 16, 2015 at 11:53
I addressed this in the blog text.

Steve - Mar 16, 2015 at 11:55
GGNullPtr. For those times when the value of null changes.

Ron Gilbert - Mar 16, 2015 at 11:59
#define GGNullPtr nullptr

I define this for portability reasons. It will probably never be an issue, but you never know.

http://stackoverflow.com/questions/13816385/what-are-the-advantages-of-using-nullptr

Jalte Sorensen - Mar 16, 2015 at 12:07
I really liked that you also use video like that.
It was very insightful. So if you two find time to make such videos in the future, then please do so :-)

Dominik - Mar 16, 2015 at 12:12
Thank for the interesting video!

Small question: What does the grey horizontal line indicate?

Slightly bigger question: Do you plan to have a series of small one-purpose tools oder do you want to integrate a loot of functionality in one universal editor? If you plan to do a bunch of tools: Where is the advantage over a monolithic approach for an editor?

Ron Gilbert - Mar 16, 2015 at 12:19
The grey line is to set the z sorting. I forgot to show that.

I like to keep editors and tools simple, so I don't usually go for the monolithic approach.

Vegetaman - Mar 16, 2015 at 12:35
Ron, this great video made me think of a question for you on objects or items that were ultimately red herrings in previous adventure games. What are your thoughts on items such as the chainsaw in the kitchen or the unusable spiral staircase in the library in Maniac Mansion in the context of today's adventure games? And actually, on the spiral staircase front, was that an area you had originally planned to put another room and cut the content for time/space reasons, or did you have various "dead end" items/things in the game to kind of add to the world or puzzlement?

JAVE - Mar 19, 2015 at 12:22
Well, the chainsaw made an excellent joke in Zak McKracken, where you could find the missing fuel...

Derrick Reisdorf - Mar 16, 2015 at 13:33
Ron, you are awesome.

Petri - Mar 16, 2015 at 13:48
Getting ready to make my first (tiny) adventure game soon, and this blog is really inspiring. So thanks for posting.

I think it helps a lot to have the tools built into the engine. Coding editors is quite tedious - why do it when you can have the graphics and animations right there to fiddle with.

Ron Gilbert - Mar 16, 2015 at 13:54
Because I like the game engine code to be clean and not filled up with cruft. True, you can compile that out for a final build, but it clutters up the code.  Also, yes, you can manipulated data, but sometimes manipulating "live" data can mess up the game state. Also, as I mentioned in the blog text, it means you have to save that data back out again. Once the data gets loaded into the game engine, it is no longer in a state where it can be saved back out. To do that would make the game engine even more complex. Game engines that have editors built in are a lot more complex, it's not something I have the time to undertake. Doing separate editors isn't that hard.

B. Mandible - Mar 16, 2015 at 14:37
What's the advantage of props over clipping planes/masks?

Ron Gilbert - Mar 16, 2015 at 14:57
Much simpler. Props are just images that get draw at the correct time to be on top of below another object, most commonly an actor. We used clipping planes in SCUMM, but mostly due to speed issues. With modern hardware and GPUs you can just draw everything in the right order. It greatly simplifies my code.

Ben - Apr 14, 2015 at 17:43
Ron, with props is there any intention to prevent the character walking through, say, the rope there? If it is just z painting order, can the character end up doing unexpected things?

Ron Gilbert - Apr 14, 2015 at 17:45
Once walk boxes are working, character won't be able to walk through objects.

Christopher Stevenson - Mar 16, 2015 at 15:22
Ron, when you asked what you could do to make the blog better, well you just did.

Not a waffle in site.

Walt - Mar 16, 2015 at 17:01
I keep thinking "If this is 4, and this is 2....." whenever I see that damn Seckrit Question.  Probally the hardest and easiest puzzle in adventure gaming history....

Anyway... on to the reason I'm here...  Video with commentary, awesome.   Love the updates.

Brian S - Mar 17, 2015 at 18:05
I agree - I sometimes start using my fingers to do the math.  It's oddly difficult.

Scroobies - Mar 18, 2015 at 00:44
He's talking about the puzzle in Monkey Island 2.

Brian S - Mar 18, 2015 at 16:37
Ahh.. subtle reference.  Yes, that one was tricky, I had forgotten about it.

Tomimt - Mar 16, 2015 at 18:27
Can you parent those bounding boxes on the objects so, that when you move the clock for an exmaple that would move the bounding box as well. It's always a little hassle to move things seperately.

But all in all, Wimby does look like a pretty elegant little object editor. It's simple, but does whats needed.

David Fox - Mar 17, 2015 at 04:20
I like that idea, Tomimt. Kind of a "group items together" command. It could not only lock the bounding box, but also the use-position so all the relevant elements could be moved together.

Mattias Cedervall - Mar 17, 2015 at 10:30
I agree with you two. It reminds me of the group function in CorelDRAW.

DuphusDigital - Mar 16, 2015 at 19:54
Ron, what JSON reader do you use?

I myself am a game developer and have been developing my own game engine (using SDL, C++, and OpenGL) and have been looking for a simple one.

Ron Gilbert - Mar 16, 2015 at 20:00
I wrote my own in C. The readers I found were really bloated, and I wanted to use a more relaxed JSON syntax.  I talked about it here: http://blog.thimbleweedpark.com/scrolling_rooms

Vegetaman - Mar 17, 2015 at 10:47
I wound up writing my own parser for JSON as well, but I wish I had extended it to relax the syntax some. The commas and quotes are kind of a pain.

DuphusDigital - Mar 16, 2015 at 20:06
Also, will WIMPY be available for download, or will we have to do what we did with SCUMM (https://github.com/AlbanBedel/scummc)?

Ingo Gudmundsson - Mar 16, 2015 at 20:42
Just a quick comment regarding the embed of the video: When I played the video there was no sound, and no visible volume ctrl. I found the source URL for the video through  right-click "view source" in Chrome and was able to view it with sound through there, and then later found out I had previously lowered the volume in completely separate Vimeo embed to zero and that had apparently translated over. Just a thought for those who might have had the same problem.

Ron Gilbert - Mar 16, 2015 at 22:28
Fixed, thanks!

Bed - Mar 16, 2015 at 23:22
Great dev blog as always Ron, you keep exceeding yourself and are leading the way in Crowd Funding Development engagement IMO :D

Guga - Mar 17, 2015 at 04:16
How do you handle overlapping boxes? Like when you have a wardrobe that can be opened to reveal some shirt inside, and the shirt's box is completely inside the wardrobe's box. Are they ordered with the sprite's z-ordering?

Ron Gilbert - Mar 17, 2015 at 10:19
There is an attribute called dependancy.  The shirt would be dependent on the wardrobe being OPEN. I have the engine code written for this, but it's not exposed to the scripters/wimpy yet.

David Fox - Mar 17, 2015 at 04:22
Ron, I see there's a cross mark on the use-position marker. I'm guessing that shows the facing position the character takes when he/she is in the use-position. How is that adjusted? And did we have something in SCUMM where the facing position on door objects was opposite when you were coming or going through a door?

Ron Gilbert - Mar 17, 2015 at 10:18
It's hard to see in the video, but the cross has a small allow showing the face direction of each object.

smartypants - Mar 17, 2015 at 14:24
But why do you say at 3:09 that it's pointing to the right, when it seems to point to the left (in my understanding)?

Ron Gilbert - Mar 17, 2015 at 14:31
I meant left.

Mattias Cedervall - Mar 17, 2015 at 15:52
What size are you? I need new pants.

Soong - Mar 17, 2015 at 04:27
Thank you so much for this update!  It's really awesome that you have been doing an amazing job with this blog from the gecko and then you still asked what you could do better.  And right afterwards, you start implementing those suggestions.  I know I'm repeating myself, but this has truly been my greatest backer experience so far!

Derrick Reisdorf - Mar 17, 2015 at 10:12
"...you have been doing an amazing job with this blog from the gecko..."
LOL.

Jammet - Mar 17, 2015 at 07:31
Wimpy is just sooo neat! Thank you for the demonstration!

Mattias Cedervall - Mar 17, 2015 at 08:18
Ron, I used Fontstruct and tried to create a font for Thimbleweed Park
that I call Thimbly. I hope you don't laugh too hard when you see it.
http://i.imgur.com/XiZLi3N.jpg

Natalija - Mar 17, 2015 at 08:52
Hahahah , your voice is so funny on this video!

Soong - Mar 18, 2015 at 04:58
I know it may not have been intended that way, but I find this comment quite rude.  Escpecially if you take into consideration that Ron said he was not all that comfortable doing those videos.

I think Ron's voice sounds perfectly normal.

Dan - Mar 18, 2015 at 18:17
I agree with Soong. It's a completely normal and likeable narration. Especially it delivers a very interesting insight!

mr. T - Mar 17, 2015 at 11:50
If Wimpy is based on your engine code of today, is there a possibility that the codebases for the engine and Wimpy start diverging from eachother as the project goes along? I imagine some scenarios where something might bahave differently in the engine vs. the tool. Or do you just recompile Wimpy again if stuff changes in the engine?

Ron Gilbert - Mar 17, 2015 at 11:54
Yes, Wimpy uses all of the rendering code of the engine and it shares all the object loading and render code. If I change something, I will have to recompile a new version of Wimpy. For me at least, this is a much better solution than adding editor code the the game's run-time. It really makes things complex and error/bug prone.

Mattias Cedervall - Mar 17, 2015 at 12:21
Ron, we all know how much you like compiling. ^_^

mr. T - Mar 18, 2015 at 14:22
Thanks for the reply!  It makes sense to keep Wimpy a separate entity.

Stefano - Mar 17, 2015 at 12:04
First of all, awesome post! This is by far the best dev blog I've ever  read.

Just a curiousity - how are the Paypal contributions going compared to the main crowd funding? Do they add a noticeable amount or is more like a 98/2% ratio?

I always wondered since I backed few other projects on Kickstarter, but little to no word was given to the post-funded campaign.

Flowo1974 - Mar 17, 2015 at 12:44
The paypal contributions were discussed in one of the first posts. IIRC, it's more like a 99/1% secenario.

Yeah! I'm with the 1%!

Mattias Cedervall - Mar 17, 2015 at 13:06
I've always wanted to be one of the 1 percenters. :P

Estranged2 - Mar 17, 2015 at 14:15
I have watched many streams of introverted people SLOWLY doing stuff without speaking. It wasn't a problem for the audience, they loved it. They are not there to see something amazing, they're probably working on their other monitor while they're watching. I think you're being too self-conscious here, and also, that you want the stream to be more meaningful than it needs to be (both are understandable for an extreme introvert).

Mattias Cedervall - Mar 17, 2015 at 15:38
Ron, I took the liberty of contacting the people behind the C64 font and I got a very nice reply. :-) He/she/they wrote they have been experimenting with adding Latin characters, but wasn't sure how to do it properly within the tight space of 8x8. They said they haven't denied any requests to use the font in projects. I suggest you contact them so you can get their permission to use the C64 font in Thimbleweed Park and maybe Gary von Graphics can help them add Latin characters. I apologize if I overstepped my boundaries now, but I just want to help out!

Bobe - Mar 17, 2015 at 17:40
>Paint Shop Pro
whatyearisit.jpg

Mattias Cedervall - Mar 18, 2015 at 06:58
Tell me more about how people stopped using boats when the airplane was invented and then tell me what you have been doing lately to try and help people for free!

Bobe - Mar 19, 2015 at 10:35
Thems sounds like fightin' words.

PrinzJohnny99 - Mar 17, 2015 at 18:03
This question may be a little bit too early, but I see that you invest a lot of time and work to create a super duper graphic adventure engine. So wouldn't it be a waste just to use it for only one game?

Matthew Fearnley - Mar 17, 2015 at 19:35
Great first video! :)

Jonas - Mar 18, 2015 at 12:01
Another great blog update, very interesting!

You might not be a "skilled" video-type-guy (if that's a skill), but I personally have no complaints if you keep doing videos just like this one :)
Makes me want to break out good old MI1... actually, I might just have to do that! Who needs sleep anyway? ;)

Looking more and more forward to this game! And while waiting, there's this blog. All in all: Win :)

Brian S - Mar 19, 2015 at 12:31
Zak McKracken was just released on Gog.com for Windows Mac and Linux.for $6.  Sorry for being off topic, but this was just too cool not to post.

Estranged2 - Mar 20, 2015 at 11:22
Buying it doesn't help its creators in any way.
Plus, it has "improved" graphics that don't fit its old style. Not that the old graphics are better, but at least they are consistent.

Brian S - Mar 20, 2015 at 13:39
It includes the FM Towns version which is 256-color vs the original 16-color implementation.   It also has the V2 DOS implementation included, which is 16-color, I believe, and much closer to the original.

I understand the money won't go to the original developers, but it means that the game will be accessible now by a wider audience than before, and so in that way, it's a plus for adventure gaming in general, and could be a help to this game by way of an indirect advertising.  Personally, I've been trying to look for a deal on the game on eBay for a long time, and have never played it. (which I'm ashamed to admit on this blog)  Now I can (and plan to, this weekend).

Brian S - Mar 24, 2015 at 17:44
Now that I've played the two ScummVM versions of Zak in the Gog release for a while, I can tell you I MUCH prefer the DOS V2 version (16-color VGA Graphics) to the FM Towns Version (256-Color).  I started with the FM Towns version, but a couple of things bugged me.  One was that the 256-color graphics, and the way they used those colors, actually made some of the more visually oriented puzzles harder (I didn't notice the wallpaper, or the couch cushion in the first couple of rooms - in the 16-color version, these were more obvious, as I expected the developers intended them to be).    Also, the FM Towns version included some gag references to the Indy games, where the DOS version included, in one case, a reference to Rescue on Fractalus in the same spot instead - which I thought was a much cooler reference.  This makes me wonder what is different in the original 16-color CGA C64 version..  Also, I much prefer the more simplistic sounds of the DOS V2 version, it definitely feels more like playing games as a kid.

In any case, this is getting me excited for Thimbleweed Park.  When I get through Zak, then I need to play through Maniac Mansion all the way...  I have that one through the minigame in the Day of the Tentacle got from an Ebay a while back.

Kane - Mar 19, 2015 at 13:26
I start to wondering, did the game sources or the engine itself will be released with the game ?
That can be an interesting idea for game creator or Adventure Game Studio users who search an alternative to it

Dan - Mar 19, 2015 at 14:39
Just take a look at the FAQ.

Of course it would be great. But I would be even more happy, if TP doesn't remain Ron's only game based on Grumpy. Naturally I have liked MM (and DOTT), but a lot of people hope for a spiritual successor to MI 1 & 2 - and who would be more competent for realizing it than Ron!

Dan - Mar 19, 2015 at 16:07
But at this stage I'm simply pleased with the development of TP!

Steve - Mar 25, 2015 at 04:15
Hi Ron,

Nice simple editor! With the bounding boxes I normally code them so initially they are automatically the same size as the graphics image and then I alter them afterwards if needed - does Wimpy do this? If not, it may save you some time to do so :)

Looking forward to the game!
Steve

Ron Gilbert - Mar 25, 2015 at 09:30
It doesn't for two reasons. 1) Many objects on the screen that need to be tagged don't have separate images, they are drawn into the background, so there is nothing to automatically size to. 2) The work flow is to create the new object, which creates the hotspot box, then assign it an image. I could create a function that snapped the hotspot to the image (if it existed), but I haven't found the need to do that (yet).

Christian - Mar 30, 2015 at 11:16
Your narration was really good. You really don't have to worry about it. Usually, people who are a "thinker" type tend to be more precise and concise when narrating. Not many people like videos full of rambling - so maybe you underestimated your suitability/qualification. :-) Keep up the good video/narration work!