Files
hanfuit 645b64fe21 DNF90 服务端与启动器完整源码(含 GM 工具功能增强)
服务端(Go):
- GM 塞背包/带属性装备发放:在线角色推送 op14 增量物品行,背包实时刷新,无需回角色选择界面
- GM 改金币/改等级:去掉在线拒绝,落库后推送 op14 钱包/op37 等级状态,在线实时刷新
- 等级端点统一切换到新版 GMSetCharacterLevel(自带在线刷新)
- 无限/锁死疲劳模式 + 燃烧疲劳:每房间消耗 2 点、打怪与通关经验双倍
- 燃烧疲劳开关时给所有在线角色推送系统提示(op12 mode 0)
- 深渊史诗掉率:GM 全局倍率 + 城镇增益药剂窗口倍率,真实接入掉落结算

启动器(Python/JS):
- 标题栏自绘、窗口 1204x717、禁止拖拽改大小、仅最小化/关闭
- GM 工具:疲劳与燃烧、深渊史诗掉率、拍卖行上架(单一定价对齐)
- 拍卖行上架前端对齐服务端单一价格语义,修复 400 报错
2026-11-04 14:31:55 +08:00

87 lines
3.9 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package raid
// 超时空之战:战况表格子上要画的"怪物头像"用的是**真实的怪物 ID**,而这只怪是
// 谁,写在 PVF 里,不是服务端自编的一张表:
//
// dungeon/gcontents/180621_fiendwar/cosmo_*.dgn
// [maze info] → [map specification] `boss` x y <mapID>
// map/gcontents/180621_fiendwar/dungeon/(2,0)_Boss_<mapID>.map
// [monster] <怪物ID> ... `[fixed]` `[boss]`
//
// 本文件把这条对应关系固化成表;`raid_fiendwar_monster_pvf_test.go` 会逐条回读
// 真 PVF 复核(每张 maze 的 BOSS 房地图、里面那只 [boss]、以及 maze 张数),
// 数据漂移会让测试先红,而不是等玩家看见错的头像。
//
// 权威出处(百度百科「超时空之战」· 怪物信息):
// "其中前哨基地/兵站本营/攻击基地中的怪物以随机分配的形式出现在地图中。"
// —— 分配发生在**建图那一刻**,所以前哨基地/兵站本营的领主是开团时就抽定的
// (见 FiendWarBattle.FixtureMazes,按格子位置钉死),雷达通关后战况表显示的与进图实际打到的才会
// 是同一只。
//
// 权威出处(同一页 · 地图构造):"雷达:该副本通关后增加所有玩家10%技能伤害,
// 并显示地图中怪物头像。(反之怪物头像显示问号)" —— 揭示的开关就是 RADAR STATE。
// fiendWarArmyBossIDs 是"攻击基地用"的四只稀有怪,也就是敌军军团 type 1..4 会走进
// 的那张 maze(maze = type-1)的领主:
//
// 1 魅妖公主(110979) / 2 融合型恶魔(110977) / 3 狂热恶魔:破坏者(110987) / 4 超合金恶魔:艾罗伊(110982)
//
// 千分比权重就是 PVF 的 [ENEMY CREATE RATE] 1 30000 2 30000 3 30000 4 10000。
var fiendWarArmyBossIDs = [4]uint32{110979, 110977, 110987, 110982}
// fiendWarOrcBossIDs 是"随机中立"的原生怪(非移动型)领主,也就是 monster type
// 1..2 会走进的那张 maze(maze = type+3)的领主:
//
// 1 面霸1号(110714) / 2 兽人队长:血之埃克斯(110975)
//
// maze 4/5 的小怪是山贼兽人/山贼弩兵/山贼头头(FarmerOrc/ArcherOrc/BanditOrc/BanditOrcHead),
// 与百科"原生怪物(非移动型怪物)· 随机中立"那一栏一致。
var fiendWarOrcBossIDs = [2]uint32{110714, 110975}
// FiendWarFixtureBossIDs 是每个设施副本、逐张 maze 的领主。
//
// 长度就是这张副本的 maze 张数:雷达/炮塔/量子时空传送站只有 1 张(领主恒定),
// 前哨基地与兵站本营各有 3 张(领主随机分配,开团抽定)。
var FiendWarFixtureBossIDs = map[int][]uint32{
// 雷达基地:磁力恶魔:马格内特
4963: {110973},
// 炮塔:常春魔藤
4965: {110980},
// 前哨基地:人类背叛者:宾柏 / 引力恶魔:薛丁恶 / 宇宙粉碎机:克鲁瑟
4967: {110981, 110984, 110708},
4969: {110981, 110984, 110708},
4971: {110981, 110984, 110708},
// 兵站本营:光之恶魔:欧格里 / 暗之恶魔:艾森 / 重力恶魔:白斯
4975: {110709, 110978, 110992},
4976: {110709, 110978, 110992},
4977: {110709, 110978, 110992},
// 量子时空传送站:宇宙恶魔:罗什(纯白 / 黑暗)
4953: {110995},
4978: {110994},
}
// FiendWarArmyBossID 返回敌军军团某兵种对应的领主。
func FiendWarArmyBossID(enemyType byte) (uint32, bool) {
if enemyType < 1 || int(enemyType) > len(fiendWarArmyBossIDs) {
return 0, false
}
return fiendWarArmyBossIDs[enemyType-1], true
}
// FiendWarOrcBossID 返回原生怪(中立兽人)某兵种对应的领主。
func FiendWarOrcBossID(monsterType byte) (uint32, bool) {
if monsterType < 1 || int(monsterType) > len(fiendWarOrcBossIDs) {
return 0, false
}
return fiendWarOrcBossIDs[monsterType-1], true
}
// FiendWarFixtureBossID 返回设施副本第 maze 张图的领主。
func FiendWarFixtureBossID(dungeon, maze int) (uint32, bool) {
bosses, ok := FiendWarFixtureBossIDs[dungeon]
if !ok || maze < 0 || maze >= len(bosses) {
return 0, false
}
return bosses[maze], true
}