服务端(Go): - GM 塞背包/带属性装备发放:在线角色推送 op14 增量物品行,背包实时刷新,无需回角色选择界面 - GM 改金币/改等级:去掉在线拒绝,落库后推送 op14 钱包/op37 等级状态,在线实时刷新 - 等级端点统一切换到新版 GMSetCharacterLevel(自带在线刷新) - 无限/锁死疲劳模式 + 燃烧疲劳:每房间消耗 2 点、打怪与通关经验双倍 - 燃烧疲劳开关时给所有在线角色推送系统提示(op12 mode 0) - 深渊史诗掉率:GM 全局倍率 + 城镇增益药剂窗口倍率,真实接入掉落结算 启动器(Python/JS): - 标题栏自绘、窗口 1204x717、禁止拖拽改大小、仅最小化/关闭 - GM 工具:疲劳与燃烧、深渊史诗掉率、拍卖行上架(单一定价对齐) - 拍卖行上架前端对齐服务端单一价格语义,修复 400 报错
46 lines
1.6 KiB
Go
46 lines
1.6 KiB
Go
package dnfbridge
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"regexp"
|
|
"strings"
|
|
"testing"
|
|
|
|
platformpvf "longheng.io/server/internal/platform/pvf"
|
|
)
|
|
|
|
func TestRealScriptPVFMatchesInitialTownDefaults(t *testing.T) {
|
|
pvfPath := os.Getenv("DNFBRIDGE_REAL_PVF_SMOKE")
|
|
if pvfPath == "" {
|
|
t.Skip("set DNFBRIDGE_REAL_PVF_SMOKE to verify the current initial town defaults")
|
|
}
|
|
archive, err := platformpvf.LoadArchive(platformpvf.Options{Path: pvfPath})
|
|
if err != nil {
|
|
t.Fatalf("load real Script.pvf: %v", err)
|
|
}
|
|
|
|
townList, err := archive.ReadText("town/town.lst")
|
|
if err != nil {
|
|
t.Fatalf("read town/town.lst: %v", err)
|
|
}
|
|
townEntry := regexp.MustCompile(fmt.Sprintf(`(?:^|\s)%d\s+`+"`"+`new_Elvengard\.twn`+"`"+`(?:\s|$)`, newCharacterInitialTownID))
|
|
if !townEntry.MatchString(townList) {
|
|
t.Fatalf("town/town.lst does not map initial town %d to new_Elvengard.twn", newCharacterInitialTownID)
|
|
}
|
|
|
|
town, err := archive.ReadText("town/new_Elvengard.twn")
|
|
if err != nil {
|
|
t.Fatalf("read town/new_Elvengard.twn: %v", err)
|
|
}
|
|
areaEntry := regexp.MustCompile(fmt.Sprintf(`(?s)\[area\]\s*%d\s+`+"`"+`Cataclysm/Town/Elvengard/new_seria_room\.map`+"`"+`.*?`+"`"+`\[gate\]`+"`"+`\s+%d\s+%d\s+\[/area\]`,
|
|
newCharacterInitialAreaID, newCharacterInitialPosX, newCharacterInitialPosY))
|
|
if !areaEntry.MatchString(town) {
|
|
t.Fatalf("new_Elvengard.twn does not define initial area=%d as new_seria_room.map with gate=(%d,%d)",
|
|
newCharacterInitialAreaID, newCharacterInitialPosX, newCharacterInitialPosY)
|
|
}
|
|
if !strings.Contains(town, "[name]") || !strings.Contains(town, "`艾尔文防线`") {
|
|
t.Fatal("new_Elvengard.twn does not identify the town as 艾尔文防线")
|
|
}
|
|
}
|