Implement secretbox handlers and align gacha behavior

- Add secretbox API schemas, handlers, and routes for all/showDetail/pon/multi
- Load secretbox server data through the shared serverdata loader
- Fix rarity mapping and pool rules for SR/SSR/UR special boxes
- Implement thanks festival pool behavior, including UR guarantee and SSR/UR-only rates
- Correct animation-related fields such as is_hit and lowest_rarity, and add rare UR promotion animation

Signed-off-by: Sean Du <do4suki@gmail.com>
This commit is contained in:
2026-06-05 21:57:04 +08:00
parent acd9be627e
commit 750c2cf3d0
20 changed files with 2558 additions and 576 deletions
+44
View File
@@ -0,0 +1,44 @@
package secretbox
import (
secretboxapischema "honoka-chan/internal/schema/api/secretbox"
honokautils "honoka-chan/internal/utils"
"time"
)
func all() (res any, err error) {
secretBoxData, err := honokautils.LoadServerData[secretboxapischema.AllData]("secretbox_data.json")
if err != nil {
return nil, err
}
secretBoxData.UseCache = 0
secretBoxData.IsUnitMax = false
secretBoxData.GaugeInfo.MaxGaugePoint = 100
secretBoxData.GaugeInfo.GaugePoint = 0
for i := range secretBoxData.ItemList {
if secretBoxData.ItemList[i].Amount < 999 {
secretBoxData.ItemList[i].Amount = 999
}
}
for i := range secretBoxData.MemberCategoryList {
for j := range secretBoxData.MemberCategoryList[i].PageList {
for k := range secretBoxData.MemberCategoryList[i].PageList[j].ButtonList {
for m := range secretBoxData.MemberCategoryList[i].PageList[j].ButtonList[k].CostList {
secretBoxData.MemberCategoryList[i].PageList[j].ButtonList[k].CostList[m].Payable = true
}
}
}
}
res = secretboxapischema.AllResp{
Result: secretBoxData,
Status: 200,
CommandNum: false,
TimeStamp: time.Now().Unix(),
}
return res, nil
}
@@ -0,0 +1,15 @@
package secretbox
import (
"fmt"
)
func SecretBoxApi(action string) (res any, err error) {
switch action {
case "all":
res, err = all()
default:
err = fmt.Errorf("unimplemented action: secretbox: %s", action)
}
return res, err
}