2 questions about the actual development process of Thimbleweed Park

Hi all, I love Thimbleweed Park (didn’t like it that much first play, but just jumped in to another playthrough and so far really enjoying it). I also love all the old games Ron made and others at Lucasarts at the time.

My whole life since I played Monkey Island on Amiga, I’ve been interested in making games and hoping to one day make a game similar to Monkey Island.

I’m getting there now and am able to make basic games where you move around collecting stuff etc. But I’m struggling making the dialog system where it actually knows what stage of the game the user is at.

I notice that Ron Gilbert in his legendary excellence actually frequents these boards and graces us with some wisdom pearls on a regular basis (so I’m hoping that I am lucky enough that he might read this!!! -and have time to respond with a short reply!)

QUESTION: I’m currently teaching myself something called “Finite State Machines” in the hope this can be used to make the dialog system aware of the progress in the game etc. - But i keep asking myself , “is this the way Ron would do it…” lol

ALSO: Would love to know what exact software is used to make the sprites for the Thimbleweed Park game (would also be interested to know what software was used to make Monkey Island sprites back in the day :D)

Anyways, I am sure I have only a small percent chance Ron will be able to respond here, and if anyone else has experience in developing adventure games and/or 2d games in general I’d love to hear your advice.

THANKS FOR READING. HAVE FUN !

3 Likes

Modern-day probably just Photoshop? Back in the day, afaik Deluxe Paint.

3 Likes

Here you can see an early example of dialog trees during development:
https://blog.thimbleweedpark.com/dialog_puzzles

Back then Deluxe Paint was used a lot.
Backgrounds varied from game to game: E.g. in MI2 they were drawn on paper, scanned in and then digitally touched up (seems like they have used Photoshop for this).

Take a look at this for more history: The Making of Indiana Jones and the Fate of Atlantis

Both Gary Winnick and Mark Ferrari (and also Ron) used Photoshop with custom paint brushes (but there are also a lot of pixel art specific tools out there; Asesprite was mentioned on the blog).

There are a lot of interesting posts on the development blog of the game, like those:
https://blog.thimbleweedpark.com/thimblecon87
https://blog.thimbleweedpark.com/pixel_here_and_there

Try this search for posts by Gary.

2 Likes

Thanks guys!!

I can’t seem to get 2d looking any good using photoshop :expressionless: My art skills are just terrible but luckily I can do a little in 3d so far.

Wow thanks for the link about the dialogue tree. Not sure why I never found it before. I’ll take a look later . Cheers guys!

1 Like

In terms of getting good 2D sprites and backgrounds in photoshop, it requires a few things.

A grid set up to 1x1 size pixel

You will be predominantly using the pencil tool in 1x1 size

You will need to pick a good color pallet

You will need to learn how to dither

And watch this video of Mark Ferrari talking about how he made pixel art backgrounds in the past and currently (monkey island and thimbleweed Park)

3 Likes

Best money I’ve ever spent on a piece of software.

Well, except TWP, of course.

2 Likes

Thanks again everyone. I’ll take all this on-board and try to make something cool. Really want to get started on the dialogue tree setup today!. Also Asesprite reminds me of Dpaint on my A500 (them were the days!!)

great video!! …I’ve a looonnnnnnnggggggg road ahead of me :smiley:

1 Like

Desperately trying to make sense of Ron’s script example (https://blog.thimbleweedpark.com/dialog_puzzles), but I don’t quite understand yet how to allow my dialog text file be aware of the state of certain bool values (eg !talked_to_Sheriff = YES). Also I am not sure how he is using “->” to move to new sections of the text file during conversations.

I’m using C# which is probably why, I don’t have a clue how to use C++/C or even Python or any other languages.

My main questions: What filetype is the ‘script’ in that link (is it .txt .json etc), and how does the game-code know from that script which sentence to display at any given time.

I even tried posting lots of questions on StackExchange style websites, and got lots of helpful responses. But sadly there are many different methods being advised to me and I have gotten mixed up between them all. I will keep trying tho :expressionless:

I have found this video that is answering a lot of my questions today !!! https://www.youtube.com/watch?v=0hMiPBe_VRc

She works with Tim Schaffer , and uses lots they learnt making Double Fine Games. She goes into detail for how to create and use these Text Assets to make fun and dynamic dialog in games.

This time next year Rodney…

Yes, that’s a great video!

To answer some of your previous questions:

Your text file isn’t aware of anything, your state machine is.

It’s a custom format and it’s a simple text format.

e.g.
:something is a label
→ something means go to this label

Also your code is responsible for handling tags like [once].
i.e. in this case you have to remember if this dialog option was used by the user and then never show it again.

Another one is [showonce]: This means it is shown only once and then never again, independent from what the user selected.
You have to keep track of those states!

Also your code has access to all the game variables. asked_about_food is such one (btw. in the finished game it’s actually g.asked_about_food). When your code executes this dialog it has to look up the appropriate variables and compare them accordingly.

1 Like

Thanks for the further info friend. Could you be kind enough to show a small example pseudo-code snippet of how I can tell my state machine/game-code that “::dosomething” will mean to find the “->something” later in the asset? (basically, how to I define those ‘labels’ in the code (coz I think I now know how to structure my text asset)

There are many ways to do this.
What you need first is writing a parser for your text format.

A simple implementation could operate directly on the text file and just interpret every as needed line.
(You probably want to parse the file once to retrieve all labels and their line positions.)

You could also read the file once and create data structures to put all the stuff in it. Your code then operates on those structures. Go-to labels could be changed to direct object references etc.

A more advanced implementation would be to not only parse the whole script but actually compile it (e.g. using the Squirrel engine; or even IL), removing the need to interpret it. This is something you want to do for performance critical stuff (i.e. not really necessary for dialog for this reason).

ok thanks. I have parsed text data files on a handful of my projects before. But all I was able to do was make very simple stuff. Like I could have n lines in a text file and I could add each line to a string[] in my code.

Currently I’m struggling once it has all the custom labels and stuff and each line needs to have other properties (such as say textColour, a unique ID, a float for pause in milliseconds, etc).
I’m also struggling on my game knowing when a certain character is trying to give ‘mission-critical’ information. So that the story can progess.

Basically at this stage Im trying to create something that will be comparable to Maniac Mansion complexity, but with only one playable character and just a few puzzles to solve the whole game (eg. Something like you have to wake up, find your keys, change your car tyre , and complete the game by driving to work LOL I have such a good imagination :D)

I am getting there slowly though and have put aside this whole week to really try and hammer home this gameplay element. Help like yours and I have had from others is invaluble and is keeping me going on this tough path :smiley:

You can work with those string arrays for now.

We just talked about file lines, don’t mix them up with dialog lines.
Btw. the text colour normally comes implicit from the current actor, which could be the current PC (playable character) (Ray, Reyes etc. have different colours) or NPC (e.g. Sheriff).

That’s typically global data you have to store somewhere, like g.asked_about_food is stored there you also store story progression so you can have dialogues and other things react accordingly.

Thank you, I think im starting to understand it now. I am going to load Unity and start making a mock-up of it now and see if I can get the basics working.

(Also the text colour thing was just an example I doubt i will use it tbh, other properties it might need are: a string to hold ‘animation name’ and ‘soundfile name’)

I guess I just wish I could see a working example of the actual source code, and the text asset file, and how they are used together. But have looked around for a long time and can’t find anything I understand fully , or it is just too basic ie. just shows how to make text pop up when you click something. I think i need to just get my hands dirty again and start hacking away at my own code again. Really nice of you to explain so much mate

This was done in text adventure form, actually. :wink:

Online version: 9:05 by Adam Cadre
Inform file (same format as those old Infocom adventures like Zork), to play offline in a Z-code interpreter (e.g. “frotz”): 9:05 - Details

And surprisingly, it’s actually fun. :slight_smile:

1 Like

>look around
[!: Noun error. (This could mean a number of things: a noun used in your command may not be present, or it may be present but not visible; it may be scenery you can’t interact with; you may have specified too many indirect objects; you may have misspelled something; the list goes on.)

If you are unfamiliar with the conventions of interactive fiction, you may wish to play through the tutorial at adamcadre.ac: interactive fiction - it explains how to phrase commands in a way that produces fewer errors.]

Umm I must be too familiar with them or something. :stuck_out_tongue: (Just look does the trick.)

nice guys. Well I started making my own implementation but im running into lots of hurdles (ie. my knowledge lol).

So far I have Json file like this:

{ "lineDatas":
[
{
	"lineID": "BEDROOM_DAVE_0001",
	"lineDialog": "Yaawwn, up i get for another fun packed day.",
	"lineDuration": 3
},
{
	"lineID": "BEDROOM_DAVE_0002",
	"lineDialog": "Well I think I need a cigarette before I get to work!",
	"lineDuration": 3
    }
]
}

and couple of classes made to get that data into usable variables in code:

public class LineData
{
public string lineID;
public string lineDialog;
public float lineDuration;
}

and:

public class LineDataCollection 
{
public LineData[] lineDatas;
}

and:

public class GameController : MonoBehaviour
{
TextAsset Dialog_Data;

private void Start()
{
    Dialog_Data = Resources.Load<TextAsset>("txt/dialogJson");

    LineDataCollection lineDataCollection = JsonUtility.FromJson<LineDataCollection>(Dialog_Data.text);
    Debug.Log(lineDataCollection.lineDatas[0].lineDialog);
}


}

So it all parse the text from Json into my array of LineData[]. But I’m kinda stuck how to use the LineData to decide when a certain part of the dialog is played. (eg. in this example, he needs a cigarette before he can leave. Lets say you can look under your bed and find a packet. When the player uses the cigarette the dialog should move onto… “Oh and where did I leave my car keys…” or something.

I hope this all makes sense to someone, and if anyone can give me some more hints/pointers to get me on track would be great!

:smiley:

Also have played Zork and some others WAYY back in the day. They pretty frustrating to play but can be very fun when in the chilled, reading mood.