参考代码:
--突破瓶颈,让暗器升级
local bDarkLevelup = DarkLevelUp(sceneId, selfId);
if (bDarkLevelup == 1) then
x000034_ShowNotice(sceneId, selfId, targetId, "#{FBSJ_081209_18}");
--突破成功,记录统计日志
local guid = LuaFnObjId2Guid(sceneId, selfId);
local sLog = format("dark level now: %d", nDarkLevel + 1);
ScriptGlobal_AuditGeneralLog(LUAAUDIT_ANQITUPO, guid, sLog);
else
x900001_PushDebugMessage(sceneId, selfId, "突破失败");
end
IDA逻辑:
int __cdecl LuaFnDarkLevelUp(lua_State *L)
{
int i; // ebx
Scene_3 *Scene; // ebx
Obj_Human *v3; // ebx
Item *DarkItemEquiped; // eax
const CHAR *v6; // [esp-14h] [ebp-44Ch]
SceneManager_1 *const v7; // [esp-10h] [ebp-448h]
const CHAR *v8; // [esp-10h] [ebp-448h]
double v9; // [esp-Ch] [ebp-444h]
Item *pDarkItem; // [esp+8h] [ebp-430h]
unsigned int selfId; // [esp+Ch] [ebp-42Ch]
SceneID_t sceneId; // [esp+10h] [ebp-428h]
int bStudyNewSkill; // [esp+1Ch] [ebp-41Ch] BYREF
char s[1048]; // [esp+20h] [ebp-418h] BYREF
for ( i = 1; i <= 2; ++i )
{
if ( L )
{
if ( lua_isnumber((lua_State_0 *)L, i) == 1 )
continue;
snprintf(s, 0x200u, "ERROR: [%s]Param %d is illegal!", "LuaFnDarkLevelUp", i);
}
else
{
snprintf(s, 0x200u, "ERROR: [%s] Lua_State==NULL!", "LuaFnDarkLevelUp");
}
CacheLog(3, s);
}
sceneId = (__int16)lua_tonumber((lua_State_0 *)L, 1);
selfId = (int)lua_tonumber((lua_State_0 *)L, 2);
Scene = SceneManager::GetScene(v7, *(int *)&g_pSceneManager, sceneId);
if ( !Scene )
{
v8 = "Scene ID ErrorLuaFnDarkLevelUp";
v6 = "pScene";
LABEL_23:
__assertex__("./Script/LuaFnTbl_Misc.h", 0x149Bu, "int LuaFnDarkLevelUp(lua_State*)", v6, v8);
}
if ( ThreadValueManager::GetCurrentThreadID() != Scene->m_ThreadID )
__assertex__(
"./Script/LuaFnTbl_Misc.h",
0x149Bu,
"int LuaFnDarkLevelUp(lua_State*)",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadID",
"ThreadValueManager::GetCurrentThreadID()==pScene->m_ThreadIDLuaFnDarkLevelUp");
if ( selfId > 0x752F || (v3 = (Obj_Human *)Scene->m_pObjManager->m_pObj[selfId]) == 0 )
{
v8 = "selfId ErrorLuaFnDarkLevelUp";
v6 = "pObj";
goto LABEL_23;
}
if ( (*((int (__cdecl **)(Obj_Human *))v3->_vptr_Obj + 2))(v3) == 1 )
{
if ( !Obj_Human::IsCanLogic(v3) )
__assertex__(
"./Script/LuaFnTbl_Misc.h",
0x149Bu,
"int LuaFnDarkLevelUp(lua_State*)",
"pHuman->IsCanLogic()",
"IsCanLogic() test return falseLuaFnDarkLevelUp");
DarkItemEquiped = Obj_Human::GetDarkItemEquiped(v3);
pDarkItem = DarkItemEquiped;
if ( DarkItemEquiped
&& (bStudyNewSkill = 0, Item::CanDarkLevelupNow(DarkItemEquiped))
&& Item::DarkLevelup(pDarkItem, &bStudyNewSkill) )
{
Obj_Human::OnDarkLevelUpOK(v3, pDarkItem, bStudyNewSkill);
HIDWORD(v9) = 1072693248;
}
else
{
HIDWORD(v9) = 0;
}
LODWORD(v9) = 0;
lua_pushnumber((lua_State_0 *)L, v9);
}
else
{
lua_pushnumber((lua_State_0 *)L, -1.0);
}
return 1;
}