完善地区设定

This commit is contained in:
milimoe 2025-02-10 00:30:34 +08:00
parent 27e281adc4
commit 24084b4740
Signed by: milimoe
GPG Key ID: 05D280912DA6C69E
15 changed files with 622 additions and 269 deletions

View File

@ -48,29 +48,5 @@ namespace Oshima.FunGame.OshimaModules.Characters
InitialHR = Random.Shared.Next(1, 6); InitialHR = Random.Shared.Next(1, 6);
InitialMR = Random.Shared.Next(1, 6); InitialMR = Random.Shared.Next(1, 6);
} }
public void SetPrimaryAttribute(PrimaryAttribute? value = null)
{
if (value != null && value.HasValue)
{
PrimaryAttribute = value.Value;
}
else
{
double max = Math.Max(Math.Max(STR, AGI), INT);
if (max == STR)
{
PrimaryAttribute = PrimaryAttribute.STR;
}
else if (max == AGI)
{
PrimaryAttribute = PrimaryAttribute.AGI;
}
else if (max == INT)
{
PrimaryAttribute = PrimaryAttribute.INT;
}
}
}
} }
} }

View File

@ -0,0 +1,23 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Items
{
public class RegionItem : Item
{
public HashSet<Func<Region, bool>> GenerationPredicates { get; } = [];
public RegionItem(long id, string name, string description, string story = "", QualityType quality = QualityType.White, params IEnumerable<Func<Region, bool>> predicates) : base(ItemType.SpecialItem)
{
Id = id;
Name = name;
Description = description;
BackgroundStory = story;
QualityType = quality;
foreach (Func<Region, bool> predicate in predicates)
{
GenerationPredicates.Add(predicate);
}
}
}
}

View File

@ -0,0 +1,125 @@
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Regions
{
public class : OshimaRegion
{
public ()
{
Id = 1;
Name = "银辉城";
Description = "悬浮在云海中的倒三角金属都市,建筑由星银合金铸造,街道流淌着液态月光。核心区藏有能改写现实法则的「悖论引擎」";
Category = "奇异";
Weathers.Add("晴朗", 20);
ChangeRandomWeather();
Difficulty = RarityType.TwoStar;
Characters.Add(new(10101, "失控的悖论引擎"));
Units.Add(new(20101, "星银守卫"));
Crops.Add(new(180101, "星银合金", "锻造物品的材料。", "银辉城特有的金属材料,拥有着银色的光泽和坚固的质地。据说它能够吸收和储存能量,是建造城市和制造武器的理想材料。"));
Crops.Add(new(180102, "液态月光", "锻造物品的材料。", "一种在银辉城特有的、散发着柔和光芒的液体,如同月光般清澈。据说它蕴含着悖论引擎的能量,能够影响现实的结构。"));
}
}
public class : OshimaRegion
{
public ()
{
Id = 4;
Name = "永霜裂痕";
Description = "冰晶峡谷冻结着不同时代的战争残影,哨塔时钟随机倒转/加速,需服用「时霜药剂」保持神智";
Category = "奇异";
Weathers.Add("极寒", -25);
ChangeRandomWeather();
Difficulty = RarityType.FiveStar;
Characters.Add(new(10401, "时空扭曲者"));
Units.Add(new(20401, "冰霜傀儡"));
Crops.Add(new(180401, "时霜药剂", "锻造物品的材料。", "一种在永霜裂痕中使用的特殊药剂,能够减缓时间流逝,保持人的神智清醒。但长期服用可能导致记忆混乱和时间感知错乱。"));
Crops.Add(new(180402, "冰封记忆", "锻造物品的材料。", "永霜裂痕中冰封的古代战争幻象碎片,触碰时会引发强烈的记忆回溯,但同时也伴随着认知扭曲的风险。"));
}
}
public class : OshimaRegion
{
public ()
{
Id = 5;
Name = "千瞳镜湖";
Description = "湖面倒影展现平行时空,潜入会进入重力颠倒的镜像城,湖底布满瞳孔状传送门";
Category = "奇异";
Weathers.Add("阴沉", 10);
ChangeRandomWeather();
Difficulty = RarityType.TwoStar;
Characters.Add(new(10501, "镜像之主"));
Units.Add(new(20501, "镜像守卫"));
Crops.Add(new(180501, "量子纠缠碎片", "锻造物品的材料。", "千瞳镜湖的瞳孔状传送门中提取的微小碎片,拥有着神秘的能量。据说它们与平行时空相连,能够引发量子纠缠现象。"));
}
}
public class : OshimaRegion
{
public ()
{
Id = 7;
Name = "流沙时计荒漠";
Description = "沙粒蕴含时间魔法,沙丘每小时重组地形,沙暴中会出现海市蜃楼般的「昨日之城」";
Category = "奇异";
Weathers.Add("沙尘暴", 35);
ChangeRandomWeather();
Difficulty = RarityType.ThreeStar;
Characters.Add(new(10701, "时间吞噬者"));
Units.Add(new(20701, "流沙蝎"));
Crops.Add(new(180701, "时间碎片", "锻造物品的材料。", "流沙时计荒漠中散落的神秘碎片,拥有着不规则的形状和模糊的纹路。据说它们是过去时光的残余,会随机重组。"));
}
}
public class : OshimaRegion
{
public ()
{
Id = 11;
Name = "穹顶之泪湖";
Description = "破碎天穹下的倒影湖泊,折射多维星空,星辉水母群午夜重构水体重力法则";
Category = "奇异";
Weathers.Add("星光", 16);
ChangeRandomWeather();
Difficulty = RarityType.OneStar;
Characters.Add(new(11101, "星辉巨母"));
Units.Add(new(21101, "星辉水母"));
Crops.Add(new(181101, "星辉凝露", "锻造物品的材料。", "穹顶之泪湖中星辉水母散发出的凝露,蕴含着重构水体重力法则的能量,但可能引发重力波动。"));
}
}
public class : OshimaRegion
{
public ()
{
Id = 16;
Name = "时漏沙漠";
Description = "时间碎片组成的流沙领域,时之蝎加速局部时间,沙漏仙人掌分泌时凝液";
Category = "奇异";
Weathers.Add("不稳定", 38);
ChangeRandomWeather();
Difficulty = RarityType.TwoStar;
Characters.Add(new(11601, "时之君王"));
Units.Add(new(21601, "时之蝎"));
Crops.Add(new(181601, "时凝液", "锻造物品的材料。", "时漏沙漠中沙漏仙人掌分泌的液体,拥有着粘稠的质地和淡淡的光泽。据说它能够加速时间的流逝,但使用时需要谨慎。"));
}
}
public class : OshimaRegion
{
public ()
{
Id = 20;
Name = "谵妄海市";
Description = "需认知干扰剂进入的幻觉城市,思维寄生虫伪装市民,贩卖可食用梦境碎片";
Category = "奇异";
Weathers.Add("迷幻", 20);
ChangeRandomWeather();
Difficulty = RarityType.FourStar;
Characters.Add(new(12001, "梦魇之主"));
Units.Add(new(22001, "思维寄生虫"));
Crops.Add(new(182001, "梦境碎片", "锻造物品的材料。", "谵妄海市中流通的特殊商品,拥有着不同的颜色和味道。据说它能够影响人的梦境,甚至改变人的认知。"));
}
}
}

View File

@ -0,0 +1,125 @@
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Regions
{
public class : OshimaRegion
{
public ()
{
Id = 2;
Name = "瑟兰薇歌林海";
Description = "树木枝干中流淌荧蓝汁液,春季行走重组地貌,冬季化为水晶雕塑。深处沉睡着被精灵封印的「旋律古龙」";
Category = "生态";
Weathers.Add("多云", 15);
ChangeRandomWeather();
Difficulty = RarityType.FourStar;
Characters.Add(new(10201, "旋律古龙"));
Units.Add(new(20201, "荧光精灵"));
Crops.Add(new(180201, "荧蓝汁液", "锻造物品的材料。", "瑟兰薇歌林海特有树木的汁液,呈现美丽的荧蓝色。采集时需要小心,因为树木在受到威胁时会将汁液转化为神经毒素。"));
}
}
public class : OshimaRegion
{
public ()
{
Id = 8;
Name = "腐萤沼渊";
Description = "荧光毒气沼泽,中心生长直径三公里的脑状肉瘤「共生母体」,菌类模仿动物叫声诱捕猎物";
Category = "生态";
Weathers.Add("潮湿", 22);
ChangeRandomWeather();
Difficulty = RarityType.OneStar;
Characters.Add(new(10801, "共生母体"));
Units.Add(new(20801, "沼泽毒虫"));
Crops.Add(new(180801, "菌类样本", "锻造物品的材料。", "腐萤沼渊共生母体上生长的奇异菌类,拥有着不同的颜色和形态。采集时需要小心,因为某些菌类会释放麻痹毒素。"));
}
}
public class : OshimaRegion
{
public ()
{
Id = 14;
Name = "永燃坩埚";
Description = "岩浆海上的球形锻造都市,岩浆鱿鱼游弋街道,火山灰培育活体金属苔藓";
Category = "生态";
Weathers.Add("高温", 60);
ChangeRandomWeather();
Difficulty = RarityType.FiveStar;
Characters.Add(new(11401, "岩浆之王"));
Units.Add(new(21401, "岩浆鱿鱼"));
Crops.Add(new(181401, "活体金属苔藓", "锻造物品的材料。", "永燃坩埚特有的金属质感的苔藓,能够在火山灰中生长。它拥有着自我修复和繁殖的能力,是研究金属生命的重要材料。"));
}
}
public class : OshimaRegion
{
public ()
{
Id = 15;
Name = "骨桥深渊";
Description = "巨型骸骨形成的呼吸桥梁,幽灵船在桥底虚空航行,骸骨寄生神经蕨类";
Category = "生态";
Weathers.Add("阴森", 8);
ChangeRandomWeather();
Difficulty = RarityType.ThreeStar;
Characters.Add(new(11501, "骸骨巨龙"));
Units.Add(new(21501, "幽灵"));
Crops.Add(new(181501, "虚空骨髓", "锻造物品的材料。", "骨桥深渊中巨型骸骨内部的特殊物质,散发着微弱的虚空能量,长期接触可能导致精神错乱。"));
Crops.Add(new(181502, "神经蕨类", "锻造物品的材料。", "骨桥深渊中寄生在骸骨上的奇异蕨类,其根系与骸骨的神经系统相连,触碰时会引发幻觉和精神冲击。"));
}
}
public class : OshimaRegion
{
public ()
{
Id = 17;
Name = "脉轮圣树";
Description = "树干直径十公里的螺旋巨树,年轮是立体城市,树液凝结可编程蜜蜡";
Category = "生态";
Weathers.Add("晴朗", 24);
ChangeRandomWeather();
Difficulty = RarityType.ThreeStar;
Characters.Add(new(11701, "圣树守护者"));
Units.Add(new(21701, "蜜蜡蜂"));
Crops.Add(new(181701, "可编程蜜蜡", "锻造物品的材料。", "脉轮圣树分泌的树脂凝结而成的蜡状物质,拥有着独特的纹路和光泽。据说它能够被编程,用于创造各种奇妙的物品。"));
}
}
public class : OshimaRegion
{
public ()
{
Id = 19;
Name = "双生月崖";
Description = "撕裂的悬浮山脉,永昼侧栖光鹰,永夜侧绽影玫瑰。此地区不定期切换昼夜,在切换窗口期内可安全离开此地,否则,视为跨越界限触发湮灭";
Category = "生态";
Weathers.Add("永昼", 15);
Weathers.Add("永夜", -10);
ChangeRandomWeather();
Difficulty = RarityType.FiveStar;
Characters.Add(new(11901, "昼夜守护者"));
Units.Add(new(21901, "光鹰", [(r => r.Weather == "永昼")]));
Crops.Add(new(181901, "影玫瑰", "锻造物品的材料。", "双生月崖永夜侧绽放的奇异玫瑰,散发着幽暗的光芒。", QualityType.White, [(r => r.Weather == "永夜")]));
}
}
public class : OshimaRegion
{
public ()
{
Id = 13;
Name = "回音棱镜林";
Description = "晶体化红杉储存亡者记忆,荧光孢子引发共感,影狼嚎叫产生空间褶皱";
Category = "生态";
Weathers.Add("雾气", 14);
ChangeRandomWeather();
Difficulty = RarityType.FourStar;
Characters.Add(new(11301, "远古影狼"));
Units.Add(new(21301, "棱镜幽灵"));
Crops.Add(new(181301, "晶化记忆孢子", "锻造物品的材料。", "回音棱镜林晶体化红杉散发的孢子,蕴含着亡者的记忆,吸入可能引发共感。"));
}
}
}

View File

@ -0,0 +1,38 @@
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Regions
{
public class 齿 : OshimaRegion
{
public 齿()
{
Id = 12;
Name = "齿轮坟场";
Description = "堆积上古机械文明的金属荒漠,沙粒为微缩齿轮,构装巨龙在沙暴中游荡";
Category = "机械";
Weathers.Add("沙尘", 30);
ChangeRandomWeather();
Difficulty = RarityType.ThreeStar;
Characters.Add(new(11201, "报废的构装巨龙"));
Units.Add(new(21201, "齿轮傀儡"));
Crops.Add(new(181201, "机械核心碎片", "锻造物品的材料。", "齿轮坟场中构装巨龙残骸的动力核心碎片,蕴含着上古机械文明的能量,但可能带有自毁装置。"));
}
}
public class 齿 : OshimaRegion
{
public 齿()
{
Id = 10;
Name = "齿与血回廊";
Description = "自我扩建的活体建筑群,齿轮血管输送液态魔力,「造物车间」会强制改造闯入者";
Category = "机械";
Weathers.Add("阴暗", 12);
ChangeRandomWeather();
Difficulty = RarityType.FiveStar;
Characters.Add(new(11001, "回廊之心"));
Units.Add(new(21001, "改造士兵"));
Crops.Add(new(181001, "活体魔力血", "锻造物品的材料。", "齿与血回廊活体建筑中流动的液态魔力,具有自我修复和改造的能力,但接触可能导致身体异变。"));
}
}
}

View File

@ -0,0 +1,39 @@
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Regions
{
public class : OshimaRegion
{
public ()
{
Id = 3;
Name = "赫菲斯托斯之喉";
Description = "螺旋向下的火山矿井,底层矿工开采深渊火钻,矿道会突然熔化成通往元素位面的裂缝";
Category = "矿区";
Weathers.Add("炎热", 45);
ChangeRandomWeather();
Difficulty = RarityType.FourStar;
Characters.Add(new(10301, "熔岩巨兽"));
Units.Add(new(20301, "火焰元素"));
Crops.Add(new(180301, "深渊火钻", "锻造物品的材料。", "赫菲斯托斯之喉深处开采出的珍贵矿石,散发着炙热的红色光芒。据说只有被矿工灵魂烙印认可的人才能安全触碰它。"));
}
}
public class : OshimaRegion
{
public ()
{
Id = 18;
Name = "悲鸣矿脉";
Description = "岩层嵌满神经宝石的活体矿山,开采引发山体剧痛,晶簇守卫实体化巡逻";
Category = "矿区";
Weathers.Add("幽暗", 10);
ChangeRandomWeather();
Difficulty = RarityType.FourStar;
Characters.Add(new(11801, "矿脉之心"));
Units.Add(new(21801, "晶簇守卫"));
Crops.Add(new(181801, "神经宝石", "锻造物品的材料。", "悲鸣矿脉中开采出的特殊宝石,散发着微弱的蓝色光芒。据说它与矿脉的神经系统相连,能够引发剧烈的疼痛。"));
Crops.Add(new(181802, "矿脉神经纤维", "锻造物品的材料。", "悲鸣矿脉中连接神经宝石的纤维,触碰时会引发山体剧痛,并可能导致精神污染。"));
}
}
}

View File

@ -0,0 +1,54 @@
using System.Text;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Interface.Entity;
using Milimoe.FunGame.Core.Library.Constant;
using Oshima.FunGame.OshimaModules.Items;
using Oshima.FunGame.OshimaModules.Units;
namespace Oshima.FunGame.OshimaModules.Regions
{
public class OshimaRegion : Region
{
public new HashSet<RegionCharacter> Characters { get; } = [];
public new HashSet<RegionUnit> Units { get; } = [];
public new HashSet<RegionItem> Crops { get; } = [];
public override bool Equals(IBaseEntity? other)
{
return other is OshimaRegion && other.GetIdName() == GetIdName();
}
public override string ToString()
{
StringBuilder builder = new();
builder.AppendLine($"☆--- {Name} ---☆");
builder.AppendLine($"编号:{Id}");
builder.AppendLine($"天气:{Weather}");
builder.AppendLine($"温度:{Temperature} °C");
builder.AppendLine($"{Description}");
if (Characters.Count > 0)
{
builder.AppendLine($"== 头目 ==");
builder.AppendLine(string.Join("", Characters.Select(o => o.Name)));
}
if (Units.Count > 0)
{
builder.AppendLine($"== 生物 ==");
builder.AppendLine(string.Join("", Units.Select(o => o.Name)));
}
if (Crops.Count > 0)
{
builder.AppendLine($"== 作物 ==");
builder.AppendLine(string.Join("", Crops.Select(c => c.Name)));
}
builder.AppendLine($"探索难度:{CharacterSet.GetRarityTypeName(Difficulty)}");
return builder.ToString().Trim();
}
}
}

View File

@ -0,0 +1,38 @@
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Regions
{
public class : OshimaRegion
{
public ()
{
Id = 6;
Name = "雷霆王座山脉";
Description = "悬浮岩块组成的三维迷宫,最高峰「裁决尖碑」在月圆之夜投射出泰坦调试世界的符文";
Category = "世外";
Weathers.Add("雷暴", 5);
ChangeRandomWeather();
Difficulty = RarityType.FourStar;
Characters.Add(new(10601, "雷霆泰坦"));
Units.Add(new(20601, "雷霆元素"));
Crops.Add(new(180601, "泰坦符文石", "锻造物品的材料。", "雷霆王座山脉裁决尖碑上脱落的符文石,蕴含着泰坦调试世界的法则,但解读时需要强大的精神力。"));
}
}
public class 屿 : OshimaRegion
{
public 屿()
{
Id = 9;
Name = "苍穹碎屿";
Description = "破碎天穹形成的浮空岛群,「星锚之地」竖立着束缚星空巨兽的引雷柱";
Category = "世外";
Weathers.Add("晴朗", 18);
ChangeRandomWeather();
Difficulty = RarityType.ThreeStar;
Characters.Add(new(10901, "星空巨兽"));
Units.Add(new(20901, "浮空岛灵"));
Crops.Add(new(180901, "星锚晶石", "锻造物品的材料。", "苍穹碎屿星锚之地用于束缚星空巨兽的晶石,蕴含着强大的雷电能量,但可能引发空间裂缝。"));
}
}
}

View File

@ -0,0 +1,56 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Units
{
public class RegionCharacter : Character
{
public HashSet<Func<Region, bool>> GenerationPredicates { get; } = [];
public RegionCharacter(long id, string name, params IEnumerable<Func<Region, bool>> predicates)
{
Id = id;
Name = name;
NickName = name;
PrimaryAttribute = (PrimaryAttribute)Random.Shared.Next(1, 4);
InitialATK = Random.Shared.Next(55, 101);
InitialHP = Random.Shared.Next(80, 201);
InitialMP = Random.Shared.Next(50, 131);
int value = 61;
int valueGrowth = 61;
for (int i = 0; i < 3; i++)
{
if (value == 0) break;
int attribute = i < 2 ? Random.Shared.Next(value) : (value - 1);
int growth = i < 2 ? Random.Shared.Next(0, valueGrowth) : (valueGrowth - 1);
switch (i)
{
case 1:
InitialAGI = attribute;
AGIGrowth = Calculation.Round(Convert.ToDouble(growth) / 10, 2);
break;
case 2:
InitialINT = attribute;
INTGrowth = Calculation.Round(Convert.ToDouble(growth) / 10, 2);
break;
case 0:
default:
InitialSTR = attribute;
STRGrowth = Calculation.Round(Convert.ToDouble(growth) / 10, 2);
break;
}
value -= attribute;
valueGrowth -= growth;
}
InitialSPD = Random.Shared.Next(220, 451);
InitialHR = Random.Shared.Next(3, 9);
InitialMR = Random.Shared.Next(3, 9);
foreach (Func<Region, bool> predicate in predicates)
{
GenerationPredicates.Add(predicate);
}
}
}
}

View File

@ -0,0 +1,25 @@
using Milimoe.FunGame.Core.Entity;
namespace Oshima.FunGame.OshimaModules.Units
{
public class RegionUnit : Unit
{
public HashSet<Func<Region, bool>> GenerationPredicates { get; } = [];
public RegionUnit(long id, string name, params IEnumerable<Func<Region, bool>> predicates)
{
Id = id;
Name = name;
InitialATK = Random.Shared.Next(25, 51);
InitialHP = Random.Shared.Next(35, 91);
InitialMP = Random.Shared.Next(20, 61);
InitialSPD = Random.Shared.Next(155, 320);
InitialHR = Random.Shared.Next(1, 6);
InitialMR = Random.Shared.Next(1, 6);
foreach (Func<Region, bool> predicate in predicates)
{
GenerationPredicates.Add(predicate);
}
}
}
}

View File

@ -247,7 +247,7 @@ namespace Oshima.FunGame.OshimaServers
msg = SCAdd(data); msg = SCAdd(data);
break; break;
case "sclist": case "sclist":
msg = SCList(); msg = SCList(data);
break; break;
case "att": case "att":
break; break;
@ -312,13 +312,15 @@ namespace Oshima.FunGame.OshimaServers
return result; return result;
} }
public string SCList() public string SCList(Dictionary<string, object> data)
{ {
string result = $"☆--- OSMTV 圣人排行榜 TOP10 ---☆\r\n统计时间{DateTime.Now.ToString(General.GeneralDateTimeFormatChinese)}\r\n"; string result = $"☆--- OSMTV 圣人排行榜 TOP10 ---☆\r\n统计时间{DateTime.Now.ToString(General.GeneralDateTimeFormatChinese)}\r\n";
SQLHelper? sql = Controller.SQLHelper; SQLHelper? sql = Controller.SQLHelper;
if (sql != null) if (sql != null)
{ {
long userQQ = Controller.JSON.GetObject<long>(data, "qq");
(bool userHas, double userSC, int userTop, string userRemark) = (false, 0, 0, "");
sql.Script = "select * from saints order by sc desc"; sql.Script = "select * from saints order by sc desc";
sql.ExecuteDataSet(); sql.ExecuteDataSet();
if (sql.Success && sql.DataSet.Tables.Count > 0) if (sql.Success && sql.DataSet.Tables.Count > 0)
@ -327,13 +329,25 @@ namespace Oshima.FunGame.OshimaServers
foreach (DataRow dr in sql.DataSet.Tables[0].Rows) foreach (DataRow dr in sql.DataSet.Tables[0].Rows)
{ {
count++; count++;
if (count > 10) break;
long qq = Convert.ToInt64(dr["qq"]); long qq = Convert.ToInt64(dr["qq"]);
double sc = Convert.ToDouble(dr["sc"]); double sc = Convert.ToDouble(dr["sc"]);
string remark = Convert.ToString(dr["remark"]) ?? ""; string remark = Convert.ToString(dr["remark"]) ?? "";
if (qq == userQQ)
{
userHas = true;
userSC = sc;
userTop = count;
userRemark = remark;
}
if (count > 10) continue;
result += $"{count}. 用户:{qq},圣人点数:{sc} 分{(remark.Trim() != "" ? $" ({remark})" : "")}\r\n"; result += $"{count}. 用户:{qq},圣人点数:{sc} 分{(remark.Trim() != "" ? $" ({remark})" : "")}\r\n";
} }
if (userHas)
{
result += $"你的圣人点数为:{userSC} 分{(userRemark.Trim() != "" ? $"{userRemark}" : "")},排在第 {userTop} / {sql.DataSet.Tables[0].Rows.Count} 名。";
}
} }
else result = "圣人榜目前没有任何数据。";
} }
else result = "无法调用此接口SQL 服务不可用。"; else result = "无法调用此接口SQL 服务不可用。";

View File

@ -2,6 +2,7 @@
using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Constant;
using Oshima.FunGame.OshimaModules.Effects.OpenEffects; using Oshima.FunGame.OshimaModules.Effects.OpenEffects;
using Oshima.FunGame.OshimaModules.Items; using Oshima.FunGame.OshimaModules.Items;
using Oshima.FunGame.OshimaModules.Regions;
namespace Oshima.FunGame.OshimaServers.Service namespace Oshima.FunGame.OshimaServers.Service
{ {
@ -17,11 +18,13 @@ namespace Oshima.FunGame.OshimaServers.Service
public static List<Skill> Magics { get; } = []; public static List<Skill> Magics { get; } = [];
public static List<Item> Equipment { get; } = []; public static List<Item> Equipment { get; } = [];
public static List<Item> Items { get; } = []; public static List<Item> Items { get; } = [];
public static List<Item> DrawCardItems { get; } = [];
public static List<Skill> ItemSkills { get; } = []; public static List<Skill> ItemSkills { get; } = [];
public static List<Item> AllItems { get; } = []; public static List<Item> AllItems { get; } = [];
public static List<Skill> AllSkills { get; } = []; public static List<Skill> AllSkills { get; } = [];
public static Dictionary<long, User> UserIdAndUsername { get; } = []; public static Dictionary<long, User> UserIdAndUsername { get; } = [];
public static ItemType[] ItemCanUsed => [ItemType.Consumable, ItemType.MagicCard, ItemType.SpecialItem, ItemType.GiftBox, ItemType.Others]; public static ItemType[] ItemCanUsed => [ItemType.Consumable, ItemType.MagicCard, ItemType.SpecialItem, ItemType.GiftBox, ItemType.Others];
public static ItemType[] ItemCanNotDrawCard => [ItemType.Collectible, ItemType.QuestItem, ItemType.GiftBox, ItemType.Others];
public static Dictionary<int, Dictionary<string, int>> LevelBreakNeedyList { get; } = new() public static Dictionary<int, Dictionary<string, int>> LevelBreakNeedyList { get; } = new()
{ {
@ -535,187 +538,10 @@ namespace Oshima.FunGame.OshimaServers.Service
} }
}; };
public static List<Region> Regions { get; } = [ public static List<OshimaRegion> Regions { get; } = [
new Region() new (), new (), new (), new (), new (), new (), new (), new (),
{ new 屿(), new 齿(), new (), new 齿(), new (), new (), new (), new (),
Id = 1, new (), new (), new (), new ()
Name = "银辉城",
Description = "悬浮在云海中的倒三角金属都市,建筑由星银合金铸造,街道流淌着液态月光。核心区藏有能改写现实法则的「悖论引擎」",
Weather = "晴朗",
Temperature = 20,
Difficulty = RarityType.TwoStar
},
new Region()
{
Id = 2,
Name = "瑟兰薇歌林海",
Description = "树木枝干中流淌荧蓝汁液,春季行走重组地貌,冬季化为水晶雕塑。深处沉睡着被精灵封印的「旋律古龙」",
Weather = "多云",
Temperature = 15,
Difficulty = RarityType.FourStar
},
new Region()
{
Id = 3,
Name = "赫菲斯托斯之喉",
Description = "螺旋向下的火山矿井,底层矿工开采深渊火钻,矿道会突然熔化成通往元素位面的裂缝",
Weather = "炎热",
Temperature = 45,
Difficulty = RarityType.FourStar
},
new Region()
{
Id = 4,
Name = "永霜裂痕",
Description = "冰晶峡谷冻结着不同时代的战争残影,哨塔时钟随机倒转/加速,需服用「时霜药剂」保持神智",
Weather = "极寒",
Temperature = -25,
Difficulty = RarityType.FiveStar
},
new Region()
{
Id = 5,
Name = "千瞳镜湖",
Description = "湖面倒影展现平行时空,潜入会进入重力颠倒的镜像城,湖底布满瞳孔状传送门",
Weather = "阴沉",
Temperature = 10,
Difficulty = RarityType.TwoStar
},
new Region()
{
Id = 6,
Name = "雷霆王座山脉",
Description = "悬浮岩块组成的三维迷宫,最高峰「裁决尖碑」在月圆之夜投射出泰坦调试世界的符文",
Weather = "雷暴",
Temperature = 5,
Difficulty = RarityType.FourStar
},
new Region()
{
Id = 7,
Name = "流沙时计荒漠",
Description = "沙粒蕴含时间魔法,沙丘每小时重组地形,沙暴中会出现海市蜃楼般的「昨日之城」",
Weather = "沙尘暴",
Temperature = 35,
Difficulty = RarityType.ThreeStar
},
new Region()
{
Id = 8,
Name = "腐萤沼渊",
Description = "荧光毒气沼泽,中心生长直径三公里的脑状肉瘤「共生母体」,菌类模仿动物叫声诱捕猎物",
Weather = "潮湿",
Temperature = 22,
Difficulty = RarityType.OneStar
},
new Region()
{
Id = 9,
Name = "苍穹碎屿",
Description = "破碎天穹形成的浮空岛群,「星锚之地」竖立着束缚星空巨兽的引雷柱",
Weather = "晴朗",
Temperature = 18,
Difficulty = RarityType.ThreeStar
},
new Region()
{
Id = 10,
Name = "齿与血回廊",
Description = "自我扩建的活体建筑群,齿轮血管输送液态魔力,「造物车间」会强制改造闯入者",
Weather = "阴暗",
Temperature = 12,
Difficulty = RarityType.FiveStar
},
new Region()
{
Id = 11,
Name = "穹顶之泪湖",
Description = "破碎天穹下的倒影湖泊,折射多维星空,星辉水母群午夜重构水体重力法则",
Weather = "星光",
Temperature = 16,
Difficulty = RarityType.OneStar
},
new Region()
{
Id = 12,
Name = "齿轮坟场",
Description = "堆积上古机械文明的金属荒漠,沙粒为微缩齿轮,构装巨龙在沙暴中游荡",
Weather = "沙尘",
Temperature = 30,
Difficulty = RarityType.ThreeStar
},
new Region()
{
Id = 13,
Name = "回音棱镜林",
Description = "晶体化红杉储存亡者记忆,荧光孢子引发共感,影狼嚎叫产生空间褶皱",
Weather = "雾气",
Temperature = 14,
Difficulty = RarityType.FourStar
},
new Region()
{
Id = 14,
Name = "永燃坩埚",
Description = "岩浆海上的球形锻造都市,岩浆鱿鱼游弋街道,火山灰培育活体金属苔藓",
Weather = "高温",
Temperature = 60,
Difficulty = RarityType.FiveStar
},
new Region()
{
Id = 15,
Name = "骨桥深渊",
Description = "巨型骸骨形成的呼吸桥梁,幽灵船在桥底虚空航行,骸骨寄生神经蕨类",
Weather = "阴森",
Temperature = 8,
Difficulty = RarityType.ThreeStar
},
new Region()
{
Id = 16,
Name = "时漏沙漠",
Description = "时间碎片组成的流沙领域,时之蝎加速局部时间,沙漏仙人掌分泌时凝液",
Weather = "不稳定",
Temperature = 38,
Difficulty = RarityType.TwoStar
},
new Region()
{
Id = 17,
Name = "脉轮圣树",
Description = "树干直径十公里的螺旋巨树,年轮是立体城市,树液凝结可编程蜜蜡",
Weather = "晴朗",
Temperature = 24,
Difficulty = RarityType.ThreeStar
},
new Region()
{
Id = 18,
Name = "悲鸣矿脉",
Description = "岩层嵌满神经宝石的活体矿山,开采引发山体剧痛,晶簇守卫实体化巡逻",
Weather = "幽暗",
Temperature = 10,
Difficulty = RarityType.FourStar
},
new Region()
{
Id = 19,
Name = "双生月崖",
Description = "撕裂的悬浮山脉,永昼侧栖光鹰,永夜侧绽影玫瑰,跨越界限触发湮灭",
Weather = "昼夜交替",
Temperature = 15,
Difficulty = RarityType.FiveStar
},
new Region()
{
Id = 20,
Name = "谵妄海市",
Description = "需认知干扰剂进入的幻觉城市,思维寄生虫伪装市民,贩卖可食用梦境碎片",
Weather = "迷幻",
Temperature = 20,
Difficulty = RarityType.FourStar
}
]; ];
public static Dictionary<QualityType, double> DrawCardProbabilities { get; } = new() public static Dictionary<QualityType, double> DrawCardProbabilities { get; } = new()

View File

@ -7,6 +7,7 @@ using Oshima.Core.Constant;
using Oshima.FunGame.OshimaModules.Characters; using Oshima.FunGame.OshimaModules.Characters;
using Oshima.FunGame.OshimaModules.Effects.OpenEffects; using Oshima.FunGame.OshimaModules.Effects.OpenEffects;
using Oshima.FunGame.OshimaModules.Items; using Oshima.FunGame.OshimaModules.Items;
using Oshima.FunGame.OshimaModules.Regions;
using Oshima.FunGame.OshimaModules.Skills; using Oshima.FunGame.OshimaModules.Skills;
namespace Oshima.FunGame.OshimaServers.Service namespace Oshima.FunGame.OshimaServers.Service
@ -52,6 +53,13 @@ namespace Oshima.FunGame.OshimaServers.Service
FunGameConstant.AllItems.AddRange(FunGameConstant.Equipment); FunGameConstant.AllItems.AddRange(FunGameConstant.Equipment);
FunGameConstant.AllItems.AddRange(FunGameConstant.Items); FunGameConstant.AllItems.AddRange(FunGameConstant.Items);
foreach (OshimaRegion region in FunGameConstant.Regions)
{
FunGameConstant.AllItems.AddRange(region.Crops.Select(i => i.Copy()));
}
FunGameConstant.DrawCardItems.AddRange(FunGameConstant.AllItems.Where(i => !FunGameConstant.ItemCanNotDrawCard.Contains(i.ItemType)));
Skill?[] activeSkills = [.. FunGameConstant.Equipment.Select(i => i.Skills.Active), .. FunGameConstant.Items.Select(i => i.Skills.Active)]; Skill?[] activeSkills = [.. FunGameConstant.Equipment.Select(i => i.Skills.Active), .. FunGameConstant.Items.Select(i => i.Skills.Active)];
foreach (Skill? skill in activeSkills) foreach (Skill? skill in activeSkills)
{ {
@ -367,6 +375,7 @@ namespace Oshima.FunGame.OshimaServers.Service
FunGameConstant.SuperSkills.Clear(); FunGameConstant.SuperSkills.Clear();
FunGameConstant.PassiveSkills.Clear(); FunGameConstant.PassiveSkills.Clear();
FunGameConstant.Magics.Clear(); FunGameConstant.Magics.Clear();
FunGameConstant.DrawCardItems.Clear();
FunGameConstant.AllItems.Clear(); FunGameConstant.AllItems.Clear();
FunGameConstant.ItemSkills.Clear(); FunGameConstant.ItemSkills.Clear();
FunGameConstant.AllSkills.Clear(); FunGameConstant.AllSkills.Clear();
@ -613,7 +622,7 @@ namespace Oshima.FunGame.OshimaServers.Service
break; break;
case 7: case 7:
Item = FunGameConstant.Items[Random.Shared.Next(FunGameConstant.Items.Count)].Copy(); Item = FunGameConstant.DrawCardItems[Random.Shared.Next(FunGameConstant.DrawCardItems.Count)].Copy();
SetSellAndTradeTime(); SetSellAndTradeTime();
user.Inventory.Items.Add(); user.Inventory.Items.Add();
msg += ItemSet.GetQualityTypeName(.QualityType) + ItemSet.GetItemTypeName(.ItemType) + "【" + .Name + "】!\r\n" + .Description; msg += ItemSet.GetQualityTypeName(.QualityType) + ItemSet.GetItemTypeName(.ItemType) + "【" + .Name + "】!\r\n" + .Description;
@ -648,7 +657,7 @@ namespace Oshima.FunGame.OshimaServers.Service
double q = Random.Shared.NextDouble() * 100; double q = Random.Shared.NextDouble() * 100;
// 根据签到天数调整概率 // 根据签到天数调整概率
double daysFactor = Math.Min(days * 0.02, 30); double daysFactor = Math.Min(days * 0.03, 30);
Dictionary<QualityType, double> adjustedProbabilities = new(FunGameConstant.DrawCardProbabilities); Dictionary<QualityType, double> adjustedProbabilities = new(FunGameConstant.DrawCardProbabilities);
foreach (QualityType typeTemp in adjustedProbabilities.Keys) foreach (QualityType typeTemp in adjustedProbabilities.Keys)
{ {
@ -1371,7 +1380,7 @@ namespace Oshima.FunGame.OshimaServers.Service
boss.Skills.Add(super); boss.Skills.Add(super);
boss.Recovery(); boss.Recovery();
boss.SetPrimaryAttribute(); SetCharacterPrimaryAttribute(boss);
Bosses[nowIndex] = boss; Bosses[nowIndex] = boss;
} }
@ -1479,24 +1488,26 @@ namespace Oshima.FunGame.OshimaServers.Service
QuestType type = (QuestType)Random.Shared.Next(3); QuestType type = (QuestType)Random.Shared.Next(3);
long id = quests.Count > 0 ? quests.Values.Max(q => q.Id) + 1 : 1; long id = quests.Count > 0 ? quests.Values.Max(q => q.Id) + 1 : 1;
// 生成任务奖励物品
HashSet<Item> items = [];
Dictionary<string, int> itemsCount = [];
int index = Random.Shared.Next(FunGameConstant.DrawCardItems.Count);
Item item = FunGameConstant.DrawCardItems[index];
items.Add(item);
itemsCount[item.Name] = 1;
index = Random.Shared.Next(FunGameConstant.DrawCardItems.Count);
Item item2 = FunGameConstant.DrawCardItems[index];
items.Add(item2);
if (!itemsCount.TryAdd(item2.Name, 1))
{
itemsCount[item2.Name]++;
}
Quest quest; Quest quest;
if (type == QuestType.Continuous) if (type == QuestType.Continuous)
{ {
string name = FunGameConstant.ContinuousQuestList.Keys.OrderBy(o => Random.Shared.Next()).First(); string name = FunGameConstant.ContinuousQuestList.Keys.OrderBy(o => Random.Shared.Next()).First();
int minutes = Random.Shared.Next(10, 41); int minutes = Random.Shared.Next(10, 41);
HashSet<Item> items = [];
Dictionary<string, int> itemsCount = [];
int index = Random.Shared.Next(FunGameConstant.AllItems.Count);
Item item = FunGameConstant.AllItems[index];
items.Add(item);
itemsCount[item.Name] = 1;
index = Random.Shared.Next(FunGameConstant.AllItems.Count);
Item item2 = FunGameConstant.AllItems[index];
items.Add(item2);
if (!itemsCount.TryAdd(item2.Name, 1))
{
itemsCount[item2.Name]++;
}
quest = new() quest = new()
{ {
Id = id, Id = id,
@ -1514,19 +1525,6 @@ namespace Oshima.FunGame.OshimaServers.Service
{ {
string name = FunGameConstant.ImmediateQuestList.Keys.OrderBy(o => Random.Shared.Next()).First(); string name = FunGameConstant.ImmediateQuestList.Keys.OrderBy(o => Random.Shared.Next()).First();
int difficulty = Random.Shared.Next(3, 11); int difficulty = Random.Shared.Next(3, 11);
HashSet<Item> items = [];
Dictionary<string, int> itemsCount = [];
int index = Random.Shared.Next(FunGameConstant.AllItems.Count);
Item item = FunGameConstant.AllItems[index];
items.Add(item);
itemsCount[item.Name] = 1;
index = Random.Shared.Next(FunGameConstant.AllItems.Count);
Item item2 = FunGameConstant.AllItems[index];
items.Add(item2);
if (!itemsCount.TryAdd(item2.Name, 1))
{
itemsCount[item2.Name]++;
}
quest = new() quest = new()
{ {
Id = id, Id = id,
@ -1543,19 +1541,6 @@ namespace Oshima.FunGame.OshimaServers.Service
{ {
string name = FunGameConstant.ProgressiveQuestList.Keys.OrderBy(o => Random.Shared.Next()).First(); string name = FunGameConstant.ProgressiveQuestList.Keys.OrderBy(o => Random.Shared.Next()).First();
int maxProgress = Random.Shared.Next(3, 11); int maxProgress = Random.Shared.Next(3, 11);
HashSet<Item> items = [];
Dictionary<string, int> itemsCount = [];
int index = Random.Shared.Next(FunGameConstant.AllItems.Count);
Item item = FunGameConstant.AllItems[index];
items.Add(item);
itemsCount[item.Name] = 1;
index = Random.Shared.Next(FunGameConstant.AllItems.Count);
Item item2 = FunGameConstant.AllItems[index];
items.Add(item2);
if (!itemsCount.TryAdd(item2.Name, 1))
{
itemsCount[item2.Name]++;
}
quest = new() quest = new()
{ {
Id = id, Id = id,
@ -1741,5 +1726,29 @@ namespace Oshima.FunGame.OshimaServers.Service
SQLHelper.Parameters["@AutoKey"] = AutoKey; SQLHelper.Parameters["@AutoKey"] = AutoKey;
return $"{Milimoe.FunGame.Core.Library.SQLScript.Entity.UserQuery.Select_Users} {Milimoe.FunGame.Core.Library.SQLScript.Constant.Command_Where} {Milimoe.FunGame.Core.Library.SQLScript.Entity.UserQuery.Column_AutoKey} = @AutoKey"; return $"{Milimoe.FunGame.Core.Library.SQLScript.Entity.UserQuery.Select_Users} {Milimoe.FunGame.Core.Library.SQLScript.Constant.Command_Where} {Milimoe.FunGame.Core.Library.SQLScript.Entity.UserQuery.Column_AutoKey} = @AutoKey";
} }
public static void SetCharacterPrimaryAttribute(Character character, PrimaryAttribute? value = null)
{
if (value != null && value.HasValue)
{
character.PrimaryAttribute = value.Value;
}
else
{
double max = Math.Max(Math.Max(character.STR, character.AGI), character.INT);
if (max == character.STR)
{
character.PrimaryAttribute = PrimaryAttribute.STR;
}
else if (max == character.AGI)
{
character.PrimaryAttribute = PrimaryAttribute.AGI;
}
else if (max == character.INT)
{
character.PrimaryAttribute = PrimaryAttribute.INT;
}
}
}
} }
} }

View File

@ -12,6 +12,7 @@ using Milimoe.FunGame.Core.Library.SQLScript.Entity;
using Oshima.Core.Configs; using Oshima.Core.Configs;
using Oshima.FunGame.OshimaModules.Characters; using Oshima.FunGame.OshimaModules.Characters;
using Oshima.FunGame.OshimaModules.Items; using Oshima.FunGame.OshimaModules.Items;
using Oshima.FunGame.OshimaModules.Regions;
using Oshima.FunGame.OshimaServers.Service; using Oshima.FunGame.OshimaServers.Service;
namespace Oshima.FunGame.WebAPI.Controllers namespace Oshima.FunGame.WebAPI.Controllers
@ -719,10 +720,7 @@ namespace Oshima.FunGame.WebAPI.Controllers
return NetworkUtility.JsonSerialize($"你的{General.GameplayEquilibriumConstant.InGameMaterial}不足 {reduce} 呢,无法重随自建角色属性!"); return NetworkUtility.JsonSerialize($"你的{General.GameplayEquilibriumConstant.InGameMaterial}不足 {reduce} 呢,无法重随自建角色属性!");
} }
newCustom = new CustomCharacter(FunGameConstant.CustomCharacterId, ""); newCustom = new CustomCharacter(FunGameConstant.CustomCharacterId, "");
if (newCustom is CustomCharacter temp) FunGameService.SetCharacterPrimaryAttribute(newCustom);
{
temp.SetPrimaryAttribute();
}
user.LastTime = DateTime.Now; user.LastTime = DateTime.Now;
pc.Add("user", user); pc.Add("user", user);
pc.SaveConfig(); pc.SaveConfig();
@ -5083,7 +5081,7 @@ namespace Oshima.FunGame.WebAPI.Controllers
List<string> regions = []; List<string> regions = [];
if (index != null) if (index != null)
{ {
if (FunGameConstant.Regions.FirstOrDefault(kv => kv.Id == index) is Region region) if (FunGameConstant.Regions.FirstOrDefault(kv => kv.Id == index) is OshimaRegion region)
{ {
regions.Add(region.ToString()); regions.Add(region.ToString());
} }

View File

@ -182,23 +182,30 @@ namespace Oshima.FunGame.WebAPI.Controllers
{ {
if (msg is null) return ""; if (msg is null) return "";
if (await FungameService.Handler(third: msg)) bool result = true;
string error = "";
TaskUtility.NewTask(async () => result = await FungameService.Handler(third: msg)).OnError(e => error = e.ToString());
int time = 0;
int timeout = 8 * 1000;
while (true)
{ {
int time = 0; await Task.Delay(200);
int timeout = 8 * 1000; time += 200;
while (true) if (time >= timeout)
{ {
await Task.Delay(200); break;
time += 200;
if (time >= timeout)
{
break;
}
if (msg.IsCompleted)
{
break;
}
} }
if (!result || msg.IsCompleted)
{
break;
}
}
if (error != "")
{
if (msg.Result != "") msg.Result += "\r\n";
msg.Result += error;
} }
return NetworkUtility.JsonSerialize(msg.Result); return NetworkUtility.JsonSerialize(msg.Result);