首页 » Python » 自定义Dota2英雄名字来获得更好的小地图体验

自定义Dota2英雄名字来获得更好的小地图体验

原文 http://blog.csdn.net/zhchs2012/article/details/79248222

2018-02-04 02:00:35阅读(419)

写在前面

Dota2是笔者一直在玩的一款游戏,在小地图的选项中可以选择是剪头/圆圈表示敌我双方,也可以选择为英雄头像,我最喜欢的模式是直接显示英雄名字
简易图标模式:
自定义Dota2英雄名字来获得更好的小地图体验
英雄头像模式:
自定义Dota2英雄名字来获得更好的小地图体验
英雄名称模式:
自定义Dota2英雄名字来获得更好的小地图体验
然而,英雄名称模式有个问题。有些英雄的官方译名太长,如“殁境神蚀者”。此类过长的名字出现在小地图上很容易让人迷惑其准确的位置。

解决思路

官方译文的文件其实存放在本地。
其位置为:”X:/Steam/steamapps/common/dota 2 beta/game/dota/resource/dota_schinese.txt”
英雄名称的译文是以如图所示的方式存放的:
自定义Dota2英雄名字来获得更好的小地图体验
看到这里,其实方法就明晰了,我们手动修改双引号内中文的部分,改为你喜欢的任意名字即可。原则是尽量简短,WAR3上DoTA1的许许多多的简称就能发挥其用处了。

不完美的地方

经测试,手动修改此文本文件后,的确修改了游戏内英雄中文名称的称呼。然而DoTA2这个游戏的更新频率非常频繁,每次更新都会有一个本地文件的验证。验证后这个文本文件就会被服务器最新的版本所覆盖。所以我们总不能每次都手动修改吧,要麻烦死人的。
身为一名数据分析师,半个程序员自然要想办法将其自动化。所以接下来就是脚本自动化批量修改的最终方案。

最终方案

请上我们大名鼎鼎的Python,利用正则表达式匹配所有英雄的名字并替换这一行的文本为我们设定好的内容。请见代码:

import re
import shutil
import os
def make_bakup():
    bak_path = 'F:/游戏安装包/dota2_txtbak/'
    bak_name = 'dota_schinese.txt'
    shutil.copy(file_path,os.path.join(bak_path + bak_name))
def restore():
    bak_path = 'F:/游戏安装包/dota2_txtbak/'
    bak_name = 'dota_schinese.txt'
    shutil.copy(os.path.join(bak_path + bak_name),file_path)
def get_content():
    f = open(file_path,'r',encoding='utf-16')
    content = f.read()
    f.close()
    return content
def write_content(new_content):
    f = open(file_path, 'w', encoding='utf-16')
    f.write(new_content)
    f.close()
def per_sub(re_name,new_name,content):
    comp = re_name.split('\s')
    new_content = re.sub(re_name,'{} "{}"\n'.format(comp[0],new_name),content)
    return new_content
hero_list = [('"npc_dota_hero_queenofpain"\s*.+\n','女王'),('"npc_dota_hero_antimage"\s*.+\n','敌法'),('"npc_dota_hero_kunkka"\s*.+\n','船长'),('"npc_dota_hero_lina"\s*.+\n','火女'),
             ('"npc_dota_hero_mirana"\s*.+\n', '白虎'),('"npc_dota_hero_windrunner"\s*.+\n','风行'),('"npc_dota_hero_slardar"\s*.+\n','大鱼'),('"npc_dota_hero_phantom_assassin"\s*.+\n','幻刺'),
             ('"npc_dota_hero_tidehunter"\s*.+\n', '潮汐'),('"npc_dota_hero_vengefulspirit"\s*.+\n','VS'),('"npc_dota_hero_juggernaut"\s*.+\n','剑圣'),('"npc_dota_hero_earthshaker"\s*.+\n','小牛'),
             ('"npc_dota_hero_pudge"\s*.+\n', '屠夫'),('"npc_dota_hero_bane"\s*.+\n','祸乱'),('"npc_dota_hero_crystal_maiden"\s*.+\n','冰女'),('"npc_dota_hero_skeleton_king"\s*.+\n','骷髅王'),
             ('"npc_dota_hero_storm_spirit"\s*.+\n','蓝猫'),('"npc_dota_hero_drow_ranger"\s*.+\n','小黑'),('"npc_dota_hero_bloodseeker"\s*.+\n','血魔'),('"npc_dota_hero_phantom_lancer"\s*.+\n','猴子'),
             ('"npc_dota_hero_razor"\s*.+\n', '电棍'),('"npc_dota_hero_morphling"\s*.+\n', '水人'),('"npc_dota_hero_shadow_shaman"\s*.+\n', '小Y'),('"npc_dota_hero_riki"\s*.+\n', '隐刺'),
             ('"npc_dota_hero_tinker"\s*.+\n', 'TK'),('"npc_dota_hero_sniper"\s*.+\n', '火枪'),('"npc_dota_hero_necrolyte"\s*.+\n', 'NEC'),('"npc_dota_hero_venomancer"\s*.+\n', '剧毒'),
             ('"npc_dota_hero_faceless_void"\s*.+\n', '虚空'),('"npc_dota_hero_death_prophet"\s*.+\n', 'DP'),('"npc_dota_hero_pugna"\s*.+\n', '骨法'),('"npc_dota_hero_templar_assassin"\s*.+\n', '圣堂'),
             ('"npc_dota_hero_viper"\s*.+\n', '毒龙'),('"npc_dota_hero_luna"\s*.+\n', '月骑'),('"npc_dota_hero_dragon_knight"\s*.+\n', '龙骑'),('"npc_dota_hero_dazzle"\s*.+\n', '暗牧'),
             ('"npc_dota_hero_rattletrap"\s*.+\n', '发条'), ('"npc_dota_hero_leshrac"\s*.+\n', '老鹿'),('"npc_dota_hero_life_stealer"\s*.+\n', '小狗'),('"npc_dota_hero_dark_seer"\s*.+\n', '兔子'),
             ('"npc_dota_hero_clinkz"\s*.+\n', '骨弓'), ('"npc_dota_hero_omniknight"\s*.+\n', '全能'),('"npc_dota_hero_enchantress"\s*.+\n', '小鹿'),('"npc_dota_hero_huskar"\s*.+\n', '神灵'),
             ('"npc_dota_hero_night_stalker"\s*.+\n', '夜魔'), ('"npc_dota_hero_broodmother"\s*.+\n', '蜘蛛'),('"npc_dota_hero_bounty_hunter"\s*.+\n', '赏金'),('"npc_dota_hero_weaver"\s*.+\n', '蚂蚁'),
             ('"npc_dota_hero_jakiro"\s*.+\n', '双头龙'), ('"npc_dota_hero_batrider"\s*.+\n', '蝙蝠'),('"npc_dota_hero_doom_bringer"\s*.+\n', '末日'),('"npc_dota_hero_ancient_apparition"\s*.+\n', '冰魂'),
             ('"npc_dota_hero_ursa"\s*.+\n', '拍拍'), ('"npc_dota_hero_spirit_breaker"\s*.+\n', '白牛'),('"npc_dota_hero_gyrocopter"\s*.+\n', '飞机'),('"npc_dota_hero_alchemist"\s*.+\n', '炼金'),
             ('"npc_dota_hero_invoker"\s*.+\n', '卡尔'), ('"npc_dota_hero_silencer"\s*.+\n', '沉默'),('"npc_dota_hero_obsidian_destroyer"\s*.+\n', '黑鸟'),('"npc_dota_hero_brewmaster"\s*.+\n', '熊猫'),
             ('"npc_dota_hero_shadow_demon"\s*.+\n', '毒狗'), ('"npc_dota_hero_lone_druid"\s*.+\n', '熊德'),('"npc_dota_hero_chaos_knight"\s*.+\n', '混沌'),('"npc_dota_hero_treant"\s*.+\n', '大树'),
             ('"npc_dota_hero_meepo"\s*.+\n', '地卜'), ('"npc_dota_hero_ogre_magi"\s*.+\n', '蓝胖'),('"npc_dota_hero_undying"\s*.+\n', '尸王'),('"npc_dota_hero_disruptor"\s*.+\n', '萨尔'),
             ('"npc_dota_hero_nyx_assassin"\s*.+\n', '小强'), ('"npc_dota_hero_naga_siren"\s*.+\n', '小娜迦'),('"npc_dota_hero_keeper_of_the_light"\s*.+\n', '光法'),('"npc_dota_hero_visage"\s*.+\n', '死灵龙'),
             ('"npc_dota_hero_wisp"\s*.+\n', '小精灵'), ('"npc_dota_hero_slark"\s*.+\n', '小鱼'),('"npc_dota_hero_medusa"\s*.+\n', '大娜迦'),('"npc_dota_hero_troll_warlord"\s*.+\n', '巨魔'),
             ('"npc_dota_hero_centaur"\s*.+\n', '人马'), ('"npc_dota_hero_magnataur"\s*.+\n', '猛犸'),('"npc_dota_hero_bristleback"\s*.+\n', '刚背'), ('"npc_dota_hero_tusk"\s*.+\n', '海民'),
             ('"npc_dota_hero_skywrath_mage"\s*.+\n', '天怒'), ('"npc_dota_hero_elder_titan"\s*.+\n', '大牛'),('"npc_dota_hero_legion_commander"\s*.+\n', '军团'), ('"npc_dota_hero_ember_spirit"\s*.+\n', '火猫'),
             ('"npc_dota_hero_earth_spirit"\s*.+\n', '土猫'), ('"npc_dota_hero_abyssal_underlord"\s*.+\n', '大屁股'),('"npc_dota_hero_terrorblade"\s*.+\n', 'TB'), ('"npc_dota_hero_oracle"\s*.+\n', '神谕'),
             ('"npc_dota_hero_techies"\s*.+\n', '炸弹'), ('"npc_dota_hero_winter_wyvern"\s*.+\n', '冰龙'),('"npc_dota_hero_arc_warden"\s*.+\n', '电狗'), ('"npc_dota_hero_monkey_king"\s*.+\n', '大圣'),
             ('"npc_dota_hero_pangolier"\s*.+\n', '滚滚'), ('"npc_dota_hero_dark_willow"\s*.+\n', '花仙子')]
if __name__ == '__main__':
    #file_path = 'F:/游戏安装包/dota2_txtbak/dota_schinese_20170520.txt'   #拿备份文件做测试
    file_path = 'D:/Steam/steamapps/common/dota 2 beta/game/dota/resource/dota_schinese.txt'
    make_bakup()
    for hero in hero_list:
        if hero_list.index(hero) == 0:
            new_content = per_sub(*hero_list[0], get_content())
        else:
            new_content = per_sub(*hero,new_content)
    write_content(new_content)
    #restore()   恢复备份,前提是已经备份过

解析1:为了出错之后有挽回的余地,写了备份函数make_bakup()与恢复函数restore(),在修改英雄名字之前会先备份一份完整的文件到指定路径。如果修改出错或者不喜欢自己改的名字仍然想用官方译名可以恢复回来。
解析2:这个文件所用的字符编码集竟然不是最通用的”UTF-8”,这使得我折腾了好一会儿。多番查证和尝试后敲定使用”UTF-16”完美解决。我原谅V社应该是有别的什么考量。

结果验证

自定义Dota2英雄名字来获得更好的小地图体验
完美!!!
题外话:有人会说为什么手动修改后不直接锁死文件,不让V社在更新游戏的时候修正这个译文文本文件不就一次改动完美保留了么。
这个当然是可行的,但是会带来另外的毛病。如果官方增加了新的文本内容,恐怕会出现莫名其妙的BUG,所以还是建议在每次更新文件内容被官方修正后都运行下脚本,反正也不花多少时间对吧。

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹