mirror of
https://gitlab.com/YuukiPS/GC-Resources.git
synced 2025-04-28 09:05:26 +00:00
761 lines
30 KiB
Lua
761 lines
30 KiB
Lua
--[[
|
||
setmetatable(_ENV,{__index=function() return{} end})
|
||
local stage_def = {
|
||
[1] = {
|
||
--根据阶段创建的group,在阶段group中标记
|
||
[1] = {2,3,4,5},
|
||
[2] = {2,3,4,5},
|
||
[3] = {2,3,4,5},
|
||
[4] = {2,3,4,5}
|
||
},
|
||
[2] = {
|
||
[1] = {2,3,4,5},
|
||
[2] = {2,3,4,5},
|
||
[3] = {2,3,4,5},
|
||
[4] = {2,3,4,5}
|
||
},
|
||
[3] = {
|
||
[1] = {2,3,4,5},
|
||
[2] = {2,3,4,5},
|
||
[3] = {2,3,4,5},
|
||
[4] = {2,3,4,5}
|
||
},
|
||
}
|
||
|
||
--根据progress对应的monster_tide,配在主group中
|
||
local tide_defs = {
|
||
[1] = {
|
||
[0] = {suite={2,3,4,5},weight={20,20,20,20,20}},
|
||
[1] = {suite={2,3,4,5},weight={20,20,20,20,20}},
|
||
[2] = {suite={},weight={}},
|
||
[3] = {suite={2,3,4,5},weight={20,20,20,20,20}},
|
||
[4] = {suite={2,3,4,5},weight={20,20,20,20,20}}
|
||
},
|
||
[2] = {
|
||
[0] = {suite={2,3,4,5},weight={20,20,20,20,20}},
|
||
[1] = {suite={2,3,4,5},weight={20,20,20,20,20}},
|
||
[2] = {suite={},weight={}},
|
||
[3] = {suite={2,3,4,5},weight={20,20,20,20,20}},
|
||
[4] = {suite={2,3,4,5},weight={20,20,20,20,20}}
|
||
},
|
||
[3] = {
|
||
[0] = {suite={2,3,4,5},weight={20,20,20,20,20}},
|
||
[1] = {suite={2,3,4,5},weight={20,20,20,20,20}},
|
||
[2] = {suite={},weight={}},
|
||
[3] = {suite={2,3,4,5},weight={20,20,20,20,20}},
|
||
[4] = {suite={2,3,4,5},weight={20,20,20,20,20}}
|
||
},
|
||
}
|
||
|
||
--monster_tide的启动参数,配在主group中
|
||
local tide_suite_config = {
|
||
[2] = {total=10,min=2,max=4,next=3,delay=10},
|
||
[3] = {total=10,min=2,max=4,next=4,delay=10},
|
||
[4] = {total=10,min=2,max=4,next=5,delay=10},
|
||
[5] = {total=10,min=2,max=4,next=6,delay=10}
|
||
}
|
||
|
||
--配在及时group中
|
||
local timer_def = {
|
||
[1] = {
|
||
--根据时间创建的group
|
||
[1] = {2,3,4,5},
|
||
[2] = {2,3,4,5},
|
||
[3] = {2,3,4,5},
|
||
[4] = {2,3,4,5}
|
||
},
|
||
[2] = {
|
||
[1] = {2,3,4,5},
|
||
[2] = {2,3,4,5},
|
||
[3] = {2,3,4,5},
|
||
[4] = {2,3,4,5}
|
||
},
|
||
[3] = {
|
||
[1] = {2,3,4,5},
|
||
[2] = {2,3,4,5},
|
||
[3] = {2,3,4,5},
|
||
[4] = {2,3,4,5}
|
||
}
|
||
}
|
||
|
||
local progress_def = {
|
||
["normal"] = {0,1500,3000,4500,6500},
|
||
["hard"] = {0,1500,3000,4500,6500},
|
||
["nightmare"] = {0,1500,3000,4500,6500}
|
||
}
|
||
|
||
local defs = {
|
||
--group_main
|
||
gadget_aster = 413001,
|
||
gadget_reward = 123456,
|
||
score_ratio = {normal=1,hard=0.75,nightmare=0.5},
|
||
difficulty_weight = {normal=75,hard=20,nightmare=5},
|
||
--group_stage
|
||
--group_clear
|
||
aster_timer = {60,120,180,240,300},
|
||
clear_delay = 30
|
||
}--]]
|
||
|
||
local play = {
|
||
PlayType = 2,
|
||
PlayId = 2,
|
||
player_energy = "AVATAR_ASTER_SCORE", --global_value
|
||
radius = 10,
|
||
monster_tide = 426,
|
||
group_main = 133001413,
|
||
group_timer = 133001426,
|
||
group_stage = 133001427,
|
||
group_gadget = 133001498,
|
||
energy_str = "AVATAR_ASTER_SCORE", --uid_value
|
||
difficulty = "difficulty",
|
||
ratio_energy = {"ASTER_ENERGY_RATIO",2},
|
||
ratio_progress = {"ASTER_PROGRESS_RATIO",2},
|
||
op_radius = 10
|
||
}
|
||
|
||
local extra_triggers = {
|
||
[play.group_main] = {
|
||
--活动准备阶段
|
||
["Battle_State"] = { config_id = 8000001, name = "Battle_State", event = EventType.EVENT_SCENE_MP_PLAY_BATTLE_STATE, source = "", condition = "condition_battle_state", action = "action_battle_state", trigger_count = 0 },
|
||
--战斗结束
|
||
["Battle_Result"] = { config_id = 8000002, name = "Battle_Result", event = EventType.EVENT_SCENE_MP_PLAY_BATTLE_RESULT, source = "", condition = "", action = "action_battle_result", trigger_count = 0 },
|
||
--角色充能处理
|
||
["Monster_Die_Before_Leave_Scene"] = { config_id = 8000003, name = "Monster_Die_Before_Leave_Scene", event = EventType.EVENT_MONSTER_DIE_BEFORE_LEAVE_SCENE, source = "", condition = "condition_monster_die_before_leave_scene", action = "action_monster_die_before_leave_scene", trigger_count = 0 },
|
||
--战斗阶段响应
|
||
["Battle_State_Change"] = { config_id = 8000004, name = "Battle_State_Change", event = EventType.EVENT_SCENE_MP_PLAY_BATTLE_STAGE_CHANGE, source = "", condition = "", action = "action_battle_stage_change", trigger_count = 0 },
|
||
--怪物潮管理与切换
|
||
["Monster_Tide_Over"] = { config_id = 8000005, name = "Monster_Tide", event = EventType.EVENT_MONSTER_TIDE_OVER, source = "", condition = "", action = "action_monster_tide_over", trigger_count = 0 },
|
||
["Timer_Delay"] = { config_id = 8000006, name = "Timer_Delay", event = EventType.EVENT_TIMER_EVENT, source = "next_tide_delay", condition = "", action = "action_timer_delay", trigger_count = 0 },
|
||
["Battle_Interrupt"] = { config_id = 8000007, name = "Battle_Interrupt", event = EventType.EVENT_SCENE_MP_PLAY_BATTLE_INTERRUPT, source = "", condition = "", action = "action_battle_interrupt", trigger_count = 0},
|
||
--1.3版本修复内容
|
||
--处理1.1版本数据未清理的大陨石
|
||
["Group_Load"] = { config_id = 8000100, name = "Group_Load", event = EventType.EVENT_GROUP_LOAD, source = "", condition = "", action = "action_group_load", trigger_count = 0 }
|
||
},
|
||
[play.group_timer] = {
|
||
--活动准备阶段
|
||
["Battle_State"] = { config_id = 8000008, name = "Battle_State", event = EventType.EVENT_SCENE_MP_PLAY_BATTLE_STATE, source = "", condition = "condition_battle_state", action = "action_battle_state", trigger_count = 0 },
|
||
--角色充能处理
|
||
["Monster_Die_Before_Leave_Scene"] = { config_id = 8000009, name = "Monster_Die_Before_Leave_Scene", event = EventType.EVENT_MONSTER_DIE_BEFORE_LEAVE_SCENE, source = "", condition = "condition_monster_die_before_leave_scene", action = "action_monster_die_before_leave_scene", trigger_count = 0 },
|
||
--战斗结束
|
||
["Battle_Result"] = { config_id = 8000010, name = "Battle_Result", event = EventType.EVENT_SCENE_MP_PLAY_BATTLE_RESULT, source = "", condition = "", action = "action_battle_result", trigger_count = 0 },
|
||
--计时处理
|
||
["Timer_Summon"] = { config_id = 8000011, name = "Timer_Summon", event = EventType.EVENT_TIMER_EVENT, source = "aster_timer", condition = "", action = "action_timer_summon", trigger_count = 0 }
|
||
},
|
||
[play.group_stage] = {
|
||
--角色充能处理
|
||
["Monster_Die_Before_Leave_Scene"] = { config_id = 8000012, name = "Monster_Die_Before_Leave_Scene", event = EventType.EVENT_MONSTER_DIE_BEFORE_LEAVE_SCENE, source = "", condition = "condition_monster_die_before_leave_scene", action = "action_monster_die_before_leave_scene", trigger_count = 0 },
|
||
--战斗结束
|
||
["Battle_Result"] = { config_id = 8000013, name = "Battle_Result", event = EventType.EVENT_SCENE_MP_PLAY_BATTLE_RESULT, source = "", condition = "", action = "action_battle_result", trigger_count = 0 },
|
||
["Any_Monster_Die"] = { config_id = 8000014, name = "Any_Monster_Die", event = EventType.EVENT_ANY_MONSTER_DIE, source = "", condition = "condition_any_monster_die", action = "action_any_monster_die", trigger_count = 0 }
|
||
|
||
}
|
||
}
|
||
|
||
--%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||
--1.3修复内容
|
||
function action_group_load(context, evt)
|
||
--1.6改为注册及之后,动态group不允许使用setDead,也不需要维持这段逻辑
|
||
--[[for i,v in ipairs(suites) do
|
||
ScriptLib.RemoveExtraGroupSuite(context, play.group_main, i)
|
||
end
|
||
ScriptLib.SetGroupDead(context, play.group_main)--]]
|
||
return 0
|
||
end
|
||
--%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||
|
||
|
||
|
||
function LF_Initialize_Group(triggers, suites, group_id)
|
||
--[[if group_id == play.group_main then
|
||
for k,v in pairs(extra_triggers[group_id]) do
|
||
table.insert(triggers, v)
|
||
table.insert(suites[init_config.suite].triggers, v.name)
|
||
end
|
||
else
|
||
for k,v in pairs(extra_triggers[group_id]) do
|
||
-- Triggers 是个数组,不是map
|
||
table.insert(triggers, v)
|
||
for p,q in pairs(suites) do
|
||
if p ~= init_config.suite or v.name ~= "Any_Monster_Die" then
|
||
table.insert(q.triggers, v.name)
|
||
end
|
||
end
|
||
-- 所以不能 triggers[k] = v
|
||
end
|
||
end--]]
|
||
for k,v in pairs(extra_triggers[group_id]) do
|
||
table.insert(triggers, v)
|
||
table.insert(suites[init_config.suite].triggers, v.name)
|
||
end
|
||
end
|
||
|
||
function UpdateAsterInterrupt(context)
|
||
local u_list = ScriptLib.GetSceneUidList(context)
|
||
for i,v in ipairs(u_list) do
|
||
if v == context.uid then
|
||
ScriptLib.ScenePlayBattleUidOp(context, play.group_main, defs.gadget_aster, {v}, 0, "random_buff_aster", {}, {}, 6, 0)
|
||
return 0
|
||
end
|
||
end
|
||
end
|
||
|
||
function UpdateAsterProgress(context)
|
||
local host = ScriptLib.GetScenePlayBattleHostUid(context, 0)
|
||
local D = ScriptLib.GetScenePlayBattleUidValue(context, 0, host, play.difficulty)
|
||
ratio = LF_Get_Extra_Energy_Ratio(context, host)
|
||
--获取玩家当前能量
|
||
local uid = context.uid
|
||
local energy = ScriptLib.GetTeamAbilityFloatValue(context, uid, play.energy_str)
|
||
local progress = math.ceil(energy * ratio)
|
||
--将当前能量写入uid_value
|
||
local old_progress = ScriptLib.GetScenePlayBattleUidValue(context, 0, uid, play.energy_str)
|
||
ScriptLib.PrintContextLog(context, "## uid:"..uid.." | energy:"..progress.." | old_energy:"..old_progress)
|
||
ScriptLib.SetScenePlayBattleUidValue(context, 0, uid, play.energy_str, old_progress + progress)
|
||
--通知ability可以清掉自己的能量计数
|
||
--ScriptLib.GadgetPlayUidOp(context, 0, 0, {uid}, 1, "clear_energy", {})
|
||
ScriptLib.AddTeamEntityGlobalFloatValue(context, {uid}, play.player_energy, -1*energy)
|
||
--增加玩法总进度
|
||
ScriptLib.AddScenePlayBattleProgress(context, 133001413, progress * LF_Get_Extra_Progress_Ratio(context, host))
|
||
return 0
|
||
end
|
||
|
||
function LF_Get_Extra_Energy_Ratio(context, host)
|
||
local ratio_ = 1
|
||
--if true == LF_Is_Near_Op_Uid(context, host, play.ratio_energy[1]) then
|
||
if 1 == ScriptLib.GetTeamAbilityFloatValue(context, context.source_entity_id, play.ratio_energy[1]) then
|
||
ratio_ = play.ratio_energy[2]
|
||
end
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : Extra_Energy_Ratio -> "..ratio_)
|
||
return ratio_
|
||
end
|
||
|
||
function LF_Get_Extra_Progress_Ratio(context, host)
|
||
local ratio_ = 1
|
||
--if true == LF_Is_Near_Op_Uid(context, host, play.ratio_progress[1]) then
|
||
if 1 == ScriptLib.GetTeamAbilityFloatValue(context, context.source_entity_id, play.ratio_progress[1]) then
|
||
ratio_ = play.ratio_progress[2]
|
||
end
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : Extra_Progress_Ratio -> "..ratio_)
|
||
return ratio_
|
||
end
|
||
|
||
function LF_Is_Near_Op_Uid(context, host, str)
|
||
local target = ScriptLib.GetScenePlayBattleUidValue(context, 0, host, "Op_Uid")
|
||
if target == 0 or 0 == ScriptLib.GetTeamAbilityFloatValue(context, target, str)then
|
||
return false
|
||
end
|
||
local target_Eid = ScriptLib.GetAvatarEntityIdByUid(context, target)
|
||
if target_Eid == 0 then
|
||
return false
|
||
end
|
||
--本人的直接返回
|
||
if target_Eid == context.source_entity_id then
|
||
return true
|
||
end
|
||
local pos1 = ScriptLib.GetPosByEntityId(context, target_Eid)
|
||
local pos2 = ScriptLib.GetPosByEntityId(context, context.source_entity_id)
|
||
if play.op_radius < LF_Calculate_Distance(context, pos1, pos2) then
|
||
return false
|
||
end
|
||
return true
|
||
end
|
||
|
||
function LF_Calculate_Distance(context, pos1, pos2)
|
||
local distance = math.sqrt(math.pow(pos1.x-pos2.x,2)+math.pow(pos1.y-pos2.y,2)+math.pow(pos1.z-pos2.z,2))
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : op_distance -> "..distance)
|
||
return distance
|
||
end
|
||
|
||
-------------------------------------------------
|
||
function condition_battle_state(context, evt)
|
||
if defs.group_id == play.group_main then
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG: battle_state : param1->"..evt.param1.." | param2->"..evt.param2.." | param3->"..evt.param3)
|
||
end
|
||
if evt.param1 == play.PlayType and evt.param2 == play.PlayId then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
function action_battle_state(context, evt)
|
||
--BATTLE_PREPARE
|
||
if evt.param3 == 2 and defs.group_id == play.group_main then
|
||
LF_Battle_Prepare(context, evt)
|
||
--BATTLE_READY
|
||
elseif evt.param3 == 3 and defs.group_id == play.group_main then
|
||
LF_Battle_Ready(context, evt)
|
||
--BATTLE_PRESTART
|
||
elseif evt.param3 == 4 and defs.group_id == play.group_main then
|
||
LF_Battle_Prestart(context, evt)
|
||
--BATTLE_START
|
||
elseif evt.param3 == 5 then
|
||
LF_Battle_Start(context, evt)
|
||
--[[--BATTLE_STOP
|
||
elseif evt.param3 == 6 then
|
||
LF_Battle_Stop(context, evt)--]]
|
||
elseif defs.group_id == play.group_main then
|
||
ScriptLib.PrintContextLog(context, "## ASTER_ERR : Invalid Battle State")
|
||
return -1
|
||
end
|
||
return 0
|
||
end
|
||
|
||
function action_battle_stage_change(context, evt)
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : battle_stage_change : old_stage->"..evt.param1.." | cur_stage->"..evt.param2.." | final_stage->"..evt.param3)
|
||
if evt.param2 == evt.param3 then
|
||
return 0
|
||
end
|
||
local host = ScriptLib.GetScenePlayBattleHostUid(context, 0)
|
||
ScriptLib.SetScenePlayBattleUidValue(context, 0, host, "stage_ptr", evt.param2)
|
||
LF_Uid_Op(context, evt.param2)
|
||
--阶段转换时一定要停当前tide
|
||
LF_Modify_Gadget_Group(context, evt.param2)
|
||
local r = ScriptLib.KillMonsterTide(context, play.group_main, play.monster_tide)
|
||
ScriptLib.CancelGroupTimerEvent(context, play.group_main, "next_tide_delay")
|
||
local s = ScriptLib.GetScenePlayBattleUidValue(context, 0, host, "tide_ptr")
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : remove_suite_over_stage -> "..s.." | kill_tide_result -> "..r)
|
||
--清理tide_monster
|
||
if s ~= 0 then
|
||
ScriptLib.RemoveExtraGroupSuite(context, play.group_main, s)
|
||
end
|
||
--清理stage_monster
|
||
local prev_stage_suite = ScriptLib.GetScenePlayBattleUidValue(context, 0, host, "prev_stage_suite")
|
||
if prev_stage_suite ~= 0 then
|
||
ScriptLib.RemoveExtraGroupSuite(context, play.group_stage, prev_stage_suite)
|
||
end
|
||
ScriptLib.ExecuteGroupLua(context, play.group_stage, "LF_Find_Stage_Suite", {evt.param2,host})
|
||
return 0
|
||
end
|
||
|
||
function action_battle_result(context, evt)
|
||
if evt.param3 == 1 then
|
||
LF_Battle_Win(context, evt)
|
||
elseif evt.param3 == 0 then
|
||
LF_Battle_Lose(context, evt)
|
||
end
|
||
return 0
|
||
end
|
||
|
||
function condition_monster_die_before_leave_scene(context, evt)
|
||
--如果monster没有分就return了
|
||
if monsters[evt.param1].kill_score > 0 then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
function action_monster_die_before_leave_scene(context, evt)
|
||
--判断附近玩家,并增加对应分数
|
||
--local uid_list = ScriptLib.GetSurroundUidList(context, evt.param1, play.radius)
|
||
local uid_list = ScriptLib.GetSceneUidList(context)
|
||
if #uid_list == 0 then
|
||
ScriptLib.PrintContextLog(context, "## ASTER_ERR : None Near Players")
|
||
return -1
|
||
end
|
||
--通知客户端执行加分,考虑到客户端可能断线,这个分数服务器自己不记录
|
||
local score_ = monsters[evt.param1].kill_score
|
||
local host = ScriptLib.GetScenePlayBattleHostUid(context, 0)
|
||
local ratio_ = ScriptLib.GetScenePlayBattleUidValue(context, 0, host, "ratio_ptr")
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : monster->"..evt.param1.." | score->"..score_.." | ratio->"..ratio_)
|
||
ScriptLib.AddTeamEntityGlobalFloatValue(context, uid_list, play.player_energy, score_ * ratio_)
|
||
return 0
|
||
end
|
||
|
||
function action_timer_summon(context, evt)
|
||
local host = ScriptLib.GetScenePlayBattleHostUid(context, 0)
|
||
local D = ScriptLib.GetScenePlayBattleUidValue(context, 0, host, play.difficulty)
|
||
local timer_ptr = ScriptLib.GetScenePlayBattleUidValue(context, 0, host,"timer_ptr")
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : timer_event \"aster_timer\" -> "..defs.aster_timer[timer_ptr])
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : cur_timer_ptr -> "..timer_ptr)
|
||
math.randomseed(ScriptLib.GetServerTime(context) + timer_ptr)
|
||
local Timer = timer_def[D][timer_ptr][math.random(1,#timer_def[D][timer_ptr])]
|
||
if #suites[Timer].monsters > 0 then
|
||
ScriptLib.ShowTemplateReminder(context, 110, {0,0})
|
||
end
|
||
if defs.aster_timer[timer_ptr+1] == nil then
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : aster_timer_end")
|
||
return -1
|
||
end
|
||
--设置下一招怪阶段
|
||
ScriptLib.CreateGroupTimerEvent(context, play.group_timer, "aster_timer", defs.aster_timer[timer_ptr+1] - defs.aster_timer[timer_ptr])
|
||
--ScriptLib.CreateGroupTimerEvent(context, play.group_timer, "clear_delay", defs.clear_delay)
|
||
--召唤当前波次的怪物
|
||
--ScriptLib.PauseAutoMonsterTide(context, play.group_main, play.monster_tide)
|
||
--ScriptLib.RefreshGroup(context, {group_id = play.group_timer, suite = timer_def[D][timer_ptr][math.random(1,#timer_def[D][timer_ptr])]})
|
||
ScriptLib.AddExtraGroupSuite(context, play.group_timer, Timer)
|
||
ScriptLib.SetScenePlayBattleUidValue(context, 0, host,"timer_ptr", timer_ptr + 1)
|
||
--ScriptLib.SetScenePlayBattleUidValue(context, 0, host,"prev_timer_suite", Timer)
|
||
return 0
|
||
end
|
||
|
||
function action_monster_tide_over(context, evt)
|
||
local host = ScriptLib.GetScenePlayBattleHostUid(context, 0)
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : Monster_Tide_Over : tide_index->"..evt.source_name.." | status->"..evt.param2)
|
||
local tide_ptr = ScriptLib.GetScenePlayBattleUidValue(context, 0, host, "tide_ptr")
|
||
--自动结束,计算下一个tide,如果只有一个会选自己
|
||
local new_tide_ptr = tide_suite_config[tide_ptr].next
|
||
if new_tide_ptr == nil then
|
||
ScriptLib.PrintContextLog(context, "## ASTER_ERR : INVALID_CIRCLE_TIDE_PTR -> "..tide_ptr)
|
||
return -1
|
||
end
|
||
ScriptLib.CreateGroupTimerEvent(context, play.group_main, "next_tide_delay", tide_suite_config[tide_ptr].delay)
|
||
ScriptLib.SetScenePlayBattleUidValue(context, 0, host, "tide_ptr", new_tide_ptr)
|
||
return 0
|
||
end
|
||
|
||
function action_timer_delay(context, evt)
|
||
local host = ScriptLib.GetScenePlayBattleHostUid(context, 0)
|
||
--继续创建下个tide
|
||
local tide_ptr = ScriptLib.GetScenePlayBattleUidValue(context, 0, host, "tide_ptr")
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : timer_delay_tide -> "..tide_ptr)
|
||
ScriptLib.AutoMonsterTide(context, play.monster_tide, play.group_main, suites[tide_ptr].monsters, tide_suite_config[tide_ptr].total, tide_suite_config[tide_ptr].min, tide_suite_config[tide_ptr].max)
|
||
return 0
|
||
end
|
||
|
||
function action_battle_interrupt(context, evt)
|
||
ScriptLib.SetGadgetEnableInteract(context, play.group_main, defs.gadget_aster, true)
|
||
return 0
|
||
end
|
||
|
||
function condition_any_monster_die(context, evt)
|
||
if 0 == ScriptLib.GetGroupMonsterCount(context) then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
function action_any_monster_die(context, evt)
|
||
local host = ScriptLib.GetScenePlayBattleHostUid(context, 0)
|
||
local stage = ScriptLib.GetScenePlayBattleUidValue(context, 0, host, "stage_ptr")
|
||
ScriptLib.ExecuteGroupLua(context, play.group_main, "LF_Modify_Monster_Tide", {stage,host})
|
||
return 0
|
||
end
|
||
---------------------------------------
|
||
|
||
--/*************************************/
|
||
|
||
---------------------------------------
|
||
function LF_Battle_Prepare(context, evt)
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : LF_Battle_Prepare")
|
||
ScriptLib.PrintLog("================VERSION 76=========================")
|
||
--关闭大陨石交互
|
||
ScriptLib.SetGadgetEnableInteract(context, play.group_main, defs.gadget_aster, false)
|
||
return 0
|
||
end
|
||
|
||
function LF_Battle_Ready(context, evt)
|
||
--ScriptLib.PrintContextLog(context, "## ASTER_LOG : LF_Battle_Ready")
|
||
--随机难度
|
||
local D_str = LF_Random_Play_Difficulty(context, evt)
|
||
local D_num = 0
|
||
if D_str == "normal" then
|
||
D_num = 1
|
||
elseif D_str == "hard" then
|
||
D_num = 2
|
||
elseif D_str == "nightmare" then
|
||
D_num = 3
|
||
elseif D_str == "easy" then
|
||
D_num = 4
|
||
end
|
||
--启用playEntity
|
||
LF_Attach_Ability(context, evt, D_num, D_str)
|
||
--开启大陨石玩法
|
||
ScriptLib.PrestartScenePlayBattle(context, {duration = 600,start_cd = 10,progress_stage = progress_def[D_str], group_id = play.group_main, mode = D_num + 200})
|
||
--写入难度
|
||
LF_Set_Battle_Difficulty(context, evt, D_num)
|
||
--生成Buff序列
|
||
LF_Init_Uid_Op_Buff(context, evt)--]]
|
||
return 0
|
||
end
|
||
|
||
function LF_Battle_Prestart(context, evt)
|
||
--3秒倒计时提醒
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : LF_Battle_Prestart")
|
||
--[[--随机难度
|
||
LF_Random_Play_Difficulty(context, evt)
|
||
--生成Buff序列
|
||
LF_Init_Uid_Op_Buff(context, evt)--]]
|
||
return 0
|
||
end
|
||
|
||
function LF_Battle_Start(context, evt)
|
||
--ScriptLib.PrintContextLog(context, "## ASTER_LOG : LF_Battle_Start")
|
||
--正式开始
|
||
if defs.group_id == play.group_main then
|
||
--启动起始tide
|
||
local host = ScriptLib.GetScenePlayBattleHostUid(context, 0)
|
||
LF_Modify_Gadget_Group(context, 0)
|
||
LF_Modify_Monster_Tide(context, context, 0, host, 0)
|
||
elseif defs.group_id == play.group_timer then
|
||
--启动timer_group计时器
|
||
LF_Set_Timer(context, evt)
|
||
end
|
||
return 0
|
||
end
|
||
|
||
--[[function LF_Battle_Stop(context, evt)
|
||
--结束
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : LF_Battle_Stop")
|
||
return 0
|
||
end--]]
|
||
|
||
function LF_Battle_Win(context, evt)
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : LF_Battle_Win")
|
||
if defs.group_id == play.group_main then
|
||
ScriptLib.KillMonsterTide(context, play.group_main, play.monster_tide)
|
||
local host = ScriptLib.GetScenePlayBattleHostUid(context, 0)
|
||
local circle = ScriptLib.GetScenePlayBattleUidValue(context, 0, host, "circle_ptr")
|
||
ScriptLib.KillExtraGroupSuite(context, play.group_gadget, circle)
|
||
ScriptLib.CancelGroupTimerEvent(context, play.group_main, "next_tide_delay")
|
||
local s = ScriptLib.GetScenePlayBattleUidValue(context, 0, host, "tide_ptr")
|
||
ScriptLib.RemoveExtraGroupSuite(context, play.group_main, s)
|
||
ScriptLib.CreateScenePlayGeneralRewardGadget(context, {group_id = play.group_main, config_id = defs.gadget_reward})
|
||
ScriptLib.SetGadgetEnableInteract(context, play.group_main, defs.gadget_aster, true)
|
||
ScriptLib.SetGadgetStateByConfigId(context, defs.gadget_aster, 0)
|
||
elseif defs.group_id == play.group_stage then
|
||
ScriptLib.RefreshGroup(context, {group_id = defs.group_id, suite = 1})
|
||
elseif defs.group_id == play.group_timer then
|
||
ScriptLib.RefreshGroup(context, {group_id = defs.group_id, suite = 1})
|
||
ScriptLib.CancelGroupTimerEvent(context, play.group_timer, "aster_timer")
|
||
--ScriptLib.CancelGroupTimerEvent(context, play.group_timer, "clear_delay")
|
||
end
|
||
return 0
|
||
end
|
||
|
||
function LF_Battle_Lose(context, evt)
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : LF_Battle_Lose")
|
||
if defs.group_id == play.group_main then
|
||
local host = ScriptLib.GetScenePlayBattleHostUid(context, 0)
|
||
local circle = ScriptLib.GetScenePlayBattleUidValue(context, 0, host, "circle_ptr")
|
||
ScriptLib.KillExtraGroupSuite(context, play.group_gadget, circle)
|
||
ScriptLib.CancelGroupTimerEvent(context, play.group_main, "next_tide_delay")
|
||
ScriptLib.KillMonsterTide(context, play.group_main, play.monster_tide)
|
||
local s = ScriptLib.GetScenePlayBattleUidValue(context, 0, host, "tide_ptr")
|
||
ScriptLib.RemoveExtraGroupSuite(context, play.group_main, s)
|
||
ScriptLib.SetGadgetEnableInteract(context, play.group_main, defs.gadget_aster, true)
|
||
ScriptLib.SetGadgetStateByConfigId(context, defs.gadget_aster, 0)
|
||
elseif defs.group_id == play.group_stage then
|
||
ScriptLib.RefreshGroup(context, {group_id = defs.group_id, suite = 1})
|
||
elseif defs.group_id == play.group_timer then
|
||
ScriptLib.RefreshGroup(context, {group_id = defs.group_id, suite = 1})
|
||
ScriptLib.CancelGroupTimerEvent(context, play.group_timer, "aster_timer")
|
||
--ScriptLib.CancelGroupTimerEvent(context, play.group_timer, "clear_delay")
|
||
end
|
||
return 0
|
||
end
|
||
|
||
function LF_Find_Stage_Suite(context, prev_context, param1, param2, param3)
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : Find_Stage_Suite : stage->"..param1.." | host->"..param2)
|
||
local stage = param1
|
||
local host = param2
|
||
local D = ScriptLib.GetScenePlayBattleUidValue(context, 0, host, play.difficulty)
|
||
--用于定义阶段转换,影响stage对应group的逻辑
|
||
local stage_suite_arr = stage_def[D][stage]
|
||
|
||
if stage_suite_arr == nil or #stage_suite_arr == 0 then
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : None Stage Suite")
|
||
ScriptLib.ExecuteGroupLua(context, play.group_main, "LF_Modify_Monster_Tide", {stage,host})
|
||
return 0
|
||
else
|
||
math.randomseed(ScriptLib.GetServerTime(context) + stage)
|
||
local stage_suite = stage_suite_arr[math.random(1,#stage_suite_arr)]
|
||
ScriptLib.ExecuteGroupLua(context, play.group_main, "LF_Handle_Stage_Change", {stage,stage_suite})
|
||
end
|
||
return 0
|
||
end
|
||
|
||
function LF_Modify_Monster_Tide(context, prev_context, param1, param2, param3)
|
||
local stage = param1
|
||
local host = param2
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : modify_monster_tide : cur_stage->"..stage)
|
||
local D = ScriptLib.GetScenePlayBattleUidValue(context, 0, host, play.difficulty)
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : show difficulty ->"..D)
|
||
if #tide_defs[D][stage].suite == 0 then
|
||
ScriptLib.PrintContextLog(context, "## ASTER_ERR : no_monster_tide_begin")
|
||
return -1
|
||
elseif #tide_defs[D][stage].suite ~= #tide_defs[D][stage].weight then
|
||
ScriptLib.PrintContextLog(context, "## ASTER_ERR : Invalid Monster Tide Config")
|
||
return -1
|
||
end
|
||
local tide_ptr = LF_Handle_Random_Weight(context, stage, tide_defs[D], "suite")
|
||
--根据tide预设值创建tide
|
||
if tide_ptr > 0 then
|
||
ScriptLib.SetScenePlayBattleUidValue(context, 0, host, "tide_ptr", tide_ptr)
|
||
ScriptLib.AutoMonsterTide(context, play.monster_tide, play.group_main, suites[tide_ptr].monsters, tide_suite_config[tide_ptr].total, tide_suite_config[tide_ptr].min, tide_suite_config[tide_ptr].max)
|
||
else
|
||
return -1
|
||
end
|
||
return 0
|
||
end
|
||
|
||
function LF_Handle_Random_Weight(context, stage, table, name)
|
||
math.randomseed(ScriptLib.GetServerTime(context) + stage)
|
||
local weight_sum = 0
|
||
for i,v in ipairs(table[stage].weight) do
|
||
weight_sum = weight_sum + v
|
||
end
|
||
if weight_sum == 0 then
|
||
ScriptLib.PrintContextLog(context, "## ASTER_ERR : Weight Is Zero")
|
||
return -1
|
||
end
|
||
local weight_ran = math.random(1,weight_sum)
|
||
for i,v in ipairs(table[stage].weight) do
|
||
weight_ran = weight_ran - v
|
||
if weight_ran <= 0 then
|
||
return table[stage][name][i]
|
||
end
|
||
end
|
||
return -1
|
||
end
|
||
|
||
function LF_Attach_Ability(context, evt, num, str)
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : LF_Attach_Ability")
|
||
local host = ScriptLib.GetScenePlayBattleHostUid(context, 0)
|
||
ScriptLib.SetScenePlayBattlePlayTeamEntityGadgetId(context, play.group_main, 70370000 + num)
|
||
ScriptLib.SetScenePlayBattleUidValue(context, 0, host, "ratio_ptr", defs.score_ratio[str])
|
||
return 0
|
||
end
|
||
|
||
function LF_Random_Play_Difficulty(context, evt)
|
||
---[[
|
||
local M = ScriptLib.GetGroupVariableValue(context, "GM_Mode")
|
||
if M == 1 then
|
||
return "normal"
|
||
elseif M == 2 then
|
||
return "hard"
|
||
elseif M == 3 then
|
||
return "nightmare"
|
||
elseif M == 4 then
|
||
return "easy"
|
||
end
|
||
--]]
|
||
if 1 == ScriptLib.GetScenePlayBattleType(context, play.group_main) then
|
||
return "easy"
|
||
end
|
||
local max_difficulty = 0
|
||
for k,v in pairs(defs.difficulty_weight) do
|
||
max_difficulty = max_difficulty + v
|
||
end
|
||
math.randomseed(ScriptLib.GetServerTime(context) + evt.param1 + evt.param2)
|
||
local ran_difficulty = math.random(1,max_difficulty)
|
||
for k,v in pairs(defs.difficulty_weight) do
|
||
ran_difficulty = ran_difficulty - v
|
||
if ran_difficulty <= 0 then
|
||
return k
|
||
end
|
||
end
|
||
return 0
|
||
end
|
||
|
||
function LF_Set_Battle_Difficulty(context, evt, difficulty)
|
||
local host = ScriptLib.GetScenePlayBattleHostUid(context, 0)
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : Set_Initial_Difficulty->"..difficulty)
|
||
--ScriptLib.ShowTemplateReminder(context, 100 + difficulty, {0,0})
|
||
ScriptLib.SetScenePlayBattleUidValue(context, 0, host, play.difficulty, difficulty)
|
||
return 0
|
||
end
|
||
|
||
function LF_Handle_Stage_Change(context, prev_context, param1, param2, param3)
|
||
local stage = param1
|
||
local suite = param2
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : handle_stage_change : stage->"..stage.." | suite->"..suite)
|
||
--处理progress阶段转换的逻辑
|
||
if #suites[suite].monsters == 0 then
|
||
ScriptLib.PrintContextLog(context, "## ASTER_ERR : Invalid Monster Suite->"..suite)
|
||
return -1
|
||
end
|
||
local host = ScriptLib.GetScenePlayBattleHostUid(context, 0)
|
||
ScriptLib.AddExtraGroupSuite(context, play.group_stage, suite)
|
||
ScriptLib.SetScenePlayBattleUidValue(context, 0, host, "prev_stage_suite", suite)
|
||
--ScriptLib.ShowTemplateReminder(context, 109, {0,0})
|
||
return 0
|
||
end
|
||
|
||
function LF_Uid_Op(context, stage)
|
||
--用于处理点名逻辑
|
||
local buff_type = LF_Get_Uid_Op_Buff(context, stage)
|
||
local uid_list = LF_Get_Uid_Op_Target(context, buff_type)
|
||
local host = ScriptLib.GetScenePlayBattleHostUid(context, 0)
|
||
--[[if #uid_list == 0 then
|
||
ScriptLib.PrintContextLog(context, "## ASTER_ERR : Invalid Op Uid List")
|
||
return -1
|
||
end--]]
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : random_buff -> "..buff_type)
|
||
if buff_type == 3 or buff_type == 5 then
|
||
ScriptLib.SetScenePlayBattleUidValue(context, 0, host, "Op_Uid", uid_list[1])
|
||
else
|
||
ScriptLib.SetScenePlayBattleUidValue(context, 0, host, "Op_Uid", 0)
|
||
end
|
||
ScriptLib.ScenePlayBattleUidOp(context, play.group_main, defs.gadget_aster, uid_list, buff_type, "random_buff_aster", {}, {}, buff_type, 30)
|
||
return 0
|
||
end
|
||
|
||
function LF_Init_Uid_Op_Buff(context, evt)
|
||
local host = ScriptLib.GetScenePlayBattleHostUid(context, 0)
|
||
local D = ScriptLib.GetScenePlayBattleUidValue(context, 0, host, play.difficulty)
|
||
--初始化点名buff栈,栈的深度要掐头去尾
|
||
local buff_stack = 0
|
||
for i,v in ipairs(buff_def[D]) do
|
||
local buff_ = LF_Handle_Random_Weight(context, i, buff_def[D], "buff")
|
||
buff_stack = buff_stack + math.pow(10,i-1)*buff_
|
||
end
|
||
if buff_stack > 0 then
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : buff_stack -> "..buff_stack)
|
||
ScriptLib.SetScenePlayBattleUidValue(context, 0, host, "buff_stack", buff_stack)
|
||
else
|
||
ScriptLib.PrintContextLog(context, "## ASTER_ERR : buff_stack_error")
|
||
end
|
||
return 0
|
||
end
|
||
|
||
function LF_Get_Uid_Op_Buff(context, stage)
|
||
local host = ScriptLib.GetScenePlayBattleHostUid(context, 0)
|
||
local buff_stack = ScriptLib.GetScenePlayBattleUidValue(context, 0, host,"buff_stack")
|
||
return buff_stack//math.pow(10,stage-1)%10
|
||
end
|
||
|
||
function LF_Get_Uid_Op_Target(context, buff_type)
|
||
--点名返回的目标
|
||
local user = ScriptLib.GetSceneUidList(context)
|
||
local list = {}
|
||
math.randomseed(ScriptLib.GetServerTime(context) + buff_type)
|
||
--if buff_type == 1 or buff_type == 2 then
|
||
list[1] = user[math.random(1,#user)]
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : uid_op_target -> "..list[1])
|
||
--end
|
||
return list
|
||
end
|
||
|
||
function LF_Set_Timer(context, evt)
|
||
local host = ScriptLib.GetScenePlayBattleHostUid(context, 0)
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : set_timer \"aster_timer\"-> "..defs.aster_timer[1])
|
||
ScriptLib.CreateGroupTimerEvent(context, play.group_timer, "aster_timer", defs.aster_timer[1])
|
||
ScriptLib.SetScenePlayBattleUidValue(context, 0, host,"timer_ptr", 1)
|
||
return 0
|
||
end
|
||
|
||
function LF_Modify_Gadget_Group(context, stage)
|
||
ScriptLib.PrintContextLog(context, "## ASTER_LOG : modify_gadget_group | stage -> "..stage)
|
||
local host = ScriptLib.GetScenePlayBattleHostUid(context, 0)
|
||
local D = ScriptLib.GetScenePlayBattleUidValue(context, 0, host, play.difficulty)
|
||
if circle_type_defs[D] == 1 then
|
||
--交分台锁位置
|
||
ScriptLib.SetGadgetStateByConfigId(context, defs.gadget_aster, 202)
|
||
elseif circle_type_defs[D] == 2 then
|
||
--交分台换位置
|
||
ScriptLib.SetGadgetStateByConfigId(context, defs.gadget_aster, 201)
|
||
end
|
||
if stage == 0 then
|
||
ScriptLib.SetScenePlayBattleUidValue(context, 0, host, "circle_ptr", tide_defs[D][stage].circle)
|
||
ScriptLib.AddExtraGroupSuite(context, play.group_gadget, tide_defs[D][stage].circle)
|
||
elseif circle_type_defs[D] == 1 then
|
||
ScriptLib.SetScenePlayBattleUidValue(context, 0, host, "circle_ptr", tide_defs[D][stage].circle)
|
||
local prev_stage = ScriptLib.GetScenePlayBattleUidValue(context, 0, host, "prev_stage")
|
||
ScriptLib.KillExtraGroupSuite(context, play.group_gadget, tide_defs[D][prev_stage].circle)
|
||
ScriptLib.AddExtraGroupSuite(context, play.group_gadget, tide_defs[D][stage].circle)
|
||
end
|
||
ScriptLib.SetScenePlayBattleUidValue(context, 0, host, "prev_stage", stage)
|
||
return 0
|
||
end
|
||
|
||
LF_Initialize_Group(triggers, suites, defs.group_id) |