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",