From 2ed15a6419e3a8fce0953e5cc4dce191b7386af4 Mon Sep 17 00:00:00 2001 From: milimoe Date: Mon, 30 Jun 2025 00:04:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E6=8E=A2=E7=B4=A2=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E5=88=B0=E4=BB=BB=E5=8A=A1=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E5=92=8C=E6=B4=BB=E5=8A=A8=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OshimaCore/Constant/ResultEnum.cs | 11 + OshimaModules/Regions/Anomaly.cs | 26 ++ OshimaModules/Regions/Ecology.cs | 22 ++ OshimaModules/Regions/Machine.cs | 6 + OshimaModules/Regions/Mineral.cs | 6 + OshimaModules/Regions/OshimaRegion.cs | 3 + OshimaModules/Regions/Outworld.cs | 6 + OshimaModules/Regions/QuestExploration.cs | 12 + OshimaServers/Model/ExploreModel.cs | 1 + OshimaServers/Service/FunGameConstant.cs | 262 +----------------- OshimaServers/Service/FunGameService.cs | 129 ++++++++- OshimaWebAPI/Controllers/FunGameController.cs | 33 +-- 12 files changed, 229 insertions(+), 288 deletions(-) create mode 100644 OshimaCore/Constant/ResultEnum.cs create mode 100644 OshimaModules/Regions/QuestExploration.cs diff --git a/OshimaCore/Constant/ResultEnum.cs b/OshimaCore/Constant/ResultEnum.cs new file mode 100644 index 0000000..4abdefc --- /dev/null +++ b/OshimaCore/Constant/ResultEnum.cs @@ -0,0 +1,11 @@ +namespace Oshima.Core.Constant +{ + public enum ExploreResult + { + General, + Nothing, + Fight, + Earned, + Event + } +} diff --git a/OshimaModules/Regions/Anomaly.cs b/OshimaModules/Regions/Anomaly.cs index 5748400..2d12c62 100644 --- a/OshimaModules/Regions/Anomaly.cs +++ b/OshimaModules/Regions/Anomaly.cs @@ -1,4 +1,5 @@ using Milimoe.FunGame.Core.Library.Constant; +using Oshima.Core.Constant; namespace Oshima.FunGame.OshimaModules.Regions { @@ -25,6 +26,15 @@ namespace Oshima.FunGame.OshimaModules.Regions NPCs.Add("沉默守卫G-7"); Areas.Add("悖论深井"); Areas.Add("星屑回廊"); + Areas.Add("星辉水域"); + Areas.Add("上城区"); + Areas.Add("旧街道"); + ContinuousQuestList.Add("悖论引擎的暗涌之息", new("穿梭于银辉城流淌液态月光的街道,侦测悖论引擎释放的异常能量潮汐,揭开可能撕裂现实结构的危险谜团。")); + ContinuousQuestList.Add("镜湖星辉的引力观察", new("在银辉城折射星空的水域边缘建立观测点,记录星辉水母群在午夜重构重力法则时的空间涟漪。")); + ImmediateQuestList.Add("星银警戒协议·弎级响应", new("星银合金守卫在悖论引擎周边暴走,形成包围核心区的杀戮矩阵,必须在三刻钟内解除警戒协议。")); + ImmediateQuestList.Add("液态月光洪流预警", new("银辉城街道的液态月光进入异常涨潮期,即将淹没悖论引擎控制中枢,必须立即启动排水协议。")); + ProgressiveQuestList.Add("月光萃取计划", new("前往银辉城,采集 {0} 份液态月光(避开月光洪流的**时段/每夜丑时三刻)。", item: "液态月光")); + ProgressiveQuestList.Add("湖底重力场测绘", new("在银辉城星辉水域测绘 {0} 个重力异常点(星银合金),注意避开午夜水母重构期。", item: "星银合金")); } } @@ -47,6 +57,9 @@ namespace Oshima.FunGame.OshimaModules.Regions NPCs.Add("冻伤的信使"); Areas.Add("时钟哨塔"); Areas.Add("记忆回廊"); + ContinuousQuestList.Add("时间琥珀中的战争回响", new("在永霜裂痕建立时滞力场实验室,分析冻结在冰壁中的古代战争幻象,还原时霜药剂对观察者认知体系的扭曲机制。")); + ImmediateQuestList.Add("时霜逆流救援行动", new("科研小组被困在永霜裂痕加速百倍的时间泡内,其肉体正以肉眼可见的速度衰老,必须校准哨塔时钟恢复时间流速。")); + ProgressiveQuestList.Add("时霜逆向工程", new("通过时间镜像收集 {0} 份来自永霜裂痕不同历史断片的时霜药剂样本(注意时空回响对记忆的覆盖效应)。", item: "时霜药剂")); } } @@ -69,6 +82,9 @@ namespace Oshima.FunGame.OshimaModules.Regions NPCs.Add("溺亡观测者"); Areas.Add("倒影城"); Areas.Add("千瞳之巢"); + ContinuousQuestList.Add("镜像维度的认知污染", new("佩戴反重力拘束装置潜入千瞳镜湖,测绘镜像城的拓扑结构,警惕瞳孔状传送门对记忆模块的逆向写入现象。")); + ImmediateQuestList.Add("镜像侵蚀净化指令", new("千瞳镜湖的镜像守卫突破维度屏障入侵现实,携带的认知病毒正在改写物理法则,启动空间净化协议隔离威胁。")); + ProgressiveQuestList.Add("瞳孔密钥重构计划", new("前往千瞳镜湖,从 {0} 个瞳孔状传送门提取量子纠缠碎片(保持镜像对称操作以避免维度塌缩)。", item: "量子纠缠碎片")); } } @@ -94,6 +110,13 @@ namespace Oshima.FunGame.OshimaModules.Regions NPCs.Add("循环勘探队"); Areas.Add("昨日之城"); Areas.Add("时漏绿洲"); + Areas.Add("沙丘核心"); + ContinuousQuestList.Add("流沙时计的昨日寻踪", new("在时之荒漠中寻找海市蜃楼般的昨日之城,收集散落在其中的时间碎片,还原历史真相。")); + ContinuousQuestList.Add("时沙陷阱的预警系统", new("在时之荒漠部署时间流沙监测网,预测沙丘重组周期并标记高危区域,保障探索者安全。")); + ImmediateQuestList.Add("流沙陷阱紧急救援", new("勘探队被困在时之荒漠重组的沙丘核心,必须在沙暴吞噬前开辟逃生通道。")); + ImmediateQuestList.Add("时之蝎群时空侵染", new("时之荒漠的时之蝎因时凝液泄漏引发群体狂暴,其时间加速能力正在污染周边空间,需立即净化。")); + ProgressiveQuestList.Add("时间碎片收集", new("在时之荒漠的昨日之城中收集 {0} 份不同的时间碎片(注意时间碎片会随机重组)。", item: "时间碎片")); + ProgressiveQuestList.Add("时凝液时效研究", new("在时之荒漠提纯 {0} 份时凝液(操作需在时间加速器防护罩内完成)。", item: "时凝液")); } } @@ -115,6 +138,9 @@ namespace Oshima.FunGame.OshimaModules.Regions NPCs.Add("洛伦佐"); Areas.Add("梦境交易所"); Areas.Add("​​幻疡医院"); + ContinuousQuestList.Add("谵妄梦境的思维隔离", new("在谵妄海市建立认知过滤系统,阻断思维寄生虫对市民意识的寄生感染路径。")); + ImmediateQuestList.Add("谵妄认知病毒爆发", new("谵妄海市的思维寄生虫释放II型认知病毒,感染市民产生现实扭曲能力,必须一小时内建立精神隔离区。")); + ProgressiveQuestList.Add("梦境碎片毒性分析", new("在谵妄海市分析 {0} 份不同的梦境碎片(需全程佩戴认知过滤器)。", item: "梦境碎片")); } } } diff --git a/OshimaModules/Regions/Ecology.cs b/OshimaModules/Regions/Ecology.cs index 2578a6a..a20637b 100644 --- a/OshimaModules/Regions/Ecology.cs +++ b/OshimaModules/Regions/Ecology.cs @@ -24,6 +24,12 @@ namespace Oshima.FunGame.OshimaModules.Regions NPCs.Add("封喉歌者"); Areas.Add("古龙沉眠地穴"); Areas.Add("立体蜂巢市集"); + ContinuousQuestList.Add("林海深处的记忆协奏曲", new("在瑟兰薇歌林海水晶化的树冠建立观测站,记录春季地貌重组时树木根系发出的低频共振波,破译其与旋律古龙苏醒周期的关联。")); + ContinuousQuestList.Add("圣树蜜蜡的数据加密", new("在瑟兰薇歌林海脉轮圣树区部署安全协议,防止可编程蜜蜡的数据泄露事件再次发生。")); + ImmediateQuestList.Add("音律囚笼突破作战", new("苏醒的旋律古龙释放出高频震波,将精灵们困在水晶共振牢笼中,需在下次地貌重组前切断声波共鸣节点。")); + ImmediateQuestList.Add("圣树蜜蜡数据泄漏", new("瑟兰薇歌林海脉轮圣树区的可编程蜜蜡核心数据被盗,需在加密密钥失效前追回数据包。")); + ProgressiveQuestList.Add("林海汁液采收行动", new("使用抗腐蚀容器收集瑟兰薇歌林海的 {0} 份荧蓝汁液(树木自卫系统激活时汁液会转化为神经毒素)。", item: "荧蓝汁液")); + ProgressiveQuestList.Add("圣树蜜蜡编程实验", new("在瑟兰薇歌林海的脉轮圣树区进行 {0} 次蜜蜡编程(收集可编程蜜蜡)。", item: "可编程蜜蜡")); } } @@ -45,6 +51,10 @@ namespace Oshima.FunGame.OshimaModules.Regions NPCs.Add("溃烂猎人"); Areas.Add("母体神经丛​​"); Areas.Add("诱捕菌林"); + ContinuousQuestList.Add("腐萤沼渊的共生调查", new("深入腐萤沼渊,研究共生母体的生态系统,记录菌类模仿动物叫声的频率和模式。")); + ContinuousQuestList.Add("腐沼菌群的声波分析", new("在腐萤沼渊建立声纹实验室,解析共生母体菌类发出的动物模拟叫声,建立声波防御系统。")); + ImmediateQuestList.Add("腐沼毒气中和行动", new("腐萤沼渊共生母体排出的毒气云正在快速扩散,需在十分钟内启动应急中和装置保护周边生态。")); + ProgressiveQuestList.Add("共生母体样本采集", new("从腐萤沼渊的共生母体采集 {0} 份不同的菌类样本(注意菌类会释放麻痹毒素)。", item: "菌类样本")); } } @@ -72,6 +82,12 @@ namespace Oshima.FunGame.OshimaModules.Regions Areas.Add("永夜墓园"); Areas.Add("星锚之地"); Areas.Add("中央之岛"); + ContinuousQuestList.Add("星锚之地的束缚警戒", new("前往双生月崖永夜侧的星锚之地,加固引雷柱的能量场,防止星空巨兽挣脱时空束缚。")); + ContinuousQuestList.Add("双生湮灭的边界探测", new("在双生月崖建立空间稳定站,研究昼夜切换时湮灭边界产生的空间畸变现象。")); + ImmediateQuestList.Add("星空巨兽狂怒预警", new("双生月崖星锚之地的引雷柱遭到破坏,星空巨兽即将挣脱束缚,必须立即修复能量矩阵。")); + ImmediateQuestList.Add("湮灭边界扩张警报", new("双生月崖昼夜切换窗口期异常延迟,湮灭边界以每分钟5米速度扩张,必须立即撤离滞留学生团。")); + ProgressiveQuestList.Add("星锚晶石加固任务", new("在双生月崖的星锚之地校准 {0} 个不同的引雷柱,收集星锚晶石。", item: "星锚晶石")); + ProgressiveQuestList.Add("湮灭边界观测记录", new("在双生月崖收集 {0} 份影玫瑰。", item: "影玫瑰")); } } @@ -94,10 +110,16 @@ namespace Oshima.FunGame.OshimaModules.Regions Crops.Add(new(181101, "晶化记忆孢子", "锻造物品的材料。", "红杉散发的记忆载体,吸入后可能体验亡者临终经历。")); Crops.Add(new(181102, "虚空骨髓", "锻造物品的材料。", "骨骼深处的虚空物质,散发扭曲精神的空间能量。")); Crops.Add(new(181103, "神经蕨类", "锻造物品的材料。", "寄生在骸骨上的蕨类植物,根系连接骸骨神经,触碰引发剧烈幻觉。")); + Crops.Add(new(181104, "龙骨碎片", "锻造物品的材料。", "幽灵船的龙骨半埋于桥底虚空泥沼中,其扭曲的脊椎骨刺穿雾层,船体残骸散发幽蓝磷光。")); NPCs.Add("骸骨诗人"); NPCs.Add("\"船长\""); Areas.Add("骸鲸观星台"); Areas.Add("幽灵船坞"); + ContinuousQuestList.Add("骨桥记忆的精神共鸣", new("进入棱镜骨桥,收集晶体化红杉中储存的亡者记忆,调查空间褶皱对现实结构的影响。")); + ImmediateQuestList.Add("骨桥幽灵舰队突袭", new("棱镜骨桥下方的幽灵船队突破虚空屏障,对现实维度发动突袭,必须在半小时内建立反制防线。")); + ImmediateQuestList.Add("棱镜记忆过载危机", new("棱镜骨桥的红杉晶体因记忆过载即将爆发共感冲击波,必须在五分钟内疏散周边观测人员。")); + ProgressiveQuestList.Add("骨桥记忆共鸣实验", new("在棱镜骨桥提取 {0} 份不同的亡者记忆(晶化记忆孢子)。", item: "晶化记忆孢子")); + ProgressiveQuestList.Add("幽灵航线能量测绘", new("在棱镜骨桥下方收集 {0} 份幽灵船能量数据(龙骨碎片)。", item: "龙骨碎片")); } } } diff --git a/OshimaModules/Regions/Machine.cs b/OshimaModules/Regions/Machine.cs index 63d5fe9..079d6f4 100644 --- a/OshimaModules/Regions/Machine.cs +++ b/OshimaModules/Regions/Machine.cs @@ -24,6 +24,12 @@ namespace Oshima.FunGame.OshimaModules.Regions NPCs.Add("7号改造体"); Areas.Add("​​忏悔教堂​​"); Areas.Add("造物车间"); + ContinuousQuestList.Add("机械坟场的改造危机", new("潜入齿轮坟场被活体建筑同化的造物车间,研究其机械与生物融合的改造机制,寻找控制方法。")); + ContinuousQuestList.Add("齿轮活血的污染控制", new("在齿轮坟场建立液态魔力隔离区,防止活体魔力血的生物污染扩散至外部环境。")); + ImmediateQuestList.Add("活体建筑增殖警报", new("齿轮坟场的活体建筑开始暴走式增殖,必须在三刻钟内切断核心供能管道遏制扩张。")); + ImmediateQuestList.Add("机械坟场核心熔毁", new("齿轮坟场的上古机械核心因活体魔力血污染进入熔毁倒计时,需立即执行冷却协议防止爆炸。")); + ProgressiveQuestList.Add("活体建筑解析计划", new("在齿轮坟场研究 {0} 个活体建筑样本(活体魔力血)。", item: "活体魔力血")); + ProgressiveQuestList.Add("机械核心解密行动", new("在齿轮坟场解析 {0} 个上古机械核心(机械核心碎片)。", item: "机械核心碎片")); } } } diff --git a/OshimaModules/Regions/Mineral.cs b/OshimaModules/Regions/Mineral.cs index aa2b4da..4156b8c 100644 --- a/OshimaModules/Regions/Mineral.cs +++ b/OshimaModules/Regions/Mineral.cs @@ -24,6 +24,12 @@ namespace Oshima.FunGame.OshimaModules.Regions NPCs.Add("苔丝夫人"); Areas.Add("鱿熔血池​​"); Areas.Add("活体锻炉"); + ContinuousQuestList.Add("元素裂隙的熵增警告", new("使用抗魔探针扫描永燃坩埚第47层矿道,绘制元素裂缝的扩张轨迹,评估其引发位面坍缩的风险等级。")); + ContinuousQuestList.Add("坩埚熔岩的生命观测", new("在永燃坩埚的火山灰层建立实验室,监测活体金属苔藓与岩浆鱿鱼的共生进化过程。")); + ImmediateQuestList.Add("深渊火种收容危机", new("永燃坩埚矿道底层的深渊火钻因元素污染进入链式裂变,引发全矿道魔能过载,立即部署熵减力场遏制反应。")); + ImmediateQuestList.Add("坩埚金属瘟疫爆发", new("永燃坩埚的活体金属苔藓变异为吞噬性瘟疫,正沿岩浆通道快速扩散,必须立即启动熔断隔离机制。")); + ProgressiveQuestList.Add("火钻精炼协议", new("在永燃坩埚矿工灵魂烙印的指引下获取 {0} 颗深渊火钻(未烙印者触碰火钻将引发元素爆燃)。", item: "深渊火钻")); + ProgressiveQuestList.Add("坩埚活体金属培育", new("在永燃坩埚培育 {0} 份活体金属苔藓(注意培育环境需保持600℃以上恒温)。", item: "活体金属苔藓")); } } } diff --git a/OshimaModules/Regions/OshimaRegion.cs b/OshimaModules/Regions/OshimaRegion.cs index c38c5ef..58bb08a 100644 --- a/OshimaModules/Regions/OshimaRegion.cs +++ b/OshimaModules/Regions/OshimaRegion.cs @@ -12,6 +12,9 @@ namespace Oshima.FunGame.OshimaModules.Regions public new HashSet Characters { get; } = []; public new HashSet Units { get; } = []; public new HashSet Crops { get; } = []; + public Dictionary ContinuousQuestList { get; set; } = []; + public Dictionary ImmediateQuestList { get; set; } = []; + public Dictionary ProgressiveQuestList { get; set; } = []; public override bool Equals(IBaseEntity? other) { diff --git a/OshimaModules/Regions/Outworld.cs b/OshimaModules/Regions/Outworld.cs index 24f68a8..73d58d4 100644 --- a/OshimaModules/Regions/Outworld.cs +++ b/OshimaModules/Regions/Outworld.cs @@ -26,6 +26,12 @@ namespace Oshima.FunGame.OshimaModules.Regions Areas.Add("神经矿脉​​"); Areas.Add("雷霆王座"); Areas.Add("裁决矩阵"); + ContinuousQuestList.Add("泰坦遗迹的符文解读", new("攀登泰坦遗迹,记录裁决尖碑在月圆之夜投射的泰坦符文,破译其蕴含的宇宙法则。")); + ContinuousQuestList.Add("矿脉神经的止痛研究", new("在泰坦遗迹的悲鸣矿脉区开发神经缓冲装置,减轻开采神经宝石引发的山体剧痛反应。")); + ImmediateQuestList.Add("泰坦遗迹的磁场危机", new("泰坦遗迹的悬浮岩块因神经宝石共振引发磁场紊乱,必须在半小时内稳定能量场防止区域崩塌。")); + ImmediateQuestList.Add("矿脉神经共鸣失控", new("泰坦遗迹悲鸣矿脉的神经宝石集体共振,引发山体结构崩解,必须立即部署阻尼力场稳定矿脉。")); + ProgressiveQuestList.Add("泰坦符文拓印", new("在泰坦遗迹的裁决尖碑上拓印 {0} 份不同的泰坦符文石(避开雷暴时段/每逢子时)。", item: "泰坦符文石")); + ProgressiveQuestList.Add("矿脉神经镇痛研究", new("在泰坦遗迹的悲鸣矿脉区采集 {0} 份神经宝石样本(开采时会引发山体剧痛反应)。", item: "神经宝石")); } } } diff --git a/OshimaModules/Regions/QuestExploration.cs b/OshimaModules/Regions/QuestExploration.cs new file mode 100644 index 0000000..0495309 --- /dev/null +++ b/OshimaModules/Regions/QuestExploration.cs @@ -0,0 +1,12 @@ +using Oshima.Core.Constant; + +namespace Oshima.FunGame.OshimaModules.Regions +{ + public class QuestExploration(string description, string character = "", string item = "", ExploreResult result = ExploreResult.General) + { + public ExploreResult ExploreResult { get; set; } = result; + public string Description { get; set; } = description; + public string Character { get; set; } = character; + public string Item { get; set; } = item; + } +} diff --git a/OshimaServers/Model/ExploreModel.cs b/OshimaServers/Model/ExploreModel.cs index 2e0aa42..8428df9 100644 --- a/OshimaServers/Model/ExploreModel.cs +++ b/OshimaServers/Model/ExploreModel.cs @@ -1,6 +1,7 @@ using System.Text; using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Constant; +using Oshima.Core.Constant; using Oshima.FunGame.OshimaServers.Service; namespace Oshima.FunGame.OshimaServers.Model diff --git a/OshimaServers/Service/FunGameConstant.cs b/OshimaServers/Service/FunGameConstant.cs index b9c03ee..83f7408 100644 --- a/OshimaServers/Service/FunGameConstant.cs +++ b/OshimaServers/Service/FunGameConstant.cs @@ -1,5 +1,6 @@ using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Constant; +using Oshima.Core.Constant; using Oshima.FunGame.OshimaModules.Effects.OpenEffects; using Oshima.FunGame.OshimaModules.Items; using Oshima.FunGame.OshimaModules.Regions; @@ -290,258 +291,6 @@ namespace Oshima.FunGame.OshimaServers.Service } }; - public static Dictionary ContinuousQuestList { get; } = new() - { - { - "悖论引擎的暗涌之息", - "穿梭于银辉城流淌液态月光的街道,侦测悖论引擎释放的异常能量潮汐,揭开可能撕裂现实结构的危险谜团。" - }, - { - "林海深处的记忆协奏曲", - "在瑟兰薇歌林海水晶化的树冠建立观测站,记录春季地貌重组时树木根系发出的低频共振波,破译其与旋律古龙苏醒周期的关联。" - }, - { - "元素裂隙的熵增警告", - "使用抗魔探针扫描永燃坩埚第47层矿道,绘制元素裂缝的扩张轨迹,评估其引发位面坍缩的风险等级。" - }, - { - "时间琥珀中的战争回响", - "在永霜裂痕建立时滞力场实验室,分析冻结在冰壁中的古代战争幻象,还原时霜药剂对观察者认知体系的扭曲机制。" - }, - { - "镜像维度的认知污染", - "佩戴反重力拘束装置潜入千瞳镜湖,测绘镜像城的拓扑结构,警惕瞳孔状传送门对记忆模块的逆向写入现象。" - }, - { - "泰坦遗迹的符文解读", - "攀登泰坦遗迹,记录裁决尖碑在月圆之夜投射的泰坦符文,破译其蕴含的宇宙法则。" - }, - { - "流沙时计的昨日寻踪", - "在时之荒漠中寻找海市蜃楼般的昨日之城,收集散落在其中的时间碎片,还原历史真相。" - }, - { - "腐萤沼渊的共生调查", - "深入腐萤沼渊,研究共生母体的生态系统,记录菌类模仿动物叫声的频率和模式。" - }, - { - "星锚之地的束缚警戒", - "前往双生月崖永夜侧的星锚之地,加固引雷柱的能量场,防止星空巨兽挣脱时空束缚。" - }, - { - "机械坟场的改造危机", - "潜入齿轮坟场被活体建筑同化的造物车间,研究其机械与生物融合的改造机制,寻找控制方法。" - }, - { - "镜湖星辉的引力观察", - "在银辉城折射星空的水域边缘建立观测点,记录星辉水母群在午夜重构重力法则时的空间涟漪。" - }, - { - "骨桥记忆的精神共鸣", - "进入棱镜骨桥,收集晶体化红杉中储存的亡者记忆,调查空间褶皱对现实结构的影响。" - }, - { - "坩埚熔岩的生命观测", - "在永燃坩埚的火山灰层建立实验室,监测活体金属苔藓与岩浆鱿鱼的共生进化过程。" - }, - { - "时沙陷阱的预警系统", - "在时之荒漠部署时间流沙监测网,预测沙丘重组周期并标记高危区域,保障探索者安全。" - }, - { - "腐沼菌群的声波分析", - "在腐萤沼渊建立声纹实验室,解析共生母体菌类发出的动物模拟叫声,建立声波防御系统。" - }, - { - "双生湮灭的边界探测", - "在双生月崖建立空间稳定站,研究昼夜切换时湮灭边界产生的空间畸变现象。" - }, - { - "谵妄梦境的思维隔离", - "在谵妄海市建立认知过滤系统,阻断思维寄生虫对市民意识的寄生感染路径。" - }, - { - "圣树蜜蜡的数据加密", - "在瑟兰薇歌林海脉轮圣树区部署安全协议,防止可编程蜜蜡的数据泄露事件再次发生。" - }, - { - "矿脉神经的止痛研究", - "在泰坦遗迹的悲鸣矿脉区开发神经缓冲装置,减轻开采神经宝石引发的山体剧痛反应。" - }, - { - "齿轮活血的污染控制", - "在齿轮坟场建立液态魔力隔离区,防止活体魔力血的生物污染扩散至外部环境。" - } - }; - - public static Dictionary ImmediateQuestList { get; } = new() - { - { - "星银警戒协议·弎级响应", - "星银合金守卫在悖论引擎周边暴走,形成包围核心区的杀戮矩阵,必须在三刻钟内解除警戒协议。" - }, - { - "音律囚笼突破作战", - "苏醒的旋律古龙释放出高频震波,将精灵们困在水晶共振牢笼中,需在下次地貌重组前切断声波共鸣节点。" - }, - { - "深渊火种收容危机", - "永燃坩埚矿道底层的深渊火钻因元素污染进入链式裂变,引发全矿道魔能过载,立即部署熵减力场遏制反应。" - }, - { - "时霜逆流救援行动", - "科研小组被困在永霜裂痕加速百倍的时间泡内,其肉体正以肉眼可见的速度衰老,必须校准哨塔时钟恢复时间流速。" - }, - { - "镜像侵蚀净化指令", - "千瞳镜湖的镜像守卫突破维度屏障入侵现实,携带的认知病毒正在改写物理法则,启动空间净化协议隔离威胁。" - }, - { - "泰坦遗迹的磁场危机", - "泰坦遗迹的悬浮岩块因神经宝石共振引发磁场紊乱,必须在半小时内稳定能量场防止区域崩塌。" - }, - { - "流沙陷阱紧急救援", - "勘探队被困在时之荒漠重组的沙丘核心,必须在沙暴吞噬前开辟逃生通道。" - }, - { - "腐沼毒气中和行动", - "腐萤沼渊共生母体排出的毒气云正在快速扩散,需在十分钟内启动应急中和装置保护周边生态。" - }, - { - "星空巨兽狂怒预警", - "双生月崖星锚之地的引雷柱遭到破坏,星空巨兽即将挣脱束缚,必须立即修复能量矩阵。" - }, - { - "活体建筑增殖警报", - "齿轮坟场的活体建筑开始暴走式增殖,必须在三刻钟内切断核心供能管道遏制扩张。" - }, - { - "圣树蜜蜡数据泄漏", - "瑟兰薇歌林海脉轮圣树区的可编程蜜蜡核心数据被盗,需在加密密钥失效前追回数据包。" - }, - { - "矿脉神经共鸣失控", - "泰坦遗迹悲鸣矿脉的神经宝石集体共振,引发山体结构崩解,必须立即部署阻尼力场稳定矿脉。" - }, - { - "骨桥幽灵舰队突袭", - "棱镜骨桥下方的幽灵船队突破虚空屏障,对现实维度发动突袭,必须在半小时内建立反制防线。" - }, - { - "坩埚金属瘟疫爆发", - "永燃坩埚的活体金属苔藓变异为吞噬性瘟疫,正沿岩浆通道快速扩散,必须立即启动熔断隔离机制。" - }, - { - "时之蝎群时空侵染", - "时之荒漠的时之蝎因时凝液泄漏引发群体狂暴,其时间加速能力正在污染周边空间,需立即净化。" - }, - { - "湮灭边界扩张警报", - "双生月崖昼夜切换窗口期异常延迟,湮灭边界以每分钟5米速度扩张,必须立即撤离滞留学生团。" - }, - { - "谵妄认知病毒爆发", - "谵妄海市的思维寄生虫释放II型认知病毒,感染市民产生现实扭曲能力,必须一小时内建立精神隔离区。" - }, - { - "液态月光洪流预警", - "银辉城街道的液态月光进入异常涨潮期,即将淹没悖论引擎控制中枢,必须立即启动排水协议。" - }, - { - "棱镜记忆过载危机", - "棱镜骨桥的红杉晶体因记忆过载即将爆发共感冲击波,必须在五分钟内疏散周边观测人员。" - }, - { - "机械坟场核心熔毁", - "齿轮坟场的上古机械核心因活体魔力血污染进入熔毁倒计时,需立即执行冷却协议防止爆炸。" - } - }; - - public static Dictionary ProgressiveQuestList { get; } = new() - { - { - "月光萃取计划", - "前往银辉城,在星银合金建筑的沟壑中采集 {0} 份液态月光(避开月光洪流的高潮时段/每夜丑时三刻)。" - }, - { - "林海汁液采收行动", - "使用抗腐蚀容器收集瑟兰薇歌林海的 {0} 份荧蓝汁液(树木自卫系统激活时汁液会转化为神经毒素)。" - }, - { - "火钻精炼协议", - "在永燃坩埚矿工灵魂烙印的指引下获取 {0} 颗深渊火钻(未烙印者触碰火钻将引发元素爆燃)。" - }, - { - "时霜逆向工程", - "通过时间镜像收集 {0} 份来自永霜裂痕不同历史断片的时霜药剂样本(注意时空回响对记忆的覆盖效应)。" - }, - { - "瞳孔密钥重构计划", - "前往千瞳镜湖,从 {0} 个瞳孔状传送门提取量子纠缠碎片(保持镜像对称操作以避免维度塌缩)。" - }, - { - "泰坦符文拓印", - "在泰坦遗迹的裁决尖碑上拓印 {0} 份不同的泰坦符文(避开雷暴时段/每逢子时)。" - }, - { - "时间碎片收集", - "在时之荒漠的昨日之城幻影中收集 {0} 份不同的时间碎片(注意时间碎片会随机重组)。" - }, - { - "共生母体样本采集", - "从腐萤沼渊的共生母体采集 {0} 份不同的菌类样本(注意菌类会释放麻痹毒素)。" - }, - { - "星锚晶石加固任务", - "在双生月崖的星锚之地校准 {0} 个不同的引雷柱(避开星空巨兽的能量波动周期)。" - }, - { - "活体建筑解析计划", - "在齿轮坟场研究 {0} 个活体建筑样本(警惕改造实验引发的身体异变)。" - }, - { - "圣树蜜蜡编程实验", - "在瑟兰薇歌林海的脉轮圣树区进行 {0} 次蜜蜡编程(注意编码错误会引发精神干扰)。" - }, - { - "矿脉神经镇痛研究", - "在泰坦遗迹的悲鸣矿脉区采集 {0} 份神经宝石样本(开采时会引发山体剧痛反应)。" - }, - { - "骨桥记忆共鸣实验", - "在棱镜骨桥提取 {0} 份不同的亡者记忆(注意记忆共鸣会引发共感眩晕)。" - }, - { - "坩埚活体金属培育", - "在永燃坩埚培育 {0} 份活体金属苔藓(注意培育环境需保持600℃以上恒温)。" - }, - { - "幽灵航线能量测绘", - "在棱镜骨桥下方收集 {0} 份幽灵船能量数据(避开虚空航行高峰期)。" - }, - { - "时凝液时效研究", - "在时之荒漠提纯 {0} 份时凝液(操作需在时间加速器防护罩内完成)。" - }, - { - "湮灭边界观测记录", - "在双生月崖记录 {0} 次湮灭边界现象(每次观测窗口期不超过三分钟)。" - }, - { - "梦境碎片毒性分析", - "在谵妄海市分析 {0} 份不同的梦境碎片(需全程佩戴认知过滤器)。" - }, - { - "机械核心解密行动", - "在齿轮坟场解析 {0} 个上古机械核心(注意核心可能触发自毁程序)。" - }, - { - "湖底重力场测绘", - "在银辉城星辉水域测绘 {0} 个重力异常点(避开午夜水母重构期)。" - } - }; - public static List Regions { get; } = [ new 银辉城(), new 瑟兰薇歌林海(), new 永燃坩埚(), new 永霜裂痕(), new 齿轮坟场(), new 千瞳镜湖(), new 时之荒漠(), new 谵妄海市(), new 腐萤沼渊(), new 双生月崖(), new 棱镜骨桥(), new 泰坦遗迹() @@ -722,13 +471,4 @@ namespace Oshima.FunGame.OshimaServers.Service "堰揩越趁趋超揽堤提博揭喜彭揣插揪搜煮援搀裁搁搓搂搅壹握搔揉斯期欺联葫" + "散惹葬募葛董葡敬葱蒋蒂落韩朝辜葵棒棱棋椰植森焚椅椒棵棍椎棉"; } - - public enum ExploreResult - { - General, - Nothing, - Fight, - Earned, - Event - } } diff --git a/OshimaServers/Service/FunGameService.cs b/OshimaServers/Service/FunGameService.cs index e70b561..0b698fc 100644 --- a/OshimaServers/Service/FunGameService.cs +++ b/OshimaServers/Service/FunGameService.cs @@ -16,7 +16,9 @@ namespace Oshima.FunGame.OshimaServers.Service { public class FunGameService { + public static Dictionary> UserExploreItemCache { get; } = []; public static HashSet Activities { get; } = []; + public static List ActivitiesItemCache { get; } = []; public static Dictionary> UserNotice { get; } = []; public static Dictionary Bosses { get; } = []; public static ServerPluginLoader? ServerPluginLoader { get; set; } = null; @@ -619,12 +621,13 @@ namespace Oshima.FunGame.OshimaServers.Service return [.. list.Skip((showPage - 1) * pageSize).Take(pageSize)]; } - public static string GetDrawCardResult(int reduce, User user, bool isMulti = false, int multiCount = 1) + public static string GetDrawCardResult(int reduce, User user, bool isMulti = false, int multiCount = 1, bool useCurrency = true) { string msg = ""; + string reduceUnit = useCurrency ? General.GameplayEquilibriumConstant.InGameCurrency : General.GameplayEquilibriumConstant.InGameMaterial; if (!isMulti) { - msg = $"消耗 {reduce} {General.GameplayEquilibriumConstant.InGameCurrency},恭喜你抽到了:"; + msg = $"消耗 {reduce} {reduceUnit},恭喜你抽到了:"; } int r = Random.Shared.Next(8); @@ -1644,16 +1647,22 @@ namespace Oshima.FunGame.OshimaServers.Service itemsCount[item2.Name]++; } + // 随机筛选地区 + OshimaRegion region = FunGameConstant.Regions.OrderBy(o => Random.Shared.Next()).First(); + Quest quest; if (type == QuestType.Continuous) { - string name = FunGameConstant.ContinuousQuestList.Keys.OrderBy(o => Random.Shared.Next()).First(); + string name = region.ContinuousQuestList.Keys.OrderBy(o => Random.Shared.Next()).First(); + QuestExploration exploration = region.ContinuousQuestList[name]; int minutes = Random.Shared.Next(10, 41); quest = new() { Id = id, Name = name, - Description = FunGameConstant.ContinuousQuestList[name], + Description = exploration.Description, + RegionId = region.Id, + NeedyExploreItemName = exploration.Item, QuestType = QuestType.Continuous, EstimatedMinutes = minutes, CreditsAward = minutes * 20, @@ -1664,13 +1673,16 @@ namespace Oshima.FunGame.OshimaServers.Service } else if (type == QuestType.Immediate) { - string name = FunGameConstant.ImmediateQuestList.Keys.OrderBy(o => Random.Shared.Next()).First(); + string name = region.ImmediateQuestList.Keys.OrderBy(o => Random.Shared.Next()).First(); + QuestExploration exploration = region.ImmediateQuestList[name]; int difficulty = Random.Shared.Next(3, 11); quest = new() { Id = id, Name = name, - Description = FunGameConstant.ImmediateQuestList[name], + Description = exploration.Description, + RegionId = region.Id, + NeedyExploreItemName = exploration.Item, QuestType = QuestType.Immediate, CreditsAward = difficulty * 80, MaterialsAward = difficulty / 2 * 1, @@ -1680,13 +1692,16 @@ namespace Oshima.FunGame.OshimaServers.Service } else { - string name = FunGameConstant.ProgressiveQuestList.Keys.OrderBy(o => Random.Shared.Next()).First(); + string name = region.ProgressiveQuestList.Keys.OrderBy(o => Random.Shared.Next()).First(); + QuestExploration exploration = region.ProgressiveQuestList[name]; int maxProgress = Random.Shared.Next(3, 11); quest = new() { Id = id, Name = name, - Description = string.Format(FunGameConstant.ProgressiveQuestList[name], maxProgress), + Description = string.Format(exploration.Description, maxProgress), + RegionId = region.Id, + NeedyExploreItemName = exploration.Item, QuestType = QuestType.Progressive, Progress = 0, MaxProgress = maxProgress, @@ -1727,6 +1742,31 @@ namespace Oshima.FunGame.OshimaServers.Service result = true; } } + if (UserExploreItemCache.TryGetValue(user.Id, out List? value) && value != null && value.Count > 0) + { + // 从缓存中获取收集的物品 + List willRemove = []; + foreach (string item in value.Distinct()) + { + IEnumerable items = value.Where(str => str == item); + IEnumerable progressiveQuests = quests.Values.Where(q => q.QuestType == QuestType.Progressive && q.Status == QuestState.InProgress); + foreach (Quest quest in progressiveQuests) + { + if (quest.NeedyExploreItemName == item) + { + quest.Progress += items.Count(); + if (quest.Progress >= quest.MaxProgress) + { + quest.Progress = quest.MaxProgress; + quest.Status = QuestState.Completed; + result = true; + } + } + } + willRemove.Add(item); + } + value.RemoveAll(willRemove.Contains); + } IEnumerable finishQuests = quests.Values.Where(q => q.Status == QuestState.Completed); foreach (Quest quest in finishQuests) { @@ -1752,6 +1792,10 @@ namespace Oshima.FunGame.OshimaServers.Service newItem.User = user; SetSellAndTradeTime(newItem); user.Inventory.Items.Add(newItem); + // 连接到任务系统 + AddExploreItemCache(user.Id, item.Name); + // 连接到活动系统 + ActivitiesItemCache.Add(item.Name); } } } @@ -1763,6 +1807,18 @@ namespace Oshima.FunGame.OshimaServers.Service return result; } + public static void AddExploreItemCache(long userid, string item) + { + if (UserExploreItemCache.TryGetValue(userid, out List? value) && value != null) + { + value.Add(item); + } + else + { + UserExploreItemCache[userid] = [item]; + } + } + public static string CheckDailyStore(EntityModuleConfig store, User? user = null) { if (store.Count == 0) @@ -1863,7 +1919,7 @@ namespace Oshima.FunGame.OshimaServers.Service { for (int i = 0; i < count; i++) { - Item newItem = item.Copy(); + Item newItem = item.Copy(true); SetSellAndTradeTime(newItem); if (goods.GetPrice(General.GameplayEquilibriumConstant.InGameCurrency, out double price) && price > 0) { @@ -1935,6 +1991,39 @@ namespace Oshima.FunGame.OshimaServers.Service { Activities.Add(activity); } + bool update = false; + if (ActivitiesItemCache.Count > 0) + { + List willRemove = []; + IEnumerable activityList = Activities.Where(a => a.Status == ActivityState.InProgress); + foreach (string item in ActivitiesItemCache.Distinct()) + { + IEnumerable items = ActivitiesItemCache.Where(str => str == item); + foreach (Quest quest in activityList.SelectMany(a => a.Quests)) + { + if (quest.NeedyExploreItemName == item) + { + update = true; + quest.Progress += items.Count(); + if (quest.Progress >= quest.MaxProgress) + { + quest.Progress = quest.MaxProgress; + quest.Status = QuestState.Completed; + } + } + } + willRemove.Add(item); + } + ActivitiesItemCache.RemoveAll(willRemove.Contains); + } + if (update) + { + foreach (Activity activity in Activities) + { + activities.Add(activity.Id.ToString(), activity); + } + activities.SaveConfig(); + } StringBuilder builder = new(); builder.AppendLine("★☆★ 活动中心 ★☆★"); @@ -2192,7 +2281,7 @@ namespace Oshima.FunGame.OshimaServers.Service { msgs = msgs[^2..]; } - if (enemy.HP <= 0) + if (enemys.All(c => c.HP <= 0)) { model.FightWin = true; int credits = 0; @@ -2222,6 +2311,17 @@ namespace Oshima.FunGame.OshimaServers.Service model.Awards[item.Name] = count; award = $"{credits} {General.GameplayEquilibriumConstant.InGameCurrency}," + $"{exp} 点经验值(探索队员们平分)," + $"{materials} {General.GameplayEquilibriumConstant.InGameMaterial}," + $"以及 {count} 个{item.Name}"; + if (Random.Shared.NextDouble() > 0.6) + { + Item? itemDrop = region.Items.OrderBy(o => Random.Shared.Next()).FirstOrDefault(); + if (itemDrop != null) + { + string itemquality = ItemSet.GetQualityTypeName(itemDrop.QualityType); + string itemtype = ItemSet.GetItemTypeName(itemDrop.ItemType) + (itemDrop.ItemType == ItemType.Weapon && itemDrop.WeaponType != WeaponType.None ? "-" + ItemSet.GetWeaponTypeName(itemDrop.WeaponType) : ""); + if (itemtype != "") itemtype = $"|{itemtype}"; + award += $"!额外获得了:[{itemquality + itemtype}] {itemDrop.Name}"; + } + } exploreString = $"{exploreString}\r\n{string.Join("\r\n", msgs)}\r\n探索小队战胜了{enemy.Name}!获得了:{award}!"; } else @@ -2244,7 +2344,10 @@ namespace Oshima.FunGame.OshimaServers.Service else { model.Awards[itemEarned.Name] = 1; - award = itemEarned.Name; + string itemquality = ItemSet.GetQualityTypeName(itemEarned.QualityType); + string itemtype = ItemSet.GetItemTypeName(itemEarned.ItemType) + (itemEarned.ItemType == ItemType.Weapon && itemEarned.WeaponType != WeaponType.None ? "-" + ItemSet.GetWeaponTypeName(itemEarned.WeaponType) : ""); + if (itemtype != "") itemtype = $"|{itemtype}"; + award += $"[{itemquality + itemtype}] {itemEarned.Name}"; } break; case ExploreResult.Event: @@ -2300,6 +2403,10 @@ namespace Oshima.FunGame.OshimaServers.Service newItem.User = user; SetSellAndTradeTime(newItem); user.Inventory.Items.Add(newItem); + // 连接到任务系统 + AddExploreItemCache(user.Id, item.Name); + // 连接到活动系统 + ActivitiesItemCache.Add(item.Name); } } } diff --git a/OshimaWebAPI/Controllers/FunGameController.cs b/OshimaWebAPI/Controllers/FunGameController.cs index 6ace146..9c4635b 100644 --- a/OshimaWebAPI/Controllers/FunGameController.cs +++ b/OshimaWebAPI/Controllers/FunGameController.cs @@ -1343,7 +1343,7 @@ namespace Oshima.FunGame.WebAPI.Controllers double dice = Random.Shared.NextDouble(); if (dice > 0.8) { - string msg = FunGameService.GetDrawCardResult(reduce, user); + string msg = FunGameService.GetDrawCardResult(reduce, user, useCurrency: false); user.LastTime = DateTime.Now; pc.Add("user", user); pc.SaveConfig(); @@ -1391,7 +1391,7 @@ namespace Oshima.FunGame.WebAPI.Controllers if (dice > 0.8) { count++; - result.Add(FunGameService.GetDrawCardResult(reduce, user, true, count)); + result.Add(FunGameService.GetDrawCardResult(reduce, user, true, count, useCurrency: false)); } } if (result.Count == 1) @@ -3926,6 +3926,10 @@ namespace Oshima.FunGame.WebAPI.Controllers { msgs.Add($"任务【{quest.Name}】已经结算并发放奖励了哦!\r\n{quest}"); } + else if (quest.Status == QuestState.InProgress) + { + msgs.Add($"任务【{quest.Name}】已经在进行中,请根据任务要求完成任务。\r\n{quest}"); + } else { quest.StartTime = DateTime.Now; @@ -3942,13 +3946,9 @@ namespace Oshima.FunGame.WebAPI.Controllers quest.Status = QuestState.Completed; msgs.Add("在任务过程中,你碰巧遇到了米莉,任务直接完成了!"); } - else + else if (quest.QuestType == QuestType.Progressive) { msgs.Add($"开始任务【{quest.Name}】成功!任务信息如下:\r\n{quest}"); - // TODO:进度条任务需要完成任务的指标,实现任务逻辑 - quest.Progress = quest.MaxProgress; - quest.Status = QuestState.Completed; - msgs.Add("在任务过程中,你碰巧遇到了米莉,任务直接完成了!"); } quests.SaveConfig(); } @@ -5059,9 +5059,9 @@ namespace Oshima.FunGame.WebAPI.Controllers foreach (Item item in good.Items) { count++; - Item newItem = item.Copy(); + Item newItem = item.Copy(true); newItem.Character = user.Inventory.MainCharacter; - newItem.SetLevel(1); + if (newItem.ItemType != ItemType.MagicCard) newItem.SetLevel(1); itemMsg += $"[ {count} ] {newItem.ToString(false, true)}".Trim(); } msg = good.ToString().Split("包含物品:")[0].Trim(); @@ -5328,14 +5328,21 @@ namespace Oshima.FunGame.WebAPI.Controllers if (msg == "") { - exploreTimes -= characterCount; if (regionid > 0 && regionid <= FunGameConstant.Regions.Count && FunGameConstant.Regions.FirstOrDefault(r => r.Id == regionid) is OshimaRegion region) { + exploreTimes -= characterCount; + msg = $"开始探索【{region.Name}】,探索时间预计 {FunGameConstant.ExploreTime} 分钟(系统会自动结算,届时会有提示)。" + $"探索成员:[ {FunGameService.GetCharacterGroupInfoByInventorySequence(user.Inventory.Characters, characterIds, " ] / [ ")} ]"; ExploreModel model = await FunGameService.GenerateExploreModel(region, characterIds, user); exploreId = model.Guid; list.Add(model); + + if (exploreTimes > 0) + { + if (msg != "") msg += "\r\n"; + msg += $"本次扣除探索次数 {characterCount} 次,你的剩余探索次数:{exploreTimes} 次。需要注意:探索角色越多,奖励越多,但是会扣除相应的探索次数。"; + } } else { @@ -5343,12 +5350,6 @@ namespace Oshima.FunGame.WebAPI.Controllers } } - if (exploreTimes > 0) - { - if (msg != "") msg += "\r\n"; - msg += $"本次扣除探索次数 {characterCount} 次,你的剩余探索次数:{exploreTimes} 次。需要注意:探索角色越多,奖励越多,但是会扣除相应的探索次数。"; - } - user.LastTime = DateTime.Now; pc.Add("user", user); pc.Add("exploreTimes", exploreTimes);