mirror of
https://gitlab.com/YuukiPS/GC-Resources.git
synced 2025-04-28 09:05:26 +00:00
445 lines
16 KiB
Lua
445 lines
16 KiB
Lua
--ServerUploadTool Save to [/root/env/data/lua/common/V3_0]
|
||
-- goto 1176 296 -1594
|
||
--[[======================================
|
||
|| filename: GopherPlay
|
||
|| owner: zijun.ma
|
||
|| description: 地鼠玩法
|
||
|| LogName: TD_GopherPlay
|
||
|| Protection: [Protection]
|
||
=======================================]]
|
||
|
||
-- local defs =
|
||
-- {
|
||
-- regionId = 12345,
|
||
-- targetScore = 3,
|
||
-- maxTime = 90,
|
||
-- startId = 0,
|
||
-- }
|
||
|
||
local GopherPlay = {
|
||
RegionCid = defs.regionId,
|
||
ChallengeIndex = 83,
|
||
OptionId = 175,
|
||
LargeMushroomId = 70310220,
|
||
ConfigList =
|
||
{
|
||
defs.gadget_mushroom01,defs.gadget_mushroom02,defs.gadget_mushroom03,
|
||
defs.gadget_mushroom04,defs.gadget_mushroom05,defs.gadget_mushroom06
|
||
},
|
||
ZeroArray = {0,0,0,0,0,0},
|
||
}
|
||
|
||
-- local GopherArray = {
|
||
-- [1] =
|
||
-- {-- time里面有两个值,一个是指延时多久出现,一个是指延时多久消失。譬如{1,5}是指第1秒后出现,第5秒后消失。
|
||
-- [1] = { array = { 0, 0, 0, 1, 2, 1}, time = {1,5}},
|
||
-- [2] = { array = { 1, 2, 1, 0, 0, 0}, time = {1,5}},
|
||
-- [3] = { array = { 0, 1, 0, 2, 1, 0}, time = {1,5}},
|
||
-- [4] = { array = { 0, 2, 1, 2, 0, 0}, time = {1,5}},
|
||
-- },
|
||
-- [2] =
|
||
-- {
|
||
-- [1] = { array = { 0, 0, 0, 1, 2, 1}, time = {1,5}},
|
||
-- [2] = { array = { 1, 2, 1, 0, 0, 0}, time = {1,5}},
|
||
-- [3] = { array = { 0, 1, 0, 2, 1, 0}, time = {1,5}},
|
||
-- [4] = { array = { 0, 2, 1, 2, 0, 0}, time = {1,5}},
|
||
-- },
|
||
-- }
|
||
|
||
local GopherState = {
|
||
[0] = 0,
|
||
[1] = 901,
|
||
[2] = 902,
|
||
}
|
||
|
||
-- 流程规划
|
||
-- 严格根据Size初始化地鼠列表
|
||
-- LF_StartChallenge()
|
||
-- 按照选取的资料组开始挑战
|
||
-- LF_TimeAxisManager()
|
||
-- LF_SummonGopher()
|
||
-- LF_GopherDisappear()
|
||
-- LF_GopherBeHit()
|
||
-- LF_ChallengeJudge()
|
||
|
||
|
||
local GopherPlay_Trigger = {
|
||
{ keyWord = "TimeAxisManager", event = EventType.EVENT_TIME_AXIS_PASS, source = "", trigger_count = 0},
|
||
-- Group是DynamicGroup,所以初始化倒不是问题
|
||
--{ keyWord = "ChallengeInit", event = EventType.EVENT_GROUP_LOAD, source = "GopherPlay", trigger_count = 0},
|
||
{ keyWord = "ChallengeSuccess", event = EventType.EVENT_CHALLENGE_SUCCESS, source = "", trigger_count = 0},
|
||
{ keyWord = "ChallengeFail", event = EventType.EVENT_CHALLENGE_FAIL, source = "", trigger_count = 0},
|
||
{ keyWord = "SelectOption", event = EventType.EVENT_SELECT_OPTION, source = "", trigger_count = 0},
|
||
{ keyWord = "GroupLoad", event = EventType.EVENT_GROUP_LOAD, source = "", trigger_count = 0},
|
||
-- { keyWord = "GadgetStateChange", event = EventType.EVENT_GADGET_STATE_CHANGE, condition = "condition_GadgetStateChange", source = "", trigger_count = 0},
|
||
{ keyWord = "VariableChange", event = EventType.EVENT_VARIABLE_CHANGE, source = "score", trigger_count = 0, tag = "99"},
|
||
{ keyWord = "TempVariableChange", event = EventType.EVENT_VARIABLE_CHANGE, source = "scoreTemp", trigger_count = 0},
|
||
|
||
}
|
||
|
||
local GopherPlay_Variables = {
|
||
-- 记录是否已成功
|
||
{ config_id = 50000001, name = "succeed", value = 0, no_refresh = true },
|
||
-- -- 记录这一轮击杀了多少个大蘑菇
|
||
-- { config_id = 50000002, name = "scoreTemp", value = 0, no_refresh = false },
|
||
|
||
}
|
||
|
||
function LF_Initialize_Level()
|
||
local startConfigID = 40000001
|
||
for _,v in pairs(GopherPlay_Trigger) do
|
||
v.config_id = startConfigID
|
||
if v.keyWordType == nil then
|
||
v.name = "tri_" .. v.keyWord
|
||
else
|
||
v.name = "tri_" .. v.keyWord .. v.keyWordType
|
||
end
|
||
v.action = "action_" .. v.keyWord
|
||
if v.condition == nil then
|
||
v.condition = ""
|
||
end
|
||
startConfigID = startConfigID + 1
|
||
table.insert(triggers, v)
|
||
end
|
||
|
||
LF_InsertTriggers(GopherPlay_Trigger,RequireSuite)
|
||
|
||
-- add variables
|
||
for _,v in pairs(GopherPlay_Variables) do
|
||
table.insert(variables, v)
|
||
end
|
||
|
||
return 0
|
||
end
|
||
|
||
--[[=====================================
|
||
|| action函数
|
||
--======================================]]
|
||
function action_TimeAxisManager(context,evt)
|
||
local timeProcess = evt.param1
|
||
ScriptLib.PrintContextLog(context, "## TD_GopherPlay: time axis "..evt.source_name..", stage "..timeProcess.. " is finished")
|
||
|
||
if timeProcess%2 == 0 then
|
||
-- 偶数时,走消失逻辑
|
||
LF_GopherDisappear(context)
|
||
else
|
||
-- 奇数时,走出现逻辑
|
||
LF_SummonGopher(context)
|
||
end
|
||
return 0
|
||
end
|
||
|
||
function action_ChallengeSuccess(context,evt)
|
||
ScriptLib.PrintContextLog(context, "## TD_GopherPlay: challenge index = "..evt.param1.." succeeds")
|
||
|
||
ScriptLib.SetGroupVariableValue(context, "succeed", 1)
|
||
|
||
LF_StopChallenge(context, true)
|
||
return 0
|
||
end
|
||
|
||
function action_ChallengeFail(context,evt)
|
||
ScriptLib.PrintContextLog(context, "## TD_GopherPlay: challenge index = "..evt.param1.." fails")
|
||
|
||
LF_StopChallenge(context, false)
|
||
return 0
|
||
end
|
||
|
||
function action_SelectOption(context, evt)
|
||
ScriptLib.PrintContextLog(context, "## TD_GopherPlay: worktop "..evt.param1..", option = "..evt.param2)
|
||
|
||
-- 和操作台交互,开启挑战
|
||
LF_StartChallenge(context)
|
||
return 0
|
||
end
|
||
|
||
function action_GroupLoad(context, evt)
|
||
ScriptLib.PrintContextLog(context, "## TD_GopherPlay: group is loaded")
|
||
|
||
local succeed = ScriptLib.GetGroupVariableValue(context, "succeed")
|
||
if succeed == 0 then
|
||
succeed = false
|
||
else
|
||
succeed = true
|
||
end
|
||
LF_StopChallenge(context, succeed)
|
||
|
||
return 0
|
||
end
|
||
|
||
function action_VariableChange(context, evt)
|
||
ScriptLib.PrintContextLog(context, "## TD_GopherPlay: group var "..evt.source_name.." changes from "..evt.param2.." to "..evt.param1)
|
||
|
||
return 0
|
||
end
|
||
|
||
function action_TempVariableChange(context, evt)
|
||
ScriptLib.PrintContextLog(context, "## TD_GopherPlay: group var "..evt.source_name.." changes from "..evt.param2.." to "..evt.param1)
|
||
|
||
local largeMushroomCount = ScriptLib.GetGroupTempValue(context, "LargeMushroomCount", {})
|
||
-- 击杀了这一轮所有大蘑菇,而且不能是最后成功的那一下
|
||
if evt.param1 >= largeMushroomCount and ScriptLib.GetGroupTempValue(context, "score", {}) < defs.targetScore then
|
||
LF_GopherDisappear(context)
|
||
end
|
||
|
||
return 0
|
||
end
|
||
|
||
|
||
-- function condition_GadgetStateChange(context, evt)
|
||
-- -- 只有当是大蘑菇并且进入202的时候才能触发这个trigger
|
||
-- local config_id = evt.param2
|
||
-- local gadget_id = ScriptLib.GetGadgetIdByEntityId(context, evt.source_eid)
|
||
-- local gadgetState = ScriptLib.GetGadgetStateByConfigId(context, 0, config_id)
|
||
-- ScriptLib.PrintContextLog(context, "## TD_GopherPlay configId = ".. config_id .. ", gadgetId = "..gadget_id..", gadgetState change from "..evt.param2.." to "..gadgetState)
|
||
|
||
-- if 202 == gadgetState and gadget_id == GopherPlay.LargeMushroomId then
|
||
-- return true
|
||
-- end
|
||
|
||
-- return false
|
||
-- end
|
||
|
||
-- function action_GadgetStateChange(context, evt)
|
||
-- SLC_AddScore(context, evt)
|
||
-- return 0
|
||
-- end
|
||
|
||
--[[=====================================
|
||
|| 流程函数
|
||
--======================================]]
|
||
function LF_StartChallenge(context)
|
||
|
||
-- 删除操作台选项,操作台进202
|
||
ScriptLib.DelWorktopOptionByGroupId(context, 0, defs.startId, GopherPlay.OptionId)
|
||
ScriptLib.SetGadgetStateByConfigId(context, defs.startId, 202)
|
||
|
||
-- 运行后,开启挑战
|
||
math.randomseed(tostring(ScriptLib.GetServerTime(context)):reverse():sub(1, 6))
|
||
local randomIndex = math.random(#GopherArray)
|
||
ScriptLib.PrintContextLog(context, "## TD_GopherPlay : 使用Index=".. randomIndex .."的矩阵作为当前的挑战矩阵")
|
||
|
||
ScriptLib.StartChallenge(context, GopherPlay.ChallengeIndex, GopherPlay.ChallengeIndex, {defs.maxTime, 3, 99, defs.targetScore})
|
||
ScriptLib.AddExtraGroupSuite(context, 0, 2)
|
||
|
||
|
||
-- 初始化地鼠index
|
||
ScriptLib.SetGroupTempValue(context, "CurIndex", randomIndex, {})
|
||
ScriptLib.SetGroupTempValue(context, "CurArrayIndex", 1, {})
|
||
-- ScriptLib.SetGroupTempValue(context, "Score", 0, {})
|
||
local timeAxis = GopherArray[randomIndex][1].time
|
||
ScriptLib.InitTimeAxis(context, "GopherPlay_1", timeAxis, false)
|
||
return 0
|
||
end
|
||
|
||
function LF_StopChallenge(context, success)
|
||
-- 关闭时间轴
|
||
local curArrayIndex = ScriptLib.GetGroupTempValue(context, "CurArrayIndex", {})
|
||
ScriptLib.EndTimeAxis(context, "GopherPlay_"..curArrayIndex)
|
||
ScriptLib.EndTimeAxis(context, "GopherPlay_"..curArrayIndex + 1)
|
||
|
||
|
||
-- 设置所有蘑菇钻地
|
||
LF_SetArrayGadgetState(context,GopherPlay.ZeroArray)
|
||
|
||
if success == true then
|
||
-- 成功,删除操作台选项,操作台进202
|
||
ScriptLib.DelWorktopOptionByGroupId(context, 0, defs.startId, GopherPlay.OptionId)
|
||
ScriptLib.SetGadgetStateByConfigId(context, defs.startId, 202)
|
||
else
|
||
-- 失败,重置回suite 1
|
||
ScriptLib.RefreshGroup(context, { group_id = base_info.group_id, suite = 1 })
|
||
ScriptLib.SetWorktopOptionsByGroupId(context, 0, defs.startId, {GopherPlay.OptionId})
|
||
|
||
end
|
||
return 0
|
||
end
|
||
|
||
function LF_SummonGopher(context)
|
||
-- 召唤地鼠
|
||
local currentIndex = ScriptLib.GetGroupTempValue(context, "CurIndex", {})
|
||
currentIndex = Fix(currentIndex,GopherArray,"LF_SummonGopher:currentIndex")
|
||
|
||
local curArrayIndex = ScriptLib.GetGroupTempValue(context, "CurArrayIndex", {})
|
||
curArrayIndex = Fix(curArrayIndex,GopherArray[currentIndex],"LF_SummonGopher:curArrayIndex")
|
||
|
||
local tempArray = GopherArray[currentIndex][curArrayIndex].array
|
||
|
||
LF_SetArrayGadgetState(context,tempArray)
|
||
ScriptLib.PrintContextLog(context, "## TD_GopherPlay : 已成功设置第"..currentIndex.."种,第"..curArrayIndex.."轮的地鼠出场")
|
||
|
||
-- 记录这一轮有多少大蘑菇,并把tempScore清零
|
||
local largeMushroomCount = LF_CalLargeMushroom(context, tempArray)
|
||
ScriptLib.SetGroupTempValue(context, "LargeMushroomCount", largeMushroomCount, {})
|
||
ScriptLib.SetGroupTempValue(context, "scoreTemp", 0, {})
|
||
ScriptLib.PrintContextLog(context, "## TD_GopherPlay: largeMushroomCount = "..largeMushroomCount..", group var scoreTemp is reset to 0")
|
||
|
||
ScriptLib.SetGroupTempValue(context, "last", 0, {})
|
||
|
||
return 0
|
||
end
|
||
|
||
function LF_CalLargeMushroom(context, array)
|
||
local temp = 0
|
||
for i = 1, #array do
|
||
if array[i] == 2 then
|
||
temp = temp + 1
|
||
end
|
||
end
|
||
return temp
|
||
end
|
||
|
||
|
||
function LF_GopherDisappear(context)
|
||
-- 地鼠消失
|
||
local currentIndex = ScriptLib.GetGroupTempValue(context, "CurIndex", {})
|
||
local currentArrayIndex = ScriptLib.GetGroupTempValue(context, "CurArrayIndex", {})
|
||
local arrayLens = #GopherArray[currentIndex]
|
||
-- 设置所有蘑菇钻地
|
||
LF_SetArrayGadgetState(context,GopherPlay.ZeroArray)
|
||
ScriptLib.PrintContextLog(context, "## TD_GopherPlay : 已成功设置第"..currentIndex.."轮的地鼠消失" )
|
||
|
||
local temp = currentArrayIndex + 1
|
||
if temp > arrayLens then
|
||
temp = 1
|
||
end
|
||
ScriptLib.SetGroupTempValue(context, "CurArrayIndex", temp, {})
|
||
local nextIdx = ScriptLib.GetGroupTempValue(context, "CurArrayIndex", {})
|
||
ScriptLib.PrintContextLog(context, "## TD_GopherPlay : current index = "..currentIndex..", next array index = "..nextIdx)
|
||
|
||
-- 开启下一个时间轴
|
||
local timeAxis = GopherArray[currentIndex][nextIdx].time
|
||
if #timeAxis ~= 2 then
|
||
ScriptLib.PrintContextLog(context, "## TD_GopherPlay: next time axis not allowed")
|
||
return 0
|
||
end
|
||
ScriptLib.PrintContextLog(context, "## TD_GopherPlay: time axis = "..timeAxis[1]..", "..timeAxis[2])
|
||
|
||
ScriptLib.EndTimeAxis(context, "GopherPlay_"..currentArrayIndex)
|
||
ScriptLib.InitTimeAxis(context, "GopherPlay_"..nextIdx, timeAxis, false)
|
||
return 0
|
||
end
|
||
|
||
-- 根据给定的Array分别对GopherPlay.ConfigList进行设置
|
||
function LF_SetArrayGadgetState(context,array)
|
||
for i = 1,#GopherPlay.ConfigList do
|
||
local configId = GopherPlay.ConfigList[i]
|
||
local index = Fix(i,array,"LF_SetArrayGadgetState:index")
|
||
local curState = array[index]
|
||
if curState < 0 or curState > 2 then
|
||
curState = 0
|
||
end
|
||
local gadgetState = GopherState[curState]
|
||
ScriptLib.PrintContextLog(context, "## TD_GopherPlay : cid -> " .. configId .. " | gadgetState -> " .. gadgetState)
|
||
ScriptLib.SetGadgetStateByConfigId(context, configId, gadgetState)
|
||
end
|
||
|
||
return 0
|
||
end
|
||
|
||
function SLC_AddScore(context,evt)
|
||
|
||
local configId = ScriptLib.GetGadgetConfigId(context, { gadget_eid = context.target_entity_id })
|
||
if configId == 0 then
|
||
ScriptLib.PrintContextLog(context, "## TD_GopherPlay : SLC_AddScore is called, configId = "..configId..", wrong config id and return immediately")
|
||
return 0
|
||
end
|
||
|
||
local before = ScriptLib.GetGroupTempValue(context, "last", {})
|
||
ScriptLib.SetGroupTempValue(context, "last", configId, {})
|
||
local last = ScriptLib.GetGroupTempValue(context, "last", {})
|
||
|
||
if before == last then
|
||
-- 防止短时间内被打两次
|
||
ScriptLib.PrintContextLog(context, "## TD_GopherPlay : SLC_AddScore is called, configId = "..configId..", before = "..before..
|
||
", last = "..last..", mushroom is hit twice, ignore second time")
|
||
return 0
|
||
end
|
||
|
||
local temp1 = ScriptLib.GetGroupTempValue(context, "score", {})
|
||
local temp2 = ScriptLib.GetGroupTempValue(context, "scoreTemp", {})
|
||
|
||
ScriptLib.SetGroupTempValue(context, "score", temp1 + 1, {})
|
||
ScriptLib.SetGroupTempValue(context, "scoreTemp", temp2 + 1, {})
|
||
|
||
local temp = ScriptLib.GetGroupTempValue(context, "score", {})
|
||
ScriptLib.PrintContextLog(context, "## TD_GopherPlay : 成功击碎一枚大箱子,分数+1,当前分数为".. temp)
|
||
|
||
return 0
|
||
end
|
||
|
||
--[[=====================================
|
||
|| 常用工具包
|
||
--======================================]]
|
||
|
||
-- 标准的InsertTriggers方法
|
||
function LF_InsertTriggers(TempTrigger,TempRequireSuite)
|
||
local hasRequireSuitList = not (TempRequireSuite == nil or #TempRequireSuite <=0)
|
||
if hasRequireSuitList then
|
||
if (init_config.io_type ~= 1) then
|
||
--常规group注入。trigger注入白名单定义的suite list
|
||
for i = 1, #TempRequireSuite do
|
||
for k,v in pairs(TempTrigger) do
|
||
if (TempRequireSuite[i]<=#suites) then
|
||
table.insert(suites[TempRequireSuite[i]].triggers, v.name)
|
||
end
|
||
end
|
||
end
|
||
else
|
||
--flow group注入。trigger注入白名单定义的suite list
|
||
for i = 1, #TempRequireSuite do
|
||
for k,v in pairs(TempTrigger) do
|
||
if (TempRequireSuite[i]<=#suite_disk) then
|
||
table.insert(suite_disk[TempRequireSuite[i]].triggers, v.name)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
else
|
||
--不存在白名单设置,走常规的trigger注入流程
|
||
if (init_config.io_type ~= 1) then
|
||
for i = 1, #suites do
|
||
for k,v in pairs(TempTrigger) do
|
||
table.insert(suites[i].triggers, v.name)
|
||
end
|
||
end
|
||
else
|
||
for i = 1, #suite_disk do
|
||
for k,v in pairs(TempTrigger) do
|
||
table.insert(suite_disk[i].triggers, v.name)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
-- 简单拆分一个数组
|
||
function LF_ArrayToString(array)
|
||
local s = "{"
|
||
for k,v in pairs(array) do
|
||
if k < #array then
|
||
s = s .. v ..","
|
||
else
|
||
s = s .. v
|
||
end
|
||
end
|
||
s = s .."}"
|
||
return s
|
||
end
|
||
|
||
-- 根据数组的长度修饰num
|
||
function Fix(value,array,error)
|
||
if value < 1 then
|
||
ScriptLib.PrintLog(error .. "value = " .. value)
|
||
return 1
|
||
end
|
||
if value > #array then
|
||
ScriptLib.PrintLog(error .. "value = " .. value)
|
||
return #array
|
||
end
|
||
|
||
return value
|
||
end
|
||
|
||
LF_Initialize_Level()
|