mirror of
https://github.com/oshima-studios/OshimaGameModule.git
synced 2025-12-05 16:16:35 +00:00
修改第二货币的名称;添加锻造系统
This commit is contained in:
parent
d6d7beaa6f
commit
59836e5e69
@ -36,6 +36,7 @@ namespace Oshima.FunGame.OshimaModules
|
|||||||
protected override void AfterLoad()
|
protected override void AfterLoad()
|
||||||
{
|
{
|
||||||
General.GameplayEquilibriumConstant.InGameTime = "秒";
|
General.GameplayEquilibriumConstant.InGameTime = "秒";
|
||||||
|
General.GameplayEquilibriumConstant.InGameMaterial = "钻石";
|
||||||
General.GameplayEquilibriumConstant.UseMagicType = [MagicType.None];
|
General.GameplayEquilibriumConstant.UseMagicType = [MagicType.None];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
23
OshimaServers/Model/ForgeModel.cs
Normal file
23
OshimaServers/Model/ForgeModel.cs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
using Milimoe.FunGame.Core.Library.Constant;
|
||||||
|
|
||||||
|
namespace Oshima.FunGame.OshimaServers.Model
|
||||||
|
{
|
||||||
|
public class ForgeModel
|
||||||
|
{
|
||||||
|
public Guid Guid { get; set; } = Guid.NewGuid();
|
||||||
|
public bool MasterForge { get; set; } = false;
|
||||||
|
public Dictionary<string, int> ForgeMaterials { get; set; } = [];
|
||||||
|
public long TargetRegionId { get; set; } = 0;
|
||||||
|
public QualityType TargetQuality { get; set; } = QualityType.White;
|
||||||
|
public Dictionary<long, double> RegionProbabilities { get; set; } = [];
|
||||||
|
public bool Result { get; set; } = false;
|
||||||
|
public QualityType ResultQuality { get; set; } = QualityType.White;
|
||||||
|
public string ResultItem { get; set; } = "";
|
||||||
|
public long ResultRegion { get; set; } = 0;
|
||||||
|
public string ResultString { get; set; } = "";
|
||||||
|
public double ResultPoints => ResultPointsGeneral + ResultPointsSuccess + ResultPointsFail;
|
||||||
|
public double ResultPointsGeneral { get; set; } = 0;
|
||||||
|
public double ResultPointsSuccess { get; set; } = 0;
|
||||||
|
public double ResultPointsFail { get; set; } = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -374,7 +374,9 @@ namespace Oshima.FunGame.OshimaServers.Service
|
|||||||
"{2}的低语在风中消散,但留在你手中的是闪耀的{0}!",
|
"{2}的低语在风中消散,但留在你手中的是闪耀的{0}!",
|
||||||
"恭喜你!成功在荒野中迷路!奖励…等等,好像是:{0}?至少不是空手而归…",
|
"恭喜你!成功在荒野中迷路!奖励…等等,好像是:{0}?至少不是空手而归…",
|
||||||
"你凝视着远方,远方也凝视着你…然后,你获得了:{0}!这大概就是命运吧。",
|
"你凝视着远方,远方也凝视着你…然后,你获得了:{0}!这大概就是命运吧。",
|
||||||
"探索结果:空气,阳光,还有…奖励:{0}!看来今天运气还不错?"
|
"探索结果:空气,阳光,还有…奖励:{0}!看来今天运气还不错?",
|
||||||
|
"你随手拨开{4}的草丛,惊喜地发现{0}在阳光下闪闪发光!",
|
||||||
|
"{3}在{4}的微光中低语,指引你走向了意外的{0}!"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -383,7 +385,12 @@ namespace Oshima.FunGame.OshimaServers.Service
|
|||||||
"{4}地牢里的封印纹丝未动,仿佛在嘲笑着你的徒劳……(什么也没有获得)",
|
"{4}地牢里的封印纹丝未动,仿佛在嘲笑着你的徒劳……(什么也没有获得)",
|
||||||
"在你的注视下,{4}的宝藏已被{2}掠夺一空。(什么也没有获得)",
|
"在你的注视下,{4}的宝藏已被{2}掠夺一空。(什么也没有获得)",
|
||||||
"你对着空地发呆了半天,只剩冰冷的{4}和你的失望。(什么也没有获得)",
|
"你对着空地发呆了半天,只剩冰冷的{4}和你的失望。(什么也没有获得)",
|
||||||
"在空荡的回响中传来讥笑,原来{4}的秘宝不过是个传说。(什么也没有获得)"
|
"在空荡的回响中传来讥笑,原来{4}的秘宝不过是个传说。(什么也没有获得)",
|
||||||
|
"{4}的废墟中只有风声作伴,{3}也无法指引你找到任何东西。(什么也没有获得)",
|
||||||
|
"你翻遍了{4}的每个角落,{2}的笑声仿佛在嘲笑你的空手而归。(什么也没有获得)",
|
||||||
|
"{6}的阴影笼罩着{4},但无论你如何寻找,宝藏依然无踪。(什么也没有获得)",
|
||||||
|
"在{4}的荒凉中,你只找到了一堆无用的碎石和失望。(什么也没有获得)",
|
||||||
|
"{3}的光芒在{4}中黯淡,仿佛连它都不愿理会你的探索。(什么也没有获得)"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -392,7 +399,12 @@ namespace Oshima.FunGame.OshimaServers.Service
|
|||||||
"当你触碰{3}时,{1}的咆哮震撼着{4}!",
|
"当你触碰{3}时,{1}的咆哮震撼着{4}!",
|
||||||
"原来这里真的有危险……是{1}守卫着{4},不得不战了!",
|
"原来这里真的有危险……是{1}守卫着{4},不得不战了!",
|
||||||
"在探索{4}的某处时,身旁的墙突然破裂,{1}从阴影中降临!",
|
"在探索{4}的某处时,身旁的墙突然破裂,{1}从阴影中降临!",
|
||||||
"你惊动了{1}!{4}瞬间化作战场!"
|
"你惊动了{1}!{4}瞬间化作战场!",
|
||||||
|
"{1}从{4}的黑暗中冲出,{3}的光芒成了战斗的信号!",
|
||||||
|
"{4}的宁静被打破,{1}的怒吼在{6}回荡,战斗一触即发!",
|
||||||
|
"当你靠近{3}时,{1}从{4}的迷雾中现身,剑拔弩张!",
|
||||||
|
"{4}的深处传来低吼,{1}正守候着,你别无选择只能应战!",
|
||||||
|
"你踏入{4}的禁地,{1}的咆哮宣告了战斗的开始!"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -401,7 +413,12 @@ namespace Oshima.FunGame.OshimaServers.Service
|
|||||||
"祝福应验!{4}深处的{0}为你所有!",
|
"祝福应验!{4}深处的{0}为你所有!",
|
||||||
"解开{4}地牢中的谜题后,{0}终于显现!",
|
"解开{4}地牢中的谜题后,{0}终于显现!",
|
||||||
"屏障消散,至宝{0}光芒万丈,自觉地飞进了你的口袋!",
|
"屏障消散,至宝{0}光芒万丈,自觉地飞进了你的口袋!",
|
||||||
"在偶遇{1}和{2}的遭遇战时,你渔翁得利抢到了:{0}!"
|
"在偶遇{1}和{2}的遭遇战时,你渔翁得利抢到了:{0}!",
|
||||||
|
"{4}的古老祭坛发出光芒,{0}从{3}中缓缓升起,归于你手!",
|
||||||
|
"你无意间触碰{4}的机关,{0}如流星般落入你的怀抱!",
|
||||||
|
"{2}的指引让你在{4}的废墟中发现了闪耀的{0}!",
|
||||||
|
"在{6}的星光下,{3}为你揭示了{0}的藏身之处!",
|
||||||
|
"{4}的秘密通道在{3}的指引下开启,{0}赫然出现在你面前!"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -430,7 +447,7 @@ namespace Oshima.FunGame.OshimaServers.Service
|
|||||||
public static Dictionary<QualityType, double> DecomposedMaterials { get; } = new()
|
public static Dictionary<QualityType, double> DecomposedMaterials { get; } = new()
|
||||||
{
|
{
|
||||||
{ QualityType.Gold, 128 },
|
{ QualityType.Gold, 128 },
|
||||||
{ QualityType.Red, 6 },
|
{ QualityType.Red, 64 },
|
||||||
{ QualityType.Orange, 32 },
|
{ QualityType.Orange, 32 },
|
||||||
{ QualityType.Purple, 16 },
|
{ QualityType.Purple, 16 },
|
||||||
{ QualityType.Blue, 8 },
|
{ QualityType.Blue, 8 },
|
||||||
@ -438,6 +455,25 @@ namespace Oshima.FunGame.OshimaServers.Service
|
|||||||
{ QualityType.White, 1 }
|
{ QualityType.White, 1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public static Dictionary<QualityType, double> ForgeNeedy { get; } = new()
|
||||||
|
{
|
||||||
|
{ QualityType.Red, 230 },
|
||||||
|
{ QualityType.Orange, 170 },
|
||||||
|
{ QualityType.Purple, 120 },
|
||||||
|
{ QualityType.Blue, 80 },
|
||||||
|
{ QualityType.Green, 50 },
|
||||||
|
{ QualityType.White, 30 }
|
||||||
|
};
|
||||||
|
|
||||||
|
public static Dictionary<RarityType, double> ForgeRegionCoefficient { get; } = new()
|
||||||
|
{
|
||||||
|
{ RarityType.OneStar, 0.5 },
|
||||||
|
{ RarityType.TwoStar, 0.6 },
|
||||||
|
{ RarityType.ThreeStar, 0.7 },
|
||||||
|
{ RarityType.FourStar, 0.85 },
|
||||||
|
{ RarityType.FiveStar, 1 }
|
||||||
|
};
|
||||||
|
|
||||||
public static string[] GreekAlphabet { get; } = ["α", "β", "γ", "δ", "ε", "ζ", "η", "θ", "ι", "κ", "λ", "μ", "ν", "ξ", "ο", "π", "ρ", "σ", "τ", "υ", "φ", "χ", "ψ", "ω"];
|
public static string[] GreekAlphabet { get; } = ["α", "β", "γ", "δ", "ε", "ζ", "η", "θ", "ι", "κ", "λ", "μ", "ν", "ξ", "ο", "π", "ρ", "σ", "τ", "υ", "φ", "χ", "ψ", "ω"];
|
||||||
|
|
||||||
public static string[] CommonSurnames { get; } = [
|
public static string[] CommonSurnames { get; } = [
|
||||||
|
|||||||
@ -35,7 +35,7 @@
|
|||||||
{"小队状态", "查看小队所有角色状态"},
|
{"小队状态", "查看小队所有角色状态"},
|
||||||
{"清空小队", "清空所有小队成员"},
|
{"清空小队", "清空所有小队成员"},
|
||||||
{"生命之泉", "使用金币回复角色状态"},
|
{"生命之泉", "使用金币回复角色状态"},
|
||||||
{"酒馆", "使用材料使角色获得满能量"},
|
{"酒馆", "使用钻石使角色获得满能量"},
|
||||||
};
|
};
|
||||||
|
|
||||||
public static Dictionary<string, string> ItemHelp { get; } = new() {
|
public static Dictionary<string, string> ItemHelp { get; } = new() {
|
||||||
@ -46,8 +46,8 @@
|
|||||||
{"角色库存 [页码]", "显示库存中所有角色"},
|
{"角色库存 [页码]", "显示库存中所有角色"},
|
||||||
{"我的物品 <物品序号>", "查看指定物品详细信息"},
|
{"我的物品 <物品序号>", "查看指定物品详细信息"},
|
||||||
{"抽卡/十连抽卡", "金币抽卡(1000/次)"},
|
{"抽卡/十连抽卡", "金币抽卡(1000/次)"},
|
||||||
{"材料抽卡/材料十连抽卡", "材料抽卡(5/次)"},
|
{"钻石抽卡/钻石十连抽卡", "钻石抽卡(5/次)"},
|
||||||
{"兑换金币 <材料数>", "1材料=200金币"},
|
{"兑换金币 <钻石数>", "1钻石=200金币"},
|
||||||
{"使用 <物品名称> <数量> [角色] [角色序号]", "使用物品(可指定角色)举例:使用大经验书 100 角色1"},
|
{"使用 <物品名称> <数量> [角色] [角色序号]", "使用物品(可指定角色)举例:使用大经验书 100 角色1"},
|
||||||
{"使用 <物品序号> [使用次数] [角色] [角色序号]", "使用物品(可指定角色)"},
|
{"使用 <物品序号> [使用次数] [角色] [角色序号]", "使用物品(可指定角色)"},
|
||||||
{"使用魔法卡 <物品序号> <卡包序号>", "使用指定魔法卡"},
|
{"使用魔法卡 <物品序号> <卡包序号>", "使用指定魔法卡"},
|
||||||
@ -56,6 +56,11 @@
|
|||||||
{"分解 <物品名称> <数量>", "分解指定数量物品"},
|
{"分解 <物品名称> <数量>", "分解指定数量物品"},
|
||||||
{"强制分解 <物品名称> <数量>", "分解指定数量物品"},
|
{"强制分解 <物品名称> <数量>", "分解指定数量物品"},
|
||||||
{"品质分解 <品质索引>", "按品质分解(0-6:普通/优秀/稀有/史诗/传说/神话/不朽)"},
|
{"品质分解 <品质索引>", "按品质分解(0-6:普通/优秀/稀有/史诗/传说/神话/不朽)"},
|
||||||
|
{"锻造配方 <{<物品名称> <数量>...}>", "创建一个锻造配方" },
|
||||||
|
{"锻造信息", "查看已经创建的锻造配方" },
|
||||||
|
{"取消锻造", "取消已经创建的锻造配方" },
|
||||||
|
{"模拟锻造", "模拟锻造结果" },
|
||||||
|
{"确认开始锻造", "确认已经创建的锻造配方并开始锻造" },
|
||||||
};
|
};
|
||||||
|
|
||||||
public static Dictionary<string, string> BattleHelp { get; } = new() {
|
public static Dictionary<string, string> BattleHelp { get; } = new() {
|
||||||
@ -69,7 +74,7 @@
|
|||||||
{"练级结算", "收取练级奖励,并且回血和复活"},
|
{"练级结算", "收取练级奖励,并且回血和复活"},
|
||||||
{"练级信息", "查看练级进度"},
|
{"练级信息", "查看练级进度"},
|
||||||
{"生命之泉", "使用金币回复角色状态"},
|
{"生命之泉", "使用金币回复角色状态"},
|
||||||
{"酒馆", "使用材料使角色获得满能量"},
|
{"酒馆", "使用钻石使角色获得满能量"},
|
||||||
};
|
};
|
||||||
|
|
||||||
public static Dictionary<string, string> PlayHelp { get; } = new() {
|
public static Dictionary<string, string> PlayHelp { get; } = new() {
|
||||||
@ -83,11 +88,16 @@
|
|||||||
{"探索 <地区序号> <{角色序号...}>", "探索指定地区(可多角色)"},
|
{"探索 <地区序号> <{角色序号...}>", "探索指定地区(可多角色)"},
|
||||||
{"探索结算", "结算所有未完成的探索"},
|
{"探索结算", "结算所有未完成的探索"},
|
||||||
{"挑战金币秘境 <难度>", "以小队挑战金币秘境,秘境难度1-5"},
|
{"挑战金币秘境 <难度>", "以小队挑战金币秘境,秘境难度1-5"},
|
||||||
{"挑战材料秘境 <难度>", "以小队挑战材料秘境,秘境难度1-5"},
|
{"挑战钻石秘境 <难度>", "以小队挑战钻石秘境,秘境难度1-5"},
|
||||||
{"挑战经验秘境 <难度>", "以小队挑战经验秘境,秘境难度1-5"},
|
{"挑战经验秘境 <难度>", "以小队挑战经验秘境,秘境难度1-5"},
|
||||||
{"挑战地区秘境 <难度>", "以小队挑战地区锻造材料秘境,秘境难度1-5"},
|
{"挑战地区秘境 <难度>", "以小队挑战地区锻造材料秘境,秘境难度1-5"},
|
||||||
{"挑战突破秘境 <难度>", "以小队挑战角色突破材料秘境,秘境难度1-5"},
|
{"挑战突破秘境 <难度>", "以小队挑战角色突破材料秘境,秘境难度1-5"},
|
||||||
{"挑战技能秘境 <难度>", "以小队挑战技能升级材料秘境,秘境难度1-5"},
|
{"挑战技能秘境 <难度>", "以小队挑战技能升级材料秘境,秘境难度1-5"},
|
||||||
|
{"锻造配方 <{<物品名称> <数量>...}>", "创建一个锻造配方" },
|
||||||
|
{"锻造信息", "查看已经创建的锻造配方" },
|
||||||
|
{"取消锻造", "取消已经创建的锻造配方" },
|
||||||
|
{"模拟锻造", "模拟锻造结果" },
|
||||||
|
{"确认开始锻造", "确认已经创建的锻造配方并开始锻造" },
|
||||||
};
|
};
|
||||||
|
|
||||||
public static Dictionary<string, string> ClubHelp { get; } = new() {
|
public static Dictionary<string, string> ClubHelp { get; } = new() {
|
||||||
@ -132,16 +142,10 @@
|
|||||||
{"商店2", "查看武器商会商品"},
|
{"商店2", "查看武器商会商品"},
|
||||||
{"商店3", "查看杂货铺商品"},
|
{"商店3", "查看杂货铺商品"},
|
||||||
{"商店4", "查看慈善基金会商品"},
|
{"商店4", "查看慈善基金会商品"},
|
||||||
|
{"锻造商店", "查看锻造积分商店商品"},
|
||||||
{"商店查看 <商品序号>", "查看指定商品详情,访问任意商店后2分钟内可用"},
|
{"商店查看 <商品序号>", "查看指定商品详情,访问任意商店后2分钟内可用"},
|
||||||
{"商店购买 <商品序号>", "购买指定商品,访问任意商店后2分钟内可用"},
|
{"商店购买 <商品序号>", "购买指定商品,访问任意商店后2分钟内可用"},
|
||||||
{"商店出售 <物品序号>", "向商店出售具有回收价的指定物品"},
|
{"商店出售 <物品序号>", "向商店出售具有回收价的指定物品"},
|
||||||
{"市场上架 <物品序号> <定价>", "将物品寄售到市场上,手续费15%"},
|
|
||||||
{"市场下架 <市场物品序号>", "下架指定物品"},
|
|
||||||
{"市场购买 <市场物品序号>", "购买指定物品"},
|
|
||||||
{"社团市场上架 <物品序号> <定价>", "将物品寄售到社团市场上,手续费10%,并且8%进入社团基金"},
|
|
||||||
{"社团市场下架 <市场物品序号>", "下架指定物品"},
|
|
||||||
{"社团市场购买 <市场物品序号>", "购买指定物品"},
|
|
||||||
{"社团市场清空", "管理员可下架所有物品"},
|
|
||||||
{"创建报价", "创建一个交易报价"},
|
{"创建报价", "创建一个交易报价"},
|
||||||
{"我的报价 [页码]/查报价 <报价序号>", "查询指定报价详情"},
|
{"我的报价 [页码]/查报价 <报价序号>", "查询指定报价详情"},
|
||||||
{"发送报价 <报价序号>", "仅发起方可操作"},
|
{"发送报价 <报价序号>", "仅发起方可操作"},
|
||||||
@ -152,6 +156,13 @@
|
|||||||
{"报价添加对方物品 <报价序号> <{物品序号}...>", "仅发起方可操作"},
|
{"报价添加对方物品 <报价序号> <{物品序号}...>", "仅发起方可操作"},
|
||||||
{"报价移除物品 <报价序号> <{报价物品序号}...>", "仅发起方可操作"},
|
{"报价移除物品 <报价序号> <{报价物品序号}...>", "仅发起方可操作"},
|
||||||
{"报价移除对方物品 <报价序号> <{报价物品序号}...>", "仅发起方可操作"},
|
{"报价移除对方物品 <报价序号> <{报价物品序号}...>", "仅发起方可操作"},
|
||||||
|
{"市场上架 <物品序号> <定价>", "将物品寄售到市场上,手续费15%"},
|
||||||
|
{"市场下架 <市场物品序号>", "下架指定物品"},
|
||||||
|
{"市场购买 <市场物品序号>", "购买指定物品"},
|
||||||
|
{"社团市场上架 <物品序号> <定价>", "将物品寄售到社团市场上,手续费10%,并且8%进入社团基金"},
|
||||||
|
{"社团市场下架 <市场物品序号>", "下架指定物品"},
|
||||||
|
{"社团市场购买 <市场物品序号>", "购买指定物品"},
|
||||||
|
{"社团市场清空", "管理员可下架所有物品"},
|
||||||
};
|
};
|
||||||
|
|
||||||
public static IEnumerable<KeyValuePair<string, string>> GetPage(Dictionary<string, string> dict, int page, int pageSize = 10)
|
public static IEnumerable<KeyValuePair<string, string>> GetPage(Dictionary<string, string> dict, int page, int pageSize = 10)
|
||||||
|
|||||||
@ -1387,7 +1387,7 @@ namespace Oshima.FunGame.OshimaServers.Service
|
|||||||
int original = has.Level;
|
int original = has.Level;
|
||||||
// 添加技能等级
|
// 添加技能等级
|
||||||
has.Level += magic.Level;
|
has.Level += magic.Level;
|
||||||
// 补偿材料,1级10材料
|
// 补偿钻石,1级10钻石
|
||||||
int diff = magic.Level - (has.Level - original);
|
int diff = magic.Level - (has.Level - original);
|
||||||
if (diff != 0)
|
if (diff != 0)
|
||||||
{
|
{
|
||||||
@ -3402,7 +3402,10 @@ namespace Oshima.FunGame.OshimaServers.Service
|
|||||||
Item newItem = item;
|
Item newItem = item;
|
||||||
if (copyNew) newItem = item.Copy(copyLevel);
|
if (copyNew) newItem = item.Copy(copyLevel);
|
||||||
newItem.User = user;
|
newItem.User = user;
|
||||||
if (hasLock && (newItem.QualityType >= QualityType.Orange || FunGameConstant.CharacterLevelBreakItems.Any(c => c.Id == item.Id)) || FunGameConstant.SkillLevelUpItems.Any(c => c.Id == item.Id)) newItem.IsLock = true;
|
if (hasLock && (newItem.QualityType >= QualityType.Orange ||
|
||||||
|
FunGameConstant.ExploreItems.Values.SelectMany(i => i).Any(c => c.Id == item.Id) ||
|
||||||
|
FunGameConstant.CharacterLevelBreakItems.Any(c => c.Id == item.Id) ||
|
||||||
|
FunGameConstant.SkillLevelUpItems.Any(c => c.Id == item.Id))) newItem.IsLock = true;
|
||||||
if (hasSellAndTradeTime) SetSellAndTradeTime(newItem);
|
if (hasSellAndTradeTime) SetSellAndTradeTime(newItem);
|
||||||
if (hasPrice)
|
if (hasPrice)
|
||||||
{
|
{
|
||||||
@ -3998,6 +4001,141 @@ namespace Oshima.FunGame.OshimaServers.Service
|
|||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void GenerateForgeResult(User user, ForgeModel model)
|
||||||
|
{
|
||||||
|
if (model.ForgeMaterials.Count == 0)
|
||||||
|
{
|
||||||
|
model.ResultString = "没有提交任何锻造材料,请重新提交。";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Dictionary<OshimaRegion, int> regionMaterialCount = [];
|
||||||
|
Dictionary<string, double> regionMaterialEquivalent = [];
|
||||||
|
Dictionary<OshimaRegion, double> regionContributions = [];
|
||||||
|
foreach (string key in model.ForgeMaterials.Keys)
|
||||||
|
{
|
||||||
|
int c = model.ForgeMaterials[key];
|
||||||
|
OshimaRegion r = FunGameConstant.ExploreItems.FirstOrDefault(kv => kv.Value.Select(i => i.Name).Any(s => s == key)).Key;
|
||||||
|
if (r.Id == 0) continue;
|
||||||
|
if (!regionMaterialCount.TryAdd(r, c)) regionMaterialCount[r] += c;
|
||||||
|
double ce = c * FunGameConstant.ForgeRegionCoefficient[r.Difficulty];
|
||||||
|
if (!regionMaterialEquivalent.TryAdd(key, ce)) regionMaterialEquivalent[key] += ce;
|
||||||
|
if (!regionContributions.TryAdd(r, ce)) regionContributions[r] += ce;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (regionMaterialCount.Count == 0)
|
||||||
|
{
|
||||||
|
model.ResultString = "提交的锻造材料均不属于任何地区,请重新提交。";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
OshimaRegion resultRegion;
|
||||||
|
bool isSimplyForge = regionMaterialCount.Count == 1;
|
||||||
|
int count = 0;
|
||||||
|
if (isSimplyForge)
|
||||||
|
{
|
||||||
|
OshimaRegion region = regionMaterialCount.Keys.First();
|
||||||
|
count = regionMaterialCount[region];
|
||||||
|
if (count < FunGameConstant.ForgeNeedy[QualityType.White])
|
||||||
|
{
|
||||||
|
model.ResultString = $"提交的锻造材料不足 {FunGameConstant.ForgeNeedy[QualityType.White]} 个,请重新提交。";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
resultRegion = FunGameConstant.ExploreItems.Keys.First(r => r.Id == region.Id);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
count = (int)regionMaterialEquivalent.Values.Sum();
|
||||||
|
if (count < FunGameConstant.ForgeNeedy[QualityType.White])
|
||||||
|
{
|
||||||
|
model.ResultString = $"有效材料用量 ({count}) 不足最低要求 ({FunGameConstant.ForgeNeedy[QualityType.White]}),请重新提交!";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
model.RegionProbabilities = regionContributions.ToDictionary(kv => kv.Key.Id, kv => kv.Value / count);
|
||||||
|
double randomValue = Random.Shared.NextDouble();
|
||||||
|
double cumulative = 0;
|
||||||
|
resultRegion = regionContributions.Keys.First();
|
||||||
|
foreach (OshimaRegion r in regionContributions.Keys)
|
||||||
|
{
|
||||||
|
cumulative += regionContributions[r] / count;
|
||||||
|
if (randomValue <= cumulative)
|
||||||
|
{
|
||||||
|
resultRegion = r;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
model.ResultRegion = resultRegion.Id;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count >= FunGameConstant.ForgeNeedy[QualityType.Red])
|
||||||
|
{
|
||||||
|
model.ResultQuality = QualityType.Red;
|
||||||
|
}
|
||||||
|
else if (count >= FunGameConstant.ForgeNeedy[QualityType.Orange])
|
||||||
|
{
|
||||||
|
model.ResultQuality = QualityType.Orange;
|
||||||
|
}
|
||||||
|
else if (count >= FunGameConstant.ForgeNeedy[QualityType.Purple])
|
||||||
|
{
|
||||||
|
model.ResultQuality = QualityType.Purple;
|
||||||
|
}
|
||||||
|
else if (count >= FunGameConstant.ForgeNeedy[QualityType.Blue])
|
||||||
|
{
|
||||||
|
model.ResultQuality = QualityType.Blue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
model.ResultQuality = QualityType.White;
|
||||||
|
}
|
||||||
|
model.ResultPointsGeneral = count * 0.3;
|
||||||
|
|
||||||
|
string resultItemString = "";
|
||||||
|
Item? resultItem = resultRegion.Items.OrderBy(o => Random.Shared.Next()).First(i => i.QualityType == model.ResultQuality);
|
||||||
|
if (resultItem != null)
|
||||||
|
{
|
||||||
|
string itemquality = ItemSet.GetQualityTypeName(resultItem.QualityType);
|
||||||
|
string itemtype = ItemSet.GetItemTypeName(resultItem.ItemType) + (resultItem.ItemType == ItemType.Weapon && resultItem.WeaponType != WeaponType.None ? "-" + ItemSet.GetWeaponTypeName(resultItem.WeaponType) : "");
|
||||||
|
if (itemtype != "") itemtype = $"|{itemtype}";
|
||||||
|
resultItemString = $"{itemtype}{resultItem.Name}";
|
||||||
|
model.ResultItem = resultItem.Name;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isSimplyForge)
|
||||||
|
{
|
||||||
|
if (resultItem is null)
|
||||||
|
{
|
||||||
|
model.ResultPointsFail = count * 0.2;
|
||||||
|
model.ResultString = $"锻造失败!本次锻造物品的品质为:{ItemSet.GetQualityTypeName(model.ResultQuality)},地区为:{resultRegion.Name},该地区不存在该品质的物品!\r\n" +
|
||||||
|
$"本次提交 {count} 个地区 [ {resultRegion.Name} ] 的锻造材料,获得 {model.ResultPoints:0.##} 点锻造积分。";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
model.Result = true;
|
||||||
|
model.ResultPointsSuccess = count - FunGameConstant.ForgeNeedy[model.ResultQuality];
|
||||||
|
model.ResultString = $"锻造成功!本次锻造物品的品质为:{ItemSet.GetQualityTypeName(model.ResultQuality)},地区为:{resultRegion.Name},获得了:{resultItemString}!\r\n" +
|
||||||
|
$"本次提交 {count} 个地区 [ {resultRegion.Name} ] 的锻造材料,获得 {model.ResultPoints:0.##} 点锻造积分。";
|
||||||
|
AddItemToUserInventory(user, resultItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (resultItem is null)
|
||||||
|
{
|
||||||
|
model.ResultPointsFail = count * 0.2;
|
||||||
|
model.ResultString = $"锻造失败!本次锻造物品的品质为:{ItemSet.GetQualityTypeName(model.ResultQuality)},地区为:{resultRegion.Name},该地区不存在该品质的物品!\r\n" +
|
||||||
|
$"本次提交 {regionContributions.Count} 个地区的锻造材料({string.Join("、", regionMaterialCount.Select(kv => $"{kv.Value} 个来自{kv.Key}"))}),总共 {count} 有效材料用量,获得 {model.ResultPoints:0.##} 点锻造积分。";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
model.Result = true;
|
||||||
|
model.ResultPointsSuccess = count - FunGameConstant.ForgeNeedy[model.ResultQuality];
|
||||||
|
model.ResultString = $"锻造成功!本次锻造物品的品质为:{ItemSet.GetQualityTypeName(model.ResultQuality)},地区为:{resultRegion.Name},获得了:{resultItemString}!\r\n" +
|
||||||
|
$"本次提交 {regionContributions.Count} 个地区的锻造材料({string.Join("、", regionMaterialCount.Select(kv => $"{kv.Value} 个来自{kv.Key}"))}),总共 {count} 有效材料用量,获得 {model.ResultPoints:0.##} 点锻造积分。";
|
||||||
|
AddItemToUserInventory(user, resultItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void RefreshNotice()
|
public static void RefreshNotice()
|
||||||
{
|
{
|
||||||
Notices.LoadConfig();
|
Notices.LoadConfig();
|
||||||
|
|||||||
@ -3908,7 +3908,7 @@ namespace Oshima.FunGame.WebAPI.Controllers
|
|||||||
FunGameService.Bosses.Remove(bossIndex);
|
FunGameService.Bosses.Remove(bossIndex);
|
||||||
double gained = boss.Level;
|
double gained = boss.Level;
|
||||||
user.Inventory.Materials += gained;
|
user.Inventory.Materials += gained;
|
||||||
msgs.Add($"恭喜你击败了 Boss,获得 {gained} 材料奖励!");
|
msgs.Add($"恭喜你击败了 Boss,获得 {gained} {General.GameplayEquilibriumConstant.InGameMaterial}奖励!");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -4178,7 +4178,7 @@ namespace Oshima.FunGame.WebAPI.Controllers
|
|||||||
FunGameService.Bosses.Remove(bossIndex);
|
FunGameService.Bosses.Remove(bossIndex);
|
||||||
double gained = boss.Level;
|
double gained = boss.Level;
|
||||||
user.Inventory.Materials += gained;
|
user.Inventory.Materials += gained;
|
||||||
msgs.Add($"恭喜你击败了 Boss,获得 {gained} 材料奖励!");
|
msgs.Add($"恭喜你击败了 Boss,获得 {gained} {General.GameplayEquilibriumConstant.InGameMaterial}奖励!");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -7141,7 +7141,7 @@ namespace Oshima.FunGame.WebAPI.Controllers
|
|||||||
stores.LoadConfig();
|
stores.LoadConfig();
|
||||||
|
|
||||||
string msg = "";
|
string msg = "";
|
||||||
Store? store = stores.Get(storeName);
|
Store? store = FunGameService.GetRegionStore(stores, user, storeRegion, storeName);
|
||||||
if (store != null)
|
if (store != null)
|
||||||
{
|
{
|
||||||
if (store.Goods.Values.FirstOrDefault(g => g.Id == goodid && (!g.ExpireTime.HasValue || g.ExpireTime.Value > DateTime.Now)) is Goods good)
|
if (store.Goods.Values.FirstOrDefault(g => g.Id == goodid && (!g.ExpireTime.HasValue || g.ExpireTime.Value > DateTime.Now)) is Goods good)
|
||||||
|
|||||||
@ -950,22 +950,22 @@ namespace Oshima.FunGame.WebAPI.Services
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e.Detail == "材料抽卡")
|
if (e.Detail == "钻石抽卡")
|
||||||
{
|
{
|
||||||
List<string> msgs = Controller.DrawCard_Material(uid);
|
List<string> msgs = Controller.DrawCard_Material(uid);
|
||||||
if (msgs.Count > 0)
|
if (msgs.Count > 0)
|
||||||
{
|
{
|
||||||
await SendAsync(e, "材料抽卡", "\r\n" + string.Join("\r\n", msgs));
|
await SendAsync(e, "钻石抽卡", "\r\n" + string.Join("\r\n", msgs));
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e.Detail == "材料十连抽卡")
|
if (e.Detail == "钻石十连抽卡")
|
||||||
{
|
{
|
||||||
List<string> msgs = Controller.DrawCards_Material(uid);
|
List<string> msgs = Controller.DrawCards_Material(uid);
|
||||||
if (msgs.Count > 0)
|
if (msgs.Count > 0)
|
||||||
{
|
{
|
||||||
await SendAsync(e, "材料十连抽卡", "\r\n" + string.Join("\r\n", msgs));
|
await SendAsync(e, "钻石十连抽卡", "\r\n" + string.Join("\r\n", msgs));
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -2830,16 +2830,16 @@ namespace Oshima.FunGame.WebAPI.Services
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e.Detail.StartsWith("挑战材料秘境"))
|
if (e.Detail.StartsWith("挑战钻石秘境"))
|
||||||
{
|
{
|
||||||
string detail = e.Detail.Replace("挑战材料秘境", "").Trim();
|
string detail = e.Detail.Replace("挑战钻石秘境", "").Trim();
|
||||||
string msg = "";
|
string msg = "";
|
||||||
if (int.TryParse(detail, out int diff))
|
if (int.TryParse(detail, out int diff))
|
||||||
{
|
{
|
||||||
msg = await Controller.FightInstance(uid, (int)InstanceType.Material, diff);
|
msg = await Controller.FightInstance(uid, (int)InstanceType.Material, diff);
|
||||||
if (msg.Trim() != "")
|
if (msg.Trim() != "")
|
||||||
{
|
{
|
||||||
await SendAsync(e, "挑战材料秘境", msg);
|
await SendAsync(e, "挑战钻石秘境", msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
@ -2905,6 +2905,7 @@ namespace Oshima.FunGame.WebAPI.Services
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (e.Detail.StartsWith("商店"))
|
if (e.Detail.StartsWith("商店"))
|
||||||
{
|
{
|
||||||
string detail = e.Detail.Replace("商店", "").Trim();
|
string detail = e.Detail.Replace("商店", "").Trim();
|
||||||
@ -2925,6 +2926,9 @@ namespace Oshima.FunGame.WebAPI.Services
|
|||||||
case 4:
|
case 4:
|
||||||
msg = Controller.ShowSystemStore(uid, "铎京城", "dokyo_welfare");
|
msg = Controller.ShowSystemStore(uid, "铎京城", "dokyo_welfare");
|
||||||
break;
|
break;
|
||||||
|
case 5:
|
||||||
|
msg = Controller.ShowSystemStore(uid, "铎京城", "dokyo_forge");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2936,6 +2940,46 @@ namespace Oshima.FunGame.WebAPI.Services
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (e.Detail.StartsWith("锻造配方"))
|
||||||
|
{
|
||||||
|
string pattern = @"锻造配方\s*(?:(?<itemName>[^\d\s][^\d]*?)\s+(?<count>\d+)\s*)+";
|
||||||
|
Dictionary<string, int> recipeItems = [];
|
||||||
|
|
||||||
|
StringBuilder builder = new();
|
||||||
|
MatchCollection matches = Regex.Matches(e.Detail, pattern, RegexOptions.ExplicitCapture);
|
||||||
|
foreach (Match match in matches)
|
||||||
|
{
|
||||||
|
CaptureCollection itemNames = match.Groups["itemName"].Captures;
|
||||||
|
CaptureCollection counts = match.Groups["count"].Captures;
|
||||||
|
|
||||||
|
for (int i = 0; i < itemNames.Count; i++)
|
||||||
|
{
|
||||||
|
string itemName = itemNames[i].Value.Trim();
|
||||||
|
if (int.TryParse(counts[i].Value, out int count))
|
||||||
|
{
|
||||||
|
recipeItems[itemName] = count;
|
||||||
|
builder.AppendLine($"{itemName} x{count}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
User user = Factory.GetUser();
|
||||||
|
ForgeModel model = new()
|
||||||
|
{
|
||||||
|
ForgeMaterials = recipeItems
|
||||||
|
};
|
||||||
|
FunGameService.GenerateForgeResult(user, model);
|
||||||
|
if (model.ResultString != "")
|
||||||
|
{
|
||||||
|
await SendAsync(e, "锻造配方", model.ResultString);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await SendAsync(e, "锻造配方", $"失败了……\r\n{builder}");
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
if (uid == GeneralSettings.Master && e.Detail.StartsWith("重载FunGame", StringComparison.CurrentCultureIgnoreCase))
|
if (uid == GeneralSettings.Master && e.Detail.StartsWith("重载FunGame", StringComparison.CurrentCultureIgnoreCase))
|
||||||
{
|
{
|
||||||
string msg = Controller.Relaod(uid);
|
string msg = Controller.Relaod(uid);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user