打印

從源碼C底層中,增加 出奇不意 cf

從源碼C底層中,增加 出奇不意 cf

如果走PVE的伺服器,會讓玩家刷出奇不意來挑戰 (首次可以 2 回合動作)

不過,若可以讓指定地圖永遠都出奇不易,就不需要刷了

先說明 出奇不意的判斷邏輯
battle.c 中的 BATTLE_Init 函式裡可以見到
iRet = BATTLE_SurpriseCheck(battleindex);

if (iRet == 1) BattleArray[battleindex].Side[1].flg |= BSIDE_FLG_SURPRISE;

這表示左上方(Side[1]),也就是敵方 出奇不意,對右下方(玩家方)而言則是遭敵偷襲

if (iRet == 2) BattleArray[battleindex].Side[0].flg |= BSIDE_FLG_SURPRISE;

這表示右下方(Side[0]),也就是我方 出奇不意,對敵方而言則是遭敵偷襲


以下教學開始
1.宣告函式 (npc_lua_interface.h) **增加在哪裡可以去看上一篇**
增加
#define FUNCNAME_CHECKSURPRISE                                        "NPC_Lua_CheckSurprise"
以及
BOOL NPC_Lua_CheckSurprise(int _playindex);

2.增加函式 (function.c)
{ {FUNCNAME_CHECKSURPRISE} ,                NPC_Lua_CheckSurprise,0 },

3.增加LUA函式實作 (npc_lua.c)
BOOL NPC_Lua_CheckSurprise(int _playindex)
{
        if(M_Script_Lua == NULL)
        {
        print("M_Script_Lua Null!");
        return FALSE;
        }
       
        lua_getglobal(M_Script_Lua, "LuaCheckSurprise");

        if (!lua_isfunction(M_Script_Lua, -1)) {
    lua_pop(M_Script_Lua, 1);
    return TRUE;
        }
        //依次放入參數
        lua_pushnumber(M_Script_Lua,_playindex);
       
        int TM_Ret = 0;
        TM_Ret = lua_pcall(M_Script_Lua, 1, 1, 0);
        //
        if(TM_Ret != 0){
                //失敗-輸出錯誤信息
                print("NPC_Lua_CheckSurprise Lua Err :%d(%s)\n", TM_Ret, lua_tostring(M_Script_Lua, -1));
                //出棧
                lua_pop(M_Script_Lua, 1);
                return FALSE;
        }
        //
        int ret = lua_tonumber(M_Script_Lua, -1);
       
        lua_pop(M_Script_Lua, 1);
       
        return ret;
}

4.應用於戰鬥事件 (battle_event.c)
先在檔案上方宣告函式
extern int NPC_Lua_CheckSurprise(int index);

然後到出奇不意的判斷函式中 (BATTLE_SurpriseCheck)增加以下原始碼

把原本的
return iRet;
替換成
if (NPC_Lua_CheckSurprise(charaindex) > 0)
                return NPC_Lua_CheckSurprise(charaindex);
        else
                return iRet;


6. 最後遊戲內 Lua 實作呼叫 (範例是 在薩村內PVE戰鬥絕對觸發 出奇不意 )
function LuaCheckSurprise(_PlayerIndex)
        local map = Char.GetData(_PlayerIndex,%對像_地圖%);
        if map == 1000 then
                return 2; //絕對出奇不意 (參考上面 iRet 值)
        end
end

[ 本帖最後由 寇丁gm 於 2026-5-25 18:55 編輯 ]

TOP