古剑奇谭1.4.8修改方法

24 3 月, 2011

凌晨无聊买了古剑天墉旧事的DLC,老套路A掉每个怪打到BOSS,认真打了遍BOSS,没过。修改之。

古剑以前版本是有修改器的,但千年剑灵DLC那版及以后就没找到修改器了,只能自己来了。

改攻击力是最简单靠谱的方法了,千年剑灵那版我也是改的红玉的攻击力,天墉旧事就改百里屠苏的吧。

用WinHex打开存档文件,跳转到0xA882和0xA88A,这两处地址的连续4字节是百里屠苏的攻击力,改成一样的即可。

记录下,别下次又删了,找不到了,又得做重复工作。

Ansi2Unicode Unicode2Ansi

10 12 月, 2010

//
// Function:
//  将Ansi字符串转换为Unicode字符串
//
PCWSTR Ansi2Unicode(PCSTR pMultiByteStr)
{
 int nLenOfWideCharStr = MultiByteToWideChar(CP_ACP, 0, pMultiByteStr, -1, NULL, 0);
 PWSTR pWideCharStr = (PWSTR)malloc(nLenOfWideCharStr * sizeof(wchar_t));
 if(pWideCharStr)
 {
  MultiByteToWideChar(CP_ACP, 0, pMultiByteStr, -1, pWideCharStr, nLenOfWideCharStr);
 }
 return pWideCharStr;
}

// 调用方法
   const char *pMultiByteStr = “中文”;
   const wchar_t *pWideCharStr = Ansi2Unicode(pMultiByteStr);
   if(pWideCharStr)
   {
    MessageBox(hWnd, pWideCharStr, TEXT(“Ansi2Unicode”), MB_OK);
    free((void *)pWideCharStr);
    pWideCharStr = NULL;
   }

Read the rest of this entry »

GetMessageText

9 12 月, 2010

//
// Function:
//  根据dwMessageId从系统消息表中获取对应的消息文本保存在hlocal中
//
BOOL GetMessageText(HLOCAL& hlocal, DWORD dwMessageId)
{
 return FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER,// 标识组合位
  NULL,// 模块
  dwMessageId,// 消息码
  MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),// 语言标识
  (PTSTR)&hlocal,// 缓冲区
  0,// 字符数
  NULL);// 参数列表
}

// 调用方法
   HLOCAL hlocal = NULL;
   if(GetMessageText(hlocal, 2))
   {
    MessageBox(hWnd, (PCTSTR)LocalLock(hlocal), TEXT(“MessageText”), MB_OK);
    LocalFree(hlocal);
   }

C++ Primer Chapter14

16 11 月, 2010

1、重载操作符必须具有至少一个类类型或枚举类型的操作数。这条规则强制重载操作符不能重新定义用于内置类型对象的操作符的含义。

操作符的优先级、结合性或操作数数目不能改变。

除了函数调用操作符operater()之外,重载操作符时使用默认实参是非法的。

2、在&&和||的重载版本中,两个操作数都要进行求值,而且对操作数的求值顺序不做规定。因此,重载&&、||或逗号操作符不是一种好的做法。

3、作为类成员的重载函数,其形参看起来比操作数数目少1。作为成员函数的操作符有一个隐含的this形参,限定为第一个操作数。

一般将算术和关系操作符定义为非成员函数,而将赋值操作符定义为成员。

4、一般而言,输出操作符应输出对象的内容,进行最小限度的格式化,它们不应该输出换行符。

5、后缀式操作符函数接受一个额外的(即无用的)int型形参。

6、转换函数采用如下通用形式:operater type()

转换函数必须是成员函数,不能指定返回类型,并且形参表必须为空。

转换函数一般不应该改变被转换的对象。因此,转换操作符通常定义为const成员。

只能应用一个类类型转换。

const

17 9 月, 2010

int _tmain(int argc, _TCHAR* argv[])
{
 const int e = 3;
 int *w = (int *)&e;
 *w = 6; // 不会报错,但是e的值不会改变。
 e = 6; // 报错
 int a = e;
 printf(“%d,%d”, e, a);
 return 0;
}

分析:编译器对const的检查是对常量名进行的,因此可以通过 int *w = (int *)&e;*w=6;改变e的值。但是为什么 int a =  e;printf(“%d,%d”, e, a);e和a的值都是3呢?这是因为由于在编译时e的值已知,并且是const常量,所以生成的代码并不是引用e,而且直接引用了立即数3。通过printf(“%d-%d,%d-%d”, &e, e, w, *w);会发现&e和w(即地址值)是一样的,但是e和*w(即值)是不一样的。

参考资料:CONST

修改const值