diff --git a/README.md b/README.md index f847e4a..582451f 100644 --- a/README.md +++ b/README.md @@ -20,61 +20,61 @@ mm6chupchangekey.exe 文件路径及名称 功能1 按键1 功能2 按键2 ... 其中,功能可以是以下之一(以下括号中是注释,请不要在命令行中输入括号和其中的内容): -* alwaysrun(是否总是奔跑) -* fliponexit(离开房屋时是否转身) -* forward(前进) -* back(后退) -* "turn left"(左转) -* "turn right"(右转) -* yell(呐喊) -* jump(跳跃) -* "toggle turnbase"(切换回合制/即时制) -* inspect(调查前方事物) -* "skip character"(切换到下一个队员) -* "cast quick spell"(施展备用魔法) -* attack(使用武器攻击) -* "fly up"(向上飞) -* "fly down"(向下飞) -* land(降落) +* `alwaysrun`(是否总是奔跑) +* `fliponexit`(离开房屋时是否转身) +* `forward`(前进) +* `back`(后退) +* `"turn left"`(左转) +* `"turn right"`(右转) +* `yell`(呐喊) +* `jump`(跳跃) +* `"toggle turnbase"`(切换回合制/即时制) +* `inspect`(调查前方事物) +* `"skip character"`(切换到下一个队员) +* `"cast quick spell"`(施展备用魔法) +* `attack`(使用武器攻击) +* `"fly up"`(向上飞) +* `"fly down"`(向下飞) +* `land`(降落) (本工具暂无法改变仰视俯视平视、打开任务地图摘要休息魔法书等的键位) -对于alwaysrun和fliponexit,“按键”可以是1或0(即是或否);对于其他,按键可以是以下之一: - -* backspace -* enter -* space -* "page up" -* "page down" -* end -* home -* left -* up -* right -* down -* insert -* delete -* 0 至 9 -* a 至 z -* = -* , -* - -* . -* / -* ` -* \ -* ' +对于`alwaysrun`和`fliponexit`,“按键”可以是`1`或`0`(即是或否);对于其他,按键可以是以下之一: + +* `backspace` +* `enter` +* `space` +* `"page up"` +* `"page down"` +* `end` +* `home` +* `left` +* `up` +* `right` +* `down` +* `insert` +* `delete` +* `0` 至 `9` +* `a` 至 `z` +* `=` +* `,` +* `-` +* `.` +* `/` +* `` ` `` +* `\` +* `'` 也可以使用(但不建议使用): -* f1 至 f12 -* tab -* shift -* ctrl -* alt -* capslock +* `f1` 至 `f12` +* `tab` +* `shift` +* `ctrl` +* `alt` +* `capslock` -不区分大小写;有空格的请用英文双引号("")包裹起来 +不区分大小写;有空格的请用英文双引号(`""`)包裹起来 ## 范例 @@ -88,14 +88,14 @@ mm6chupchangekey.exe "mm6.exe" alwaysrun 1 fliponexit 0 forward w back s "turn l * 总是奔跑:是(1) * 离开房屋时转身:否(0) -* 前进、后退、左转、右转:WSAD -* 武器攻击:E -* (打开魔法书:C) -* 施展备用魔法:CTRL+C或ALT+C -* 向上飞:F -* 向下飞:G -* 降落:V -(一个特殊的键位是:施展备用魔法的C键和打开魔法书冲突,所以打开魔法书还是C键,施展备用魔法变为CTRL+C或ALT+C) +* 前进、后退、左转、右转:WSAD +* 武器攻击:E +* (打开魔法书:C) +* 施展备用魔法:CTRL+CALT+C +* 向上飞:F +* 向下飞:G +* 降落:V +(一个特殊的键位是:施展备用魔法的C键和打开魔法书冲突,所以打开魔法书还是C键,施展备用魔法变为CTRL+CALT+C) 您也可以双击执行changekey.bat文件,它可以还原为中文完美升级版默认键位(总是奔跑,离开房屋时不转身,其他键位和原版一致) @@ -103,30 +103,30 @@ mm6chupchangekey.exe "mm6.exe" alwaysrun 1 fliponexit 0 forward w back s "turn l ## 附:魔法门6原版键位表 -* ↑↓←→:前进、后退、左转、右转 -* Shift + ↑↓:跑步移动 -* Ctrl + ←→:侧移 -* Page Down:仰视 -* End:平视 -* Delete:俯视 -* Page Up:向上飞(当施展了空气魔法中的飞行奇术后) -* Home:降落(着陆) -* Insert:向下飞 -* Enter:切换回合制/即时制 -* 空格:调查前方事物(拾起地上的物品、打开箱子等) -* A:使用武器攻击(如敌人距离远,则使用弓箭) -* S:施展备用魔法(如无,则使用使用武器攻击) -* X:跳跃 -* R:休息 -* Z:打开队伍属性 -* C:打开魔法书 -* B:切换到下一个队员(跳过当前队员) -* 1、2、3、4:选中某队员(第二次按打开该队员的属性栏) -* 5、6:与雇佣的NPC谈话 -* M:打开地图 -* Q:打开当前任务 -* N:打开自动摘要 -* T:打开日历 -* Y:呐喊(驱赶挡路的NPC) - -(原版不按Shift为行走状态,较慢,离开房屋时会转身。中文完美升级版开启了总是奔跑,离开房屋时不会转身,没有更改其他键位) +* :前进、后退、左转、右转 +* Shift + ↑↓:跑步移动 +* Ctrl + ←→:侧移 +* Page Down:仰视 +* End:平视 +* Delete:俯视 +* Page Up:向上飞(当施展了空气魔法中的飞行奇术后) +* Home:降落(着陆) +* Insert:向下飞 +* Enter:切换回合制/即时制 +* 空格:调查前方事物(拾起地上的物品、打开箱子等) +* A:使用武器攻击(如敌人距离远,则使用弓箭) +* S:施展备用魔法(如无,则使用使用武器攻击) +* X:跳跃 +* R:休息 +* Z:打开队伍属性 +* C:打开魔法书 +* B:切换到下一个队员(跳过当前队员) +* 1、2、3、4:选中某队员(第二次按打开该队员的属性栏) +* 5、6:与雇佣的NPC谈话 +* M:打开地图 +* Q:打开当前任务 +* N:打开自动摘要 +* T:打开日历 +* Y:呐喊(驱赶挡路的NPC) + +(原版不按Shift为行走状态,较慢,离开房屋时会转身。中文完美升级版开启了总是奔跑,离开房屋时不会转身,没有更改其他键位) diff --git a/mm6chupchangekey/Source.cpp b/mm6chupchangekey/Source.cpp index b83e8d0..6912141 100644 --- a/mm6chupchangekey/Source.cpp +++ b/mm6chupchangekey/Source.cpp @@ -1,11 +1,11 @@ -#include -#include +//#include +//#include +#include #include -//#include #include -#include +//#include +//#include //#include -#include typedef std::string string; @@ -266,13 +266,31 @@ void wrongArgumentsAlert(void) { printf("Wrong arguments.\nUsage: mm6chupchangekey.exe file function1 key1 function2 key2 ..."); } -bool copyFile(const char *SRC, const char* DEST) { - std::ifstream src(SRC, std::ios::binary); - std::ofstream dest(DEST, std::ios::binary); - dest << src.rdbuf(); - return src && dest; +//bool copyFile(const char *SRC, const char* DEST) { +// std::ifstream src(SRC, std::ios::binary); +// std::ofstream dest(DEST, std::ios::binary); +// dest << src.rdbuf(); +// return src && dest; +//} + +wchar_t* s2ws(const string& s) { + int len; + int slength = (int)s.length() + 1; + len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); + wchar_t* buf = new wchar_t[len]; + MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len); + return buf; +} + +string GetExePath() { + char buffer[MAX_PATH]; + GetModuleFileNameA(NULL, buffer, MAX_PATH); + string f = string(buffer); + return f.substr(0, f.find_last_of("\\/")); } + + int main(int argc, char * argv[]) { if (argc >= 3) { @@ -280,13 +298,11 @@ int main(int argc, char * argv[]) { int i; string arg, content; - char backupExt[8] = ".backup"; - char * backupPath; - backupPath = (char *)malloc(strlen(argv[1]) + strlen(backupExt) + 1); - backupPath[0] = '\0'; - strcat(backupPath, argv[1]); - strcat(backupPath, backupExt); - copyFile(argv[1], backupPath); + string backupSuffix = ".backup"; + string backupPath = argv[1] + backupSuffix; + + string p = GetExePath(); + CopyFile(s2ws(p + '\\' + argv[1]), s2ws(p + '\\' + backupPath), 0); FILE * f; f = fopen(argv[1], "r+b"); diff --git a/mm6chupchangekey/mm6chupchangekey.vcxproj b/mm6chupchangekey/mm6chupchangekey.vcxproj index bcda95a..79f9252 100644 --- a/mm6chupchangekey/mm6chupchangekey.vcxproj +++ b/mm6chupchangekey/mm6chupchangekey.vcxproj @@ -23,6 +23,7 @@ v4.5.2 ManagedCProj mm6chupchangekey + 8.1 @@ -35,8 +36,8 @@ Application false - v140 - true + v140_xp + false Unicode @@ -49,8 +50,8 @@ Application false - v140 - true + v140_xp + false Unicode @@ -107,18 +108,26 @@ Level3 WIN32;NDEBUG;%(PreprocessorDefinitions) + /SUBSYSTEM:CONSOLE,"5.01" %(AdditionalOptions) + MultiThreaded + Console + 5.01 Level3 NDEBUG;%(PreprocessorDefinitions) + /SUBSYSTEM:CONSOLE,"5.01" %(AdditionalOptions) + MultiThreaded + Console + 5.01