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
+6 -4
View File
@@ -1,10 +1,12 @@
package apischema
type ApiReq struct {
Module string `json:"module"`
UserID int `json:"user_id"`
Action string `json:"action"`
Timestamp int64 `json:"timeStamp"`
Module string `json:"module"`
UserID int `json:"user_id"`
Action string `json:"action"`
ID int `json:"id"`
SecretBoxID int `json:"secret_box_id"`
Timestamp int64 `json:"timeStamp"`
}
type ApiResp struct {
+9 -10
View File
@@ -1,16 +1,15 @@
package bannerapischema
type BannerList struct {
BannerType int `json:"banner_type"`
TargetID int `json:"target_id"`
AssetPath string `json:"asset_path"`
FixedFlag bool `json:"fixed_flag"`
BackSide bool `json:"back_side"`
BannerID int `json:"banner_id"`
StartDate string `json:"start_date"`
EndDate string `json:"end_date"`
AddUnitStartDate string `json:"add_unit_start_date,omitempty"`
WebviewURL string `json:"webview_url,omitempty"`
BannerType int `json:"banner_type"`
TargetID int `json:"target_id"`
AssetPath string `json:"asset_path"`
FixedFlag bool `json:"fixed_flag"`
BackSide bool `json:"back_side"`
BannerID int `json:"banner_id"`
StartDate string `json:"start_date"`
EndDate string `json:"end_date"`
WebviewURL string `json:"webview_url,omitempty"`
}
type ListData struct {
+80
View File
@@ -0,0 +1,80 @@
package secretboxapischema
type ItemAmount struct {
ItemID int `json:"item_id"`
Amount int `json:"amount"`
}
type GaugeInfo struct {
MaxGaugePoint int `json:"max_gauge_point"`
GaugePoint int `json:"gauge_point"`
}
type SecretBoxAnimationAssets struct {
Type int `json:"type"`
BackgroundAsset string `json:"background_asset"`
AdditionalAsset1 string `json:"additional_asset_1"`
AdditionalAsset2 string `json:"additional_asset_2"`
AdditionalAsset3 string `json:"additional_asset_3"`
}
type SecretBoxCost struct {
ID int `json:"id"`
Type int `json:"type"`
Amount int `json:"amount"`
ItemID *int `json:"item_id"`
UnitCount int `json:"unit_count"`
Payable bool `json:"payable"`
}
type SecretBoxButton struct {
SecretBoxButtonType int `json:"secret_box_button_type"`
CostList []SecretBoxCost `json:"cost_list"`
SecretBoxName string `json:"secret_box_name"`
LimitCount int `json:"limit_count,omitempty"`
LimitUnderMessage string `json:"limit_under_message,omitempty"`
LimitUnderMessageSuffix string `json:"limit_under_message_suffix,omitempty"`
BalloonAsset string `json:"balloon_asset,omitempty"`
}
type SecretBoxInfo struct {
SecretBoxID int `json:"secret_box_id"`
SecretBoxType int `json:"secret_box_type"`
Name string `json:"name"`
Description string `json:"description"`
StartDate string `json:"start_date"`
EndDate string `json:"end_date"`
ShowEndDate string `json:"show_end_date"`
AddGauge int `json:"add_gauge"`
AlwaysDisplayFlag int `json:"always_display_flag"`
PonCount int `json:"pon_count"`
PonUpperLimit int `json:"pon_upper_limit"`
}
type SecretBoxPage struct {
MenuAsset string `json:"menu_asset"`
PageOrder int `json:"page_order"`
AnimationAssets SecretBoxAnimationAssets `json:"animation_assets"`
ButtonList []SecretBoxButton `json:"button_list"`
SecretBoxInfo SecretBoxInfo `json:"secret_box_info"`
}
type MemberCategoryPageList struct {
MemberCategory int `json:"member_category"`
PageList []SecretBoxPage `json:"page_list"`
}
type AllData struct {
UseCache int `json:"use_cache"`
IsUnitMax bool `json:"is_unit_max"`
ItemList []ItemAmount `json:"item_list"`
GaugeInfo GaugeInfo `json:"gauge_info"`
MemberCategoryList []MemberCategoryPageList `json:"member_category_list"`
}
type AllResp struct {
Result AllData `json:"result"`
Status int `json:"status"`
CommandNum bool `json:"commandNum"`
TimeStamp int64 `json:"timeStamp"`
}