From 6ab9e8a92b3f92dcce62a364656fc139e9253133 Mon Sep 17 00:00:00 2001
From: MuelsyseBot_v1 <@>
Date: Wed, 7 Feb 2024 20:02:39 +0800
Subject: [PATCH] [CN UPDATE] Client:2.2.01 Data:24-02-06-16-52-58-51f4ae
---
zh_CN/gamedata/[uc]lua/base/dialog/UIBase.lua | 8 +
.../feature/sandboxv2/SandboxV2ModeModule.lua | 457 ++++++++++++++++++
.../hotfixes/CharacterRepoPageHotfixer.lua | 26 +
.../gamedata/[uc]lua/hotfixes/DefinedFix.lua | 2 +
.../ProfessionCntToggleCheckerHotfixer.lua | 59 +++
.../[uc]lua/hotfixes/SandboxV2Hotfixer.lua | 19 +
zh_CN/gamedata/battle/buff_template_data.json | 94 ++--
zh_CN/gamedata/excel/activity_table.json | 8 +
zh_CN/gamedata/excel/battle_equip_table.json | 16 +-
zh_CN/gamedata/excel/data_version.txt | 2 +-
zh_CN/gamedata/excel/sandbox_perm_table.json | 106 +++-
.../levels/enemydata/enemy_database.json | 5 +
.../sandbox/sandbox_1/level_sandbox1_77.json | 14 +-
13 files changed, 766 insertions(+), 50 deletions(-)
create mode 100644 zh_CN/gamedata/[uc]lua/feature/sandboxv2/SandboxV2ModeModule.lua
create mode 100644 zh_CN/gamedata/[uc]lua/hotfixes/CharacterRepoPageHotfixer.lua
create mode 100644 zh_CN/gamedata/[uc]lua/hotfixes/ProfessionCntToggleCheckerHotfixer.lua
diff --git a/zh_CN/gamedata/[uc]lua/base/dialog/UIBase.lua b/zh_CN/gamedata/[uc]lua/base/dialog/UIBase.lua
index 6c47d434a..17d995ae7 100644
--- a/zh_CN/gamedata/[uc]lua/base/dialog/UIBase.lua
+++ b/zh_CN/gamedata/[uc]lua/base/dialog/UIBase.lua
@@ -14,6 +14,14 @@
UIBase = Class("UIBase");
+function UIBase.GetLuaLayout(go)
+ if go == nil then
+ return nil
+ end
+ return go:GetComponent("Torappu.Lua.LuaLayout")
+end
+
+
function UIBase:Initialize(gobj, parent)
self.m_destroyed = false;
diff --git a/zh_CN/gamedata/[uc]lua/feature/sandboxv2/SandboxV2ModeModule.lua b/zh_CN/gamedata/[uc]lua/feature/sandboxv2/SandboxV2ModeModule.lua
new file mode 100644
index 000000000..c2e69e9af
--- /dev/null
+++ b/zh_CN/gamedata/[uc]lua/feature/sandboxv2/SandboxV2ModeModule.lua
@@ -0,0 +1,457 @@
+local eutil = CS.Torappu.Lua.Util
+local CSPageController = CS.Torappu.UI.UIPageController
+local CSPageFinder = CS.Torappu.UI.UIPageFinder
+local CSPageInterface = CSPageFinder.Interface
+local CSSandboxUtil = CS.Torappu.UI.SandboxPerm.SandboxV2.SandboxV2Util
+local CSPlayerData = CS.Torappu.PlayerData
+local CSJObjectWrapper = CS.Torappu.JObjectWrapper
+local CSUEObject = CS.UnityEngine.Object
+local CSAnimSwitchTween = CS.Torappu.UI.AnimationSwitchTween
+local CSAnimSwitchTweenBuilder = CSAnimSwitchTween.Builder
+local CSAnimLocation = CS.Torappu.UI.UIAnimationLocation
+local CSTweenEase = CS.DG.Tweening.Ease
+local CSActivityDB = CS.Torappu.ActivityDB
+
+local CSCustomDialogMgr = CS.Torappu.UI.UICustomDialogMgr
+local CSDynDialogParam = CSCustomDialogMgr.DynDialogParam
+
+local CSSandboxConfirmDialog = CS.Torappu.UI.SandboxPerm.SandboxV2.SandboxV2ConfirmDialog
+local CSSandboxConfirmDialogOptions = CSSandboxConfirmDialog.Options
+local CSSandboxV2ConfirmIconType = CS.Torappu.SandboxV2ConfirmIconType
+local CSSandboxV2ConfirmDialogConfirmVisualType = CS.Torappu.UI.SandboxPerm.SandboxV2.SandboxV2ConfirmDialogConfirmVisualType
+local CSSandboxV2ToastType = CS.Torappu.UI.SandboxPerm.SandboxV2.SandboxV2Const.SandboxV2ToastType
+
+local TOPIC_SANDBOX_1 = "sandbox_1"
+local SD1_MODE_PREFAB_PATH = "UI/SandboxPerm/Topics/[UC]sandbox_1/Home/mode_view"
+local SD1_BUFF_KEY_TMPL = "EXPLORE_BUFF_{0}"
+local NORMAL_MODE_NAME_KEY = "NORMAL_MODE_NAME"
+local HARD_MODE_NAME_KEY = "HARD_MODE_NAME"
+
+local SRV_CODE_EXPLORE_MODE = "/sandboxPerm/sandboxV2/exploreMode"
+
+local function _IsUEObjectDestroyed(obj)
+ if obj == nil then
+ return true
+ end
+ local ok, ret = xpcall(function()
+ return obj:IsDestroyed()
+ end, debug.traceback)
+ if not ok then
+
+ return true
+ end
+ return ret
+end
+
+local s_modeModules = {}
+
+local s_ShowSandboxV2ConfirmDialog = nil
+local function _GetShowSandboxV2ConfirmDialog()
+ if s_ShowSandboxV2ConfirmDialog ~= nil then
+ return s_ShowSandboxV2ConfirmDialog
+ end
+ s_ShowSandboxV2ConfirmDialog = xlua.get_generic_method(CSCustomDialogMgr, "Show")
+ s_ShowSandboxV2ConfirmDialog = s_ShowSandboxV2ConfirmDialog(CSSandboxConfirmDialog, CSSandboxConfirmDialogOptions)
+ return s_ShowSandboxV2ConfirmDialog
+end
+
+
+local SandboxV2ModeModule = Class("SandboxV2ModeModule")
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+local SD1ModeModule = Class("SD1ModeModule")
+
+
+
+function SandboxV2ModeModule.InitModeOnEntry(topicId, hostLayout)
+ if topicId == TOPIC_SANDBOX_1 then
+ s_modeModules[topicId] = SD1ModeModule.InitIfNot(topicId, hostLayout, s_modeModules[topicId])
+ end
+end
+
+
+function SandboxV2ModeModule.NotifyRefresh(topicId)
+ if topicId == TOPIC_SANDBOX_1 then
+ local module = s_modeModules[topicId]
+ SD1ModeModule.NotifyRefresh(module)
+ end
+end
+
+
+
+
+function SD1ModeModule.InitIfNot(topicId, hostLayout, existInst)
+
+ if hostLayout == nil then
+ LogError("valid hostLayout must be provided")
+ return nil
+ end
+ local hostCtrls = {}
+ hostLayout:TraverseCtrlDefines(function(key, ctrl)
+ hostCtrls[key] = ctrl
+ end)
+ local container = hostCtrls.modeContainer
+
+ if existInst ~= nil and existInst.parent ~= container then
+ existInst:DestroyModule()
+ existInst = nil
+ end
+ if existInst ~= nil then
+ return existInst
+ end
+
+
+ if _IsUEObjectDestroyed(container) then
+ LogError("valid modeContainer should be configed on hostLayout: ".. hostLayout.gameObject.name)
+ return nil
+ end
+ local pageFinder = CSPageFinder()
+ local pageInterface = pageFinder:Current(container)
+ local assetLoader = pageInterface:GetAssetLoader()
+ if assetLoader == nil then
+ return nil
+ end
+ local goPrefab = assetLoader:LoadAsset(SD1_MODE_PREFAB_PATH)
+ if goPrefab == nil then
+ return nil
+ end
+
+ local gameObject = CS.UnityEngine.GameObject.Instantiate(goPrefab, container)
+ local layout = UIBase.GetLuaLayout(gameObject)
+ if layout == nil then
+ LogError(SD1_MODE_PREFAB_PATH .. " is not LuaLayout")
+ gameObject:Destroy()
+ return nil
+ end
+
+ local inst = SD1ModeModule.new(topicId, gameObject, layout, pageInterface)
+ inst.parent = container
+
+ inst:_Init()
+ inst:_Refresh()
+ return inst
+end
+
+
+function SD1ModeModule.NotifyRefresh(module)
+ if module == nil or module.class ~= SD1ModeModule then
+ return
+ end
+ module:_Refresh()
+end
+
+
+
+
+
+function SD1ModeModule:ctor(topicId, gameObject, layout, pageInterface)
+ self.m_isDisposed = false
+ self.m_topicId = topicId
+ self.m_buttons = {}
+ self.m_gameObject = gameObject
+ self.m_layout = layout
+ self.m_pageInterface = pageInterface
+ self.m_exploreMode = false
+ local this = self
+ layout:BindLayoutEventListener(self)
+ layout:TraverseCtrlDefines(function(name, ctrl)
+ this["_"..name] = ctrl
+ end);
+ layout:TraverseValueDefines(function(name, value)
+ this["_"..name] = value
+ end)
+end
+
+
+function SD1ModeModule:DestroyModule()
+ if not _IsUEObjectDestroyed(self.m_gameObject) then
+ CSUEObject.Destroy(self.m_gameObject)
+ else
+ self:Dispose()
+ end
+end
+
+
+function SD1ModeModule:AddButtonClickListener(btn, func, ...)
+ if (not btn) or self.m_isDisposed then
+ return;
+ end
+ local args = {...};
+ local this = self;
+ btn.onClick:AddListener(function()
+ func(this, table.unpack(args));
+ end);
+ if self.m_buttons == nil then
+ self.m_buttons = {}
+ end
+ table.insert(self.m_buttons, btn)
+end
+
+
+function SD1ModeModule:Dispose()
+ self.m_isDisposed = true
+ if self.m_buttons ~=nil then
+ for i, btn in ipairs(self.m_buttons) do
+ if not _IsUEObjectDestroyed(btn) then
+ btn.onClick:RemoveAllListeners()
+ btn.onClick:Invoke()
+ end
+ end
+ self.m_buttons = nil
+ end
+ if self.m_layout ~= nil then
+ self.m_layout:BindLayoutEventListener(nil)
+ self.m_layout = nil
+ end
+ self.m_gameObject = nil
+
+ if s_modeModules[self.m_topicId] == self then
+ s_modeModules[self.m_topicId] = nil
+ end
+
+ self.m_tweenExploreOn:Release()
+ self.m_tweenExploreOff:Release()
+end
+
+
+function SD1ModeModule:OnEnable()
+end
+
+function SD1ModeModule:OnDisable()
+end
+
+function SD1ModeModule:OnDestroy()
+ self:Dispose()
+end
+
+function SD1ModeModule:OnResume()
+end
+
+function SD1ModeModule:OnExit()
+end
+
+function SD1ModeModule:OnTransInEnd()
+end
+
+function SD1ModeModule:OnTransOutEnd()
+end
+
+
+function SD1ModeModule:_Init()
+ self:AddButtonClickListener(self._btnSwitch, self.OnModeButtonClicked)
+ self.m_tweenExploreOn = self:_CreateAnimSwitch(self._clipExploreOn)
+ self.m_tweenExploreOn:Reset(false)
+ self.m_tweenExploreOff = self:_CreateAnimSwitch(self._clipExploreOff)
+ self.m_tweenExploreOff:Reset(false)
+
+ self.m_enableExploreTween = false
+end
+
+
+function SD1ModeModule:_Refresh()
+ self:_UpdateData()
+
+ local isActive = self:IsModuleActive()
+ eutil.SetActiveIfNecessary(self.m_gameObject, isActive)
+ if not isActive then
+ return
+ end
+
+ if self.m_exploreMode then
+ self:_SetExploreSwitchTween(self.m_tweenExploreOn, self.m_tweenExploreOff)
+ else
+ self:_SetExploreSwitchTween(self.m_tweenExploreOff, self.m_tweenExploreOn)
+ end
+end
+
+
+
+function SD1ModeModule:_SetExploreSwitchTween(enable, disable)
+ local isInitialRendering = (not enable.isShow) and (not disable.isShow)
+
+ local skipTween = isInitialRendering or (not self.m_enableExploreTween)
+
+
+ disable:Reset(false)
+ if skipTween then
+ enable:Reset(true)
+ return
+ end
+
+
+ if (not enable.isShow) or enable.isTweening then
+ enable:Reset(false)
+ enable:Show()
+ end
+end
+
+
+function SD1ModeModule:OnModeButtonClicked()
+ if not self:IsModuleActive() then
+ return
+ end
+ self:_OpenJudgeDialog()
+end
+
+
+function SD1ModeModule:IsPageStable()
+ return (not CSPageController.isTransiting) and (self.m_pageInterface:IsSamePage(CSPageController.activePage))
+end
+
+
+
+function SD1ModeModule:IsModuleActive()
+ if self.m_isDisposed then
+ return false
+ end
+
+ if not self.m_isNotGuide then
+ return false
+ end
+ return true
+end
+
+
+function SD1ModeModule:_UpdateData()
+ local this = self
+ local ok, ret = xpcall(function()
+ xlua.private_accessible(CSPlayerData)
+ local statusObj = CSPlayerData.instance.m_rawData:GetValue("sandboxPerm"):GetValue("template"):GetValue("SANDBOX_V2"):
+ GetValue(this.m_topicId):GetValue("status")
+ local statusWrapper = CSJObjectWrapper(statusObj)
+
+ this.m_exploreMode = statusWrapper:GetBool("exploreMode")
+ local isGuide = statusWrapper:GetBool("isGuide")
+ this.m_isNotGuide = not isGuide
+ end, debug.traceback)
+ if not ok then
+ LogError("[_UpdateData] ".. ret)
+ self.m_exploreMode = false
+ self.m_isNotGuide = false
+ end
+end
+
+
+
+function SD1ModeModule:_CreateAnimSwitch(clip)
+ local animLocation = CSAnimLocation()
+ animLocation.animationWrapper = self._anim
+ animLocation.animationName = clip.name
+ local builder = CSAnimSwitchTweenBuilder(animLocation)
+ builder.ease = CSTweenEase.Linear
+ builder.inactivateTargetIfHide = false
+ return builder:Build()
+end
+
+
+function SD1ModeModule:_OpenJudgeDialog()
+ if not self:IsPageStable() then
+ return
+ end
+
+ local toExploreMode = not self.m_exploreMode
+
+ local options = CSSandboxConfirmDialogOptions.COMMON_OPTIONS
+ options.iconId = CSSandboxUtil.LoadConfirmDialogIconId(self.m_topicId, CSSandboxV2ConfirmIconType.COMMON)
+ options.confirmStr = StringRes.SANDBOX_V2_EXPLORE_MODE_CONFIRM
+ options.confirmVisualType = CSSandboxV2ConfirmDialogConfirmVisualType.GREEN
+ local dialogParam = CSDynDialogParam()
+ dialogParam.resPath = CS.Torappu.ResourceUrls.GetSandboxV2ConfirmDialogPath()
+ dialogParam.forceSingleInst = true
+
+ if toExploreMode then
+ options.titleStr = eutil.Format(StringRes.SANDBOX_V2_EXPLORE_MODE_ON_TITLE, self:_ReadFromActStringMap(NORMAL_MODE_NAME_KEY))
+ else
+ options.titleStr = eutil.Format(StringRes.SANDBOX_V2_EXPLORE_MODE_OFF_TITLE, self:_ReadFromActStringMap(HARD_MODE_NAME_KEY))
+ end
+
+ local descList = {}
+ local descIndexValid = false
+ local descIndex = 1
+ repeat
+ local key = eutil.Format(SD1_BUFF_KEY_TMPL, descIndex)
+ local descItem = self:_ReadFromActStringMap(key)
+
+ descIndexValid = descItem ~= nil and descItem ~= ""
+
+ if descIndexValid then
+ descItem = eutil.FormatRichTextFromData(descItem)
+ table.insert(descList, descItem)
+ end
+
+ descIndex = descIndex + 1
+ until not descIndexValid
+ options.descStr = table.concat(descList, '\n')
+
+ local this = self
+ options.callback = function()
+ this:_SendExploreModeService()
+ end
+
+ _GetShowSandboxV2ConfirmDialog()(CSCustomDialogMgr.instance, dialogParam, options)
+end
+
+
+
+function SD1ModeModule:_ReadFromActStringMap(key)
+ local ret = CSActivityDB.instance:GetStringRes(self.m_topicId, key)
+ if ret == nil then
+ return ""
+ end
+ return ret
+end
+
+
+function SD1ModeModule:_HandleSwitchExploreResp(response)
+ self:_Refresh()
+
+ local modeName;
+ if self.m_exploreMode then
+ modeName = self:_ReadFromActStringMap(NORMAL_MODE_NAME_KEY)
+ else
+ modeName = self:_ReadFromActStringMap(HARD_MODE_NAME_KEY)
+ end
+ CSSandboxUtil.ShowSandboxTextToast(self.m_pageInterface:GetAssetLoader(), CSSandboxV2ToastType.COMMON,
+ eutil.Format(StringRes.SANDBOX_V2_EXPLORE_MODE_TOAST, modeName))
+end
+
+function SD1ModeModule:_SendExploreModeService()
+ if not self:IsModuleActive() then
+ return
+ end
+ local targetOpen = not self.m_exploreMode
+ local openVal
+ if targetOpen then
+ openVal = 1
+ else
+ openVal = 0
+ end
+ UISender.me:SendRequest(SRV_CODE_EXPLORE_MODE,
+ {
+ topicId = self.m_topicId,
+ open = openVal
+ },
+ {
+ onProceed = Event.Create(self, self._HandleSwitchExploreResp)
+ })
+end
+
+return SandboxV2ModeModule
\ No newline at end of file
diff --git a/zh_CN/gamedata/[uc]lua/hotfixes/CharacterRepoPageHotfixer.lua b/zh_CN/gamedata/[uc]lua/hotfixes/CharacterRepoPageHotfixer.lua
new file mode 100644
index 000000000..408902680
--- /dev/null
+++ b/zh_CN/gamedata/[uc]lua/hotfixes/CharacterRepoPageHotfixer.lua
@@ -0,0 +1,26 @@
+local CharacterRepoPageHotfixer = Class("CharacterRepoPageHotfixer", HotfixBase)
+
+local function _FixCustomSetActive(self, active)
+ local ret = self:CustomSetActive(active)
+
+ local rootCanvasGroup = self:GetComponent(typeof(CS.UnityEngine.CanvasGroup))
+ if rootCanvasGroup ~= nil and not active then
+ rootCanvasGroup:DOKill(false)
+ end
+
+ return ret
+end
+
+function CharacterRepoPageHotfixer:OnInit()
+ xlua.private_accessible(CS.Torappu.UI.CharacterRepo.CharacterRepoPage)
+ self:Fix_ex(CS.Torappu.UI.CharacterRepo.CharacterRepoPage, "CustomSetActive", function(self, active)
+ local ok, ret = xpcall(_FixCustomSetActive, debug.traceback, self, active)
+ if not ok then
+ LogError("[CharacterRepoPage] fix failed: " .. ret)
+ else
+ return ret
+ end
+ end)
+end
+
+return CharacterRepoPageHotfixer
\ No newline at end of file
diff --git a/zh_CN/gamedata/[uc]lua/hotfixes/DefinedFix.lua b/zh_CN/gamedata/[uc]lua/hotfixes/DefinedFix.lua
index 4e6929bf0..ae3f8e898 100644
--- a/zh_CN/gamedata/[uc]lua/hotfixes/DefinedFix.lua
+++ b/zh_CN/gamedata/[uc]lua/hotfixes/DefinedFix.lua
@@ -5,6 +5,8 @@ local list =
"HotFixes/TestStubHotfixer",
"HotFixes/SandboxV2Hotfixer",
"HotFixes/AttachListenerToTileAbilityHotfixer",
+ "HotFixes/ProfessionCntToggleCheckerHotfixer",
+ "Hotfixes/CharacterRepoPageHotfixer"
};
return list;
\ No newline at end of file
diff --git a/zh_CN/gamedata/[uc]lua/hotfixes/ProfessionCntToggleCheckerHotfixer.lua b/zh_CN/gamedata/[uc]lua/hotfixes/ProfessionCntToggleCheckerHotfixer.lua
new file mode 100644
index 000000000..0dc90dcf2
--- /dev/null
+++ b/zh_CN/gamedata/[uc]lua/hotfixes/ProfessionCntToggleCheckerHotfixer.lua
@@ -0,0 +1,59 @@
+
+
+
+
+
+local ProfessionCntToggleCheckerHotfixer = Class("ProfessionCntToggleCheckerHotfixer", HotfixBase)
+
+local function _Fix_CheckMaxSameProfessionCount(self)
+ self.m_professionCount:Clear();
+ local units = CS.Torappu.Battle.BattleController.instance.unitManager.characters
+ for i = 0, units.count - 1 do
+ local target = units[i]
+ if target ~= nil and target.alive and target.playerSide == self.owner.playerSide and self:_CheckProfession(target) then
+ self.m_professionCount[target.data.profession] = self.m_professionCount[target.data.profession] + 1
+ end
+ end
+ local count = 0
+ for i = 0, self.m_professionCount.Count - 1 do
+ count = math.max(count, self.m_professionCount:Get(i).Value)
+ end
+ return count
+end
+
+local function _Fix_CheckMaxDifferentProfessionCount(self)
+ self.m_professionCount:Clear();
+ local units = CS.Torappu.Battle.BattleController.instance.unitManager.characters
+ for i = 0, units.count - 1 do
+ local target = units[i]
+ if target ~= nil and target.alive and target.playerSide == self.owner.playerSide and self:_CheckProfession(target) then
+ self.m_professionCount[target.data.profession] = self.m_professionCount[target.data.profession] + 1
+ end
+ end
+ return self.m_professionCount.Count
+end
+
+function ProfessionCntToggleCheckerHotfixer:OnInit()
+ xlua.private_accessible(CS.Torappu.Battle.Abilities.ProfessionCntToggleChecker)
+ self:Fix_ex(CS.Torappu.Battle.Abilities.ProfessionCntToggleChecker, "_CheckMaxSameProfessionCount", function(self)
+ local ok, ret = xpcall(_Fix_CheckMaxSameProfessionCount, debug.traceback, self)
+ if not ok then
+ LogError("[Hotfix] failed to _Fix_CheckMaxSameProfessionCount : ".. ret)
+ return self:_CheckMaxSameProfessionCount()
+ else
+ return ret
+ end
+ end)
+
+ self:Fix_ex(CS.Torappu.Battle.Abilities.ProfessionCntToggleChecker, "_CheckMaxDifferentProfessionCount", function(self)
+ local ok, ret = xpcall(_Fix_CheckMaxDifferentProfessionCount, debug.traceback, self)
+ if not ok then
+ LogError("[Hotfix] failed to _Fix_CheckMaxDifferentProfessionCount : ".. ret)
+ return self:_CheckMaxDifferentProfessionCount()
+ else
+ return ret
+ end
+ end)
+end
+
+return ProfessionCntToggleCheckerHotfixer
\ No newline at end of file
diff --git a/zh_CN/gamedata/[uc]lua/hotfixes/SandboxV2Hotfixer.lua b/zh_CN/gamedata/[uc]lua/hotfixes/SandboxV2Hotfixer.lua
index ee3b13d9b..8b5b2d399 100644
--- a/zh_CN/gamedata/[uc]lua/hotfixes/SandboxV2Hotfixer.lua
+++ b/zh_CN/gamedata/[uc]lua/hotfixes/SandboxV2Hotfixer.lua
@@ -1,3 +1,5 @@
+local SandboxV2ModeModule = require("Feature/SandboxV2/SandboxV2ModeModule")
+
local SandboxV2Hotfixer = Class("SandboxV2Hotfixer", HotfixBase);
@@ -26,6 +28,22 @@ local function _FixApplyEquipId(self,equipId)
end
end
+local function _SandboxV2HomeController_InitIfNot(self)
+ local isFirstInit = not self.m_isInited
+ self:_InitIfNot()
+
+ local ok, ret = xpcall(function()
+ if isFirstInit then
+ SandboxV2ModeModule.InitModeOnEntry(self.m_topicId, UIBase.GetLuaLayout(self.gameObject))
+ else
+ SandboxV2ModeModule.NotifyRefresh(self.m_topicId)
+ end
+ end, debug.traceback)
+ if not ok then
+ LogError("[SandboxV2HomeController] _InitIfNot: ".. ret)
+ end
+end
+
function SandboxV2Hotfixer:OnInit()
xlua.private_accessible(CS.Torappu.UI.SandboxPerm.SandboxPermUtil);
self:Fix_ex(CS.Torappu.UI.SandboxPerm.SandboxPermUtil, "CheckIfSandboxInPlayerData", function(topicId)
@@ -45,6 +63,7 @@ function SandboxV2Hotfixer:OnInit()
return value;
end);
+ self:Fix_ex(CS.Torappu.UI.SandboxPerm.SandboxV2.SandboxV2HomeController, "_InitIfNot", _SandboxV2HomeController_InitIfNot)
end
function SandboxV2Hotfixer:OnDispose()
diff --git a/zh_CN/gamedata/battle/buff_template_data.json b/zh_CN/gamedata/battle/buff_template_data.json
index e04254fec..44b8614f8 100644
--- a/zh_CN/gamedata/battle/buff_template_data.json
+++ b/zh_CN/gamedata/battle/buff_template_data.json
@@ -95751,7 +95751,7 @@
"firstTriggerInterval": -1.0,
"priority": -1,
"priorityBBKeys": [],
- "stripBlackboardParamsWithBuffKey": false,
+ "stripBlackboardParamsWithBuffKey": true,
"blackboard": []
},
"_buffOwner": "BUFF_OWNER",
@@ -158874,41 +158874,57 @@
{
"$type": "Torappu.Battle.Action.Nodes+IfElse, Assembly-CSharp",
"_conditionNode": {
- "$type": "Torappu.Battle.Action.Nodes+CheckContainsBuff, Assembly-CSharp",
- "_targetType": "BUFF_SOURCE",
- "_buffKeys": [
- "shu_s_3"
- ],
- "isAND": true,
- "_loadFromBlackboard": false
+ "$type": "Torappu.Battle.Action.Nodes+CheckEntityDisappeared, Assembly-CSharp",
+ "_targetType": "BUFF_OWNER"
},
"_succeedNodes": [
{
- "$type": "Torappu.Battle.Action.Nodes+AttachAsDerivedBuffById, Assembly-CSharp",
- "_sourceType": "BUFF_SOURCE",
- "_buffKey": "shu_s_3",
- "_loadFromBlackboard": false,
- "_finishDerivedBuffIfParentFinish": true
- },
- {
- "$type": "Torappu.Battle.Action.Nodes+AssignBuffBlackboardFromOthers, Assembly-CSharp",
- "_targetType": "BUFF_SOURCE",
- "_blackboardKey": "max_distance",
- "_valueKey": "max_distance",
- "_buffKey": "shu_s_3"
- },
- {
- "$type": "Torappu.Battle.Action.Nodes+AssignRootTileToBB, Assembly-CSharp",
- "_targetType": "BUFF_OWNER",
- "_colKey": "start_col",
- "_rowKey": "start_row"
+ "$type": "Torappu.Battle.Action.Nodes+FinishBuff, Assembly-CSharp",
+ "_decCntIfStack": false,
+ "_updateOverrideMap": true
}
],
"_failNodes": [
{
- "$type": "Torappu.Battle.Action.Nodes+FinishBuff, Assembly-CSharp",
- "_decCntIfStack": false,
- "_updateOverrideMap": true
+ "$type": "Torappu.Battle.Action.Nodes+IfElse, Assembly-CSharp",
+ "_conditionNode": {
+ "$type": "Torappu.Battle.Action.Nodes+CheckContainsBuff, Assembly-CSharp",
+ "_targetType": "BUFF_SOURCE",
+ "_buffKeys": [
+ "shu_s_3"
+ ],
+ "isAND": true,
+ "_loadFromBlackboard": false
+ },
+ "_succeedNodes": [
+ {
+ "$type": "Torappu.Battle.Action.Nodes+AttachAsDerivedBuffById, Assembly-CSharp",
+ "_sourceType": "BUFF_SOURCE",
+ "_buffKey": "shu_s_3",
+ "_loadFromBlackboard": false,
+ "_finishDerivedBuffIfParentFinish": true
+ },
+ {
+ "$type": "Torappu.Battle.Action.Nodes+AssignBuffBlackboardFromOthers, Assembly-CSharp",
+ "_targetType": "BUFF_SOURCE",
+ "_blackboardKey": "max_distance",
+ "_valueKey": "max_distance",
+ "_buffKey": "shu_s_3"
+ },
+ {
+ "$type": "Torappu.Battle.Action.Nodes+AssignRootTileToBB, Assembly-CSharp",
+ "_targetType": "BUFF_OWNER",
+ "_colKey": "start_col",
+ "_rowKey": "start_row"
+ }
+ ],
+ "_failNodes": [
+ {
+ "$type": "Torappu.Battle.Action.Nodes+FinishBuff, Assembly-CSharp",
+ "_decCntIfStack": false,
+ "_updateOverrideMap": true
+ }
+ ]
}
]
}
@@ -204673,6 +204689,26 @@
]
}
},
+ "sandbox_2_enable_only_rush": {
+ "templateKey": "sandbox_2_enable_only_rush",
+ "effectKey": "",
+ "onEventPriority": "DEFAULT",
+ "eventToActions": {
+ "ON_BUFF_START": [
+ {
+ "$type": "Torappu.Battle.Action.Nodes+SandboxIsRushEnemyMode, Assembly-CSharp"
+ },
+ {
+ "$type": "Torappu.Battle.Action.Nodes+IfNot, Assembly-CSharp"
+ },
+ {
+ "$type": "Torappu.Battle.Action.Nodes+FinishBuff, Assembly-CSharp",
+ "_decCntIfStack": false,
+ "_updateOverrideMap": true
+ }
+ ]
+ }
+ },
"damage_scale[element]": {
"templateKey": "damage_scale[element]",
"effectKey": "",
diff --git a/zh_CN/gamedata/excel/activity_table.json b/zh_CN/gamedata/excel/activity_table.json
index 9b7cad16c..a95d4a116 100644
--- a/zh_CN/gamedata/excel/activity_table.json
+++ b/zh_CN/gamedata/excel/activity_table.json
@@ -156841,6 +156841,14 @@
"HIDDEN_MISSION_UPDATE": "档案破解进度{0}/{1}",
"HIDDEN_STAGE_UNLOCK": "发现莱茵生命加密档案",
"HIDDEN_STAGE_UPDATE": "档案数据已更新"
+ },
+ "sandbox_1": {
+ "EXPLORE_BUFF_1": "资源最大生命值降低25%",
+ "EXPLORE_BUFF_2": "食材和食品转化为能量饮料的效率提升100%",
+ "EXPLORE_BUFF_3": "敌袭敌人最大生命值及攻击力降低50%",
+ "EXPLORE_BUFF_4": "*以上效果在陌域中不生效;切换模式不改变繁荣点数转化效率",
+ "NORMAL_MODE_NAME": "标准模式",
+ "HARD_MODE_NAME": "挑战模式"
}
}
}
\ No newline at end of file
diff --git a/zh_CN/gamedata/excel/battle_equip_table.json b/zh_CN/gamedata/excel/battle_equip_table.json
index 0850070cc..1e77b49dd 100644
--- a/zh_CN/gamedata/excel/battle_equip_table.json
+++ b/zh_CN/gamedata/excel/battle_equip_table.json
@@ -76121,11 +76121,11 @@
"blackboard": [
{
"key": "max_stack_cnt",
- "value": 6.0
+ "value": 5.0
},
{
"key": "atk",
- "value": 0.05
+ "value": 0.06
}
]
},
@@ -76145,11 +76145,11 @@
"blackboard": [
{
"key": "max_stack_cnt",
- "value": 7.0
+ "value": 5.0
},
{
"key": "atk",
- "value": 0.05
+ "value": 0.07
}
]
}
@@ -76226,11 +76226,11 @@
"blackboard": [
{
"key": "max_stack_cnt",
- "value": 7.0
+ "value": 5.0
},
{
"key": "atk",
- "value": 0.05
+ "value": 0.07
}
]
},
@@ -76250,11 +76250,11 @@
"blackboard": [
{
"key": "max_stack_cnt",
- "value": 8.0
+ "value": 5.0
},
{
"key": "atk",
- "value": 0.05
+ "value": 0.08
}
]
}
diff --git a/zh_CN/gamedata/excel/data_version.txt b/zh_CN/gamedata/excel/data_version.txt
index 062202e24..dc5db0bec 100644
--- a/zh_CN/gamedata/excel/data_version.txt
+++ b/zh_CN/gamedata/excel/data_version.txt
@@ -1,3 +1,3 @@
Stream://torappu-data/v047/rel47.0
-Change:57469 on 2024/02/02
+Change:57735 on 2024/02/06
VersionControl:47.0.0
diff --git a/zh_CN/gamedata/excel/sandbox_perm_table.json b/zh_CN/gamedata/excel/sandbox_perm_table.json
index 8ad06cbe9..c5539a374 100644
--- a/zh_CN/gamedata/excel/sandbox_perm_table.json
+++ b/zh_CN/gamedata/excel/sandbox_perm_table.json
@@ -35655,6 +35655,102 @@
]
}
]
+ },
+ "normal_mode_buff1": {
+ "id": "normal_mode_buff1",
+ "points": 0.0,
+ "mutexGroupKey": null,
+ "description": "资源最大生命值降低25%",
+ "runes": [
+ {
+ "key": "char_attribute_mul",
+ "selector": {
+ "professionMask": 1023,
+ "buildableMask": "ALL",
+ "charIdFilter": null,
+ "enemyIdFilter": null,
+ "enemyIdExcludeFilter": null,
+ "enemyLevelTypeFilter": null,
+ "skillIdFilter": null,
+ "tileKeyFilter": null,
+ "groupTagFilter": null,
+ "filterTagFilter": null,
+ "filterTagExcludeFilter": null,
+ "subProfessionExcludeFilter": null,
+ "mapTagFilter": null
+ },
+ "blackboard": [
+ {
+ "key": "filter_tag",
+ "value": 0.0,
+ "valueStr": "SANDBOX_RES"
+ },
+ {
+ "key": "max_hp",
+ "value": 0.75,
+ "valueStr": null
+ }
+ ]
+ }
+ ]
+ },
+ "normal_mode_buff3": {
+ "id": "normal_mode_buff3",
+ "points": 0.0,
+ "mutexGroupKey": null,
+ "description": "敌袭敌人最大生命值,攻击力降低50%",
+ "runes": [
+ {
+ "key": "env_gbuff_new_with_verify",
+ "selector": {
+ "professionMask": 639,
+ "buildableMask": "ALL",
+ "charIdFilter": null,
+ "enemyIdFilter": null,
+ "enemyIdExcludeFilter": null,
+ "enemyLevelTypeFilter": null,
+ "skillIdFilter": null,
+ "tileKeyFilter": null,
+ "groupTagFilter": null,
+ "filterTagFilter": null,
+ "filterTagExcludeFilter": null,
+ "subProfessionExcludeFilter": null,
+ "mapTagFilter": null
+ },
+ "blackboard": [
+ {
+ "key": "key",
+ "value": 0.0,
+ "valueStr": "enemy_attribute_modify[in_rush]"
+ },
+ {
+ "key": "char",
+ "value": 0.0,
+ "valueStr": "null"
+ },
+ {
+ "key": "disable_in_sandbox_build",
+ "value": 1.0,
+ "valueStr": null
+ },
+ {
+ "key": "max_hp",
+ "value": 0.5,
+ "valueStr": null
+ },
+ {
+ "key": "atk",
+ "value": 0.5,
+ "valueStr": null
+ },
+ {
+ "key": "def",
+ "value": 1.0,
+ "valueStr": null
+ }
+ ]
+ }
+ ]
}
},
"itemRuneList": {},
@@ -51122,7 +51218,7 @@
"itemId": "sandbox_1_wood",
"itemType": "BUILDINGMAT",
"itemName": "木材",
- "itemUsage": "高强度的建筑材料,广泛应用于高级建筑建造。",
+ "itemUsage": "最基础的建筑材料,广泛应用于建筑建造。",
"itemDesc": "之前有人把未脱水的木材当柴火烧,浓烟环绕了整个部落,白天犹如黑夜。",
"itemRarity": 1,
"sortId": 9020001,
@@ -51142,7 +51238,7 @@
"itemId": "sandbox_1_iron",
"itemType": "BUILDINGMAT",
"itemName": "铁矿石",
- "itemUsage": "最基础的建筑材料,广泛应用于建筑建造。",
+ "itemUsage": "高强度的建筑材料,广泛应用于高级建筑建造。",
"itemDesc": "采矿时一定要注意避免吸入粉尘和有害气体,确保自身安全。",
"itemRarity": 3,
"sortId": 9020003,
@@ -51216,7 +51312,7 @@
"itemDesc": "口感柔滑细腻,滋味醇和浓郁,十分受高档餐厅追捧。",
"itemRarity": 3,
"sortId": 9010006,
- "obtainApproach": "击败<落沙晶蹄兽>获得\n兽栏产出"
+ "obtainApproach": "击败<落沙晶蹄兽>获得"
},
"sandbox_1_ttlmeat": {
"itemId": "sandbox_1_ttlmeat",
@@ -51226,7 +51322,7 @@
"itemDesc": "肉块与软骨紧密贴合,软硬一体,滋味别具一格,是荒地人最爱的食材。",
"itemRarity": 3,
"sortId": 9010007,
- "obtainApproach": "击败<刺棱壳兽>获得\n兽栏产出"
+ "obtainApproach": "击败<刺棱壳兽>获得"
},
"sandbox_1_water": {
"itemId": "sandbox_1_water",
@@ -51746,7 +51842,7 @@
"itemDesc": "烹饪失败多次后命运给予的馈赠。\n它可以带你去另一片大地,一片时间或快或慢、感觉或有或无的大地。",
"itemRarity": 4,
"sortId": 5000054,
- "obtainApproach": "<烹饪台>获得"
+ "obtainApproach": "探索获得"
},
"sandbox_1_building_1": {
"itemId": "sandbox_1_building_1",
diff --git a/zh_CN/gamedata/levels/enemydata/enemy_database.json b/zh_CN/gamedata/levels/enemydata/enemy_database.json
index b23d4ce08..24d51ffa9 100644
--- a/zh_CN/gamedata/levels/enemydata/enemy_database.json
+++ b/zh_CN/gamedata/levels/enemydata/enemy_database.json
@@ -169718,6 +169718,11 @@
"key": "PassiveM2.value",
"value": 100.0,
"valueStr": null
+ },
+ {
+ "key": "Passive_Hit.enemy_dhnzzh_passive_m1[to_block].extra_value",
+ "value": 4.0,
+ "valueStr": null
}
],
"skills": [
diff --git a/zh_CN/gamedata/levels/obt/sandbox/sandbox_1/level_sandbox1_77.json b/zh_CN/gamedata/levels/obt/sandbox/sandbox_1/level_sandbox1_77.json
index 4dce9bca4..9dfd4801b 100644
--- a/zh_CN/gamedata/levels/obt/sandbox/sandbox_1/level_sandbox1_77.json
+++ b/zh_CN/gamedata/levels/obt/sandbox/sandbox_1/level_sandbox1_77.json
@@ -11859,7 +11859,7 @@
"blockFragment": false,
"autoPreviewRoute": false,
"autoDisplayEnemyInfo": false,
- "isUnharmfulAndAlwaysCountAsKilled": false,
+ "isUnharmfulAndAlwaysCountAsKilled": true,
"hiddenGroup": null,
"randomSpawnGroupKey": "g0",
"randomSpawnGroupPackKey": "hidden",
@@ -11882,7 +11882,7 @@
"blockFragment": false,
"autoPreviewRoute": false,
"autoDisplayEnemyInfo": false,
- "isUnharmfulAndAlwaysCountAsKilled": false,
+ "isUnharmfulAndAlwaysCountAsKilled": true,
"hiddenGroup": null,
"randomSpawnGroupKey": null,
"randomSpawnGroupPackKey": "hidden",
@@ -11905,7 +11905,7 @@
"blockFragment": false,
"autoPreviewRoute": false,
"autoDisplayEnemyInfo": false,
- "isUnharmfulAndAlwaysCountAsKilled": false,
+ "isUnharmfulAndAlwaysCountAsKilled": true,
"hiddenGroup": null,
"randomSpawnGroupKey": null,
"randomSpawnGroupPackKey": "hidden",
@@ -11928,7 +11928,7 @@
"blockFragment": false,
"autoPreviewRoute": false,
"autoDisplayEnemyInfo": false,
- "isUnharmfulAndAlwaysCountAsKilled": false,
+ "isUnharmfulAndAlwaysCountAsKilled": true,
"hiddenGroup": null,
"randomSpawnGroupKey": null,
"randomSpawnGroupPackKey": "hidden",
@@ -11951,7 +11951,7 @@
"blockFragment": false,
"autoPreviewRoute": false,
"autoDisplayEnemyInfo": false,
- "isUnharmfulAndAlwaysCountAsKilled": false,
+ "isUnharmfulAndAlwaysCountAsKilled": true,
"hiddenGroup": null,
"randomSpawnGroupKey": null,
"randomSpawnGroupPackKey": "hidden",
@@ -11974,7 +11974,7 @@
"blockFragment": false,
"autoPreviewRoute": false,
"autoDisplayEnemyInfo": false,
- "isUnharmfulAndAlwaysCountAsKilled": false,
+ "isUnharmfulAndAlwaysCountAsKilled": true,
"hiddenGroup": null,
"randomSpawnGroupKey": null,
"randomSpawnGroupPackKey": "hidden",
@@ -11997,7 +11997,7 @@
"blockFragment": false,
"autoPreviewRoute": false,
"autoDisplayEnemyInfo": false,
- "isUnharmfulAndAlwaysCountAsKilled": false,
+ "isUnharmfulAndAlwaysCountAsKilled": true,
"hiddenGroup": null,
"randomSpawnGroupKey": null,
"randomSpawnGroupPackKey": "hidden",