diff --git a/Source/towners.cpp b/Source/towners.cpp index b3373c034..6c65f469e 100644 --- a/Source/towners.cpp +++ b/Source/towners.cpp @@ -11,6 +11,7 @@ #include "inv.h" #include "minitext.h" #include "stores.h" +#include "textdat.h" #include "utils/is_of.hpp" #include "utils/language.h" #include "utils/str_case.hpp" diff --git a/Source/track.cpp b/Source/track.cpp index 868f098d9..4aec241fb 100644 --- a/Source/track.cpp +++ b/Source/track.cpp @@ -24,7 +24,7 @@ void RepeatWalk(Player &player) if (!InDungeonBounds(cursPosition)) return; - if (player._pmode != PM_STAND && !(player.isWalking() && player.AnimInfo.getFrameToUseForRendering() > 6)) + if (player._pmode != PM_STAND && (!player.isWalking() || player.AnimInfo.getFrameToUseForRendering() <= 6)) return; const Point target = player.GetTargetPosition(); diff --git a/Source/translation_dummy.cpp b/Source/translation_dummy.cpp index ba5a64bda..0db9998e9 100644 --- a/Source/translation_dummy.cpp +++ b/Source/translation_dummy.cpp @@ -6,6 +6,8 @@ */ #include "utils/language.h" +namespace { + const char *MT_NZOMBIE_NAME = P_("monster", "Zombie"); const char *MT_BZOMBIE_NAME = P_("monster", "Ghoul"); const char *MT_GZOMBIE_NAME = P_("monster", "Rotting Carcass"); @@ -18,18 +20,11 @@ const char *MT_WSKELAX_NAME = P_("monster", "Skeleton"); const char *MT_TSKELAX_NAME = P_("monster", "Corpse Axe"); const char *MT_RSKELAX_NAME = P_("monster", "Burning Dead"); const char *MT_XSKELAX_NAME = P_("monster", "Horror"); -const char *MT_RFALLSD_NAME = P_("monster", "Fallen One"); -const char *MT_DFALLSD_NAME = P_("monster", "Carver"); -const char *MT_YFALLSD_NAME = P_("monster", "Devil Kin"); -const char *MT_BFALLSD_NAME = P_("monster", "Dark One"); const char *MT_NSCAV_NAME = P_("monster", "Scavenger"); const char *MT_BSCAV_NAME = P_("monster", "Plague Eater"); const char *MT_WSCAV_NAME = P_("monster", "Shadow Beast"); const char *MT_YSCAV_NAME = P_("monster", "Bone Gasher"); -const char *MT_WSKELBW_NAME = P_("monster", "Skeleton"); const char *MT_TSKELBW_NAME = P_("monster", "Corpse Bow"); -const char *MT_RSKELBW_NAME = P_("monster", "Burning Dead"); -const char *MT_XSKELBW_NAME = P_("monster", "Horror"); const char *MT_WSKELSD_NAME = P_("monster", "Skeleton Captain"); const char *MT_TSKELSD_NAME = P_("monster", "Corpse Captain"); const char *MT_RSKELSD_NAME = P_("monster", "Burning Dead Captain"); @@ -48,10 +43,6 @@ const char *MT_FIEND_NAME = P_("monster", "Fiend"); const char *MT_BLINK_NAME = P_("monster", "Blink"); const char *MT_GLOOM_NAME = P_("monster", "Gloom"); const char *MT_FAMILIAR_NAME = P_("monster", "Familiar"); -const char *MT_NGOATBW_NAME = P_("monster", "Flesh Clan"); -const char *MT_BGOATBW_NAME = P_("monster", "Stone Clan"); -const char *MT_RGOATBW_NAME = P_("monster", "Fire Clan"); -const char *MT_GGOATBW_NAME = P_("monster", "Night Clan"); const char *MT_NACID_NAME = P_("monster", "Acid Beast"); const char *MT_RACID_NAME = P_("monster", "Poison Spitter"); const char *MT_BACID_NAME = P_("monster", "Pit Beast"); @@ -118,34 +109,7 @@ const char *MT_ADVOCATE_NAME = P_("monster", "Advocate"); const char *MT_GOLEM_NAME = P_("monster", "Golem"); const char *MT_DIABLO_NAME = P_("monster", "The Dark Lord"); const char *MT_DARKMAGE_NAME = P_("monster", "The Arch-Litch Malignus"); -const char *MT_HELLBOAR_NAME = P_("monster", "Hellboar"); -const char *MT_STINGER_NAME = P_("monster", "Stinger"); -const char *MT_PSYCHORB_NAME = P_("monster", "Psychorb"); -const char *MT_ARACHNON_NAME = P_("monster", "Arachnon"); -const char *MT_FELLTWIN_NAME = P_("monster", "Felltwin"); -const char *MT_HORKSPWN_NAME = P_("monster", "Hork Spawn"); -const char *MT_VENMTAIL_NAME = P_("monster", "Venomtail"); -const char *MT_NECRMORB_NAME = P_("monster", "Necromorb"); -const char *MT_SPIDLORD_NAME = P_("monster", "Spider Lord"); -const char *MT_LASHWORM_NAME = P_("monster", "Lashworm"); -const char *MT_TORCHANT_NAME = P_("monster", "Torchant"); -const char *MT_HORKDMN_NAME = P_("monster", "Hork Demon"); -const char *MT_DEFILER_NAME = P_("monster", "Hell Bug"); -const char *MT_GRAVEDIG_NAME = P_("monster", "Gravedigger"); -const char *MT_TOMBRAT_NAME = P_("monster", "Tomb Rat"); -const char *MT_FIREBAT_NAME = P_("monster", "Firebat"); -const char *MT_SKLWING_NAME = P_("monster", "Skullwing"); -const char *MT_LICH_NAME = P_("monster", "Lich"); -const char *MT_CRYPTDMN_NAME = P_("monster", "Crypt Demon"); -const char *MT_HELLBAT_NAME = P_("monster", "Hellbat"); -const char *MT_BONEDEMN_NAME = P_("monster", "Bone Demon"); -const char *MT_ARCHLICH_NAME = P_("monster", "Arch Lich"); -const char *MT_BICLOPS_NAME = P_("monster", "Biclops"); -const char *MT_FLESTHNG_NAME = P_("monster", "Flesh Thing"); -const char *MT_REAPER_NAME = P_("monster", "Reaper"); -const char *MT_NAKRUL_NAME = P_("monster", "Na-Krul"); const char *GHARBAD_THE_WEAK_NAME = P_("monster", "Gharbad the Weak"); -const char *SKELETON_KING_NAME = P_("monster", "Skeleton King"); const char *ZHAR_THE_MAD_NAME = P_("monster", "Zhar the Mad"); const char *SNOTSPILL_NAME = P_("monster", "Snotspill"); const char *ARCH_BISHOP_LAZARUS_NAME = P_("monster", "Arch-Bishop Lazarus"); @@ -153,7 +117,6 @@ const char *RED_VEX_NAME = P_("monster", "Red Vex"); const char *BLACK_JADE_NAME = P_("monster", "Black Jade"); const char *LACHDANAN_NAME = P_("monster", "Lachdanan"); const char *WARLORD_OF_BLOOD_NAME = P_("monster", "Warlord of Blood"); -const char *THE_BUTCHER_NAME = P_("monster", "The Butcher"); const char *HORK_DEMON_NAME = P_("monster", "Hork Demon"); const char *THE_DEFILER_NAME = P_("monster", "The Defiler"); const char *NA_KRUL_NAME = P_("monster", "Na-Krul"); @@ -267,7 +230,7 @@ const char *IDI_FUNGALTM_NAME = N_("Fungal Tome"); const char *IDI_SPECELIX_NAME = N_("Spectral Elixir"); const char *IDI_BLDSTONE_NAME = N_("Blood Stone"); const char *IDI_MAPOFDOOM_NAME = N_("Cathedral Map"); -const char *IDI_EAR_NAME = N_("Heart"); +const char *IDI_EAR_NAME = N_("Ear"); const char *IDI_HEAL_NAME = N_("Potion of Healing"); const char *IDI_MANA_NAME = N_("Potion of Mana"); const char *IDI_IDENTIFY_NAME = N_("Scroll of Identify"); @@ -293,70 +256,39 @@ const char *IDI_FULLNOTE_NAME = N_("Reconstructed Note"); const char *IDI_BROWNSUIT_NAME = N_("Brown Suit"); const char *IDI_GREYSUIT_NAME = N_("Grey Suit"); const char *ITEM_48_NAME = N_("Cap"); -const char *ITEM_48_SHORT_NAME = N_("Cap"); const char *ITEM_49_NAME = N_("Skull Cap"); -const char *ITEM_49_SHORT_NAME = N_("Cap"); const char *ITEM_50_NAME = N_("Helm"); -const char *ITEM_50_SHORT_NAME = N_("Helm"); const char *ITEM_51_NAME = N_("Full Helm"); -const char *ITEM_51_SHORT_NAME = N_("Helm"); const char *ITEM_52_NAME = N_("Crown"); -const char *ITEM_52_SHORT_NAME = N_("Crown"); const char *ITEM_53_NAME = N_("Great Helm"); -const char *ITEM_53_SHORT_NAME = N_("Helm"); const char *ITEM_54_NAME = N_("Cape"); -const char *ITEM_54_SHORT_NAME = N_("Cape"); const char *ITEM_55_NAME = N_("Rags"); -const char *ITEM_55_SHORT_NAME = N_("Rags"); const char *ITEM_56_NAME = N_("Cloak"); -const char *ITEM_56_SHORT_NAME = N_("Cloak"); const char *ITEM_57_NAME = N_("Robe"); -const char *ITEM_57_SHORT_NAME = N_("Robe"); const char *ITEM_58_NAME = N_("Quilted Armor"); const char *ITEM_58_SHORT_NAME = N_("Armor"); const char *ITEM_59_NAME = N_("Leather Armor"); -const char *ITEM_59_SHORT_NAME = N_("Armor"); const char *ITEM_60_NAME = N_("Hard Leather Armor"); -const char *ITEM_60_SHORT_NAME = N_("Armor"); const char *ITEM_61_NAME = N_("Studded Leather Armor"); -const char *ITEM_61_SHORT_NAME = N_("Armor"); const char *ITEM_62_NAME = N_("Ring Mail"); const char *ITEM_62_SHORT_NAME = N_("Mail"); const char *ITEM_63_NAME = N_("Chain Mail"); -const char *ITEM_63_SHORT_NAME = N_("Mail"); const char *ITEM_64_NAME = N_("Scale Mail"); -const char *ITEM_64_SHORT_NAME = N_("Mail"); const char *ITEM_65_NAME = N_("Breast Plate"); const char *ITEM_65_SHORT_NAME = N_("Plate"); const char *ITEM_66_NAME = N_("Splint Mail"); -const char *ITEM_66_SHORT_NAME = N_("Mail"); const char *ITEM_67_NAME = N_("Plate Mail"); -const char *ITEM_67_SHORT_NAME = N_("Plate"); const char *ITEM_68_NAME = N_("Field Plate"); -const char *ITEM_68_SHORT_NAME = N_("Plate"); const char *ITEM_69_NAME = N_("Gothic Plate"); -const char *ITEM_69_SHORT_NAME = N_("Plate"); const char *ITEM_70_NAME = N_("Full Plate Mail"); -const char *ITEM_70_SHORT_NAME = N_("Plate"); -const char *ITEM_71_NAME = N_("Buckler"); const char *ITEM_71_SHORT_NAME = N_("Shield"); const char *ITEM_72_NAME = N_("Small Shield"); -const char *ITEM_72_SHORT_NAME = N_("Shield"); const char *ITEM_73_NAME = N_("Large Shield"); -const char *ITEM_73_SHORT_NAME = N_("Shield"); const char *ITEM_74_NAME = N_("Kite Shield"); -const char *ITEM_74_SHORT_NAME = N_("Shield"); const char *ITEM_75_NAME = N_("Tower Shield"); -const char *ITEM_75_SHORT_NAME = N_("Shield"); const char *ITEM_76_NAME = N_("Gothic Shield"); -const char *ITEM_76_SHORT_NAME = N_("Shield"); -const char *ITEM_77_NAME = N_("Potion of Healing"); -const char *ITEM_78_NAME = N_("Potion of Full Healing"); -const char *ITEM_79_NAME = N_("Potion of Mana"); -const char *ITEM_80_NAME = N_("Potion of Full Mana"); const char *ITEM_81_NAME = N_("Potion of Rejuvenation"); const char *ITEM_82_NAME = N_("Potion of Full Rejuvenation"); -const char *ITEM_83_NAME = N_("Blacksmith Oil"); const char *ITEM_84_NAME = N_("Oil of Accuracy"); const char *ITEM_85_NAME = N_("Oil of Sharpness"); const char *ITEM_86_NAME = N_("Oil"); @@ -367,11 +299,8 @@ const char *ITEM_90_NAME = N_("Elixir of Vitality"); const char *ITEM_91_NAME = N_("Scroll of Healing"); const char *ITEM_92_NAME = N_("Scroll of Search"); const char *ITEM_93_NAME = N_("Scroll of Lightning"); -const char *ITEM_94_NAME = N_("Scroll of Identify"); -const char *ITEM_95_NAME = N_("Scroll of Resurrect"); const char *ITEM_96_NAME = N_("Scroll of Fire Wall"); const char *ITEM_97_NAME = N_("Scroll of Inferno"); -const char *ITEM_98_NAME = N_("Scroll of Town Portal"); const char *ITEM_99_NAME = N_("Scroll of Flash"); const char *ITEM_100_NAME = N_("Scroll of Infravision"); const char *ITEM_101_NAME = N_("Scroll of Phasing"); @@ -385,114 +314,54 @@ const char *ITEM_109_NAME = N_("Scroll of Nova"); const char *ITEM_110_NAME = N_("Scroll of Golem"); const char *ITEM_112_NAME = N_("Scroll of Teleport"); const char *ITEM_113_NAME = N_("Scroll of Apocalypse"); -const char *ITEM_118_NAME = N_("Dagger"); -const char *ITEM_118_SHORT_NAME = N_("Dagger"); -const char *ITEM_119_NAME = N_("Short Sword"); -const char *ITEM_119_SHORT_NAME = N_("Sword"); const char *ITEM_120_NAME = N_("Falchion"); -const char *ITEM_120_SHORT_NAME = N_("Sword"); const char *ITEM_121_NAME = N_("Scimitar"); -const char *ITEM_121_SHORT_NAME = N_("Sword"); const char *ITEM_122_NAME = N_("Claymore"); -const char *ITEM_122_SHORT_NAME = N_("Sword"); const char *ITEM_123_NAME = N_("Blade"); -const char *ITEM_123_SHORT_NAME = N_("Blade"); const char *ITEM_124_NAME = N_("Sabre"); -const char *ITEM_124_SHORT_NAME = N_("Sabre"); const char *ITEM_125_NAME = N_("Long Sword"); -const char *ITEM_125_SHORT_NAME = N_("Sword"); const char *ITEM_126_NAME = N_("Broad Sword"); -const char *ITEM_126_SHORT_NAME = N_("Sword"); const char *ITEM_127_NAME = N_("Bastard Sword"); -const char *ITEM_127_SHORT_NAME = N_("Sword"); const char *ITEM_128_NAME = N_("Two-Handed Sword"); -const char *ITEM_128_SHORT_NAME = N_("Sword"); const char *ITEM_129_NAME = N_("Great Sword"); -const char *ITEM_129_SHORT_NAME = N_("Sword"); const char *ITEM_130_NAME = N_("Small Axe"); const char *ITEM_130_SHORT_NAME = N_("Axe"); -const char *ITEM_131_NAME = N_("Axe"); -const char *ITEM_131_SHORT_NAME = N_("Axe"); const char *ITEM_132_NAME = N_("Large Axe"); -const char *ITEM_132_SHORT_NAME = N_("Axe"); const char *ITEM_133_NAME = N_("Broad Axe"); -const char *ITEM_133_SHORT_NAME = N_("Axe"); const char *ITEM_134_NAME = N_("Battle Axe"); -const char *ITEM_134_SHORT_NAME = N_("Axe"); const char *ITEM_135_NAME = N_("Great Axe"); -const char *ITEM_135_SHORT_NAME = N_("Axe"); const char *ITEM_136_NAME = N_("Mace"); -const char *ITEM_136_SHORT_NAME = N_("Mace"); const char *ITEM_137_NAME = N_("Morning Star"); -const char *ITEM_137_SHORT_NAME = N_("Mace"); const char *ITEM_138_NAME = N_("War Hammer"); const char *ITEM_138_SHORT_NAME = N_("Hammer"); const char *ITEM_139_NAME = N_("Spiked Club"); -const char *ITEM_139_SHORT_NAME = N_("Club"); -const char *ITEM_140_NAME = N_("Club"); -const char *ITEM_140_SHORT_NAME = N_("Club"); const char *ITEM_141_NAME = N_("Flail"); -const char *ITEM_141_SHORT_NAME = N_("Flail"); const char *ITEM_142_NAME = N_("Maul"); -const char *ITEM_142_SHORT_NAME = N_("Maul"); -const char *ITEM_143_NAME = N_("Short Bow"); const char *ITEM_143_SHORT_NAME = N_("Bow"); const char *ITEM_144_NAME = N_("Hunter's Bow"); -const char *ITEM_144_SHORT_NAME = N_("Bow"); const char *ITEM_145_NAME = N_("Long Bow"); -const char *ITEM_145_SHORT_NAME = N_("Bow"); const char *ITEM_146_NAME = N_("Composite Bow"); -const char *ITEM_146_SHORT_NAME = N_("Bow"); const char *IDI_SHORT_BATTLE_BOW_NAME = N_("Short Battle Bow"); -const char *IDI_SHORT_BATTLE_BOW_SHORT_NAME = N_("Bow"); const char *ITEM_148_NAME = N_("Long Battle Bow"); -const char *ITEM_148_SHORT_NAME = N_("Bow"); const char *ITEM_149_NAME = N_("Short War Bow"); -const char *ITEM_149_SHORT_NAME = N_("Bow"); const char *ITEM_150_NAME = N_("Long War Bow"); -const char *ITEM_150_SHORT_NAME = N_("Bow"); -const char *ITEM_151_NAME = N_("Short Staff"); const char *ITEM_151_SHORT_NAME = N_("Staff"); const char *ITEM_152_NAME = N_("Long Staff"); -const char *ITEM_152_SHORT_NAME = N_("Staff"); const char *ITEM_153_NAME = N_("Composite Staff"); -const char *ITEM_153_SHORT_NAME = N_("Staff"); const char *ITEM_154_NAME = N_("Quarter Staff"); -const char *ITEM_154_SHORT_NAME = N_("Staff"); const char *ITEM_155_NAME = N_("War Staff"); -const char *ITEM_155_SHORT_NAME = N_("Staff"); const char *ITEM_156_NAME = N_("Ring"); -const char *ITEM_156_SHORT_NAME = N_("Ring"); -const char *ITEM_157_NAME = N_("Ring"); -const char *ITEM_157_SHORT_NAME = N_("Ring"); -const char *ITEM_158_NAME = N_("Ring"); -const char *ITEM_158_SHORT_NAME = N_("Ring"); const char *ITEM_159_NAME = N_("Amulet"); -const char *ITEM_159_SHORT_NAME = N_("Amulet"); -const char *ITEM_160_NAME = N_("Amulet"); -const char *ITEM_160_SHORT_NAME = N_("Amulet"); const char *ITEM_161_NAME = N_("Rune of Fire"); const char *ITEM_161_SHORT_NAME = N_("Rune"); const char *ITEM_162_NAME = N_("Rune of Lightning"); -const char *ITEM_162_SHORT_NAME = N_("Rune"); const char *ITEM_163_NAME = N_("Greater Rune of Fire"); -const char *ITEM_163_SHORT_NAME = N_("Rune"); const char *ITEM_164_NAME = N_("Greater Rune of Lightning"); -const char *ITEM_164_SHORT_NAME = N_("Rune"); const char *ITEM_165_NAME = N_("Rune of Stone"); -const char *ITEM_165_SHORT_NAME = N_("Rune"); -const char *IDI_SORCERER_NAME = N_("Short Staff of Charged Bolt"); +const char *ITEM_166_NAME = N_("Short Staff of Charged Bolt"); const char *IDI_ARENAPOT_NAME = N_("Arena Potion"); const char *UNIQUE_ITEM_0_NAME = N_("The Butcher's Cleaver"); -const char *UNIQUE_ITEM_1_NAME = N_("The Undead Crown"); -const char *UNIQUE_ITEM_2_NAME = N_("Empyrean Band"); -const char *UNIQUE_ITEM_3_NAME = N_("Optic Amulet"); -const char *UNIQUE_ITEM_4_NAME = N_("Ring of Truth"); -const char *UNIQUE_ITEM_5_NAME = N_("Harlequin Crest"); -const char *UNIQUE_ITEM_6_NAME = N_("Veil of Steel"); -const char *UNIQUE_ITEM_7_NAME = N_("Arkaine's Valor"); -const char *UNIQUE_ITEM_8_NAME = N_("Griswold's Edge"); -const char *UNIQUE_ITEM_9_NAME = N_("Bovine Plate"); +const char *UNIQUE_ITEM_9_NAME = N_("Lightforge"); const char *UNIQUE_ITEM_10_NAME = N_("The Rift Bow"); const char *UNIQUE_ITEM_11_NAME = N_("The Needler"); const char *UNIQUE_ITEM_12_NAME = N_("The Celestial Bow"); @@ -573,33 +442,12 @@ const char *UNIQUE_ITEM_86_NAME = N_("Ring of Regha"); const char *UNIQUE_ITEM_87_NAME = N_("The Bleeder"); const char *UNIQUE_ITEM_88_NAME = N_("Constricting Ring"); const char *UNIQUE_ITEM_89_NAME = N_("Ring of Engagement"); -const char *UNIQUE_ITEM_90_NAME = N_("Giant's Knuckle"); -const char *UNIQUE_ITEM_91_NAME = N_("Mercurial Ring"); -const char *UNIQUE_ITEM_92_NAME = N_("Xorine's Ring"); -const char *UNIQUE_ITEM_93_NAME = N_("Karik's Ring"); -const char *UNIQUE_ITEM_94_NAME = N_("Ring of Magma"); -const char *UNIQUE_ITEM_95_NAME = N_("Ring of the Mystics"); -const char *UNIQUE_ITEM_96_NAME = N_("Ring of Thunder"); -const char *UNIQUE_ITEM_97_NAME = N_("Amulet of Warding"); -const char *UNIQUE_ITEM_98_NAME = N_("Gnat Sting"); -const char *UNIQUE_ITEM_99_NAME = N_("Flambeau"); -const char *UNIQUE_ITEM_100_NAME = N_("Armor of Gloom"); -const char *UNIQUE_ITEM_101_NAME = N_("Blitzen"); -const char *UNIQUE_ITEM_102_NAME = N_("Thunderclap"); -const char *UNIQUE_ITEM_103_NAME = N_("Shirotachi"); -const char *UNIQUE_ITEM_104_NAME = N_("Eater of Souls"); -const char *UNIQUE_ITEM_105_NAME = N_("Diamondedge"); -const char *UNIQUE_ITEM_106_NAME = N_("Bone Chain Armor"); -const char *UNIQUE_ITEM_107_NAME = N_("Demon Plate Armor"); -const char *UNIQUE_ITEM_108_NAME = N_("Acolyte's Amulet"); -const char *UNIQUE_ITEM_109_NAME = N_("Gladiator's Ring"); const char *ITEM_PREFIX_0_NAME = N_("Tin"); const char *ITEM_PREFIX_1_NAME = N_("Brass"); const char *ITEM_PREFIX_2_NAME = N_("Bronze"); const char *ITEM_PREFIX_3_NAME = N_("Iron"); const char *ITEM_PREFIX_4_NAME = N_("Steel"); const char *ITEM_PREFIX_5_NAME = N_("Silver"); -const char *ITEM_PREFIX_6_NAME = N_("Gold"); const char *ITEM_PREFIX_7_NAME = N_("Platinum"); const char *ITEM_PREFIX_8_NAME = N_("Mithril"); const char *ITEM_PREFIX_9_NAME = N_("Meteoric"); @@ -630,7 +478,6 @@ const char *ITEM_PREFIX_33_NAME = N_("Champion's"); const char *ITEM_PREFIX_34_NAME = N_("King's"); const char *ITEM_PREFIX_35_NAME = N_("Vulnerable"); const char *ITEM_PREFIX_36_NAME = N_("Rusted"); -const char *ITEM_PREFIX_37_NAME = N_("Fine"); const char *ITEM_PREFIX_38_NAME = N_("Strong"); const char *ITEM_PREFIX_39_NAME = N_("Grand"); const char *ITEM_PREFIX_40_NAME = N_("Valiant"); @@ -642,7 +489,6 @@ const char *ITEM_PREFIX_45_NAME = N_("Holy"); const char *ITEM_PREFIX_46_NAME = N_("Godly"); const char *ITEM_PREFIX_47_NAME = N_("Red"); const char *ITEM_PREFIX_48_NAME = N_("Crimson"); -const char *ITEM_PREFIX_49_NAME = N_("Crimson"); const char *ITEM_PREFIX_50_NAME = N_("Garnet"); const char *ITEM_PREFIX_51_NAME = N_("Ruby"); const char *ITEM_PREFIX_52_NAME = N_("Blue"); @@ -676,9 +522,6 @@ const char *ITEM_PREFIX_79_NAME = N_("Plentiful"); const char *ITEM_PREFIX_80_NAME = N_("Bountiful"); const char *ITEM_PREFIX_81_NAME = N_("Flaming"); const char *ITEM_PREFIX_82_NAME = N_("Lightning"); -const char *ITEM_PREFIX_83_NAME = N_("Jester's"); -const char *ITEM_PREFIX_84_NAME = N_("Crystalline"); -const char *ITEM_PREFIX_85_NAME = N_("Doppelganger's"); const char *ITEM_SUFFIX_0_NAME = N_("quality"); const char *ITEM_SUFFIX_1_NAME = N_("maiming"); const char *ITEM_SUFFIX_2_NAME = N_("slaying"); @@ -774,9 +617,6 @@ const char *ITEM_SUFFIX_91_NAME = N_("balance"); const char *ITEM_SUFFIX_92_NAME = N_("stability"); const char *ITEM_SUFFIX_93_NAME = N_("harmony"); const char *ITEM_SUFFIX_94_NAME = N_("blocking"); -const char *ITEM_SUFFIX_95_NAME = N_("devastation"); -const char *ITEM_SUFFIX_96_NAME = N_("decay"); -const char *ITEM_SUFFIX_97_NAME = N_("peril"); const char *SPELL_FIREBOLT_NAME = P_("spell", "Firebolt"); const char *SPELL_HEALING_NAME = P_("spell", "Healing"); const char *SPELL_LIGHTNING_NAME = P_("spell", "Lightning"); @@ -813,6 +653,56 @@ const char *SPELL_TELEKINESIS_NAME = P_("spell", "Telekinesis"); const char *SPELL_HEAL_OTHER_NAME = P_("spell", "Heal Other"); const char *SPELL_BLOOD_STAR_NAME = P_("spell", "Blood Star"); const char *SPELL_BONE_SPIRIT_NAME = P_("spell", "Bone Spirit"); +const char *MT_HELLBOAR_NAME = P_("monster", "Hellboar"); +const char *MT_STINGER_NAME = P_("monster", "Stinger"); +const char *MT_PSYCHORB_NAME = P_("monster", "Psychorb"); +const char *MT_ARACHNON_NAME = P_("monster", "Arachnon"); +const char *MT_FELLTWIN_NAME = P_("monster", "Felltwin"); +const char *MT_HORKSPWN_NAME = P_("monster", "Hork Spawn"); +const char *MT_VENMTAIL_NAME = P_("monster", "Venomtail"); +const char *MT_NECRMORB_NAME = P_("monster", "Necromorb"); +const char *MT_SPIDLORD_NAME = P_("monster", "Spider Lord"); +const char *MT_LASHWORM_NAME = P_("monster", "Lashworm"); +const char *MT_TORCHANT_NAME = P_("monster", "Torchant"); +const char *MT_DEFILER_NAME = P_("monster", "Hell Bug"); +const char *MT_GRAVEDIG_NAME = P_("monster", "Gravedigger"); +const char *MT_TOMBRAT_NAME = P_("monster", "Tomb Rat"); +const char *MT_FIREBAT_NAME = P_("monster", "Firebat"); +const char *MT_SKLWING_NAME = P_("monster", "Skullwing"); +const char *MT_LICH_NAME = P_("monster", "Lich"); +const char *MT_CRYPTDMN_NAME = P_("monster", "Crypt Demon"); +const char *MT_HELLBAT_NAME = P_("monster", "Hellbat"); +const char *MT_BONEDEMN_NAME = P_("monster", "Bone Demon"); +const char *MT_ARCHLICH_NAME = P_("monster", "Arch Lich"); +const char *MT_BICLOPS_NAME = P_("monster", "Biclops"); +const char *MT_FLESTHNG_NAME = P_("monster", "Flesh Thing"); +const char *MT_REAPER_NAME = P_("monster", "Reaper"); +const char *UNIQUE_ITEM_90_NAME = N_("Giant's Knuckle"); +const char *UNIQUE_ITEM_91_NAME = N_("Mercurial Ring"); +const char *UNIQUE_ITEM_92_NAME = N_("Xorine's Ring"); +const char *UNIQUE_ITEM_93_NAME = N_("Karik's Ring"); +const char *UNIQUE_ITEM_94_NAME = N_("Ring of Magma"); +const char *UNIQUE_ITEM_95_NAME = N_("Ring of the Mystics"); +const char *UNIQUE_ITEM_96_NAME = N_("Ring of Thunder"); +const char *UNIQUE_ITEM_97_NAME = N_("Amulet of Warding"); +const char *UNIQUE_ITEM_98_NAME = N_("Gnat Sting"); +const char *UNIQUE_ITEM_99_NAME = N_("Flambeau"); +const char *UNIQUE_ITEM_100_NAME = N_("Armor of Gloom"); +const char *UNIQUE_ITEM_101_NAME = N_("Blitzen"); +const char *UNIQUE_ITEM_102_NAME = N_("Thunderclap"); +const char *UNIQUE_ITEM_103_NAME = N_("Shirotachi"); +const char *UNIQUE_ITEM_104_NAME = N_("Eater of Souls"); +const char *UNIQUE_ITEM_105_NAME = N_("Diamondedge"); +const char *UNIQUE_ITEM_106_NAME = N_("Bone Chain Armor"); +const char *UNIQUE_ITEM_107_NAME = N_("Demon Plate Armor"); +const char *UNIQUE_ITEM_108_NAME = N_("Acolyte's Amulet"); +const char *UNIQUE_ITEM_109_NAME = N_("Gladiator's Ring"); +const char *ITEM_PREFIX_83_NAME = N_("Jester's"); +const char *ITEM_PREFIX_84_NAME = N_("Crystalline"); +const char *ITEM_PREFIX_85_NAME = N_("Doppelganger's"); +const char *ITEM_SUFFIX_95_NAME = N_("devastation"); +const char *ITEM_SUFFIX_96_NAME = N_("decay"); +const char *ITEM_SUFFIX_97_NAME = N_("peril"); const char *SPELL_MANA_NAME = P_("spell", "Mana"); const char *SPELL_THE_MAGI_NAME = P_("spell", "the Magi"); const char *SPELL_THE_JESTER_NAME = P_("spell", "the Jester"); @@ -828,3 +718,5 @@ const char *SPELL_RUNE_OF_LIGHT_NAME = P_("spell", "Rune of Light"); const char *SPELL_RUNE_OF_NOVA_NAME = P_("spell", "Rune of Nova"); const char *SPELL_RUNE_OF_IMMOLATION_NAME = P_("spell", "Rune of Immolation"); const char *SPELL_RUNE_OF_STONE_NAME = P_("spell", "Rune of Stone"); + +} // namespace diff --git a/assets/txtdata/items/itemdat.tsv b/assets/txtdata/items/itemdat.tsv index 6d59bc4fb..68288195f 100644 --- a/assets/txtdata/items/itemdat.tsv +++ b/assets/txtdata/items/itemdat.tsv @@ -165,5 +165,5 @@ IDI_SHORT_BATTLE_BOW 2 Weapon Two-handed SHORT_BATTLE_BOW Bow NONE Short Battle 1 Misc Unequippable GREATER_RUNE_OF_FIRE Misc NONE Greater Rune of Fire Rune 7 0 0 0 0 0 0 42 0 GR_RUNEF Null true 400 1 Misc Unequippable GREATER_RUNE_OF_LIGHTNING Misc NONE Greater Rune of Lightning Rune 7 0 0 0 0 0 0 42 0 GR_RUNEL Null true 500 1 Misc Unequippable RUNE_OF_STONE Misc NONE Rune of Stone Rune 7 0 0 0 0 0 0 25 0 RUNES Null true 300 -IDI_SORCERER 0 Weapon Two-handed SHORT_STAFF Staff NONE Short Staff of Charged Bolt 1 25 2 4 0 0 0 25 0 STAFF ChargedBolt false 470 + 0 Weapon Two-handed SHORT_STAFF Staff NONE Short Staff of Charged Bolt 1 25 2 4 0 0 0 25 0 STAFF ChargedBolt false 470 IDI_ARENAPOT 0 Misc Unequippable ARENA_POTION Misc NONE Arena Potion 7 0 0 0 0 0 0 0 0 ARENAPOT Null true 0 diff --git a/tools/extract_translation_data.py b/tools/extract_translation_data.py index 729095757..90629ac2d 100755 --- a/tools/extract_translation_data.py +++ b/tools/extract_translation_data.py @@ -4,68 +4,101 @@ import pathlib root = pathlib.Path(__file__).resolve().parent.parent translation_dummy_path = root.joinpath("Source/translation_dummy.cpp") -monstdat_path = root.joinpath("assets/txtdata/monsters/monstdat.tsv") -unique_monstdat_path = root.joinpath("assets/txtdata/monsters/unique_monstdat.tsv") -itemdat_path = root.joinpath("assets/txtdata/items/itemdat.tsv") -unique_itemdat_path = root.joinpath("assets/txtdata/items/unique_itemdat.tsv") -item_prefixes_path = root.joinpath("assets/txtdata/items/item_prefixes.tsv") -item_suffixes_path = root.joinpath("assets/txtdata/items/item_suffixes.tsv") -spelldat_path = root.joinpath("assets/txtdata/spells/spelldat.tsv") -with open(translation_dummy_path, 'w') as temp_source: - temp_source.write(f'/**\n') - temp_source.write(f' * @file translation_dummy.cpp\n') - temp_source.write(f' *\n') - temp_source.write(f' * Do not edit this file manually, it is automatically generated\n') - temp_source.write(f' * and updated by the extract_translation_data.py script.\n') - temp_source.write(f' */\n') - temp_source.write(f'#include "utils/language.h"\n') - temp_source.write(f'\n') - with open(monstdat_path, 'r') as tsv: +base_paths = { + "monstdat": root.joinpath("assets/txtdata/monsters/monstdat.tsv"), + "unique_monstdat": root.joinpath("assets/txtdata/monsters/unique_monstdat.tsv"), + "itemdat": root.joinpath("assets/txtdata/items/itemdat.tsv"), + "unique_itemdat": root.joinpath("assets/txtdata/items/unique_itemdat.tsv"), + "item_prefixes": root.joinpath("assets/txtdata/items/item_prefixes.tsv"), + "item_suffixes": root.joinpath("assets/txtdata/items/item_suffixes.tsv"), + "spelldat": root.joinpath("assets/txtdata/spells/spelldat.tsv"), +} + +hf_paths = { + "monstdat": root.joinpath("mods/Hellfire/txtdata/monsters/monstdat.tsv"), + "unique_itemdat": root.joinpath("mods/Hellfire/txtdata/items/unique_itemdat.tsv"), + "item_prefixes": root.joinpath("mods/Hellfire/txtdata/items/item_prefixes.tsv"), + "item_suffixes": root.joinpath("mods/Hellfire/txtdata/items/item_suffixes.tsv"), + "spelldat": root.joinpath("mods/Hellfire/txtdata/spells/spelldat.tsv"), +} + +seen_pairs = set() + +def write_entry(temp_source, var_name, context, string_value, use_p): + if not string_value: + return + key = (context, string_value) + if key in seen_pairs: + return + seen_pairs.add(key) + if use_p: + temp_source.write(f'const char *{var_name} = P_("{context}", "{string_value}");\n') + else: + temp_source.write(f'const char *{var_name} = N_("{string_value}");\n') + +def process_files(paths, temp_source): + # Monsters + with open(paths["monstdat"], 'r') as tsv: reader = csv.DictReader(tsv, delimiter='\t') for row in reader: - name = row['name'] var_name = row['_monster_id'] + "_NAME" - temp_source.write(f'const char *{var_name} = P_("monster", "{name}");\n') - with open(unique_monstdat_path, 'r') as tsv: - reader = csv.DictReader(tsv, delimiter='\t') - for row in reader: - name = row['name'] - var_name = name.upper().replace(' ', '_').replace('-', '_') + "_NAME" - temp_source.write(f'const char *{var_name} = P_("monster", "{name}");\n') - with open(itemdat_path, 'r') as tsv: - reader = csv.DictReader(tsv, delimiter='\t') - for i, row in enumerate(reader): - id = row['id'] - name = row['name'] - if name == 'Scroll of None' or name == 'Non Item' or name == 'Book of ': - continue - shortName = row['shortName'] - var_name = id if id else f'ITEM_{i}' - temp_source.write(f'const char *{var_name}_NAME = N_("{name}");\n') - if shortName: - temp_source.write(f'const char *{var_name}_SHORT_NAME = N_("{shortName}");\n') - with open(unique_itemdat_path, 'r') as tsv: + write_entry(temp_source, var_name, "monster", row['name'], True) + + if "unique_monstdat" in paths: + with open(paths["unique_monstdat"], 'r') as tsv: + reader = csv.DictReader(tsv, delimiter='\t') + for row in reader: + var_name = row['name'].upper().replace(' ', '_').replace('-', '_') + "_NAME" + write_entry(temp_source, var_name, "monster", row['name'], True) + + # Items + if "itemdat" in paths: + with open(paths["itemdat"], 'r') as tsv: + reader = csv.DictReader(tsv, delimiter='\t') + for i, row in enumerate(reader): + name = row['name'] + if name in ('Scroll of None', 'Non Item', 'Book of '): + continue + shortName = row['shortName'] + var_name = row['id'] if row['id'] else f'ITEM_{i}' + write_entry(temp_source, f'{var_name}_NAME', "default", name, False) + if shortName: + write_entry(temp_source, f'{var_name}_SHORT_NAME', "default", shortName, False) + + with open(paths["unique_itemdat"], 'r') as tsv: reader = csv.DictReader(tsv, delimiter='\t') for i, row in enumerate(reader): - name = row['name'] - var_name = f'UNIQUE_ITEM_{i}' - temp_source.write(f'const char *{var_name}_NAME = N_("{name}");\n') - with open(item_prefixes_path, 'r') as tsv: + write_entry(temp_source, f'UNIQUE_ITEM_{i}_NAME', "default", row['name'], False) + + with open(paths["item_prefixes"], 'r') as tsv: reader = csv.DictReader(tsv, delimiter='\t') for i, row in enumerate(reader): - name = row['name'] - var_name = f'ITEM_PREFIX_{i}' - temp_source.write(f'const char *{var_name}_NAME = N_("{name}");\n') - with open(item_suffixes_path, 'r') as tsv: + write_entry(temp_source, f'ITEM_PREFIX_{i}_NAME', "default", row['name'], False) + + with open(paths["item_suffixes"], 'r') as tsv: reader = csv.DictReader(tsv, delimiter='\t') for i, row in enumerate(reader): - name = row['name'] - var_name = f'ITEM_SUFFIX_{i}' - temp_source.write(f'const char *{var_name}_NAME = N_("{name}");\n') - with open(spelldat_path, 'r') as tsv: + write_entry(temp_source, f'ITEM_SUFFIX_{i}_NAME', "default", row['name'], False) + + # Spells + with open(paths["spelldat"], 'r') as tsv: reader = csv.DictReader(tsv, delimiter='\t') for i, row in enumerate(reader): - name = row['name'] - var_name = 'SPELL_' + name.upper().replace(' ', '_').replace('-', '_') - temp_source.write(f'const char *{var_name}_NAME = P_("spell", "{name}");\n') + var_name = 'SPELL_' + row['name'].upper().replace(' ', '_').replace('-', '_') + write_entry(temp_source, f'{var_name}_NAME', "spell", row['name'], True) + +with open(translation_dummy_path, 'w') as temp_source: + temp_source.write(f'/**\n') + temp_source.write(f' * @file translation_dummy.cpp\n') + temp_source.write(f' *\n') + temp_source.write(f' * Do not edit this file manually, it is automatically generated\n') + temp_source.write(f' * and updated by the extract_translation_data.py script.\n') + temp_source.write(f' */\n') + temp_source.write(f'#include "utils/language.h"\n\n') + temp_source.write(f'namespace {{\n\n') + + process_files(base_paths, temp_source) + process_files(hf_paths, temp_source) + + temp_source.write(f'\n}} // namespace\n')