0
0
mirror of https://gitlab.com/YuukiPS/GC-Resources.git synced 2025-04-28 09:05:26 +00:00
2023-10-22 15:27:31 +08:00

761 lines
30 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--[[
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}
}
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)