Dev Log

MAKES HAPPY NOISES FOR IMPLEMENTING VOICEOVER MODS

I mean ahem I’m incredibly glad to see these improvements! …For some reason though, I thought DFQ already had cloud saves, so when I had to redo my OS, even though I backed up the data onto my external, I found myself lacking the save file. ;;

Okay everyone, quick update:

Version 1.0.70 is now uploading to the test servers. The principle thing that’s new here is audio support for mods, as mentioned above. There’s also minor tweaks to translation stuff, I’m including the nearly-finished Czech and German translations, and there’s Steam cloud stuff in the source code, but this is just a regular Steam-less build, so you shouldn’t see any of that.

Be on the lookout anyways for new memory leaks, crash bugs in the options menu, and do give the new mod support a try. Also be on the lookout for memory leaks and crashes with that.

Here’s an example mod:

http://files.fortressofdoors.com/defend ... /AUDIO.zip

Unzip that somewhere on your computer, then use the game’s mod interface to load that folder. It’s exactly like the regular game except:

  1. The normal battle theme has been replaced with a short blues track loop. It should loop seamlessly.
  2. The cutscene “A strange new friend,” – Act 1, Scene 2, now has a proof-of-concept of the voice-over feature. (Just cheapo “blahblah” tracks)
  3. Slak’s basic sword attack sound effects have been replaced with cheapo lightsaber sounds.

So, for any music, put your files in the “music” folder, and the filename before the .mp3 suffix is the file id to use internally.
For sfx, put that in the sfx folder, same deal.

How to get music to loop seamlessly:
Suffice it to say, getting dynamically loaded audio to loop seamlessly in flash is a MAJOR PAIN. This is because it only supports mp3, and mp3 is honestly a kind of terrible format - one of the downsides is that the format makes it ambiguous when the music actually starts and stops, and non-great audio playback software (ie, flash’s internal mp3 player) don’t handle this well.

Fortunately, there’s a solution. First, I have to do some programming tricks on my end (done that), and then the modder has to specially prepare their mp3’s.

You should START with a wav file, and encode it yourself using a program called LAME. You can get that for windows here:

http://www.gaclrecords.org.uk/lame-package-3.98.3.zip

Extract that somewhere.
[list=1]
:2of28i1m]Take your wave file, and copy it into the folder you put lame.exe in. I’m assuming it’s named “loop.wav”/:m:2of28i1m]
:2of28i1m]Make a copy of loop.wav, copy_loop.wav. The folder should now have 2 wav files in it. /:m:2of28i1m]
:2of28i1m]Open the command prompt (start -> run -> type “cmd” and hit enter)/:m:2of28i1m]
:2of28i1m]Navigate to where you put lame/:m:2of28i1m]
:2of28i1m]Enter this command:
lame -b 128 -h --nogap loop.wav copy_of_loop.wav
And hit enter./
:m:2of28i1m][/list:o:2of28i1m]

What this essentially does is create a gapless mp3. You will technically get two, but all you need is loop.mp3 (not copy_loop.mp3). This technique was originally designed for making one track on an album seamlessly run into the next - like on Pink Floyd’s Dark Side of the Moon - but it can also be exploited to make a single gapless loop mp3 if the two tracks are the same.

Now you have an mp3 that you can use in your mod that will loop perfectly (in theory). It seems to work for me.

Please note you ONLY have to do this for looping music tracks. Sound effects and music that doesn’t need to loop don’t need this treatment.

A few last-minute changes, and now it’s time for a feature freeze because a global deploy is loooong overdue, especially in light of the undeployed healer freeze glitch in 1.0.64

New stuff in 1.0.71:

[list]
:2nustfta]Title screen now indicates whether a mod is loaded or not
–>Version string will display " v.1.0.71 MOD=MOD_ID" if mod is active
–>“Unload Mod” button will appear on title screen/
:m:2nustfta]
:2nustfta]Cloud save conflict screen includes option to backup the file you don’t pick/:m:2nustfta][/list:u:2nustfta]

This is uploading to the test servers now, and I’ll upload a windows steam build to a public beta branch. The test versions will include german/czech localizations, but I will not include those in a final release until they’re 100% complete and I’ve fixed any and all translation bugs. I figure it’s best to get a patch out NOW rather than delay it for the sake of waiting on fixing up the translations (most of that is work on my end, not the translators).

Version 1.0.71 is now up on both our test servers as well as the “test_public” beta branch on steam. Windows only for now.

To test on steam:
[list=1]
:2evu85f4]Right click “Defender’s Quest” entry in your library listing./:m:2evu85f4]
:2evu85f4]Select properties/:m:2evu85f4]
:2evu85f4]Select betas/:m:2evu85f4]
:2evu85f4]Select “test_public” from the drop-down menu/:m:2evu85f4][/list:o:2evu85f4]

You are now opted-in to the “test_public” beta branch. Close the game if it’s open and reload it. The title screen should display “version 1.0.71.” If not restart steam and try again. You might also have to go to properties->local files->verify integrity of game cache.

I’ve found getting betas to work is sometimes tricky. Basically, right after you opt into a beta, check to see if the game’s library text entry turns from white to yellow and then starts ticking up with progress-text. If it doesn’t, it’s likely nothing’s changed and it’s still got the old content loaded.

Things to test:
[list=1]
:2evu85f4]Verify cloud saves are working.
Throughout play, the game will try to keep your local saves in synch with cloud saves. Steam apparently does this by writing to a cache file, which it uploads to the cloud AFTER you close the game (and perhaps not even until AFTER you close steam, I’m not 100% sure). Anyways, play the game for a bit, close it, and then play it again on another machine - see if your saves transfer over. /
:m:2evu85f4]
:2evu85f4]Verify that mods are working
Mods now have audio support, as well as the ability to unload them from the title screen. Please let me know if there’s any specific bugs related to mods./
:m:2evu85f4]
:2evu85f4]Let me know if there’s memory leaks
I’m always on the watch for these. If you notice slowdown, or even better, if you have an overall memory usage monitor open, see if it continually creeps up while you’re doing any of your usual test stuff. If so, please let me know so I can profile it on my end and fix it. /
:m:2evu85f4][/list:o:2evu85f4]

If you see anything like that, let me know. Also there’s likely to be bugs with localization stuff, I’m aware of that already.

If you need a tester invite, or want to test it on steam and need a key, just PM me and I’ll hook you up.

And obviously…
[size=28]Back up your regular saves before testing![/size]

…and we already have our first bug. Title screen buttons are garbled if you don’t have the “bonus goodies” yet.

I’m uploading version 1.0.72 which fixes this, and while I was at it I threw in data-driven level caps, so you can finally change this in your mods. The value is at the top of data_defender.xml, just export a data-only mod and edit data_defender.xml to get a proof of concept.

Uploading now to test server and to steampipe (to the beta branch).

Don’t see any catastrophic bug reports with the latest version, 1.0.72, so I’m pushing it live. If something pops up I guess I’ll just deal with it and push out a quick patch. Given that the game’s been out for a while now testing intensity is a lot lower, so I think I’m just going to push more frequent patches and respond to problems as they happen.

We plan on finishing up long-term support for DefQ 1 in the next two months. That doesn’t mean there won’t be any more patches ever, it just means we should be basically done with this phase of game maintenance, having added every extra feature we planned as well as patching the last of the bugs worth squashing.

Changelist for 1.0.72:
-Cloud saves (Steam only)
-Fixed crash bug w/ healers
-Fixed double-staff bug
-Mod support extensions:
–Unload mod from title
–Data driven level cap
–Audio support
–Voiceover mods now possible

I’ll push to the direct servers first, then Steam, then GOG, then the rest.

Okay, catastrophic memory leak reported. Lovely!

Found it real quick though. Fixed in 1.0.73, which I’m not pushing live to Steam and Direct (windows only for now). Mac and Linux builds will probably go up tomorrow, and then if there’s not any MORE fresh bugs reported I’ll roll out GOG/etc.

Version 1.0.73 (windows only for now) uploaded to Steam, uploading to direct servers as we speak, changelog since version 1.0.73:

-Fixes massive memory leak in battles

Version 1.0.73 win/mac/linux now pushed to (most) platforms.

Steam and our update servers are now both live.
Humble Store and GOG have gotten their builds and will go up as soon as the techs process them.
Kongregate web build hasn’t been updated yet but should have access to the latest versions via the full version download link.

Found and patched a bug related to Steam Cloud saves. Pushed this live to mac/win/linux on Steam today as version 1.0.74

This means until the next patch, Steam will be one minor version number ahead of the rest, but there are no additional features or bugfixes in the Steam Version, aside from the cloud save patch, which no other build has anyway.

So don’t fret if you only have Version 1.0.73, that’s the latest version everywhere but Steam for now. I thought about not updating the patch number on steam to avoid confusion, but I figure it’s best to stick with it so I know for certain that the change has been made.

Version 1.0.75 is up on the test server for windows.

Changelog for version 1.0.75:
-Mods now have their own localization files.
—If you don’t supply any, it should default to the global localization files for each missing one(in theory)
-When you export a mod, it now copies the base localization files in there as part of your starting template
-When a mod is active, clicking the mod button will now only give you one option: “unload mod” (this prevents various nasty bugs)
-Exposed a lot more data to localization:
–Overworld, Party Screen, and global Battle Screen tutorials/dialogue
–Individual battle tutorials/dialogue
–Hero blurbs
–Quick Equip menu
–Various smaller things

To any translators, you can find the new differences by loading up your latest localization files and selecting your language. The game will show you a list of missing localization entries.

There should only be a few more hard-coded strings that need to be exposed to localization. After that, this should be ready to go!

Strings still missing:

  1. Heaps on party screen - Rename/Redesing, Book buttons, the whole variable bottom left section (Skills, yellow instructions, spell/skill names and description labels and contents, “pts” in levelup bars of defenders, “Equip”/“Skills” button, Equip/Unequip buttons, Name/Attack/Owner column labels, “Nobody” as owner, “Show Equippped” checkbox label, Spell cost and spell cooldown effects in book descriptions, the whole Redesign screen.

  2. Bonus screen: “gold” stars, Select button,

  3. Battle preview screen - labels for Waves, Enemy levels, Types, Reward, Perfect bonus, Select challenge, map name and description.

  4. tips and tricks (back/next buttons, tips and their titles

  5. Battle - Wave count, Send next button, labels in wave tooltip button, “N More” button. Spells, class descriptions, technique/trait names (also on placed defender view), technique tooltip labels (target, dmg, cooldown), game speed, options menu (here I’d suggest to just use Options)

  6. Overworld - town titles and descriptions before entering, town title in town screen.

  7. Town - hire screen class description (same as redesign screen I guess) - plus there’s a problem - the tabs that switch recruit types are quite narrow and longer texts get wrapped. Could you cut these instead? There’s simply no way to say “Ice Mage” in Czech in similar length, when a woman spellcaster alone is “kouzelnice” which will break into two lines there. (Same issue on party screen in top left class name overflowing to right. Also “Nobody” when selling unequipped items. Light/Heavy tabs, Swords/Bows/Staffs tabs.

  8. Load game screen.

Probably more.

Thanks! I’ll get right to work on that.

Okay, I’ve made progress on a lot of those things. Still a bit more to do, but I wanted to post an in-progress build so you guys know where I’m at.

The new test build (1.0.76) is uploading to the tester page now.

New things:
-Fixed major bugs in mod support. Mods now correctly export/import the huge chunk of missing graphics from before.
-Did lots of localization work
-Broke some stuff: The skills preview menu in the party screen is broken in non-english locales, likely a byproduct of my tinkering. I’ll fix that in the next text build, of course, but I wanted to release this test build now as-is rather than wait on fixing that glitch.

New Localization Flags:

data_defender.csv:
Exposed spell descriptions, character blurbs, and color palette names.

"$SKILL_MCGUFFIN_A_LIGHTNING_DESC","Deals $X damage to a single enemy. Burns off psi, reducing psi reward of the enemy.",
"$SKILL_MCGUFFIN_A_FRENZY_DESC","Raises attack rate of ALL defenders by $X% for $Y seconds.",
"$SKILL_MCGUFFIN_A_HEALING_DESC","Heals all defenders for $X HP.",
"$SKILL_MCGUFFIN_A_CRYSTAL_DESC","Places crystal that deals $X damage to foes within $Y tiles. Explodes in $Z seconds, or on lightning strike.",
"$SKILL_MCGUFFIN_A_PUSHBACK_DESC","Pushes enemies $X tiles back towards the start of the maze.",
"$SKILL_MCGUFFIN_A_DRAGON_FIRE_DESC","Deals $X damage to all enemies on screen and sets them on fire for $Y seconds.",  

With similar entries for ANTIMCGUFFIN and SORCEROR.
Also this stuff:

"$SKILL_RANGER_A_BLACK_OUT_THE_SUN","Black Out The Sun",
"$TYPE_RANGED","Ranged",
"$TYPE_MELEE","Melee",
"$TYPE_ULTIMATE","Ultimate",
"$BLURB_BERSERKER","Fastest attacks.<N>Quickly hits many targets for medium damage.<N>Best against groups of weak enemies!",
"$BLURB_RANGER","Best range.<N>Hits targets from far away for light damage.<N>Best all-around unit!",
"$BLURB_KNIGHT","Slowest class.<N>Hits single targets for high damage.<N>Can pierce/destroy armor.<N>Best against strong or armored enemies!",
"$BLURB_MAGE","Slows and freezes enemies.<N>Attacks at medium speed for light damage.<N>Best against fast enemies!",
"$BLURB_DRAGON","Heavy damage.<N>Can eat enemies and set them on fire.<N>Expensive, but awesome.",
"$BLURB_HEALER","Heals your allies.<N>Has a few light attacks.<N>Place wisely for best results!",
"$COLOR_EYE","Eye",
"$COLOR_SKIN","Skin",
"$COLOR_HAIR","Hair",
"$COLOR_PANTS","Pants",
"$COLOR_WEAPON","Weapon",
"$COLOR_ARMOR","Armor",
"$COLOR_DETAIL","Detail",
"$COLOR_TUNIC","Tunic",
"$COLOR_CLOAK","Cloak",
"$COLOR_ROBE","Robe",
"$COLOR_HIDE","Hide",
"$COLOR_OUTLINE","Outline",  

data_items.csv

"$ITEM_SWORD","<RE>$ITM_W_SWORD",
"$ITEM_BOW","<RE>$ITM_W_BOW",
"$ITEM_STAFF","<RE>$ITM_W_STAFF",
"$ITEM_LIGHT","<RE>$ITM_A_LIGHT",
"$ITEM_HEAVY","<RE>$ITM_A_HEAVY",
"$ITEM_BOOK","<RE>$ITM_W_BOOK",
"$ITEM_WEAPON","Weapon",
"$ITEM_ARMOR","Armor",
"$ITM_W_BOOK","book","<NULL>",
"$ITM_W_BOOK_PLURAL","books","<NULL>",
"$ITM_A_LIGHT_PLURAL_SHORT","light","<NULL>",
"$ITM_A_HEAVY_PLURAL_SHORT","heavy","<NULL>",
"$ITM_W_SWORD_PLURAL_SHORT","swords","<NULL>",
"$ITM_W_STAFF_PLURAL_SHORT","staffs","<NULL>",
"$ITM_W_BOW_PLURAL_SHORT","bows","<NULL>",  

data_system.csv:
An enormous amount of stuff, things pertaining to all sorts of UI elements, as well as all the tips:

"$PARTY_CHANGE_NAME","Rename",
"$PARTY_RENAME","Rename",
"$PARTY_REDESIGN","Redesign",
"$UI_EQUIP_NAME","Name",
"$UI_EQUIP_STAT","Stat",
"$UI_EQUIP_OWNER","Owner",
"$UI_EQUIP_SHOW_EQUIPPED","Show Equipped",
"$UI_EQUIP_CLASS_CANT_W","This class can't equip weapons!",
"$UI_EQUIP_CLASS_CANT_A","This class can't equip armor!",
"$UI_EQUIP_ALL_W_SWORD","All swords equipped!",
"$UI_EQUIP_ALL_W_BOW","All bows equipped!",
"$UI_EQUIP_ALL_W_STAFF","All staffs equipped!",
"$UI_EQUIP_ALL_A_LIGHT","All light armor equipped!",
"$UI_EQUIP_ALL_A_HEAVY","All heavy armor equipped!",
"$UI_EQUIP_ALL_W_BOOK","All books equipped!",
"$UI_EQUIP_NO_W_SWORD","No swords owned!",
"$UI_EQUIP_NO_W_BOW","No bows owned!",
"$UI_EQUIP_NO_W_STAFF","No staffs owned!",
"$UI_EQUIP_NO_A_LIGHT","No light armor owned!",
"$UI_EQUIP_NO_A_HEAVY","No heavy armor owned!",
"$UI_OPTIONS_MENU","Options Menu",
"$UI_OPTIONS_SPEED","Game Speed",
"$UI_BONUS_GOLD_STARS_LINE","<STAR_NUM> gold stars",
"$UI_BONUS_BLUE_STARS_LINE","<STAR_NUM> blue stars",
"$UI_DEFENDER_TECHNIQUE","Technique",
"$UI_DEFENDER_TRAIT","Trait",
"$UI_SKILLS_CLICK_TO_UPGRADE","Click to Upgrade.",
"$UI_SKILLS_MAX","MAXIMUM",
"$UI_SKILLS_NO_POINTS","No points available.",
"$UI_SKILLS_REQ_1PT","REQUIRES: Char. LVL <LVL>,<N><PT> point in <SKILL>",
"$UI_SKILLS_REQ_XPT","REQUIRES: Char. LVL <LVL>,<N><PT> points in <SKILL>",
"$UI_SKILLS_NO_LEARN_SPELL","You haven't learned this spell yet.",
"$UI_SKILLS_MOUSE_OVER","Mouse-over to inspect.",
"$UI_EQUIP_SHOW_EQUIPPED","Show equipped",
"$UI_VIDEO_IF_DOESNT_WORK","If the new resolution doesn't work,<N>it will revert after a few seconds.",
"$SAVE_SLOT_PLAY","Play",
"$SAVE_SLOT_PLAY_PLUS","Play +",
"$SAVE_SLOT_NEW_GAME","New Game",
"$SAVE_SLOT_NEW_GAME_PLUS","New Game +",
"$SAVE_SLOT_EXPORT","Export",
"$SAVE_SLOT_IMPORT","Import",
"$SAVE_SLOT_DELETE","Delete",
"$UI_MOD_TITLE","Modifications",
"$UI_MOD_BROWSE_QUEUE","Browse Local Queue",
"$UI_MOD_BROWSE_WORKSHOP","Browse Steam Workshop",
"$UI_RECRUIT_BERSERKER_NUMS","font:14,x_off:0,y_off:0",
"$UI_RECRUIT_RANGER_NUMS","font:14,x_off:0,y_off:0",
"$UI_RECRUIT_KNIGHT_NUMS","font:14,x_off:0,y_off:0",
"$UI_RECRUIT_MAGE_NUMS","font:14,x_off:0,y_off:0",
"$UI_RECRUIT_HEALER_NUMS","font:14,x_off:0,y_off:0",
"$UI_RECRUIT_DRAGON_NUMS","font:14,x_off:0,y_off:0",
"$UI_BATTLE_MORE","MORE",
"$UI_BATTLE_SEND_NEXT","Send<N>NEXT",
"$UI_BATTLE_NEXT","NEXT",
"$UI_BATTLE_WAVES","Waves",
"$UI_BATTLE_WAVE","Wave",
"$UI_BATTLE_CASH_OUT","Cash Out",
"$SKILL_DESC_DMG","Dmg",
"$PARTY_HP","HP",
"$PARTY_PSI","PSI",
"$PARTY_XP","XP",
"$PARTY_ATTACK","Attack:<T>",
"$PARTY_RANGE","Range:<T>",
"$PARTY_SPEED","Speed:<T>",
"$PARTY_DEFEND","Defend:<T>",
"$PARTY_EVADE","Evade:<T>",
"$PARTY_REGEN","Regen:<T>",
"$MISC_STRENGTHS","strengths",
"$MISC_WEAKNESSES","weaknesses",
"$MISC_UNDO","undo",
"$MISC_SELECT_CHALLENGE","Select Challenge:",
"$MISC_REWARD","Reward:",
"$MISC_PERFECT_BONUS","Perfect Bonus:",
"$MISC_WAVES","Waves",
"$MISC_ENEMY_LEVELS","Enemy levels",
"$MISC_TYPES","Types",
"$MISC_UNEQUIP","unequip",
"$MISC_SKILLS","skills",
"$MISC_SKILL","skill",
"$MISC_BOOST","boost",
"$MISC_SPELL","spell",
"$MISC_LOCKED","locked",
"$MISC_NOTHING_TO_EQUIP","Nothing to equip!",
"$REWARD_NEXT_LEVEL","Unlocks next level",
"$REWARD_FINISH","Ends the game",
"$REWARD_QUEST","Quest completed",
"$REWARD_NO_XP","Nothing!",
"$REWARD_NO_GOLD","Nothing!",
"$REWARD_XP","+ <XP> XP",
"$REWARD_GOLD","+ <GOLD> SCRAP",
"$TIP_00_TITLE","Get Stuck?",
"$TIP_00_TEXT","<N><N>Sometimes it is helpful to go back and play an earlier battle to level up, get some gold, and buy better equipment. You can also try 'Casual' difficulty for a lighter challenge.",
"$TIP_10_TITLE","Hotkeys",
"$TIP_10_TEXT","You can control the game with the keyboard!<N><N>- Select spells<N>- Select characters to summon<N>- Boost / recall defenders<N>- Pause / unpause the game<N>- Cycle through summoned defenders<N>- Change targeting/speed options<N>- Tab-navigate through any interface<N>- Move cursor/click with the keyboard<N><N>(Customize keys in the options menu)",
"$TIP_20_TITLE","Skills",
"$TIP_20_TEXT","Each defender gains 1 skill point whenever they level up.<N><N>Assign these points in the party menu to unlock new abilities for battle.<N><N>1) TECHNIQUES (round) - attacks used in battle<N>2) TRAITS (square) - passive, 'always-on' abilities.<N><N>More advanced techniques require boosting to use in battle.",
"$TIP_30_TITLE","Who Gets Experience?",
"$TIP_30_TEXT","<N><N>After a battle, everyone gets the same experience if they were alive and summoned at the end.<N><N>Everyone else gets half experience.  XP per character is the same regardless of number of characters.<N><N>You can change this penalty in the Accessibility menu.",
"$TIP_40_TITLE","Overworld",
"$TIP_40_TEXT","You can click and drag to pan around the overworld, or navigate with the keyboard.<N><N>Scrolling is mapped to the arrow keys by default.",
"$TIP_50_TITLE","Recall for 100% Psi",
"$TIP_50_TEXT","Recalling defenders normally nets you only a portion of the invested Psi.<N><N>If you recall them before the first enemy wave spawns, however, you'll get 100% of your Psi back.",
"$TIP_60_TITLE","Website and Forum",
"$TIP_60_TEXT","If you have a question, join the Defender's Quest online community at www.defendersquest.com!<N><N>We have a forum where you can ask questions, a collaborative wiki, as well as a development blog.",
"$TIP_70_TITLE","Place Defenders",
"$TIP_70_TEXT","You can use the keyboard to place defenders in battle.<N><N>Default controls are mapped to the arrow keys.",
"$TIP_80_TITLE","Battle Effects",
"$TIP_80_TEXT","The colors of the bouncing numbers indicate damage type.  White is normal, grey is reduced by armor, red is bleeding, orange is fire, purple is poison, and big is critical. <N><N>You can turn them on and off in the options menu under 'Gameplay.'",
"$TIP_90_TITLE","Unique Items",
"$TIP_90_TEXT","As you play levels on higher difficulties, you will occasionally find unique items.  These are powerful collectible items and cannot be sold in stores.",
"$TIP_100_TITLE","Recalling",
"$TIP_100_TEXT","Recalling summoned defenders will let you regain a portion of the Psi you've invested in them.<N><N>The amount of recalled Psi gets lower when the defender is injured.",
"$TIP_110_TITLE","Accessibility",
"$TIP_110_TEXT","If you have physical disabilities, check out the following in the options menu:<N><N>1) Video - play in fullscreen mode, scale up the visuals<N>2) Controls - remap all the controls<N>3) Accessibility - toggle effects, play speed, and experience multiplier",
"$TIP_120_TITLE","Public Service Announcement",
"$TIP_120_TEXT","This hint is simply included so nobody tries analyzing codes or deciphering enigmas.",
"$TIP_130_TITLE","Targeting Options",
"$TIP_130_TEXT","If you click on a defender, you can set their targeting options to favor enemies in the front, back, strong, weak, or fast - use these to optimize your attacks. For example, 'strong' can help you focus on bigger units or soften up a whole crowd.",
"$TIP_140_TITLE","Advanced Targeting",
"$TIP_140_TEXT","In addition to basic targeting options, there are four optional settings:<N><N>1) Cheapest technique <N>2) Optimize Effects <N>3) Best Chance <N>4) Bulldog mode<N><N>These aren't necessary, but can help advanced players maximize their battle strategies. You can even save default target options for a given character!",
"$TIP_150_TITLE","Fire and Ice",
"$TIP_150_TEXT","Fire and ice don't play well together.  Chill and freeze will cancel fire, fire will melt freeze, and will cancel chill.",
"$TIP_160_TITLE","Higher Difficulties",
"$TIP_160_TEXT","The 'Advanced' and 'Extreme' difficulties will usually be too tough to try immediately.<N><N>Give them a try after you've beaten the next few battles on normal.",
"$TIP_170_TITLE","Equipment",
"$TIP_170_TEXT","When you buy new equipment for your hero characters, your old stuff makes great hand-me-downs for your other party members.",
"$TIP_180_TITLE","Strength in Numbers",
"$TIP_180_TEXT","Grouping defenders close together makes enemies spread out their attacks, making it easier for each of them to survive.<N><N>The drawback to this strategy is that you cover less area.",
"$TIP_190_TITLE","Reward Multiplier",
"$TIP_190_TEXT","If you want to adjust the game's level-up pace, you can change the global experience multiplier from the options menu.<N><N>The default setting is 100%.<N><N>You can also change the multiplier for scrap.",
"$TIP_200_TITLE","Disabling Techniques",
"$TIP_200_TEXT","Sometimes a particular technique may be throwing off your groove (perhaps your dragon fireballs are melting all your ice), or you just want to save a powerful attack for later. If so, you can click on the defender, then click on the technique in the menu on the lower-right to temporarily disable it.",
"$TIP_210_TITLE","Where Are My Save Files?",
"$TIP_210_TEXT","On the save game menu, there's a button with a picture of a folder and wrench.<N><N>This will take you to where your saved games and configuration file are stored.",
"$TIP_220_TITLE","New Game+",
"$TIP_220_TEXT","After you finish the regular game, you can start a new adventure with your old party, with harder battles and crazy rewards!<N><N>Go to the save screen and select NEW GAME+ on your old save slot.",
"$TIP_230_TITLE","Upgrades",
"$TIP_230_TEXT","In NG+ mode, you'll be able to earn special artifacts that you can use to upgrade unique equipment from the regular game. These upgraded items have special powers!",
"$TIP_240_TITLE","Bonus Missions",
"$TIP_240_TEXT","Once you've earned enough stars, you'll start unlocking bonus battles. These special missions have extra challenges and extra rewards.",
"$TIP_250_TITLE","Psi Burn?",
"$TIP_250_TEXT","The Lightning spell has 'Psi burn', which burns off a proportion of the enemy's Psi reward each time.  If the spell does 40% damage to the enemy, 40% of their normal Psi reward will be removed.",
"$TIP_260_TITLE","Mod Support",
"$TIP_260_TEXT","Did you know you can make your own mods (modifications) of Defender's Quest?<N><N>Click on the big 'M' button in the save game menu.  You can change almost anything - stats, levels, classes, characters, cutscenes, graphics, items, etc.",
"$TIP_270_TITLE","Remember Mom",
"$TIP_270_TEXT","<N><N>Call your mother, she misses you.",  

maps.csv:
All the tutorial text, as well as all the names & descriptions of battles & towns.

"$INDEX_SLAK_DIE_00_TITLE","TALK_$BER_NORMAL",
"$INDEX_SLAK_DIE_00_TEXT","$MCG! You lost my body!",
"$INDEX_SLAK_DIE_10_TITLE","TALK_$MCG_POWER",
"$INDEX_SLAK_DIE_10_TEXT","Sorry, it's hard to concentrate when you get hit so much!",
"$INDEX_SLAK_DIE_20_TITLE","TALK_$BER_NORMAL",
"$INDEX_SLAK_DIE_20_TEXT","Just hurry up and pull me back in! I'm missing out on killing stuff!",
"$INDEX_BER_DIE_30_TITLE","TALK_$BER_SURPRISE",
"$INDEX_BER_DIE_30_TEXT","Yo $MCG! One of my buddies is down! Pull him back in! We got murderin' to do!",
"$INDEX_KETTA_DIE_40_TITLE","TALK_$RAN_NORMAL",
"$INDEX_KETTA_DIE_40_TEXT","Hey! I got knocked out!",
"$INDEX_KETTA_DIE_50_TITLE","TALK_$MCG_POWER",
"$INDEX_KETTA_DIE_50_TEXT","Hold still. I'll get you back in a second.",
"$INDEX_KETTA_DIE_60_TITLE","TALK_$RAN_NORMAL",
"$INDEX_KETTA_DIE_60_TEXT","Hurry up, this feels really weird!",
"$INDEX_RAN_DIE_70_TITLE","TALK_$RAN_NORMAL",
"$INDEX_RAN_DIE_70_TEXT","Hey! We're losing people over here! Get 'em back in!",
"$INDEX_BOOST_SLAK_80_TITLE","TALK_$BER_DERANGED",
"$INDEX_BOOST_SLAK_80_TEXT","HAHAHA! I AM THE SEXY GOD OF VIOLENCE!",
"$INDEX_BOOST_SLAK_90_TITLE","TALK_$BER_DERANGED",
"$INDEX_BOOST_SLAK_90_TEXT","LOOK ON MY RIPPLING ABS, YE MIGHTY, AND DESPAIR!",
"$INDEX_FIRST_LEVEL_100_TITLE","",
"$INDEX_FIRST_LEVEL_100_TEXT","<N>Click here to begin.",
"$INDEX_SECOND_LEVEL_110_TITLE","",
"$INDEX_SECOND_LEVEL_110_TEXT","<N>Click here to advance.",
"$INDEX_LVL_DUDE_120_TITLE","Tutorial",
"$INDEX_LVL_DUDE_120_TEXT","<N>Congratulations! A defender gained a level!",
"$INDEX_LVL_DUDE_130_TITLE","Tutorial",
"$INDEX_LVL_DUDE_130_TEXT","<N>Click on that defender to upgrade skills.",
"$INDEX_CLICK_DUDE_140_TITLE","Tutorial",
"$INDEX_CLICK_DUDE_140_TEXT","This is the defender's SKILL TREE.",
"$INDEX_CLICK_DUDE_150_TITLE","Techniques",
"$INDEX_CLICK_DUDE_150_TEXT","<N>The ROUND skills are TECHNIQUES<N>actively used in battle.",
"$INDEX_CLICK_DUDE_160_TITLE","Traits",
"$INDEX_CLICK_DUDE_160_TEXT","<N>The SQUARE skills are passive TRAITS,<N>always-on abilities.",
"$INDEX_SKILL_DUDE_170_TITLE","Tutorial",
"$INDEX_SKILL_DUDE_170_TEXT","<N>Mousing over the skill shows what will happen when you upgrade it.",
"$INDEX_SKILL_DUDE_180_TITLE","Tutorial",
"$INDEX_SKILL_DUDE_180_TEXT","<N>Click on the skill to increase it by 1 point.",
"$INDEX_A_190_TITLE","Tutorial",
"$INDEX_A_190_TEXT","<N>Congratulations! $MCG gained a level!",
"$INDEX_A_200_TITLE","Tutorial",
"$INDEX_A_200_TEXT","<N>Click on $MCG to upgrade her spells.",
"$INDEX_B_210_TITLE","Tutorial",
"$INDEX_B_210_TEXT","<N>This is $MCG's SKILL TREE.<N>$MCG's skills are all SPELLS.",
"$INDEX_B_220_TITLE","Tutorial",
"$INDEX_B_220_TEXT","<N>$MCG has one SKILL POINT to spend.<N>Mouse over to view the LIGHTNING spell",
"$INDEX_C_230_TITLE","Tutorial",
"$INDEX_C_230_TEXT","<N>Mousing over shows what will happen when you upgrade this skill.",
"$INDEX_C_240_TITLE","Tutorial",
"$INDEX_C_240_TEXT","<N>Click the orb to increase this skill by 1 point.",
"$INDEX_BUY_STUFF_250_TITLE","",
"$INDEX_BUY_STUFF_250_TEXT","<N>You can purchase equipment and hire new defenders in towns.",
"$INDEX_BUY_STUFF_260_TITLE","",
"$INDEX_BUY_STUFF_260_TEXT","You should hire BERSERKERS and buy WEAPONS now.<N><N>(Note: each hire gets more expensive.)",
"$INDEX_HOW_TO_BUY_270_TITLE","Buying Weapons",
"$INDEX_HOW_TO_BUY_270_TEXT","These are the weapons for sale.<N>Click on a weapon type to make the 'BUY' button appear.",
"$INDEX_DIFF_TOWN_280_TITLE","More About Towns:",
"$INDEX_DIFF_TOWN_280_TEXT","<N>Different towns have different things to offer.",
"$INDEX_DIFF_TOWN_290_TITLE","More About Towns:",
"$INDEX_DIFF_TOWN_290_TEXT","<N>For instance, you can hire RANGERS and purchase ARMOR in this town.",
"$INDEX_DIFF_TOWN_300_TITLE","More About Towns:",
"$INDEX_DIFF_TOWN_300_TEXT","<N>Remember, bigger armies are more expensive - each new hire costs more than the last.",
"$INDEX_1_1_WHERE_AM_I_TITLE","The Half-Way World",
"$INDEX_1_1_WHERE_AM_I_TEXT","Lost and alone, $MCG finds herself caught between life and death.",
"$INDEX_1_2_THE_SHADOW_WORLD_TITLE","Caravan of the Dead",
"$INDEX_1_2_THE_SHADOW_WORLD_TEXT","$MCG stumbles across a merchant caravan brimming with goods.",
"$INDEX_1_3_COLISEUM_1_TITLE","The Coliseum",
"$INDEX_1_3_COLISEUM_1_TEXT","Our heroes are forced to fight revenant in Ozimal's coliseum.",
"$INDEX_JAIL_TITLE","Ozimal's Prison",
"$INDEX_JAIL_TEXT","Ozimal's prison town of slaves and gladiators. A mix of deplorable scum and innocent bystanders, all eager to escape.",
"$INDEX_JAIL_DESTROY_TEXT","The prison is empty - someone blew a hole in the wall and all the prisoners escaped.",
"$INDEX_1_4_COLISEUM_2_TITLE","Return to The Coliseum",
"$INDEX_1_4_COLISEUM_2_TEXT","Ozimal demonstrates $MCG's talents for a strange guest...",
"$INDEX_1_5_RIVER_ESCAPE_TITLE","River Escape",
"$INDEX_1_5_RIVER_ESCAPE_TEXT","A bold escape from the coliseum takes the party over a river.",
"$INDEX_SHANTY_TITLE","Shanty ",
"$INDEX_SHANTY_TEXT","A dilapidated shanty town - looks like the escaped prisoners took refuge here.",
"$INDEX_SIDEQUEST_1_TITLE","The Catacombs",
"$INDEX_SIDEQUEST_1_TEXT","While on the run from Ozimal, $MCG returns to save those still trapped in the catacombs below the prison.",
"$INDEX_RANGER_TOWN_TITLE","Karsk",
"$INDEX_RANGER_TOWN_TEXT","A survivor's camp of nomadic villagers. Karsk pays a heavy tribute to Ozimal to escape raids.",
"$INDEX_RANGER_TOWN_DESTROY_TEXT","All that remains of Karsk is a thick layer of char. The bodies of the dead are nowhere to be found.",
"$INDEX_2_1_SAVE_RANGER_TOWN_TITLE","The Battle of Karsk",
"$INDEX_2_1_SAVE_RANGER_TOWN_TEXT","Ozimal's forces lay seige to Karsk.",
"$INDEX_2_2_UNDEAD_RANGERS_TITLE","Old Friends, New Enemies",
"$INDEX_2_2_UNDEAD_RANGERS_TEXT","Victims of the attack on Karsk rise again as long-ranged enemies.",
"$INDEX_2_3_MONASTERY_GATES_TITLE","The Monastery Gates",
"$INDEX_2_3_MONASTERY_GATES_TEXT","A massive battle breaks out at the monastery gates.",
"$INDEX_LAKSOS_TITLE","Laksos",
"$INDEX_LAKSOS_TEXT","A survivor's camp at the foot of a mountain, a frequent target of  Ozimal's raiding parties.",
"$INDEX_2_4_MONASTERY_TITLE","The Monastery Ascension",
"$INDEX_2_4_MONASTERY_TEXT","Enemies make an assault up the daunting monastery stairs.",
"$INDEX_MONASTERY_TITLE","The Monastery",
"$INDEX_MONASTERY_TEXT","A Selini Chapter House, a monastery of the Ash kingdom's primary religion.",
"$INDEX_SIDEQUEST_2_TITLE","Gone Fishing",
"$INDEX_SIDEQUEST_2_TEXT","$MCG purges the revenant infestation in the river so that it can once again be used for fishing",
"$INDEX_3_1_TO_THE_PASS_TITLE","Traveling to the Hospital",
"$INDEX_3_1_TO_THE_PASS_TEXT","$MCG rushes to defend the hospital from a surprise attack.",
"$INDEX_3_2_HOSPITAL_ATTACK_TITLE","Attack at the Hospital",
"$INDEX_3_2_HOSPITAL_ATTACK_TEXT","The party helps defend the besieged hospital.",
"$INDEX_HOSPITAL_TITLE","Hospital",
"$INDEX_HOSPITAL_TEXT","A Seleni House of Mercy, a place of refuge and healing for the wounded and sick.",
"$INDEX_SIDEQUEST_3_TITLE","The Sons of Krast",
"$INDEX_SIDEQUEST_3_TEXT","$RAN begrudgingly keeps a promise to another member of the Geka tribe.",
"$INDEX_SIDEQUEST_4_TITLE","Into the Shadows",
"$INDEX_SIDEQUEST_4_TEXT","While $MCG and $RAN are gone, $BER and $HEA are spirited away by a mysterious woman.",
"$INDEX_3_3_DESERT_STRONGHOLD_TITLE","Desert Stronghold Entrance",
"$INDEX_3_3_DESERT_STRONGHOLD_TEXT","Trailed by a band of revenant, the party makes a stand before entering the Desert Stronghold.",
"$INDEX_3_4_ARMORED_CREEPS_TITLE","Night of the Living Knights",
"$INDEX_3_4_ARMORED_CREEPS_TEXT","Seeking refuge in the stronghold, the party finds something sinister in the darkness.",
"$INDEX_3_5_MEET_THE_KNIGHT_TITLE","Armor Shmarmor",
"$INDEX_3_5_MEET_THE_KNIGHT_TEXT","A lone knight joins the party and shows off his armor-busting skills.",
"$INDEX_GUARD_TOWN_TITLE","Guard Hideout",
"$INDEX_GUARD_TOWN_TEXT","A fort inhabited by former guards of the pit, hiding from vengeful plague survivors.",
"$INDEX_SIDEQUEST_5_TITLE","Return to the Shadows",
"$INDEX_SIDEQUEST_5_TEXT","The mysterious woman returns, abducting $BER and $KNI.",
"$INDEX_3_6_INTO_THE_CITY_TITLE","Deeper into the Stronghold",
"$INDEX_3_6_INTO_THE_CITY_TEXT","$KNI leads the party deeper into the stronghold in search of answers.",
"$INDEX_3_7_UNWELCOME_GUESTS_TITLE","Unwelcome Guests",
"$INDEX_3_7_UNWELCOME_GUESTS_TEXT","The party finds an unlikely ally deep in the catacombs.",
"$INDEX_3_8_DEFEND_NEST_TITLE","Defend the Nest",
"$INDEX_3_8_DEFEND_NEST_TEXT","$DRA agrees to help if the heroes help defend her nest.",
"$INDEX_DRAGON_LAIR_TITLE","Dragon's Lair",
"$INDEX_DRAGON_LAIR_TEXT","$DRA's nesting grounds, stocked with treasure and home to her young.",
"$INDEX_3_9_GOAT_STEW_TITLE","Storm the Sheep",
"$INDEX_3_9_GOAT_STEW_TEXT","$DRA is hungry. $MCG offers an alternative to human flesh.",
"$INDEX_3_10_THE_CITADEL_TITLE","The Royal Records Room",
"$INDEX_3_10_THE_CITADEL_TEXT","The party fights their way into an ancient archive chamber, hoping for answers.",
"$INDEX_FIRE_SHRINE_TITLE","Quaid Fire Shrine",
"$INDEX_FIRE_SHRINE_TEXT","This is a Quaid Fire Shrine",
"$INDEX_SIDEQUEST_6_TITLE","The Fallen Temple",
"$INDEX_SIDEQUEST_6_TEXT","$MAG and $MCG purify a defiled Quaid Fire Shrine",
"$INDEX_DESTROYED_RANGER_TOWN_TITLE","Destroyed Ranger Town",
"$INDEX_DESTROYED_RANGER_TOWN_TEXT","The remnants of the ranger's town.  A few rangers remain amongst the rubble.",
"$INDEX_3_11_CITADEL_BOSS_TITLE","Tunnel Escape",
"$INDEX_3_11_CITADEL_BOSS_TEXT","The party escapes the Citadel through a sewer tunnel, pursued by a force of revenant.",
"$INDEX_3_12_TUNNEL_ESCAPE_TITLE","Detonate the Mines",
"$INDEX_3_12_TUNNEL_ESCAPE_TEXT","$HEA plans to detonate the mines, if $MCG can hold off the revenant army long enough.",
"$INDEX_3_13_DESTROY_CITY_TITLE","Zelemir Appears",
"$INDEX_3_13_DESTROY_CITY_TEXT","Zelemir stands between the party and the way out.",
"$INDEX_GHOST_TOWN_TITLE","Ghost Town",
"$INDEX_GHOST_TOWN_TEXT","A nearly abandoned village, populated by a few roaming mercenaries and Quaid survivors.",
"$INDEX_4_1_EZTLIS_FORCES_TITLE","Eztli-Tenoch's Forces",
"$INDEX_4_1_EZTLIS_FORCES_TEXT","Making their way to the east side of the Pit, the party crosses into Eztli-Tenoch's domain.",
"$INDEX_4_2_WIZARDS_REALM_TITLE","Realm of the Wizard",
"$INDEX_4_2_WIZARDS_REALM_TEXT","The party finds themselves in the ancient ruins of a strange city.  What is this place?",
"$INDEX_4_3_THE_HALLS_TITLE","The Halls of the God-King",
"$INDEX_4_3_THE_HALLS_TEXT","The former throne room of Eztli-Tenoch himself, now the site of a new battle.",
"$INDEX_TREASURE_CHAMBER_TITLE","Treasure Chamber",
"$INDEX_TREASURE_CHAMBER_TEXT","$DRA's discovery is both a safe haven and a restocking location...if you've got the cash.",
"$INDEX_SIDEQUEST_7_TITLE","The Shadow Queen",
"$INDEX_SIDEQUEST_7_TEXT","The mysterious woman's identity is finally revealed.",
"$INDEX_4_4_FREEDOM_DASH_TITLE","A Desperate Dash to Freedom",
"$INDEX_4_4_FREEDOM_DASH_TEXT","Dashing towards the mountain pass, the party is forced to fight across a river.",
"$INDEX_4_5_RIGHT_HAND_TITLE","Eztli-Tenoch's Right Hand",
"$INDEX_4_5_RIGHT_HAND_TEXT","A mysterious foe attacks.",
"$INDEX_4_7_FOLLOW_ZELEMIR_TITLE","Following Zelemir",
"$INDEX_4_7_FOLLOW_ZELEMIR_TEXT","$MCG decides Zelemir's plan is too terrible and sets out after him.",
"$INDEX_4_6_THE_WAY_OUT_TITLE","The Way Out",
"$INDEX_4_6_THE_WAY_OUT_TEXT","$MCG accepts Zelemir's offer and sets out to escape from the Pit.",
"$INDEX_4_8_THE_ARMY_TITLE","Zelemir's Army",
"$INDEX_4_8_THE_ARMY_TEXT","After fighting through the rear guard, $MCG's army must challenge Zelemir's.",
"$INDEX_4_9_ZELEMIR_TITLE","The Face of Madness",
"$INDEX_4_9_ZELEMIR_TEXT","$MCG rushes to stop Zelemir from igniting the crystals and destroying the Pit entirely.",
"$INDEX_12_4_FINAL_TITLE","The God-King Walks Again",
"$INDEX_12_4_FINAL_TEXT","Released by $MCG's blood, Eztli-Tenoch arises.",
"$INDEX_HERMIT_1_TITLE","Hermitage",
"$INDEX_HERMIT_1_TEXT","An eccentric hermit from one of the nomad tribes lives here.",
"$INDEX_HERMIT_2_TITLE","Hermitage",
"$INDEX_HERMIT_2_TEXT","The residence of another hermit, strangely similar to the first.",
"$INDEX_HERMIT_3_TITLE","Hermitage",
"$INDEX_HERMIT_3_TEXT","A third hermit makes his abode deep in the fortress.",
"$INDEX_HERMIT_4_TITLE","Hermitage",
"$INDEX_HERMIT_4_TEXT","The last hermit makes his home in the desert.",
"$INDEX_OBELISK_TITLE","Strange Monument",
"$INDEX_OBELISK_TEXT","There's a strange monument in the desert",  

But that’s not all! I’ve added a bunch more places where you can specify numerical offsets for stuff. I’m working on the german translation first, with the expectation that since localized german text is so notoriously long, if I can handle that the other locales should benefit from the added flexibility. I’ll add spot fixes for Czech, et al, as necessary. Here’s what I added today:

data_system.csv
Controls menu:

"$UI_CONTROLS_CYCLE_NUMS","off_x:-5,text_off_y:-8",
"$UI_CONTROLS_SPEED_NUMS","offy:0,text_off_y:-8",
"$UI_CONTROLS_ACCEL_NUMS","offx:5,offy:0,text_off_y:-8",  

Tips menu:

"$TIPS_BTN_FONT_NUMS","back:14,next:14,back_off_y:1,next_off_y:1",  

Overworld buttons:

"$OVERWORLD_BTN_FONT_NUMS","party:15,movies:15,options:13,options_off_y:2,tips:15,bonus:15,quit:15",  

Party screen:

"$PARTY_RESET_POINTS_NUMS","font:10,off_x:1,off_y:0",
"$PARTY_REDESIGN_NUMS","font:10,off_x:0,off_y:-8",  

Options menu:

"$UI_ACCEPT_NUMS","font:18,off_y:1,off_x:-3",
"$UI_BACK_NUMS","font:18,off_y:1,off_x:-3",
"$UI_AUDIO_NUMS","font:18,off_y:1,off_x:-2",
"$UI_VIDEO_NUMS","font:18,off_y:1,off_x:-2",
"$UI_MISC_NUMS","font:18,off_y:1,off_x:-2",
"$UI_ACCESS_NUMS","speed_off_x:-65,radio_space_y:7,font:18,off_y:1,off_x:-2,show_boxes:1,absence_off_x:0",
"$UI_ACHIEVEMENTS_NUMS","font:18,off_y:0,pop_up_off_y:0",
"$UI_RESTART_NUMS","font:18,off_y:1,off_x:-2",
"$UI_QUIT_NUMS","font:16,off_y:3,off_x:0",
"$UI_CONTROLS_NUMS","font:18,off_y:1,off_x:-2",
"$UI_OPTIONS_NUMS","font:18,off_y:1,off_x:-2",
"$UI_ACHIEVEMENTS_BUTTON_NUMBERS","font:18,offy:-2",  

Town screen:

"$UI_RECRUIT_CANCEL_NUMS","font:14,off_x:0,off_y:3",
"$UI_RECRUIT_COST_NUMS","font:16,off_x:0,off_y:2",
"$UI_RECRUIT_GOLD_NUMS","font:16,off_x:0,off_y:2",
"$UI_RECRUIT_BERSERKER_NUMS","font:14,x_off:0,y_off:0",
"$UI_RECRUIT_RANGER_NUMS","font:12,x_off:0,y_off:2",
"$UI_RECRUIT_KNIGHT_NUMS","font:14,x_off:0,y_off:0",
"$UI_RECRUIT_MAGE_NUMS","font:12,x_off:0,y_off:2",
"$UI_RECRUIT_HEALER_NUMS","font:14,x_off:0,y_off:0",
"$UI_RECRUIT_DRAGON_NUMS","font:14,x_off:0,y_off:0",
"$UI_TOWN_RECRUIT_NUMS","font:12,x_off:2,y_off:3",
"$UI_TOWN_ARMOR_NUMS","font:15,x_off:0,y_off:0",
"$UI_TOWN_WEAPONS_NUMS","font:15,x_off:0,y_off:0",
"$UI_TOWN_LEAVE_NUMS","font:12,x_off:2,y_off:3",
"$UI_TOWN_TALK_NUMS","font:15,x_off:0,y_off:0",
"$UI_SHOP_EQUIP_NUMS","font:13,x_off:0,y_off:2",
"$UI_SHOP_BUY_TAB_NUMS","font:13,x_off:0,y_off:2",
"$UI_SHOP_SELL_TAB_NUMS","font:13,x_off:0,y_off:2",  

— Begin quote from ____

“$TIP_120_TITLE”,“Public Service Announcement”,
“$TIP_120_TEXT”,“This hint is simply included so nobody tries analyzing codes or deciphering enigmas.”,

— End quote

I’m still curious as to what that is about. :stuck_out_tongue:

The Workshop/Translation patch may or may not include an update that may or may not answer that question :roll:

— Begin quote from "Hollow"

— Begin quote from ____

“$TIP_120_TITLE”,“Public Service Announcement”,
“$TIP_120_TEXT”,“This hint is simply included so nobody tries analyzing codes or deciphering enigmas.”,

— End quote

I’m still curious as to what that is about. :stuck_out_tongue:

— End quote

Haha! I wonder that too!

Hey all!

Made some more progress. Version 1.0.77 is going up to the test servers in the next 15 mins.
Changes mostly consist of fixing some localization bugs as documented here:

viewtopic.php?f=14&t=1234&p=4174#p4174

This is very exciting - with luck, we’ll have our German/Czech translations ready for testing by the weekend. Making good progress on workshop support, so I think we’ll definitely be able to coordinate the release of the localizations with workshop support.

Any chance of you guys getting in on Steam’s new trading card thing? :slight_smile: The 7 main characters + possibly Zelemir.

Same, but also including Etzli and his love interest too? [but maybe not golden god or maybe a second, not golden god form if you have any art of him in a more human form? Sorry, it’s been months for me so my brain has forgotten the spelling of the names ;;]