写在前面

DoTA2是笔者一直在玩的一款游戏,在小地图的选项中可以选择是剪头/圆圈表示敌我双方,也可以选择为英雄头像,我最喜欢的模式是直接显示英雄名字。
简易图标模式:

英雄头像模式:

英雄名称模式:

然而,英雄名称模式有个问题。有些英雄的官方译名太长,如“殁境神蚀者”。此类过长的名字出现在小地图上很容易让人迷惑其准确的位置。

解决思路

官方译文的文件其实存放在本地。
其位置为:”X:/Steam/steamapps/common/dota 2 beta/game/dota/resource/dota_schinese.txt”
英雄名称的译文是以如图所示的方式存放的:

看到这里,其实方法就明晰了,我们手动修改双引号内中文的部分,改为你喜欢的任意名字即可。原则是尽量简短,WAR3上DoTA1的许许多多的简称就能发挥其用处了。

不完美的地方

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

最终方案

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

import re
import shutil
import osdef 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 contentdef 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_contenthero_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社应该是有别的什么考量。

结果验证


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

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

  1. 自定义View(英雄联盟七星图)

    自定义View英雄联盟七星图 一.观察及拆分UI图(假设是你们的UI设计师给你们的设计图?) 二.定义颜色和相关Power的字符串资源: 三.编写代码 前两篇做了一下准备工作,现在开始正式进入我们的自 ...

  2. 自定义linux命令工具栏,如何自定义Mac终端并使其更有用!

    原标题:如何自定义Mac终端并使其更有用! 终端应用程序是您在macOS中访问命令行的网关.它提供了带有外壳程序或命令解释器的接口,该接口可接收您的命令并调用其他命令来执行例行任务和复杂任务.如果您只 ...

  3. python告诉你ti8 dota2英雄bp

    文章链接:https://mp.weixin.qq.com/s/phJzZEQojndY-iNe77RF_w 恭喜OG成为ti8冠军,很可惜这次偶数年ti8中国队LGD与冠军失之交臂. 上学那会儿还是 ...

  4. 【C#】WinForm 之 DOTA2英雄搭配助手(网页抓取+在线绿色版+源码开放)

    睡不着,无聊......再整理点好玩的出来.先上图 效果 碎碎念 自从13级后打出DOTA2的天梯积分以来简直是逆水行舟不进则退啊,室友已经高呼着被游戏玩了!!结果怒删游戏 其实我也发现这游戏不合适我 ...

  5. 计算Dota2英雄属性的组合个数

    Dota2英雄属性组合计算问题 写在前面 问题描述 解决思路 C代码 说在最后 写在前面 这个题目是我在做公司招聘笔试题遇到的,当时想用排列组合的方法和公式来做,然而根本没有思路,最后也没有做出来.白 ...

  6. python告诉你ti8 dota2英雄bp 1

    文章链接: https://mp.weixin.qq.com/s/phJzZEQojndY-iNe77RF_w 恭喜OG成为ti8冠军,很可惜这次偶数年ti8中国队LGD与冠军失之交臂. 上学那会儿还 ...

  7. 实现线程哪种方法更好_实施数据以实现更好的用户体验设计的4种方法

    实现线程哪种方法更好 Gone are the days when design used to rely mainly on the color palettes and the creativit ...

  8. 阿里云 ESS 弹性伸缩服务新功能来袭,更全面、更自动化的使用体验

    摘要: 2017年9月阿里云弹性伸缩服务伸缩配置新增了实例自定义数据.秘钥对.实例RAM角色.标签新特性:近日,阿里云又发布了VSWitchIds.N多可用区新特性. 点此查看原文:http://cl ...

  9. 十款浏览器插件,让你拥有更好的浏览器体验

    十款浏览器插件,让你拥有更好的浏览器体验 作为浏览器的必备神器,其中最为出名的就是谷歌浏览器插件,浏览器插件可以在我们日常使用浏览器的过程中给予我们很大的便利.今天我就为大家介绍十款谷歌浏览器插件. ...

  10. 即构SDK5月迭代:新增声道选择、网络探测、智能消噪等功能,打造更优的视听体验

    即构SDK5月份的迭代更新如期而至,本月互动视频(LiveRoom).实时语音(AudioRoom)两大SDK以及录制插件(PlayRecord)均有新功能上线.新增的声道选择.变调控制.智能消噪.枚 ...

最新文章

  1. 谷歌、OpenAI 做了一个“魔性AI显微镜”,打算撬开人工智能黑箱
  2. 一起来开发Android的天气软件(三)——使用Volley实现网络通信
  3. Java Web之SpringMVC 进行数据回显
  4. P3 Simulink仿真-《Matlab/Simulink与控制系统仿真》程序指令总结
  5. virtualbox硬件加速_VirtualBox 安装Ubuntu虚拟机卡顿 加速方法以及出现的问题
  6. android学习笔记53——自动朗读TTS
  7. 书籍推荐-记这几年看的书
  8. 认识计算机硬件实验项目,实验1 认识计算机的硬件与硬件组装
  9. 基于Django实现RBAC权限管理
  10. 安装flash-----纠结
  11. 5 simple types and 6 false values in JavaScript
  12. ifen.os x pe.dmg天翼云_3.3K屏显纵览天下 11代酷睿横行职场 华硕灵耀X纵横值得选择...
  13. 微软lync 持续服务器,Lync Server 2013 Front-End服务器服务不会启动很长时间
  14. MarkdownPad2
  15. 如何安装仿宋GB2312字体
  16. mysql 钩子_SetWindowsHookEx原理(如何使用钩子,使用钩子hook其他进程的函数)
  17. 在r中弄方差分析表_R语言 | 方差分析(上)
  18. 默纳克电路图 莫纳克MCTC-MCB-C2图纸变频器pdf格式
  19. Python加密与解密
  20. 表征学习 Representation Learning(特征学习、表示学习)是什么?

热门文章

  1. python append 字典_Python3中使用append添加字典元素出现问题
  2. 网页打开慢/正在解析主机-解决
  3. 做个合格的吃货~利用Python爬取美食网站3032个菜谱并分析
  4. nginx日志磁盘空间使用率100%
  5. 树莓派的img文件怎样在vmware虚拟机里面打开
  6. pwnable.tw-2018-starbound_writeup
  7. html5清新文艺,30句清新文艺范的句子
  8. ERDAS遥感影像处理-专题图制作
  9. Java程序实现繁体字转换简体字
  10. java 生成数字_Java随机生成数字的方法