追逐自己的梦想----------辅助制作第二十六课:存仓库call实现

本次我们对存放仓库进行c++代码的实现,我们将这几个函数都封装在宝宝列表结构体中,具体代码如下:

#define nSizePackBack 36
typedef struct TBACKPACK_LIST
{
	TBACK_PACK_OBJ mtGoodList[nSizePackBack];
	TBACKPACK_LIST* GetData();  
	int UseGoodsForIndex(DWORD Index);
	int GetGoodsIndexForName(char* szpGoodsName);
	BOOL UseGoodsForName(char* szpGoodsName);
	void DbgPrint();
	DWORD SelGoods(DWORD ndIndex); //选中背包中的某一格中的物品
	BOOL MoveGoodsToDepot(DWORD ndIndex = 1);//移动选中物品到仓库中的某一格
	BOOL MoveGoodsToDepot(char* szpName);//移动选中物品到仓库中的某一格


}_TBACKPACK_LIST;


BOOL TBACKPACK_LIST::MoveGoodsToDepot(DWORD ndIndex)//移动选中物品到仓库中的某一格
{
	DWORD ndObj = NULL;
	__try{
		ndObj =  SelGoods(ndIndex); 
		if (ndObj != NULL){
			__asm{

				mov edi, Base_DepotList
				mov edi, [edi]
				MOV ECX, DWORD PTR DS : [EDI + 0x1608]
				MOV EDX, DWORD PTR DS : [EDI + 0x1BD0]
				mov eax , ndIndex
				push eax
				push ecx
				push edx
				mov ecx, edi
				mov eax, Base_MoveGoodsToDepotsCall
				CALL eax  
			}
		}

	}
	__except (1){
		DbgPrintf_Mine("BOOL TBACKPACK_LIST::MoveGoodsToDepot(DWORD ndIndex)出现异常");
		return FALSE;

	}


	return TRUE;
}


BOOL TBACKPACK_LIST::MoveGoodsToDepot(char* szpName)//移动选中物品到仓库中的某一格
{
	GetData();
	DWORD ndNum = NULL;
	for (int i = 0; i < nSizePackBack; i++){
		if (mtGoodList[i].ndGoodNum == 0){
			continue;
		}
		if (strcmp(szpName, mtGoodList[i].szpGoodName) == 0){
			
			MoveGoodsToDepot(i);
		}
	}


	return TRUE;

}


DWORD TBACKPACK_LIST::SelGoods(DWORD ndIndex) //选中背包中的某一格中的物品
{
	DWORD ndObj = NULL;

	__try{
		__asm{
			mov ebx, ndIndex
			mov edi, Base_BackPacketList  
			mov edi, [edi]
			MOV EAX, DWORD PTR DS : [EDI + 0x410 + ebx * 4]
			mov ebx, Base_SelGoodSkill
			MOV ECX, DWORD PTR DS : [ebx]   //存仓库用到的ecx
			MOV DWORD PTR DS : [ECX + 0x228], EAX
			MOV EDX, DWORD PTR DS : [ebx]
			MOV BYTE PTR DS : [EDX + 0x230], 1
			MOV EAX, DWORD PTR DS : [ebx]
			MOV ECX, DWORD PTR DS : [EAX + 0x228]
			MOV DX, WORD PTR DS : [EDI + 0x1608]
			MOV WORD PTR DS : [ECX + 0x1F2], DX
			MOV ESI, DWORD PTR DS : [ebx]
			MOV ECX, DWORD PTR DS : [ESI + 0x228]
			MOV EAX, DWORD PTR DS : [ECX + 0x50]
			MOV EDX, DWORD PTR DS : [ECX + 0x4C]

		}
	}
	__except (1){
		DbgPrintf_Mine("BOOL TBACKPACK_LIST::SelGoods(DWORD ndIndex) 出现异常");
		return FALSE;
	}


	return TRUE;
}



其中有一些需要注意的地方:

1.

			mov edi, Base_BackPacketList  
			mov edi, [edi]
</pre><pre name="code" class="cpp">这样的地址  需要分成2步来传,如果一次来传,其中的基址无法解析
</pre><pre name="code" class="cpp">2.
就是需要判断背包中物品是否存在,必须那个地方不存在物品,而进行strcmp比较也会出现异常
</pre><pre name="code" class="cpp">只要注意到这些地方,就可以消去部分bug了,具体还是需要自己在实际代码中测试才能解决具体的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值