diff --git a/TheSkyBlessing/data/api/functions/artifact/get_registry/blue.mcfunction b/TheSkyBlessing/data/api/functions/artifact/get_registry/blue.mcfunction new file mode 100644 index 0000000000..856d597652 --- /dev/null +++ b/TheSkyBlessing/data/api/functions/artifact/get_registry/blue.mcfunction @@ -0,0 +1,8 @@ +#> api:artifact/get_registry/blue +# +# +# +# @api + +# ブルーシャードの神器プールを返す + data modify storage api: Return.Registry.Blue set from storage asset:artifact RarityRegistryWithColor.Blue diff --git a/TheSkyBlessing/data/api/functions/artifact/get_registry/green.mcfunction b/TheSkyBlessing/data/api/functions/artifact/get_registry/green.mcfunction new file mode 100644 index 0000000000..d8124b384f --- /dev/null +++ b/TheSkyBlessing/data/api/functions/artifact/get_registry/green.mcfunction @@ -0,0 +1,8 @@ +#> api:artifact/get_registry/green +# +# +# +# @api + +# グリーンシャードの神器プールを返す + data modify storage api: Return.Registry.Green set from storage asset:artifact RarityRegistryWithColor.Green diff --git a/TheSkyBlessing/data/api/functions/artifact/get_registry/hide.mcfunction b/TheSkyBlessing/data/api/functions/artifact/get_registry/hide.mcfunction new file mode 100644 index 0000000000..739555d065 --- /dev/null +++ b/TheSkyBlessing/data/api/functions/artifact/get_registry/hide.mcfunction @@ -0,0 +1,8 @@ +#> api:artifact/get_registry/hide +# +# +# +# @api + +# 隠し枠の神器プールを返す + data modify storage api: Return.Registry.Hide set from storage asset:artifact HideRarityRegistry diff --git a/TheSkyBlessing/data/api/functions/artifact/get_registry/normal.mcfunction b/TheSkyBlessing/data/api/functions/artifact/get_registry/normal.mcfunction new file mode 100644 index 0000000000..e0c5ffe17e --- /dev/null +++ b/TheSkyBlessing/data/api/functions/artifact/get_registry/normal.mcfunction @@ -0,0 +1,8 @@ +#> api:artifact/get_registry/normal +# +# +# +# @api + +# 通常シャードの神器プールを返す + data modify storage api: Return.Registry.Normal set from storage asset:artifact RarityRegistry diff --git a/TheSkyBlessing/data/api/functions/artifact/get_registry/red.mcfunction b/TheSkyBlessing/data/api/functions/artifact/get_registry/red.mcfunction new file mode 100644 index 0000000000..6317a8390a --- /dev/null +++ b/TheSkyBlessing/data/api/functions/artifact/get_registry/red.mcfunction @@ -0,0 +1,8 @@ +#> api:artifact/get_registry/red +# +# +# +# @api + +# レッドシャードの神器プールを返す + data modify storage api: Return.Registry.Red set from storage asset:artifact RarityRegistryWithColor.Red diff --git a/TheSkyBlessing/data/asset/functions/trader/15/_index.d.mcfunction b/TheSkyBlessing/data/asset/functions/trader/15/_index.d.mcfunction new file mode 100644 index 0000000000..60e6385588 --- /dev/null +++ b/TheSkyBlessing/data/asset/functions/trader/15/_index.d.mcfunction @@ -0,0 +1,10 @@ +#> asset:trader/15/_index.d +# @private + +#> tag +# @within function asset:trader/15/select_artifact/** + #declare score_holder $Current + #declare score_holder $UnlockLv1 + #declare score_holder $UnlockLv2 + #declare score_holder $UnlockLv3 + #declare score_holder $UnlockLv4 diff --git a/TheSkyBlessing/data/asset/functions/trader/15/register.mcfunction b/TheSkyBlessing/data/asset/functions/trader/15/register.mcfunction new file mode 100644 index 0000000000..71fec94f32 --- /dev/null +++ b/TheSkyBlessing/data/asset/functions/trader/15/register.mcfunction @@ -0,0 +1,37 @@ +#> asset:trader/15/register +# +# +# +# @within function asset_manager:trader/register/register.m + +execute unless loaded 37 15 -6 run return 1 + +# ID (int) + data modify storage asset:trader ID set value 15 +# Pos ([int] @ 3) + data modify storage asset:trader Pos set value [37,15,-6] +# 名前 (TextComponent) (オプション) + data modify storage asset:trader Name set value '{"text":"日替わり商人"}' +# 方向 (float) (オプション) + data modify storage asset:trader Rotation set value 180f + +# 日替わりで更新する (boolean) + data modify storage asset:trader DailyUpdate set value true + +# 売る神器を決める + function asset:trader/15/select_artifact/ + +# プレイヤーの攻略度に対応した神器 + data modify storage asset:trader Trades append value {} + data modify storage asset:trader Trades[-1].BuyA set value {PresetItem:"currency/high",Count:8b} + data modify storage asset:trader Trades[-1].Sell set from storage asset:temp Sell.CurrentProgress + data modify storage asset:trader Trades[-1].MaxUses set value 1 + +# プレイヤーの攻略段階までの神器 + data modify storage asset:trader Trades append value {} + data modify storage asset:trader Trades[-1].BuyA set value {PresetItem:"currency/high",Count:8b} + data modify storage asset:trader Trades[-1].Sell set from storage asset:temp Sell.UpToProgress + data modify storage asset:trader Trades[-1].MaxUses set value 1 + +# リセット + data remove storage asset:temp Sell diff --git a/TheSkyBlessing/data/asset/functions/trader/15/select_artifact/.mcfunction b/TheSkyBlessing/data/asset/functions/trader/15/select_artifact/.mcfunction new file mode 100644 index 0000000000..45a54a9de1 --- /dev/null +++ b/TheSkyBlessing/data/asset/functions/trader/15/select_artifact/.mcfunction @@ -0,0 +1,36 @@ +#> asset:trader/15/select_artifact/ +# +# +# +# @within function asset:trader/15/register + +# 販売する神器をプールから選択する +# 1. 攻略段階に合ったランクの神器 +# 2. 攻略段階までのランクの神器 +# +# また、低確率で、このプールが隠し神器のプールに上書きされる + +# 攻略度取得 + function api:global_vars/game_progress + execute store result score $Current Temporary run data get storage api: Return.Progress 100 + +# globalで定義された攻略度によるシャード解放の割合をそれぞれ取得 + execute store result score $UnlockLv1 Temporary run data get storage global UnlockShardProgress[0] + execute store result score $UnlockLv2 Temporary run data get storage global UnlockShardProgress[1] + execute store result score $UnlockLv3 Temporary run data get storage global UnlockShardProgress[2] + execute store result score $UnlockLv4 Temporary run data get storage global UnlockShardProgress[3] + +# APIで通常シャードのプールと隠し神器のプールを取得 + function api:artifact/get_registry/normal + function api:artifact/get_registry/hide + +# 1, 2それぞれで神器を選択 + function asset:trader/15/select_artifact/current_progress/ + function asset:trader/15/select_artifact/up_to_progress/ + +# リセット + scoreboard players reset $Current Temporary + scoreboard players reset $UnlockLv1 Temporary + scoreboard players reset $UnlockLv2 Temporary + scoreboard players reset $UnlockLv3 Temporary + scoreboard players reset $UnlockLv4 Temporary diff --git a/TheSkyBlessing/data/asset/functions/trader/15/select_artifact/current_progress/.mcfunction b/TheSkyBlessing/data/asset/functions/trader/15/select_artifact/current_progress/.mcfunction new file mode 100644 index 0000000000..91349dd0be --- /dev/null +++ b/TheSkyBlessing/data/asset/functions/trader/15/select_artifact/current_progress/.mcfunction @@ -0,0 +1,25 @@ +#> asset:trader/15/select_artifact/current_progress/ +# +# +# +# @within function asset:trader/15/select_artifact/ + +# 攻略度段階に応じてプールを決める +# シャード村人に対応した攻略度で設定しておく + +# プールを設定 +# Lv1は最初から買えるようにする + execute unless score $Current Temporary >= $UnlockLv2 Temporary run function asset:trader/15/select_artifact/current_progress/set_pool.m {Rarity:1} + execute if score $Current Temporary >= $UnlockLv2 Temporary unless score $Current Temporary >= $UnlockLv3 Temporary run function asset:trader/15/select_artifact/current_progress/set_pool.m {Rarity:2} + execute if score $Current Temporary >= $UnlockLv3 Temporary unless score $Current Temporary >= $UnlockLv4 Temporary run function asset:trader/15/select_artifact/current_progress/set_pool.m {Rarity:3} + execute if score $Current Temporary >= $UnlockLv4 Temporary run function asset:trader/15/select_artifact/current_progress/set_pool.m {Rarity:4} + +# プールから神器を1つ抽出する + function lib:array/session/open + data modify storage lib: Array set from storage asset:temp Pool + function asset:trader/15/select_artifact/picks + data modify storage asset:temp Sell.CurrentProgress set from storage lib: Elements[] + function lib:array/session/close + +# リセット + data remove storage asset:temp Pool diff --git a/TheSkyBlessing/data/asset/functions/trader/15/select_artifact/current_progress/set_pool.m.mcfunction b/TheSkyBlessing/data/asset/functions/trader/15/select_artifact/current_progress/set_pool.m.mcfunction new file mode 100644 index 0000000000..0ae54294b7 --- /dev/null +++ b/TheSkyBlessing/data/asset/functions/trader/15/select_artifact/current_progress/set_pool.m.mcfunction @@ -0,0 +1,10 @@ +#> asset:trader/15/select_artifact/current_progress/set_pool.m +# @input args: +# Rarity : int +# @within function asset:trader/15/select_artifact/current_progress/ + +# プールを設定 + $data modify storage asset:temp Pool set from storage api: Return.Registry.Normal[$(Rarity)] + +# 指定されたランクの隠し枠神器があれば、確率で隠し枠の神器のプールに置き換え + $execute if data storage api: Return.Registry.Hide[$(Rarity)][0] if predicate lib:random_pass_per/3 run data modify storage asset:temp Pool set from storage api: Return.Registry.Hide[$(Rarity)] diff --git a/TheSkyBlessing/data/asset/functions/trader/15/select_artifact/picks.mcfunction b/TheSkyBlessing/data/asset/functions/trader/15/select_artifact/picks.mcfunction new file mode 100644 index 0000000000..2665245eb9 --- /dev/null +++ b/TheSkyBlessing/data/asset/functions/trader/15/select_artifact/picks.mcfunction @@ -0,0 +1,36 @@ +#> asset:trader/15/select_artifact/picks +# +# プールから1つの神器を選択する +# +# @within function +# asset:trader/15/select_artifact/current_progress/ +# asset:trader/15/select_artifact/up_to_progress/ +# asset:trader/15/select_artifact/picks + +#> private +# @private + #declare score_holder $CandidatesLength + #declare score_holder $Random + +# pickする + data modify storage lib: Picks set value [0] + execute store result score $CandidatesLength Temporary if data storage lib: Array[] + execute store result score $Random Temporary run random value 0..65535 + execute store result storage lib: Picks[0] int 1 run scoreboard players operation $Random Temporary %= $CandidatesLength Temporary + function lib:array/picks + +# リセット + scoreboard players reset $Random Temporary + scoreboard players reset $CandidatesLength Temporary + +# 選択した配列が2次元でかつ、要素数が2以上でなければ、次元を1減らしてreturnする + execute if data storage lib: Elements[][] unless data storage lib: Elements[][1] run return run data modify storage lib: Elements set from storage lib: Elements[] + +# 1次元配列ならreturn + execute unless data storage lib: Elements[][] run return fail + +# 配列の次元を1減らす + data modify storage lib: Array set from storage lib: Elements[] + +# 再帰 + function asset:trader/15/select_artifact/picks diff --git a/TheSkyBlessing/data/asset/functions/trader/15/select_artifact/up_to_progress/.mcfunction b/TheSkyBlessing/data/asset/functions/trader/15/select_artifact/up_to_progress/.mcfunction new file mode 100644 index 0000000000..bd0381f910 --- /dev/null +++ b/TheSkyBlessing/data/asset/functions/trader/15/select_artifact/up_to_progress/.mcfunction @@ -0,0 +1,29 @@ +#> asset:trader/15/select_artifact/up_to_progress/ +# +# +# +# @within function asset:trader/15/select_artifact/ + +# 隠しプールにするかの判定 + execute if predicate lib:random_pass_per/3 run data modify storage asset:temp IsHidePool set value true + +# プール初期化 + data modify storage asset:temp Pool set value [] + +# プールを設定 + execute unless data storage asset:temp {IsHidePool:true} run function asset:trader/15/select_artifact/up_to_progress/set_pool.m {Type:"Normal"} + execute if data storage asset:temp {IsHidePool:true} run function asset:trader/15/select_artifact/up_to_progress/set_pool.m {Type:"Hide"} + +# 要素数が0の場合、強制的に通常シャードのプールで上書きする (隠しプールの神器が0個である可能性があるため) + execute unless data storage asset:temp Pool[0] run function asset:trader/15/select_artifact/up_to_progress/set_pool.m {Type:"Normal"} + +# プールから神器を1つ抽出する + function lib:array/session/open + data modify storage lib: Array set from storage asset:temp Pool + function asset:trader/15/select_artifact/picks + data modify storage asset:temp Sell.UpToProgress set from storage lib: Elements[] + function lib:array/session/close + +# リセット + data remove storage asset:temp IsHidePool + data remove storage asset:temp Pool diff --git a/TheSkyBlessing/data/asset/functions/trader/15/select_artifact/up_to_progress/set_pool.m.mcfunction b/TheSkyBlessing/data/asset/functions/trader/15/select_artifact/up_to_progress/set_pool.m.mcfunction new file mode 100644 index 0000000000..1944502f37 --- /dev/null +++ b/TheSkyBlessing/data/asset/functions/trader/15/select_artifact/up_to_progress/set_pool.m.mcfunction @@ -0,0 +1,9 @@ +#> asset:trader/15/select_artifact/up_to_progress/set_pool.m +# @input args: +# Type : string (Normal | Hide) +# @within function asset:trader/15/select_artifact/up_to_progress/ + + $data modify storage asset:temp Pool append from storage api: Return.Registry.$(Type)[1][] + $execute if score $Current Temporary >= $UnlockLv2 Temporary run data modify storage asset:temp Pool append from storage api: Return.Registry.$(Type)[2][] + $execute if score $Current Temporary >= $UnlockLv3 Temporary run data modify storage asset:temp Pool append from storage api: Return.Registry.$(Type)[3][] + $execute if score $Current Temporary >= $UnlockLv4 Temporary run data modify storage asset:temp Pool append from storage api: Return.Registry.$(Type)[4][] diff --git a/TheSkyBlessing/data/asset_manager/functions/artifact/_index.d.mcfunction b/TheSkyBlessing/data/asset_manager/functions/artifact/_index.d.mcfunction index edd8b505ef..3d8c24b133 100644 --- a/TheSkyBlessing/data/asset_manager/functions/artifact/_index.d.mcfunction +++ b/TheSkyBlessing/data/asset_manager/functions/artifact/_index.d.mcfunction @@ -4,6 +4,7 @@ #> storage # @within * # api:artifact/core/** +# api:artifact/get_registry/** # asset:artifact/*/register # asset:artifact/*/give/2.give # asset:artifact/*/*/2.check_condition diff --git a/TheSkyBlessing/data/asset_manager/functions/artifact/load.mcfunction b/TheSkyBlessing/data/asset_manager/functions/artifact/load.mcfunction index be7362ac37..a0a09e6649 100644 --- a/TheSkyBlessing/data/asset_manager/functions/artifact/load.mcfunction +++ b/TheSkyBlessing/data/asset_manager/functions/artifact/load.mcfunction @@ -9,5 +9,7 @@ data modify storage asset:artifact RarityRegistryWithColor.Red set value [["UNUSED"], [], [], [], []] data modify storage asset:artifact RarityRegistryWithColor.Blue set value [["UNUSED"], [], [], [], []] data modify storage asset:artifact RarityRegistryWithColor.Green set value [["UNUSED"], [], [], [], []] + data modify storage asset:artifact HideRarityRegistry set value [["UNUSED"], [], [], [], []] + # 読み込み function #asset:artifact/register diff --git a/TheSkyBlessing/data/asset_manager/functions/trader/_index.d.mcfunction b/TheSkyBlessing/data/asset_manager/functions/trader/_index.d.mcfunction index ad3ec5b910..d0af1a55bf 100644 --- a/TheSkyBlessing/data/asset_manager/functions/trader/_index.d.mcfunction +++ b/TheSkyBlessing/data/asset_manager/functions/trader/_index.d.mcfunction @@ -12,6 +12,7 @@ # core:tick/4_interval # debug:trader/update #declare tag Trader + #declare tag Trader.DailyUpdate #> storage # @within @@ -28,13 +29,13 @@ # @within function # api:trader/schedule_recipe_update_check # asset_manager:trader/tick/4_interval -# asset_manager:trader/common/update_recipe +# asset_manager:trader/common/update_recipe/by_progress/ # core:load_once #declare score_holder $TraderRecipeVersion #> update # @within * -# asset_manager:trader/common/update_recipe +# asset_manager:trader/common/update_recipe/update # asset_manager:trader/common/trades_map/** #declare score_holder $Current #declare score_holder $Required diff --git a/TheSkyBlessing/data/asset_manager/functions/trader/common/refresh_trades/m.mcfunction b/TheSkyBlessing/data/asset_manager/functions/trader/common/refresh_trades/.mcfunction similarity index 62% rename from TheSkyBlessing/data/asset_manager/functions/trader/common/refresh_trades/m.mcfunction rename to TheSkyBlessing/data/asset_manager/functions/trader/common/refresh_trades/.mcfunction index 1b7f43a666..139020d60f 100644 --- a/TheSkyBlessing/data/asset_manager/functions/trader/common/refresh_trades/m.mcfunction +++ b/TheSkyBlessing/data/asset_manager/functions/trader/common/refresh_trades/.mcfunction @@ -1,10 +1,6 @@ -#> asset_manager:trader/common/refresh_trades/m -# @input args -# GameVersion: string -# @within function asset_manager:trader/common/update_recipe - -# バージョンが不一致なことをチェックする - $execute if data storage oh_my_dat: _[-4][-4][-4][-4][-4][-4][-4][-4].TraderData{Version:"$(GameVersion)"} run return fail +#> asset_manager:trader/common/refresh_trades/ +# +# @within function asset_manager:trader/common/update_recipe/get_trades # 更新する // TODO 本当は Trades に限らず、Pos, Name, Rotation 等も更新するべきだが、実装コストが重いので後回しにする function asset_manager:trader/common/refresh_trades/load_register.m with storage oh_my_dat: _[-4][-4][-4][-4][-4][-4][-4][-4].TraderData diff --git a/TheSkyBlessing/data/asset_manager/functions/trader/common/refresh_trades/load_register.m.mcfunction b/TheSkyBlessing/data/asset_manager/functions/trader/common/refresh_trades/load_register.m.mcfunction index e6de38a275..1ecd7f6661 100644 --- a/TheSkyBlessing/data/asset_manager/functions/trader/common/refresh_trades/load_register.m.mcfunction +++ b/TheSkyBlessing/data/asset_manager/functions/trader/common/refresh_trades/load_register.m.mcfunction @@ -1,6 +1,6 @@ #> asset_manager:trader/common/refresh_trades/load_register.m # @input args # ID: int -# @within function asset_manager:trader/common/refresh_trades/m +# @within function asset_manager:trader/common/refresh_trades/ $function asset:trader/$(ID)/register diff --git a/TheSkyBlessing/data/asset_manager/functions/trader/common/trades_map/.mcfunction b/TheSkyBlessing/data/asset_manager/functions/trader/common/trades_map/.mcfunction index 3b7b3c6837..e11527458f 100644 --- a/TheSkyBlessing/data/asset_manager/functions/trader/common/trades_map/.mcfunction +++ b/TheSkyBlessing/data/asset_manager/functions/trader/common/trades_map/.mcfunction @@ -5,7 +5,7 @@ # @input storage asset:trader Trades # @output storage asset:trader Recipes # @within function -# asset_manager:trader/common/update_recipe +# asset_manager:trader/common/update_recipe/update # asset_manager:trader/common/trades_map/ # 攻略進捗 (条件) のチェック用データ取得 diff --git a/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/by_daily.mcfunction b/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/by_daily.mcfunction new file mode 100644 index 0000000000..7f1927de5c --- /dev/null +++ b/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/by_daily.mcfunction @@ -0,0 +1,12 @@ +#> asset_manager:trader/common/update_recipe/by_daily +# +# +# +# @within function asset_manager:trader/daily_update + +# 取引一覧を抽出 + function asset_manager:trader/common/update_recipe/get_trades + data modify storage asset:trader Trades set from storage oh_my_dat: _[-4][-4][-4][-4][-4][-4][-4][-4].TraderData.Trades + +# 取引を更新 + function asset_manager:trader/common/update_recipe/update diff --git a/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/by_progress/.mcfunction b/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/by_progress/.mcfunction new file mode 100644 index 0000000000..b23f310aa8 --- /dev/null +++ b/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/by_progress/.mcfunction @@ -0,0 +1,26 @@ +#> asset_manager:trader/common/update_recipe/by_progress/ +# +# 商人のレシピを更新する +# +# @within function +# asset_manager:trader/tick/4_interval +# asset_manager:trader/daily_update +# asset_manager:trader/register/construct/set_data + +# OhMyDat呼び出し + function oh_my_dat:please + +# 日替わり商人の場合は現在の商品は維持し、攻略度だけ反映する + execute if entity @s[tag=Trader.DailyUpdate] run function asset_manager:trader/common/update_recipe/by_progress/keep_sells/ + +# バージョンをチェックし、違うなら取引内容を更新する + function asset_manager:trader/common/update_recipe/by_progress/check_version.m with storage global + +# storageに入れる + data modify storage asset:trader Trades set from storage oh_my_dat: _[-4][-4][-4][-4][-4][-4][-4][-4].TraderData.Trades + +# 取引を更新 + function asset_manager:trader/common/update_recipe/update + +# バージョンを更新 + scoreboard players operation @s RecipeVersion = $TraderRecipeVersion Global diff --git a/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/by_progress/check_version.m.mcfunction b/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/by_progress/check_version.m.mcfunction new file mode 100644 index 0000000000..1739bc6566 --- /dev/null +++ b/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/by_progress/check_version.m.mcfunction @@ -0,0 +1,11 @@ +#> asset_manager:trader/common/update_recipe/by_progress/check_version.m +# +# +# +# @within function asset_manager:trader/common/update_recipe/by_progress/ + +# バージョンが不一致なことをチェックする + $execute if data storage oh_my_dat: _[-4][-4][-4][-4][-4][-4][-4][-4].TraderData{Version:"$(GameVersion)"} run return fail + +# 一致してないならregisterから取引内容を取得 + function asset_manager:trader/common/update_recipe/get_trades diff --git a/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/by_progress/keep_sells/.mcfunction b/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/by_progress/keep_sells/.mcfunction new file mode 100644 index 0000000000..bd2181b523 --- /dev/null +++ b/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/by_progress/keep_sells/.mcfunction @@ -0,0 +1,25 @@ +#> asset_manager:trader/common/update_recipe/by_progress/keep_sells/ +# +# +# +# @within function asset_manager:trader/common/update_recipe/by_progress/ + +# 取引データ取得 + function asset_manager:trader/common/update_recipe/get_trades + +# 自身の取引データ取得 + data modify storage asset:trader TempA set from entity @s Offers.Recipes + +# 更新後のデータを取得 + data modify storage asset:trader TempB set from storage asset:trader Trades + +# 必要なデータだけ移す + function asset_manager:trader/common/update_recipe/by_progress/keep_sells/keep + +# OhMyDatに戻す + data modify storage oh_my_dat: _[-4][-4][-4][-4][-4][-4][-4][-4].TraderData.Trades set from storage asset:trader TempC + +# リセット + data remove storage asset:trader TempA + data remove storage asset:trader TempB + data remove storage asset:trader TempC diff --git a/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/by_progress/keep_sells/keep.mcfunction b/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/by_progress/keep_sells/keep.mcfunction new file mode 100644 index 0000000000..a72b6ff177 --- /dev/null +++ b/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/by_progress/keep_sells/keep.mcfunction @@ -0,0 +1,31 @@ +#> asset_manager:trader/common/update_recipe/by_progress/keep_sells/keep +# +# 更新前の商品と取引数を維持する +# +# storage +# @input +# asset:trader TempA: 更新前の取引データ配列 +# asset:trader TempB: 更新後の取引データ配列 +# @output +# asset:trader TempC: 更新前の商品とmaxUsesだけ維持した取引データ配列 +# +# @within function +# asset_manager:trader/common/update_recipe/by_progress/keep_sells/ +# asset_manager:trader/common/update_recipe/by_progress/keep_sells/keep + +# 最後尾のsellとmaxUsesだけ移す + data modify storage asset:trader TempB[-1].sell set from storage asset:trader TempA[-1].sell + data modify storage asset:trader TempB[-1].maxUses set from storage asset:trader TempA[-1].maxUses + +# 売ってるのが神器の場合はIDを入れておく + execute if data storage asset:trader TempA[-1].sell.tag.TSB.ID run data modify storage asset:trader TempB[-1].sell set from storage asset:trader TempA[-1].sell.tag.TSB.ID + +# TempCに移す + data modify storage asset:trader TempC[-1] set from storage asset:trader TempB[-1] + +# 最後尾の要素を削除 + data remove storage asset:trader TempA[-1] + data remove storage asset:trader TempB[-1] + +# 要素がまだあれば再帰 + execute if data storage asset:trader TempA[0] run function asset_manager:trader/common/update_recipe/by_progress/keep_sells/keep diff --git a/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/get_trades.mcfunction b/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/get_trades.mcfunction new file mode 100644 index 0000000000..0307e860ff --- /dev/null +++ b/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/get_trades.mcfunction @@ -0,0 +1,12 @@ +#> asset_manager:trader/common/update_recipe/get_trades +# +# +# +# @within function +# asset_manager:trader/common/update_recipe/by_daily +# asset_manager:trader/common/update_recipe/by_progress/keep_sells/ +# asset_manager:trader/common/update_recipe/by_progress/check_version.m + +# 取引一覧を抽出 + function oh_my_dat:please + function asset_manager:trader/common/refresh_trades/ diff --git a/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe.mcfunction b/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/update.mcfunction similarity index 59% rename from TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe.mcfunction rename to TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/update.mcfunction index 17701861a3..63912bd9f5 100644 --- a/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe.mcfunction +++ b/TheSkyBlessing/data/asset_manager/functions/trader/common/update_recipe/update.mcfunction @@ -1,18 +1,14 @@ -#> asset_manager:trader/common/update_recipe +#> asset_manager:trader/common/update_recipe/update +# # -# 商人のレシピを更新する # # @within function -# asset_manager:trader/tick/4_interval -# asset_manager:trader/register/construct/set_data +# asset_manager:trader/common/update_recipe/by_daily +# asset_manager:trader/common/update_recipe/by_progress/ # 攻略率を取得 function api:global_vars/game_progress execute store result score $Current Temporary run data get storage api: Return.Progress 100 -# 取引一覧を抽出 - function oh_my_dat:please - function asset_manager:trader/common/refresh_trades/m with storage global - data modify storage asset:trader Trades set from storage oh_my_dat: _[-4][-4][-4][-4][-4][-4][-4][-4].TraderData.Trades # 取引一覧を更新 function lib:array/session/open data modify storage lib: Array set from storage asset:trader Trades @@ -22,9 +18,6 @@ execute if data storage asset:trader Trades[0] run function asset_manager:trader/common/trades_map/ data modify entity @s Offers.Recipes set from storage asset:trader Recipes -# バージョンを更新 - scoreboard players operation @s RecipeVersion = $TraderRecipeVersion Global - # リセット scoreboard players reset $Current Temporary data remove storage asset:trader Trades diff --git a/TheSkyBlessing/data/asset_manager/functions/trader/daily_update.mcfunction b/TheSkyBlessing/data/asset_manager/functions/trader/daily_update.mcfunction new file mode 100644 index 0000000000..4db1955c8a --- /dev/null +++ b/TheSkyBlessing/data/asset_manager/functions/trader/daily_update.mcfunction @@ -0,0 +1,35 @@ +#> asset_manager:trader/daily_update +# +# +# +# @within function asset_manager:trader/tick/4_interval + +#> Private +# @private + #declare score_holder $DayTime + #declare score_holder $GameTime + #declare tag Update + +# 現在のdaytime/gametimeを取得 + execute store result score $DayTime Temporary run time query daytime + execute store result score $GameTime Temporary run time query gametime + +# 4tick前のdaytimeと比較し、4tick前の方がdaytimeが大きい かつ 現在のdaytimeが0~2000 +# または +# 最後に更新してから24000tick以上経過しているなら更新 + execute if score $DayTime Temporary < @s LatestDayTime if score $DayTime Temporary matches 0..2000 run tag @s add Update + + execute if entity @s[tag=!Update] run scoreboard players operation $GameTime Temporary -= @s LatestDailyUpdateTick + execute if entity @s[tag=!Update] if score $GameTime Temporary matches 24000.. run tag @s add Update + +# 更新 + execute if entity @s[tag=Update] run function asset_manager:trader/common/update_recipe/by_daily + +# LatestDayTime/LatestUpdateTick更新 + execute store result score @s LatestDayTime run time query daytime + execute if entity @s[tag=Update] store result score @s LatestDailyUpdateTick run time query gametime + +# リセット + scoreboard players reset $DayTime Temporary + scoreboard players reset $GameTime Temporary + tag @s remove Update diff --git a/TheSkyBlessing/data/asset_manager/functions/trader/register/construct/set_data.mcfunction b/TheSkyBlessing/data/asset_manager/functions/trader/register/construct/set_data.mcfunction index 3f871a71be..7a4e83788c 100644 --- a/TheSkyBlessing/data/asset_manager/functions/trader/register/construct/set_data.mcfunction +++ b/TheSkyBlessing/data/asset_manager/functions/trader/register/construct/set_data.mcfunction @@ -13,13 +13,15 @@ # Default位置 data modify storage oh_my_dat: _[-4][-4][-4][-4][-4][-4][-4][-4].TraderData.DefaultPos set from entity @s Pos data modify storage oh_my_dat: _[-4][-4][-4][-4][-4][-4][-4][-4].TraderData.DefaultRotation set from storage asset:trader Rotation +# 日替わり更新するか + execute if data storage asset:trader {DailyUpdate:true} run tag @s add Trader.DailyUpdate # 取引一覧 data modify storage oh_my_dat: _[-4][-4][-4][-4][-4][-4][-4][-4].TraderData.Trades set from storage asset:trader Trades # そのまま適用するやつ data modify entity @s CustomName set from storage asset:trader Name data modify entity @s Rotation[0] set from storage asset:trader Rotation # 取引データ - function asset_manager:trader/common/update_recipe + function asset_manager:trader/common/update_recipe/by_progress/ # リセット tag @s remove TraderInit diff --git a/TheSkyBlessing/data/asset_manager/functions/trader/register/reset.mcfunction b/TheSkyBlessing/data/asset_manager/functions/trader/register/reset.mcfunction index 9f8be8c575..a071e3bb54 100644 --- a/TheSkyBlessing/data/asset_manager/functions/trader/register/reset.mcfunction +++ b/TheSkyBlessing/data/asset_manager/functions/trader/register/reset.mcfunction @@ -6,3 +6,4 @@ data remove storage asset:trader Pos data remove storage asset:trader Name data remove storage asset:trader Rotation data remove storage asset:trader Trades +data remove storage asset:trader DailyUpdate diff --git a/TheSkyBlessing/data/asset_manager/functions/trader/tick/4_interval.mcfunction b/TheSkyBlessing/data/asset_manager/functions/trader/tick/4_interval.mcfunction index 6fa05effef..bd9276dade 100644 --- a/TheSkyBlessing/data/asset_manager/functions/trader/tick/4_interval.mcfunction +++ b/TheSkyBlessing/data/asset_manager/functions/trader/tick/4_interval.mcfunction @@ -7,5 +7,8 @@ # 奈落回避 execute if predicate lib:is_void unless predicate lib:is_vehicle run function asset_manager:trader/to_spawn +# 日替わり更新 + execute if entity @s[tag=Trader.DailyUpdate] run function asset_manager:trader/daily_update + # 更新処理 - execute unless score $TraderRecipeVersion Global = @s RecipeVersion run function asset_manager:trader/common/update_recipe + execute unless score $TraderRecipeVersion Global = @s RecipeVersion run function asset_manager:trader/common/update_recipe/by_progress/ diff --git a/TheSkyBlessing/data/core/functions/load_once.mcfunction b/TheSkyBlessing/data/core/functions/load_once.mcfunction index 3fa5d1508d..77a1ba9b84 100644 --- a/TheSkyBlessing/data/core/functions/load_once.mcfunction +++ b/TheSkyBlessing/data/core/functions/load_once.mcfunction @@ -235,9 +235,12 @@ team modify NoCollision collisionRule never #> AssetManager: Trader # @within function - # asset_manager:trader/tick/4_interval + # asset_manager:trader/tick/** + # asset_manager:trader/daily_update # asset_manager:trader/common/** scoreboard objectives add RecipeVersion dummy {"text":"商人の取引内容の更新チェック用スコア"} + scoreboard objectives add LatestDayTime dummy {"text":"商人の日替わり更新チェック用スコア"} + scoreboard objectives add LatestDailyUpdateTick dummy {"text":"商人が最後に日替わり更新したTick"} #> イベントハンドラ用スコアボード # @within function