Text Lock
Oct 27, 2016
We've now entered the next phase along our wonderful journey to release a game, and it's called Text Lock.
A few weeks ago we entered content complete, where all the art, animation, puzzles, and music were in the game and no more could be added. Text lock means all the text is now final. We've made all the last minute edits, additions, and now we're stuck with what we have. No more text changes.
The text in the game started out like this...
{
name ="action figures"
verbLookAt = function()
{
sayLine(delores, "These are part of my action figure collection, including my prized Howard the Duck.")
}
verbDefault = function()
{
noReach()
sayLine(delores, "These are in MINT CONDITION! No way I'm going to touch them.")
}
}
A few months ago, I ran a series of python scripts and we got this...
{
name = NAME(0,"action figures")
verbLookAt = function()
{
sayLine(delores, DELORES(0,"These are part of my action figure collection, including my prized Howard the Duck."))
}
verbDefault = function()
{
noReach()
sayLine(delores, DELORES(0,"These are in MINT CONDITION! No way I'm going to touch them."))
}
}
Each line was wrapped in a MACRO, identifying who said the line and unique text id. The text ids are set to 0, because they have not been extracted into the text DB yet. We lived with this for few weeks, making any changes to the text we needed.
There is also code in the game that displays a warning if it encountered any text that hadn't been wrapped with the MACROs (the python program missed a few lines due to formatting).
Last week, I extracted all the text from the game, turning the lines into this...
{
name = NAME(27084,"action figures")
verbLookAt = function()
{
sayLine(delores, DELORES(27342,"These are part of my action figure collection, including my prized Howard the Duck."))
}
verbDefault = function()
{
noReach()
sayLine(delores, DELORES(27341,"These are in MINT CONDITION! No way I'm going to touch them."))
}
}
when the final python program was run, adding the text ids, a .tsv file (Tab Separated Values) was written out that looks like this (don't be fooled, the actual file is 11,000 lines long)....
DELORES 27342 These are part of my action figure collection, including my prized Howard the Duck.
DELORES 27341 These are in MINT CONDITION! No way I'm going to touch them.
The translators then translate the text in the .tsv file and the game loads a different file, depending on the language.
The text MACROs are pretty simple.
#macro TEXT($a,$b) "@$a:$b"
#macro DELORES($a,$b) "@$a:$b"
During preprocessing phase, they take the ID and the TEXT and merge it into a string...
The advantage is the text is still a simple string, easily passed around the code. When a sayLine command is called in the engine, it extracts the ID and looks up in the text DB and display the translated line.
Starting next week, the MACRO will be replaced with this...
#macro TEXT($a,$b) "@$a"
#macro DELORES($a,$b) "@$a"
All the text is removed from the preprocessed version of the code, so when the game ships, all the text has been removed, but it still stays in the source to make it easy for us.
We have several macros to help the translator and also to make script extraction for voice recording easy:
#macro TEXT($a,$b) "@$a:$b"
// Names of objects.
#macro NAME($a,$b) "@$a:$b"
// Text that appears in art, but never appears as text strings.
#macro ART($a,$b) ""
// Text that would be said, but is never voice, like some dialog choices that are never echoed back.
// Translators need to translate it, but voice actors don't need to record it.
#macro NOTALK($a,$b) "@$a:$b"
// Text displayed on computer screens in the game.
#macro TERM($a,$b) "@$a:$b"
// System text, such as the options screens.
#macro SYSTEM($a,$b) "@$a:$b"
// Ray and Reyes
#macro AGENT($a,$b) "@$a:$b"
// Agents and Delores. Useful when Ransome has an alt line.
#macro PLAYER_AD($a,$b) "@$a:$b"
// Agents and Ransome. Probably not used a lot.
#macro PLAYER_AR($a,$b) "@$a:$b"
// Agents, Delores and Ransome. This will be the most common in the world, not in the hotel.
#macro PLAYER_ADR($a,$b) "@$a:$b"
// Delores and Ransome. Useful if the agents have a separate sayLine.
#macro PLAYER_DR($a,$b) "@$a:$b"
// Everyone. Probably used in the Hotel.
#macro PLAYER_ADRF($a,$b) "@$a:$b"
// Agents, Delores and Franklin. Ransome alt lines in the hotel.
#macro PLAYER_ADF($a,$b) "@$a:$b"
// Agents, Ransome and Franklin. Delores alt lines in the hotel.
#macro PLAYER_ARF($a,$b) "@$a:$b"
// Lines said by only one character
#macro RAY($a,$b) "@$a:$b"
#macro REYES($a,$b) "@$a:$b"
#macro RANSOME($a,$b) "@$a:$b"
#macro DELORES($a,$b) "@$a:$b"
#macro FRANKLIN($a,$b) "@$a:$b"
...
...
...
Text wrapping can get complex. but we need it this way to extract scripts for recording. If the game wasn't voiced, we could get away with just a TEXT macro, or maybe just the character ones to help the translator, but since the game is not only voiced, but has five playable characters, all who might or might not be saying the same lines, it gets complex.
Now that everything has been extracted and numbers, the file is off to Boris and he's started the German translation. In a couple of weeks, I'll hand it off to the other translators. I wanted to use Boris as a test case, to make sure everything was working before we had five people doing translation.
Like content complete, text lock is an important milestone. It's not only important in that it gives us a goal to push for, but it's also important just from the point of discipline. We could make art and text tweaks forever and each one would make the game -1% to 1% better. There comes a point where you just need to stop and that is what these milestone are for. They are saying, it's time to move on.
Now, occasionally, we will come across a line of text that NEEDS to change. If it's just a typo or spelling error, we just make it since it doesn't affect the translators or the voice actors.
But if it changes the meaning of the line, or a new lines MUST be added, we have the following process.
The first step is to talk about it, make sure we really need to add or change the line. The second step is to see if there is an existing line that will work just as well, or at least 75% as well. The final stage is to change or add the line, but we mark is as follows...
If this is the only place in the game the line was used, we'll leave the text id. If there are other places that still need the old line, we'll reset the id to 0.
At some point a few weeks from now, I'll rerun the extractor and pull all the lines that have "**" and send them to the translators. If voice recording has already happened, they get add to the lines for the pick-up session.
And that's all there is. Making games is easy.
- Ron
I still have (readonly) access to it.
I think you should put more trust in people. A bad translation is worse than a leak of an incomplete game with no audio. Who does such a hypothetical leak hurt? The bad translation hurts the very people who have financed your game.
Please reevaluate the risks and benefits of giving the translators access to the game.
I suggest, since everyone here knows english, to play Thimbleweed Park twice, in both languages.
Anyway, nowadays is easier to get in touch with the Programmers, in a blink of an eye, and ask them what they mean with a sentence like "I think I found the key".
Or... the Programmers could give a timed self-destruction copy of the game to the translators....
Everything is possible!
I've seen you say that before, and I don't know how you can. There were basic (3rd-grade) grammatical errors in the translation, plus general sloppiness all around, with lots of spelling mistakes. I'd wager no one even reviewed the translation once. It wouldn't call it "a good job", not by far.
Since only the English one will be voiced for now (afaik) you could fix bad translations in a later patch which is better than having it leaked.
Is it a matter of marketing you can't do like this?
Thank you
The books in the normal library (not the occult) may be translated, there was an option in the submitting form, for that.
DELORES 12345 Yeah, right.
Could be either honest agreement or sarcasm.
sayLine(delores, DELORES(12345, "(sarcastic)Yeah, right."))
The stage direction is not displayed on the screen, but it's emitted in the script. Plus, I and the director will be there. They are not reading the lines in the dark.
I'm confident that with your direction the game will have brilliant dialogues and voices. I can't wait!
"PULLEY"... sounds sweet... UU...EEY...
in italian, PULEGGIA... sweet, too...UE.... IA...
in german: KARABINERHAKEN! JAAAAARRRR!!!!
:-)
A "Karabinerhaken" is this little thing:
https://en.wikipedia.org/wiki/Carabiner
Beside that, we have other funny words. Like "Schadenfreude". ;)
... I didn't think that a JOY could be MALICOIUS! :-D
You are right, maybe it sounds harsh if you say it in a harsh way...
Google Translator is doing funny things. :-)
My German is horrible (although I have actually studied German many many years ago) and I'm sure there are grammar mistakes above. But it says that one of the things German and Finnish have in common is Schadenfreude/vahingonilo. The joy of other's misfortune.
I don't have this mentality though, I think. And hope.
Everybody is sometimes "schadenfroh". One example: If you can laugh about "America's Funniest Home Videos" (or the corresponding TV show in your country) then you are Schadenfroh. :)
Sehnsucht is also very interesting, it is usually translated as melancholy, but the feel about it is not the same.
"Rubber Chicken with a pulley in the middle" is already super long, did Karabinerhaken really fit on the screen?
And while the translation isn't accurate, it is no issue, since a carabiner is well suited to secure him on the cable.
Only problem, when they did the graphical inventory, the pulley can be seen.
There is another sentence which didn't fit on the screen in the German version, though. It was among the automated sequence in the Governor's Mansion. They rephrased that line in the enhanced CD version in order to fix it.
Hey, what about a cross stitch renderer for TWP?
http://lil-samuu.deviantart.com/art/Rubber-chicken-with-a-pulley-in-the-middle-513912755 :-)
This is what we call "Flaschenzug": https://en.wikipedia.org/wiki/Block_and_tackle
So perhaps the "Karabiner"-thingy makes more sense to secure yourself to the cable?
1) you never get to drink that grog in MI1
2) root beer spirit repeller is Voodoo certified
Put a pulley is pure mechanics, so the infameous suspension of disbelief is more endangered in this case. Luckily, the lo-res graphics help to blur things out so you have to rely on your imagination how Guybrush actually use the chicken...I'd say one rubber leg on either side- but then the icon is incorrect... I will need to replay the special edition to see how they handled it in HD :)
Manfred von Karma would be proud of you!
btw: You don't drink the grog, but the pirates do.
There is nothing strange about such pulleys, like those: https://www.google.com/search?q=open+block+pulley&tbm=isch
For text ART, I imagine the translator will provide you the text, and Gary/Mark/Octavi will do the rest...
One thing per time :-D Voice acting will be only in english, if I am not wrong.
Hmmm I candidate you to be the technical manager of the project eheheh...
I know I was to programmatically edit my own code it would end in disaster because I'm nowhere near consistent enough and would need hopelessly convoluted regular expressions to handle the endless edge cases :D
https://en.wikipedia.org/wiki/Gettext
It's used in a lot of programs and it uses a similiar approach as Ron.
Each actor does a single voice? or many?
I just ask because I don't know almost anything of german, it's just curiosity...
Thanks!
1. At that time (long ago) games weren't translated. In germany we had to play the english versions. Boris was one of the first who actually translated games to german. At the beginning he had to "hack" the games to translate them (i.e. the adventure "Murder on the Missisippi").
2. The few existing german translations were crap or worse. Boris translations were good. Not perfect, but good. You are able to understood and follow the story. :-)
3. He translated the first Lucasfilm adventures (the last one should be MI2 or Indy4 ...).
4. Boris was an editor at a (very) famous game magazine. So he was well-known.
Due to this reasons Boris became a famous translator in the adventure scene. That's all. (Since then there were other translators who did a great job.)
And, Boris tweeted this recently:
https://twitter.com/CloudUndSpiele/status/790603815292641280
"nicht ganz meine Übersetzung" = "not exactly my translation"
The most evident one is the monkey wrench joke.
In version 1, it was translated as "chiave inglese", while in special edition it was just the name of the monkey: "Jojo".
In the Second Edition it's maybe also OK because they've added hints.
For me it was not a problem because I knew that "chiave inglese" was the monkey wrench, hence I had understood the pun...
I don't know how many of such instances there are (probably not so many), but I wonder if they can find the actual asset from the macro/ID e.g. to export the assets + text to help the translators (I suppose there are much tighter space constraints than e.g. with flowing dialog text).
Once we get the translated text back, an artist will need to go into each of the Photoshop files for these rooms and manually recreate the text in the other languages. Then the programmers (me, Jenn, Ron) will export those additional images and set up the code that will automatically switch the text based on the selected language.
There's other text on the screens that programmatically "print" on the screen runtime. That text won't need an artist's touch.
By the way, the "on air" sign wouldn't have to be translated. It's a technical term in most of the western languages.
E.g. in German an accurate translation would be "auf Sendung".
The shortest translation I can think of would be "Aufnahme" ("recording").
http://www.bettina-straub.de/fotos/ruhe.jpg
That's even shorter than "on air". ;-)
Usually, since we are Italians, along with that sign, we have this one:
https://0.s3.envato.com/files/185909431/preview.jpg
I thought the same, it would probably look ugly too.
@Dieter:
Haven't seen those before. That's really short, even on your image is space left and right so I wonder why they didn't add an unnecessary amount of exclamation marks...
Hm, also somehow I now wonder if there will be flashing RIP signs on the cemetery.
@Zak Phoenix McKracken:
"onda" like "wave"? That's more accurate than this air thing!
English is the most spoken language. Therefore, if I were responsible for such a sign within a radio station in a non-anglophone country, I would probably decide for "on air", because there may be people who don't understand the official language of that particular country.
But there is a reason something is called official language: You better have everything in this/these language(s).
Especially in touristy areas you may add English and other languages (if you have a lot of Russian tourists in one area you may also show everything in Russian).
In a professional environment on the other hand you can use technical terms in whatever language they are, as you said.
This may be "on air" in this example, but in others it could be the one in an official language which is perfectly fine: If you are working there you just have to know/learn those terms.
Another example would be big red buttons in swimming pools which should be labeled adequately...
By the way, I somehow like "on air" also because it's a cliché. You see "on air" on such signs almost without exception, when you're watching commercials or video clips.
For text ART, I imagine the translator will provide the text, and Gary/Mark/Octavi will do the rest...
The one thing I don`t like about "text-heavy" INDIE games is that most of them are not translated. It`s so much better to play a game in ones native language.
BTW.: I think TP will sell great in Germany/Austria, we adore adventure games... :)
I then managed to get a Spanish translation from a colleague of mine who did a wonderful job, but it took A LOT of time for him even if they were just 700 lines. I have users asking me for other translations, but what can I do? I don't have the money to pay a professional, so I'll just stop at three languages.
I guess you have a couple of debugging hotkeys in the program - would it be possible to leave them in, maybe hidden a bit so it doesn't interfere with normal gameplay and people won't get the debugging overlays by accident? I would love to occasionally turn on the debugging mode and take a peek behind the curtains!
Thanks for this awesome blog and letting us look over your shoulder!
The red triangle in the 1st screenshot seems to be an excluded area of the green walkbox (to exclude that column).
Those exclusions are more apparent in the 2nd screenshot.
In the 1st one you also have red rectangles which are hotspots. Every hotspot has a red cross associated defining the walk-to location.
This was covered in this early blog post: https://blog.thimbleweedpark.com/wimpy
(one hotspot is for the door apparently, the others on the floor may be for currently hidden objects or NPC interactions?)
The yellow line seems to be the calculated walk path, which isn't optimal at its end btw.
This may be the reason for debugging it in the first place.
On the 2nd screenshot you can see white lines connecting every node with other directly visible nodes which are used for pathfinding.
Mic Uurloon used a similar approach with his engine, see this article: http://www.groebelsloot.com/2016/03/13/pathfinding-part-2/
It even includes interactive examples!
Blue crosses are locations of actors.
"Right now, walk boxes must be convex polygons, but I plan on making it so actors can navigate around the interior of concave polygons."
It seems like he decided for a more complex approach similar to the one in the other article. For this type of game it's more or less unlimited CPU anyway!
https://twitter.com/grumpygamer/status/781141606204190720
https://twitter.com/grumpygamer/status/787295266403606528
PAX to Casino = 4 min, http://bit.ly/2eqxAxM
Spend it to see the sights
PAX to Melbourne Cricket Ground(Aussie baseball) = 38 min, http://bit.ly/2eCq8x2
PAX to Melbourne Star Observation Wheel(Aussie = 30 min, http://bit.ly/2fkeyqi
.. second thought save the souvenir. you can just use google maps and see it from your laptop
https://youtu.be/IvUU8joBb1Q?t=22
https://youtu.be/mFfe4ZRQOH8?t=43
https://www.youtube.com/watch?v=BH728FBmH-c
(It's all tongue-in-cheek, but I found the notion of an Atari demo to promote the game funny and creative, and thought that Mr. Gilbert would get a kick out of it. The demo itself is crap, but so is the Atari VCS, so there. :P)
-dZ.
Thanks for watching and commenting. Yeah, it's crap but as you say, VCS is kind of crappy too. You cannot escape that "limitation" ;)
It's what makes developing for it so funny, I suppose. To try to make something not crappy.