关于修改浴火银河2全高清硬盘版

2023-11-20 19:30

本文主要是介绍关于修改浴火银河2全高清硬盘版,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我记得2013年的时候 写过一个修改欲火银河2HD的飞船数据的文章

飞船数据是ships.bin这几天心烦又偷偷玩了一下,又想改装备items.bin,然后时间少不想自己研究

于是看了下别人怎么改,确实有人改,但是写出来乱七八糟,也可能是自己的文档习惯不同吧

于是:


欲火银河2全高清硬盘版

Galaxy on Fire 2™ Full HD


不说那么多,二进制打开items.bin文件:

出于偷懒,我写了个程序查找0-1-2-3-...这样的偏移,以得到固定的存储空间,实际上不存在

稍微观察一下也不难发现,红色箭头所示,总是有0x00000000 0x00000000 0xXXXXXXXX 这样的三个DWORD

再看第一个红色箭头,值是0x1E000000,转换为x86字节序是0x0000001E,十进制的30,数一下选中部分的DWORD数量

正好也是30,再看绿色箭头不难看出,总是一个DWORD+一个DWORD这样一对一对的奸夫淫妇

而且,第一个DWORD为零时,第二个DWORD是0,1,2,3...这样递增的,像飞船的存储方式,可以认为是ID

那么暂定为非固定大小结构体:

typedef struct _tagValue{DWORD Flags;					// property flagsDWORD Value;					// property value
} VALUE, *PVALUE;typedef struct _tagEquipment{		// "items.bin"union {struct {DWORD Reserved1;		// 0x00000000DWORD Reserved2;		// 0x00000000DWORD NumOfDWORD;		// how many dwords followedVALUE Values[1];};DWORD Dummy[1];};
} EQUIP, *PEQUIP;

说到这里应该可以自己写程序编辑这些bin了吧

算了,贴上DLL部分的代码,也好做备份,有空的时候传到资源,大家有需要的就狠狠的下吧

(目前仅限修改飞船和物品)

1.gof2.h

// ****************************************************************************************************
// 文件: GOF2\\gof2.h
// 作者: 虎胆游侠(blog.csdn.net/prsniper; cto@renshenguo.com)
// 时间: 2015-11-13 05:45:21
// 注释:
// 这只是一个.h文件, 用力包含吧
// ****************************************************************************************************
#ifndef __GOF2HD_H_
#define __GOF2HD_H_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000#ifdef __GOF2HD_DLL_INC_
#define __V32_DLL_API_		// 内部编译标识
#endif#include "v32_prefix.h"		// 预编译宏, 切换内外部编译// auto include
#include "v32_api.h"#include "types.h"// exports
V32API int __stdcall CacheOpen(const char *szFileName);
V32API int __stdcall CacheSave(const char *szFileName, int bRelease);
V32API int __stdcall GetSpace(DWORD dwSpaceId, PSHIPS *ppShips);
V32API int __stdcall GetShipValue(PSHIPS pShips, int dwIndex, DWORD *pdwValue);
V32API int __stdcall SetShipValue(PSHIPS pShips, int dwIndex, DWORD dwValue);
V32API int __stdcall GetItem(DWORD dwIndex, PEQUIP *ppItem);
V32API int __stdcall GetItemValue(PEQUIP pItem, int dwIndex, DWORD *pdwValue);
V32API int __stdcall SetItemValue(PEQUIP pItem, int dwIndex, DWORD dwValue);#include "v32_subfix.h"		// 预编译宏, 切换内外部编译#endif

2.types.h

// ****************************************************************************************************
// 文件: GOF2\\types.h
// 作者: 虎胆游侠(blog.csdn.net/prsniper; cto@renshenguo.com)
// 时间: 2015-11-13 05:35:15
// 注释:
// 类型定义
// ****************************************************************************************************
#ifndef __GOF2HD_TYPE_H_
#define __GOF2HD_TYPE_H_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000//typedef unsigned long		ThisIsAFuckingType;
//typedef unsigned long		FuckYouAndYourMotherFatherSisterYourSonAndYourDaughter;
//typedef unsigned long		DWORD;
//typedef unsigned long		DOUBLEWORD;
//typedef unsigned long		DWORD;
//typedef unsigned long		DWORD;
//typedef unsigned long		DWORD;
//typedef unsigned long		DWORD;
//typedef unsigned int		DWORD;	// Multiple typedef alias type is legal, but this one
typedef unsigned long		DWORD;
typedef unsigned char		BYTE;// Begin type definitions
#pragma pack(1)
typedef struct _tagUnits{union {struct {BYTE Byte1;BYTE Byte2;BYTE Byte3;BYTE Byte4;};DWORD Value;};
} UNITS, *PUNITS;
#pragma pack()typedef struct _tagValue{DWORD Flags;					// property flagsDWORD Value;					// property value
} VALUE, *PVALUE;typedef struct _tagEquipment{		// "items.bin"union {struct {DWORD Reserved1;		// 0x00000000DWORD Reserved2;		// 0x00000000DWORD NumOfDWORD;		// how many dwords followedVALUE Values[1];};DWORD Dummy[1];};
} EQUIP, *PEQUIP;typedef struct _tagShips{			// "ships.bin"union {struct {DWORD Identifier;		// spaceship idDWORD Capacity;			// HPDWORD Volume;			// cargo hold spaceDWORD Price;			// standard priceDWORD Primary;			// max 1st weapon countDWORD Secondary;		// max 2nd weapon countDWORD Turret;			// max turret countDWORD Equipment;		// equipment capacityDWORD Operation;		// operability};DWORD Dummy[1];};
} SHIPS, *PSHIPS;
// End type definitions#include "v32_subfix.h"		// 预编译宏, 切换内外部编译#endif

3.gof2.cpp

// ****************************************************************************************************
// 文件: GOF2\\gof2.cpp
// 作者: 虎胆游侠(blog.csdn.net/prsniper; cto@renshenguo.com)
// 时间: 2015-11-13 05:50:05
// 注释:
// 操作函数
// ****************************************************************************************************
#include <stdio.h>
#include <malloc.h>
#include "v32_api.h"//using namespace Valiant;#define __GOF2HD_DLL_INC_
#include "gof2.h"void *g_pBuffer = NULL;		// global data
int g_dwCount = 0;			// byte size// 转换字节序
DWORD fnTurnBytes(DWORD dwNumber)
{UNITS u1, u;u1.Value = dwNumber;u.Byte1 = u1.Byte4;		// dwNumber << 24;	// 低位补零u.Byte2 = u1.Byte3;		// (dwNumber << 8) & 0xFF0000;u.Byte3 = u1.Byte2;		// (dwNumber >> 8) & 0xFF00;u.Byte4 = u1.Byte1;		// (dwNumber >> 24) & 0xFF;return u.Value;
}V32API int __stdcall CacheOpen(const char *szFileName)
{FILE *pf;long dwSize;void *p;pf = fopen(szFileName, "rb");if(pf == NULL){return 0;}fseek(pf, 0, SEEK_END);dwSize = ftell(pf);if(dwSize <= 0){fclose(pf);return -1;}p = malloc(dwSize);if(p == NULL){fclose(pf);return -2;}fseek(pf, 0, SEEK_SET);fread(p, sizeof(char), dwSize, pf);fclose(pf);if(g_pBuffer){free(g_pBuffer);g_pBuffer = p;g_dwCount = (int)dwSize;}return 1;
}V32API int __stdcall CacheSave(const char *szFileName, int bRelease)
{FILE *pf;int dwRet;if(szFileName != NULL){if(g_pBuffer == NULL){return 0;}pf = fopen(szFileName, "wb");dwRet = fwrite(g_pBuffer, sizeof(char), g_dwCount, pf);fclose(pf);if(dwRet != g_dwCount){return -1;}}if(bRelease){//Valiant::SafeFree(g_pBuffer);SafeFree(g_pBuffer);	// using namespace Valiant;g_dwCount = 0;return 2;}return 1;
}V32API int __stdcall GetSpace(DWORD dwSpaceId, PSHIPS *ppShips)
{union {PSHIPS pShips;void *p;};int dwCount;if(ppShips == NULL){return 0;}p = g_pBuffer;if(pShips == NULL){return -1;}dwSpaceId = fnTurnBytes(dwSpaceId);dwCount = 0;while(dwCount < g_dwCount){if(pShips->Identifier == dwSpaceId){*ppShips = pShips;return 1;}dwCount += sizeof(SHIPS);pShips++;}//if(dwCount >= g_dwCount)return -2;	// not found
}V32API int __stdcall GetShipValue(PSHIPS pShips, int dwIndex, DWORD *pdwValue)
{if(pShips == NULL || pdwValue == NULL){return 0;}if(dwIndex >= (sizeof(SHIPS) / sizeof(DWORD)) || dwIndex < 0){return -1;}*pdwValue = fnTurnBytes(pShips->Dummy[dwIndex]);return 1;
}V32API int __stdcall SetShipValue(PSHIPS pShips, int dwIndex, DWORD dwValue)
{if(pShips == NULL){return 0;}if(dwIndex >= (sizeof(SHIPS) / sizeof(DWORD)) || dwIndex < 0){return -1;}pShips->Dummy[dwIndex] = fnTurnBytes(dwValue);return 1;
}V32API int __stdcall GetItem(DWORD dwIndex, PEQUIP *ppItem)
{union {PEQUIP pItem;int dwNum;char *p1;void *p;};union {int dwCount;void *pDummy;};if(ppItem = NULL){return 0;}p = g_pBuffer;if(pItem == NULL){return -1;}pDummy = g_pBuffer;while(dwIndex){p1 += (pItem->NumOfDWORD + 3) * sizeof(DWORD);if((dwNum - dwCount) >= g_dwCount){return -2;	// not found}dwIndex--;}*ppItem = pItem;return 1;
}V32API int __stdcall GetItemValue(PEQUIP pItem, int dwIndex, DWORD *pdwValue)
{int dwRet;if(pItem == NULL){return 0;}dwRet = (int)fnTurnBytes(pItem->NumOfDWORD) + 3;if(pdwValue == NULL){return dwRet;}if(dwIndex >= dwRet || dwIndex < 0){return -1;}*pdwValue = fnTurnBytes(pItem->Dummy[dwIndex]);return 1;
}V32API int __stdcall SetItemValue(PEQUIP pItem, int dwIndex, DWORD dwValue)
{int dwRet;if(pItem == NULL){return 0;}dwRet = (int)fnTurnBytes(pItem->NumOfDWORD) + 3;if(dwIndex >= dwRet || dwIndex < 0){return -1;}pItem->Dummy[dwIndex] = fnTurnBytes(dwValue);return 1;
}

4.api.cpp

// ****************************************************************************************************
// 文件: GOF2\\api.cpp
// 作者: 虎胆游侠(blog.csdn.net/prsniper; cto@renshenguo.com)
// 时间: 2015-11-13 06:42:13
// 注释:
// 入口模块
// ****************************************************************************************************
//#include <windows.h>
#include "v32_api.h"#define __GOF2HD_DLL_INC_
#include "gof2.h"using namespace Valiant;#ifdef _DEBUG
#pragma comment(lib, "Debug\\V32.lib")
#else
#pragma comment(lib, "Release\\V32.lib")
#endif// *** DLL入口函数 ***
//BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
int __stdcall DllMain(VT32 hModule, VT32 ul_reason_for_call, VT32 lpReserved)
{//printf("DllMain(%p, %d, %p);\r\n", hModule, ul_reason_for_call, lpReserved);switch(ul_reason_for_call.Value32){case V32_PROCESS_ATTACH:case V32_PROCESS_DETACH:case V32_THREAD_ATTACH:		// 线程创建并调用case V32_THREAD_DETACH:		// 线程结束并解除break;default:return 0;	// FALSE}return 1;	// TRUE
}

这里用到了V32.dll基础类库,不过都是memcpy啊之类的自己用汇编写裸函数,同时封装为C++基类,还有一些SafeFree之类的宏定义和类型声明

就这样吧

这篇关于关于修改浴火银河2全高清硬盘版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/396925

相关文章

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

Linux修改pip临时目录方法的详解

《Linux修改pip临时目录方法的详解》在Linux系统中,pip在安装Python包时会使用临时目录(TMPDIR),但默认的临时目录可能会受到存储空间不足或权限问题的影响,所以本文将详细介绍如何... 目录引言一、为什么要修改 pip 的临时目录?1. 解决存储空间不足的问题2. 解决权限问题3. 提

Linux文件名修改方法大全

《Linux文件名修改方法大全》在Linux系统中,文件名修改是一个常见且重要的操作,文件名修改可以更好地管理文件和文件夹,使其更具可读性和有序性,本文将介绍三种在Linux系统下常用的文件名修改方法... 目录一、引言二、使用mv命令修改文件名三、使用rename命令修改文件名四、mv命令和rename命

mybatis-plus 实现查询表名动态修改的示例代码

《mybatis-plus实现查询表名动态修改的示例代码》通过MyBatis-Plus实现表名的动态替换,根据配置或入参选择不同的表,本文主要介绍了mybatis-plus实现查询表名动态修改的示... 目录实现数据库初始化依赖包配置读取类设置 myBATis-plus 插件测试通过 mybatis-plu

Linux下修改hostname的三种实现方式

《Linux下修改hostname的三种实现方式》:本文主要介绍Linux下修改hostname的三种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下修改ho编程stname三种方式方法1:修改配置文件方法2:hFvEWEostnamectl命

Git如何修改已提交人的用户名和邮箱

《Git如何修改已提交人的用户名和邮箱》文章介绍了如何修改Git已提交人的用户名和邮箱,包括注意事项和具体步骤,确保操作正确无误... 目录git修改已提交人的用户名和邮箱前言第一步第二步总结git修改已提交人的用户名和邮箱前言需注意以下两点内容:需要在顶层目录下(php就是 .git 文件夹所在的目

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

MySQL修改密码的四种实现方式

《MySQL修改密码的四种实现方式》文章主要介绍了如何使用命令行工具修改MySQL密码,包括使用`setpassword`命令和`mysqladmin`命令,此外,还详细描述了忘记密码时的处理方法,包... 目录mysql修改密码四种方式一、set password命令二、使用mysqladmin三、修改u

使用Python在Excel中插入、修改、提取和删除超链接

《使用Python在Excel中插入、修改、提取和删除超链接》超链接是Excel中的常用功能,通过点击超链接可以快速跳转到外部网站、本地文件或工作表中的特定单元格,有效提升数据访问的效率和用户体验,这... 目录引言使用工具python在Excel中插入超链接Python修改Excel中的超链接Python