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",