更新角色、技能、物品;初始化UI

This commit is contained in:
milimoe 2024-09-23 01:43:21 +08:00
parent 6932bf14a3
commit 5511c00917
Signed by: milimoe
GPG Key ID: 05D280912DA6C69E
89 changed files with 6094 additions and 232 deletions

View File

@ -1,18 +0,0 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.GameMode.OfficialStandard.Characters
{
public class ColdBlue : Character
{
public ColdBlue() : base()
{
Name = "Cold Blue";
FirstName = "冷蓝";
FirstRoleType = RoleType.Guardian;
STR = 9;
AGI = 3;
INT = 3;
}
}
}

View File

@ -1,18 +0,0 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.GameMode.OfficialStandard.Characters
{
public class DokyoMayor : Character
{
public DokyoMayor() : base()
{
Name = "Dokyo Mayor";
FirstName = "铎京市长";
FirstRoleType = RoleType.Core;
STR = 4;
AGI = 9;
INT = 1;
}
}
}

View File

@ -1,18 +0,0 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.GameMode.OfficialStandard.Characters
{
public class Kirayinna : Character
{
public Kirayinna() : base()
{
Name = "Kirayinna";
FirstName = "清香";
FirstRoleType = RoleType.Assistant;
STR = 3;
AGI = 2;
INT = 10;
}
}
}

View File

@ -1,18 +0,0 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.GameMode.OfficialStandard.Characters
{
public class MagicGirl : Character
{
public MagicGirl() : base()
{
Name = "Magic Girl";
FirstName = "魔法少女";
FirstRoleType = RoleType.Core;
STR = 3;
AGI = 8;
INT = 4;
}
}
}

View File

@ -1,18 +0,0 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.GameMode.OfficialStandard.Characters
{
public class NanGanYu : Character
{
public NanGanYu() : base()
{
Name = "NanGanYu";
FirstName = "男甘雨";
FirstRoleType = RoleType.Logistics;
STR = 4;
AGI = 2;
INT = 9;
}
}
}

View File

@ -1,18 +0,0 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.GameMode.OfficialStandard.Characters
{
public class NiuNan : Character
{
public NiuNan() : base()
{
Name = "NiuNan";
FirstName = "牛腩";
FirstRoleType = RoleType.Logistics;
STR = 0;
AGI = 0;
INT = 15;
}
}
}

View File

@ -1,18 +0,0 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.GameMode.OfficialStandard.Characters
{
public class Oshima : Character
{
public Oshima() : base()
{
Name = "Oshima";
FirstName = "大島シヤ";
FirstRoleType = RoleType.Vanguard;
STR = 15;
AGI = 5;
INT = 0;
}
}
}

View File

@ -1,18 +0,0 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.GameMode.OfficialStandard.Characters
{
public class QWQAQW : Character
{
public QWQAQW() : base()
{
Name = "QWQAQW";
FirstName = "脑婆";
FirstRoleType = RoleType.Core;
STR = 3;
AGI = 10;
INT = 2;
}
}
}

View File

@ -1,18 +0,0 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.GameMode.OfficialStandard.Characters
{
public class ThomasYang : Character
{
public ThomasYang() : base()
{
Name = "Thomas Yang";
FirstName = "吖养";
FirstRoleType = RoleType.Guardian;
STR = 8;
AGI = 1;
INT = 6;
}
}
}

View File

@ -1,18 +0,0 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.GameMode.OfficialStandard.Characters
{
public class ZzxToT : Character
{
public ZzxToT() : base()
{
Name = "ZzxToT";
FirstName = "趣多多";
FirstRoleType = RoleType.Core;
STR = 7;
AGI = 7;
INT = 1;
}
}
}

View File

@ -1,18 +0,0 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.GameMode.OfficialStandard.Characters
{
public class dddovo : Character
{
public dddovo() : base()
{
Name = "dddovo";
FirstName = "绿拱门";
FirstRoleType = RoleType.Core;
STR = 5;
AGI = 10;
INT = 0;
}
}
}

View File

@ -1,25 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.8.34330.188
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OshimaCustomizedMode", "OshimaCustomizedMode.csproj", "{497E99F9-7EA4-498C-90C5-B5751B47B2BE}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{497E99F9-7EA4-498C-90C5-B5751B47B2BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{497E99F9-7EA4-498C-90C5-B5751B47B2BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{497E99F9-7EA4-498C-90C5-B5751B47B2BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{497E99F9-7EA4-498C-90C5-B5751B47B2BE}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {B3F190BD-B445-4D80-99D7-5D2B59D038CA}
EndGlobalSection
EndGlobal

43
OshimaGameModule.sln Normal file
View File

@ -0,0 +1,43 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.8.34330.188
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OshimaModules", "OshimaModules\OshimaModules.csproj", "{497E99F9-7EA4-498C-90C5-B5751B47B2BE}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OshimaMaps", "OshimaMaps\OshimaMaps.csproj", "{27847422-7671-4DF8-95EC-975A2E2F5631}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OshimaModes", "OshimaModes\OshimaModes.csproj", "{74922E11-458E-4A91-8D11-BEC9F7758EEB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OshimaServers", "OshimaServers\OshimaServers.csproj", "{E8C696E0-96E4-45C3-8CB4-A02145179590}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{497E99F9-7EA4-498C-90C5-B5751B47B2BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{497E99F9-7EA4-498C-90C5-B5751B47B2BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{497E99F9-7EA4-498C-90C5-B5751B47B2BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{497E99F9-7EA4-498C-90C5-B5751B47B2BE}.Release|Any CPU.Build.0 = Release|Any CPU
{27847422-7671-4DF8-95EC-975A2E2F5631}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{27847422-7671-4DF8-95EC-975A2E2F5631}.Debug|Any CPU.Build.0 = Debug|Any CPU
{27847422-7671-4DF8-95EC-975A2E2F5631}.Release|Any CPU.ActiveCfg = Release|Any CPU
{27847422-7671-4DF8-95EC-975A2E2F5631}.Release|Any CPU.Build.0 = Release|Any CPU
{74922E11-458E-4A91-8D11-BEC9F7758EEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{74922E11-458E-4A91-8D11-BEC9F7758EEB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{74922E11-458E-4A91-8D11-BEC9F7758EEB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{74922E11-458E-4A91-8D11-BEC9F7758EEB}.Release|Any CPU.Build.0 = Release|Any CPU
{E8C696E0-96E4-45C3-8CB4-A02145179590}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E8C696E0-96E4-45C3-8CB4-A02145179590}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E8C696E0-96E4-45C3-8CB4-A02145179590}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E8C696E0-96E4-45C3-8CB4-A02145179590}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {B3F190BD-B445-4D80-99D7-5D2B59D038CA}
EndGlobalSection
EndGlobal

24
OshimaMaps/FastAutoMap.cs Normal file
View File

@ -0,0 +1,24 @@
using Milimoe.FunGame.Core.Library.Common.Addon;
using Oshima.FunGame.OshimaModules;
namespace Oshima.FunGame.OshimaMaps
{
public class FastAutoMap : GameMap
{
public override string Name => OshimaGameModuleConstant.FastAutoMap;
public override string Description => OshimaGameModuleConstant.Description;
public override string Version => OshimaGameModuleConstant.Version;
public override string Author => OshimaGameModuleConstant.Author;
public override float Length => 6;
public override float Width => 6;
public override float Height => 3;
public override float Size => 6;
}
}

View File

@ -0,0 +1,23 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<Company>Oshima Studios</Company>
<Authors>Oshima Studios</Authors>
<BaseOutputPath>..\bin\</BaseOutputPath>
<RootNamespace>Oshima.FunGame.$(MSBuildProjectName.Replace(" ", "_"))</RootNamespace>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\OshimaModules\OshimaModules.csproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="FunGame.Core">
<HintPath>..\..\FunGame.Core\bin\Debug\net8.0\FunGame.Core.dll</HintPath>
</Reference>
</ItemGroup>
</Project>

65
OshimaModes/FastAuto.cs Normal file
View File

@ -0,0 +1,65 @@
using Milimoe.FunGame.Core.Api.Transmittal;
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Interface;
using Milimoe.FunGame.Core.Library.Common.Addon;
using Milimoe.FunGame.Core.Library.Common.Event;
using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Model;
using Oshima.FunGame.OshimaModules;
namespace Oshima.FunGame.OshimaModes
{
public class FastAuto : GameModule, IGamingUpdateInfoEvent
{
public override string Name => OshimaGameModuleConstant.FastAuto;
public override string Description => OshimaGameModuleConstant.Description;
public override string Version => OshimaGameModuleConstant.Version;
public override string Author => OshimaGameModuleConstant.Author;
public override string DefaultMap => OshimaGameModuleConstant.FastAutoMap;
public override GameModuleDepend GameModuleDepend => OshimaGameModuleConstant.GameModuleDepend;
public override RoomType RoomType => RoomType.FastAuto;
public override bool HideMain => false;
public override void StartGame(Gaming instance, params object[] args)
{
try
{
DataRequest request = Controller.NewDataRequest(GamingType.Connect);
request.AddRequestData("un", Session.LoginUserName);
request.SendRequest();
}
catch (Exception e)
{
TXTHelper.AppendErrorLog(e.ToString());
}
}
public override void StartUI(params object[] args)
{
if (Application.MessageLoop)
{
FastAutoUI f = new();
f.Invoke(f.Show);
}
else
{
ApplicationConfiguration.Initialize();
Application.Run(new FastAutoUI());
}
}
public void GamingUpdateInfoEvent(object sender, GamingEventArgs e, Dictionary<string, object> data)
{
try
{
string msg = (DataRequest.GetDictionaryJsonObject<string>(data, "msg") ?? "").Trim();
if (msg != "") Controller.WriteLine(msg);
}
catch (Exception ex)
{
TXTHelper.AppendErrorLog(ex.ToString());
}
}
}
}

187
OshimaModes/FastAutoUI.Designer.cs generated Normal file
View File

@ -0,0 +1,187 @@
using System.Windows.Forms;
namespace Oshima.FunGame.OshimaModes
{
partial class FastAutoUI
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
mainTableLayoutPanel = new TableLayoutPanel();
flowLayoutPanel6 = new FlowLayoutPanel();
flowLayoutPanel4 = new FlowLayoutPanel();
flowLayoutPanel3 = new FlowLayoutPanel();
leftTableLayoutPanel = new TableLayoutPanel();
rightTableLayoutPanel = new TableLayoutPanel();
richTextBox = new RichTextBox();
flowLayoutPanel1 = new FlowLayoutPanel();
flowLayoutPanel2 = new FlowLayoutPanel();
flowLayoutPanel5 = new FlowLayoutPanel();
mainTableLayoutPanel.SuspendLayout();
SuspendLayout();
//
// mainTableLayoutPanel
//
mainTableLayoutPanel.ColumnCount = 3;
mainTableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
mainTableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
mainTableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
mainTableLayoutPanel.Controls.Add(flowLayoutPanel6, 2, 2);
mainTableLayoutPanel.Controls.Add(flowLayoutPanel4, 2, 0);
mainTableLayoutPanel.Controls.Add(flowLayoutPanel3, 0, 0);
mainTableLayoutPanel.Controls.Add(leftTableLayoutPanel, 0, 1);
mainTableLayoutPanel.Controls.Add(rightTableLayoutPanel, 2, 1);
mainTableLayoutPanel.Controls.Add(richTextBox, 1, 1);
mainTableLayoutPanel.Controls.Add(flowLayoutPanel1, 1, 2);
mainTableLayoutPanel.Controls.Add(flowLayoutPanel2, 1, 0);
mainTableLayoutPanel.Controls.Add(flowLayoutPanel5, 0, 2);
mainTableLayoutPanel.Dock = DockStyle.Fill;
mainTableLayoutPanel.Location = new Point(0, 0);
mainTableLayoutPanel.Name = "mainTableLayoutPanel";
mainTableLayoutPanel.RowCount = 3;
mainTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 10F));
mainTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 70F));
mainTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 20F));
mainTableLayoutPanel.Size = new Size(1688, 943);
mainTableLayoutPanel.TabIndex = 0;
//
// flowLayoutPanel6
//
flowLayoutPanel6.Dock = DockStyle.Fill;
flowLayoutPanel6.Location = new Point(1269, 757);
flowLayoutPanel6.Name = "flowLayoutPanel6";
flowLayoutPanel6.Size = new Size(416, 183);
flowLayoutPanel6.TabIndex = 8;
//
// flowLayoutPanel4
//
flowLayoutPanel4.Dock = DockStyle.Fill;
flowLayoutPanel4.Location = new Point(1269, 3);
flowLayoutPanel4.Name = "flowLayoutPanel4";
flowLayoutPanel4.Size = new Size(416, 88);
flowLayoutPanel4.TabIndex = 6;
//
// flowLayoutPanel3
//
flowLayoutPanel3.Dock = DockStyle.Fill;
flowLayoutPanel3.Location = new Point(3, 3);
flowLayoutPanel3.Name = "flowLayoutPanel3";
flowLayoutPanel3.Size = new Size(416, 88);
flowLayoutPanel3.TabIndex = 5;
//
// leftTableLayoutPanel
//
leftTableLayoutPanel.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
leftTableLayoutPanel.ColumnCount = 2;
leftTableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
leftTableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
leftTableLayoutPanel.Location = new Point(3, 97);
leftTableLayoutPanel.Name = "leftTableLayoutPanel";
leftTableLayoutPanel.RowCount = 3;
leftTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 33.33F));
leftTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 33.33F));
leftTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 33.33F));
leftTableLayoutPanel.Size = new Size(416, 654);
leftTableLayoutPanel.TabIndex = 0;
//
// rightTableLayoutPanel
//
rightTableLayoutPanel.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
rightTableLayoutPanel.ColumnCount = 2;
rightTableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
rightTableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
rightTableLayoutPanel.Location = new Point(1269, 97);
rightTableLayoutPanel.Name = "rightTableLayoutPanel";
rightTableLayoutPanel.RowCount = 3;
rightTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 33.33F));
rightTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 33.33F));
rightTableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 33.33F));
rightTableLayoutPanel.Size = new Size(416, 654);
rightTableLayoutPanel.TabIndex = 1;
//
// richTextBox
//
richTextBox.Dock = DockStyle.Fill;
richTextBox.Location = new Point(425, 97);
richTextBox.Name = "richTextBox";
richTextBox.ReadOnly = true;
richTextBox.Size = new Size(838, 654);
richTextBox.TabIndex = 2;
richTextBox.Text = "";
//
// flowLayoutPanel1
//
flowLayoutPanel1.Dock = DockStyle.Fill;
flowLayoutPanel1.Location = new Point(425, 757);
flowLayoutPanel1.Name = "flowLayoutPanel1";
flowLayoutPanel1.Size = new Size(838, 183);
flowLayoutPanel1.TabIndex = 3;
//
// flowLayoutPanel2
//
flowLayoutPanel2.Dock = DockStyle.Fill;
flowLayoutPanel2.Location = new Point(425, 3);
flowLayoutPanel2.Name = "flowLayoutPanel2";
flowLayoutPanel2.Size = new Size(838, 88);
flowLayoutPanel2.TabIndex = 4;
//
// flowLayoutPanel5
//
flowLayoutPanel5.Dock = DockStyle.Fill;
flowLayoutPanel5.Location = new Point(3, 757);
flowLayoutPanel5.Name = "flowLayoutPanel5";
flowLayoutPanel5.Size = new Size(416, 183);
flowLayoutPanel5.TabIndex = 7;
//
// FastAutoUI
//
AutoScaleDimensions = new SizeF(7F, 17F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1688, 943);
Controls.Add(mainTableLayoutPanel);
FormBorderStyle = FormBorderStyle.FixedSingle;
MaximizeBox = false;
Name = "FastAutoUI";
Text = "游戏界面";
mainTableLayoutPanel.ResumeLayout(false);
ResumeLayout(false);
}
private System.Windows.Forms.TableLayoutPanel mainTableLayoutPanel;
private System.Windows.Forms.TableLayoutPanel leftTableLayoutPanel;
private System.Windows.Forms.TableLayoutPanel rightTableLayoutPanel;
private System.Windows.Forms.RichTextBox richTextBox;
#endregion
private FlowLayoutPanel flowLayoutPanel4;
private FlowLayoutPanel flowLayoutPanel3;
private FlowLayoutPanel flowLayoutPanel1;
private FlowLayoutPanel flowLayoutPanel2;
private FlowLayoutPanel flowLayoutPanel6;
private FlowLayoutPanel flowLayoutPanel5;
}
}

57
OshimaModes/FastAutoUI.cs Normal file
View File

@ -0,0 +1,57 @@
namespace Oshima.FunGame.OshimaModes
{
public partial class FastAutoUI : Form
{
public FastAutoUI()
{
InitializeComponent();
// 根据玩家数量,添加格子
AddPlayers(7);
}
// 动态添加玩家格子
private void AddPlayers(int playerCount)
{
int leftIndex = 0; // 左侧的奇数玩家计数器
int rightIndex = 0; // 右侧的偶数玩家计数器
for (int i = 1; i <= playerCount; i++)
{
// 每个格子用Button表示
CharacterStatus playerSlot = new();
if (i % 2 == 1) // 奇数玩家,左侧
{
AddToLeftPanel(playerSlot, leftIndex);
leftIndex++;
}
else // 偶数玩家,右侧
{
AddToRightPanel(playerSlot, rightIndex);
rightIndex++;
}
}
}
// 添加奇数玩家到左侧TableLayoutPanel
private void AddToLeftPanel(Control control, int index)
{
int col = index / 3; // 每列容纳3个玩家
int row = index % 3; // 行号从0到2
leftTableLayoutPanel.Controls.Add(control, col, row);
}
// 添加偶数玩家到右侧TableLayoutPanel
private void AddToRightPanel(Control control, int index)
{
// 偶数玩家的排列规则:
// - 第一列: Player 10, Player 11, Player 12 (根据index从3开始)
// - 第二列: Player 2, Player 4, Player 6 (根据index从0开始)
int col = (index >= 3) ? 0 : 1; // 超过 3 位玩家的偶数编号应该在第一列,否则在第二列
int row = index % 3; // 行号从0到2
rightTableLayoutPanel.Controls.Add(control, col, row);
}
}
}

120
OshimaModes/FastAutoUI.resx Normal file
View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,40 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<BaseOutputPath>..\bin\</BaseOutputPath>
<RootNamespace>Oshima.FunGame.$(MSBuildProjectName.Replace(" ", "_"))</RootNamespace>
<Authors>Oshima Studios</Authors>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\OshimaMaps\OshimaMaps.csproj" />
<ProjectReference Include="..\OshimaModules\OshimaModules.csproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="FunGame.Core">
<HintPath>..\..\FunGame.Core\bin\Debug\net8.0\FunGame.Core.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\Resources.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
</Project>

17
OshimaModes/Program.cs Normal file
View File

@ -0,0 +1,17 @@
namespace Oshima.FunGame.OshimaModes
{
internal static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
Application.Run(new FastAutoUI());
}
}
}

View File

@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace Oshima.FunGame.OshimaModes.Properties {
using System;
/// <summary>
/// 一个强类型的资源类,用于查找本地化的字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// 返回此类使用的缓存的 ResourceManager 实例。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Oshima.FunGame.OshimaModes.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 重写当前线程的 CurrentUICulture 属性,对
/// 使用此强类型资源类的所有资源查找执行重写。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,359 @@
namespace Oshima.FunGame.OshimaModes
{
partial class CharacterStatus
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CharacterStatus));
CharacterName = new Label();
HPBar = new CustomProgressBar();
MPBar = new CustomProgressBar();
CharacterAvatar = new PictureBox();
EPBar = new CustomProgressBar();
EquipSlots = new TableLayoutPanel();
pictureBox2 = new PictureBox();
pictureBox3 = new PictureBox();
pictureBox4 = new PictureBox();
pictureBox5 = new PictureBox();
pictureBox6 = new PictureBox();
pictureBox7 = new PictureBox();
SkillSlots = new TableLayoutPanel();
pictureBox8 = new PictureBox();
pictureBox9 = new PictureBox();
pictureBox10 = new PictureBox();
pictureBox11 = new PictureBox();
pictureBox1 = new PictureBox();
pictureBox12 = new PictureBox();
pictureBox13 = new PictureBox();
pictureBox14 = new PictureBox();
((System.ComponentModel.ISupportInitialize)CharacterAvatar).BeginInit();
EquipSlots.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBox2).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureBox3).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureBox4).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureBox5).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureBox6).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureBox7).BeginInit();
SkillSlots.SuspendLayout();
((System.ComponentModel.ISupportInitialize)pictureBox8).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureBox9).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureBox10).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureBox11).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureBox12).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureBox13).BeginInit();
((System.ComponentModel.ISupportInitialize)pictureBox14).BeginInit();
SuspendLayout();
//
// CharacterName
//
CharacterName.Dock = DockStyle.Top;
CharacterName.Font = new Font("Microsoft YaHei UI", 18F, FontStyle.Regular, GraphicsUnit.Point, 134);
CharacterName.Location = new Point(0, 0);
CharacterName.Name = "CharacterName";
CharacterName.Size = new Size(308, 34);
CharacterName.TabIndex = 0;
CharacterName.Text = "角色名称";
CharacterName.TextAlign = ContentAlignment.MiddleCenter;
//
// HPBar
//
HPBar.BorderStyle = BorderStyle.FixedSingle;
HPBar.Dock = DockStyle.Bottom;
HPBar.Location = new Point(0, 276);
HPBar.Maximum = 1000D;
HPBar.Name = "HPBar";
HPBar.ProgressColor = Color.PaleVioletRed;
HPBar.Size = new Size(308, 20);
HPBar.TabIndex = 1;
HPBar.Value = 325D;
//
// MPBar
//
MPBar.BorderStyle = BorderStyle.FixedSingle;
MPBar.Dock = DockStyle.Bottom;
MPBar.Location = new Point(0, 296);
MPBar.Maximum = 142D;
MPBar.Name = "MPBar";
MPBar.ProgressColor = Color.SteelBlue;
MPBar.Size = new Size(308, 20);
MPBar.TabIndex = 2;
MPBar.Value = 24D;
//
// CharacterAvatar
//
CharacterAvatar.Dock = DockStyle.Left;
CharacterAvatar.Image = (Image)resources.GetObject("CharacterAvatar.Image");
CharacterAvatar.Location = new Point(0, 34);
CharacterAvatar.Name = "CharacterAvatar";
CharacterAvatar.Size = new Size(181, 182);
CharacterAvatar.SizeMode = PictureBoxSizeMode.Zoom;
CharacterAvatar.TabIndex = 3;
CharacterAvatar.TabStop = false;
//
// EPBar
//
EPBar.BorderStyle = BorderStyle.FixedSingle;
EPBar.Dock = DockStyle.Bottom;
EPBar.Location = new Point(0, 316);
EPBar.Maximum = 200D;
EPBar.Name = "EPBar";
EPBar.ProgressColor = Color.LightGoldenrodYellow;
EPBar.Size = new Size(308, 21);
EPBar.TabIndex = 4;
EPBar.Value = 54D;
//
// EquipSlots
//
EquipSlots.ColumnCount = 2;
EquipSlots.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
EquipSlots.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
EquipSlots.Controls.Add(pictureBox2, 0, 0);
EquipSlots.Controls.Add(pictureBox3, 1, 0);
EquipSlots.Controls.Add(pictureBox4, 0, 1);
EquipSlots.Controls.Add(pictureBox5, 1, 1);
EquipSlots.Controls.Add(pictureBox6, 0, 2);
EquipSlots.Controls.Add(pictureBox7, 1, 2);
EquipSlots.Dock = DockStyle.Right;
EquipSlots.Location = new Point(180, 34);
EquipSlots.Name = "EquipSlots";
EquipSlots.RowCount = 3;
EquipSlots.RowStyles.Add(new RowStyle(SizeType.Percent, 33.3333321F));
EquipSlots.RowStyles.Add(new RowStyle(SizeType.Percent, 33.3333321F));
EquipSlots.RowStyles.Add(new RowStyle(SizeType.Percent, 33.3333321F));
EquipSlots.Size = new Size(128, 182);
EquipSlots.TabIndex = 8;
//
// pictureBox2
//
pictureBox2.Image = (Image)resources.GetObject("pictureBox2.Image");
pictureBox2.Location = new Point(3, 3);
pictureBox2.Name = "pictureBox2";
pictureBox2.Size = new Size(58, 50);
pictureBox2.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox2.TabIndex = 0;
pictureBox2.TabStop = false;
//
// pictureBox3
//
pictureBox3.Image = (Image)resources.GetObject("pictureBox3.Image");
pictureBox3.Location = new Point(67, 3);
pictureBox3.Name = "pictureBox3";
pictureBox3.Size = new Size(58, 50);
pictureBox3.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox3.TabIndex = 1;
pictureBox3.TabStop = false;
//
// pictureBox4
//
pictureBox4.Image = (Image)resources.GetObject("pictureBox4.Image");
pictureBox4.Location = new Point(3, 63);
pictureBox4.Name = "pictureBox4";
pictureBox4.Size = new Size(58, 50);
pictureBox4.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox4.TabIndex = 2;
pictureBox4.TabStop = false;
//
// pictureBox5
//
pictureBox5.Image = (Image)resources.GetObject("pictureBox5.Image");
pictureBox5.Location = new Point(67, 63);
pictureBox5.Name = "pictureBox5";
pictureBox5.Size = new Size(58, 50);
pictureBox5.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox5.TabIndex = 3;
pictureBox5.TabStop = false;
//
// pictureBox6
//
pictureBox6.Image = (Image)resources.GetObject("pictureBox6.Image");
pictureBox6.Location = new Point(3, 123);
pictureBox6.Name = "pictureBox6";
pictureBox6.Size = new Size(58, 50);
pictureBox6.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox6.TabIndex = 4;
pictureBox6.TabStop = false;
//
// pictureBox7
//
pictureBox7.Image = (Image)resources.GetObject("pictureBox7.Image");
pictureBox7.Location = new Point(67, 123);
pictureBox7.Name = "pictureBox7";
pictureBox7.Size = new Size(58, 50);
pictureBox7.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox7.TabIndex = 5;
pictureBox7.TabStop = false;
//
// SkillSlots
//
SkillSlots.ColumnCount = 4;
SkillSlots.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
SkillSlots.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
SkillSlots.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
SkillSlots.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 25F));
SkillSlots.Controls.Add(pictureBox1, 0, 0);
SkillSlots.Controls.Add(pictureBox12, 1, 0);
SkillSlots.Controls.Add(pictureBox13, 2, 0);
SkillSlots.Controls.Add(pictureBox14, 3, 0);
SkillSlots.Dock = DockStyle.Bottom;
SkillSlots.Location = new Point(0, 216);
SkillSlots.Name = "SkillSlots";
SkillSlots.RowCount = 1;
SkillSlots.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));
SkillSlots.Size = new Size(308, 60);
SkillSlots.TabIndex = 9;
//
// pictureBox8
//
pictureBox8.Location = new Point(0, 0);
pictureBox8.Name = "pictureBox8";
pictureBox8.Size = new Size(100, 50);
pictureBox8.TabIndex = 0;
pictureBox8.TabStop = false;
//
// pictureBox9
//
pictureBox9.Location = new Point(0, 0);
pictureBox9.Name = "pictureBox9";
pictureBox9.Size = new Size(100, 50);
pictureBox9.TabIndex = 0;
pictureBox9.TabStop = false;
//
// pictureBox10
//
pictureBox10.Location = new Point(0, 0);
pictureBox10.Name = "pictureBox10";
pictureBox10.Size = new Size(100, 50);
pictureBox10.TabIndex = 0;
pictureBox10.TabStop = false;
//
// pictureBox11
//
pictureBox11.Location = new Point(0, 0);
pictureBox11.Name = "pictureBox11";
pictureBox11.Size = new Size(100, 50);
pictureBox11.TabIndex = 0;
pictureBox11.TabStop = false;
//
// pictureBox1
//
pictureBox1.Image = (Image)resources.GetObject("pictureBox1.Image");
pictureBox1.Location = new Point(3, 3);
pictureBox1.Name = "pictureBox1";
pictureBox1.Size = new Size(71, 50);
pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox1.TabIndex = 0;
pictureBox1.TabStop = false;
//
// pictureBox12
//
pictureBox12.Image = (Image)resources.GetObject("pictureBox12.Image");
pictureBox12.Location = new Point(80, 3);
pictureBox12.Name = "pictureBox12";
pictureBox12.Size = new Size(71, 50);
pictureBox12.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox12.TabIndex = 1;
pictureBox12.TabStop = false;
//
// pictureBox13
//
pictureBox13.Image = (Image)resources.GetObject("pictureBox13.Image");
pictureBox13.Location = new Point(157, 3);
pictureBox13.Name = "pictureBox13";
pictureBox13.Size = new Size(71, 50);
pictureBox13.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox13.TabIndex = 2;
pictureBox13.TabStop = false;
//
// pictureBox14
//
pictureBox14.Image = (Image)resources.GetObject("pictureBox14.Image");
pictureBox14.Location = new Point(234, 3);
pictureBox14.Name = "pictureBox14";
pictureBox14.Size = new Size(71, 50);
pictureBox14.SizeMode = PictureBoxSizeMode.Zoom;
pictureBox14.TabIndex = 3;
pictureBox14.TabStop = false;
//
// CharacterStatus
//
AutoScaleDimensions = new SizeF(7F, 17F);
AutoScaleMode = AutoScaleMode.Font;
Controls.Add(CharacterAvatar);
Controls.Add(EquipSlots);
Controls.Add(SkillSlots);
Controls.Add(CharacterName);
Controls.Add(HPBar);
Controls.Add(MPBar);
Controls.Add(EPBar);
Name = "CharacterStatus";
Size = new Size(308, 337);
((System.ComponentModel.ISupportInitialize)CharacterAvatar).EndInit();
EquipSlots.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)pictureBox2).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox3).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox4).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox5).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox6).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox7).EndInit();
SkillSlots.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)pictureBox8).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox9).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox10).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox11).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox1).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox12).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox13).EndInit();
((System.ComponentModel.ISupportInitialize)pictureBox14).EndInit();
ResumeLayout(false);
}
#endregion
private Label CharacterName;
private CustomProgressBar HPBar;
private CustomProgressBar MPBar;
private PictureBox CharacterAvatar;
private CustomProgressBar EPBar;
private TableLayoutPanel EquipSlots;
private PictureBox pictureBox2;
private PictureBox pictureBox3;
private PictureBox pictureBox4;
private PictureBox pictureBox5;
private PictureBox pictureBox6;
private PictureBox pictureBox7;
private TableLayoutPanel SkillSlots;
private PictureBox pictureBox8;
private PictureBox pictureBox9;
private PictureBox pictureBox10;
private PictureBox pictureBox11;
private PictureBox pictureBox1;
private PictureBox pictureBox12;
private PictureBox pictureBox13;
private PictureBox pictureBox14;
}
}

View File

@ -0,0 +1,10 @@
namespace Oshima.FunGame.OshimaModes
{
public partial class CharacterStatus : UserControl
{
public CharacterStatus()
{
InitializeComponent();
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,67 @@
namespace Oshima.FunGame.OshimaModes
{
public class CustomProgressBar : UserControl
{
private double _value = 0;
private double _maximum = 100;
private Color _progressColor = Color.Red;
public double Value
{
get => _value;
set
{
_value = Math.Max(0, Math.Min(value, _maximum)); // 限制值在范围内
Invalidate(); // 触发重绘
}
}
public double Maximum
{
get => _maximum;
set
{
_maximum = Math.Max(1, value); // 最大值不能小于1
Invalidate(); // 触发重绘
}
}
public Color ProgressColor
{
get => _progressColor;
set
{
_progressColor = value;
Invalidate(); // 触发重绘
}
}
public CustomProgressBar()
{
this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer, true);
this.Height = 20; // 设置控件的默认高度
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// 计算进度条填充宽度
double percent = _value / _maximum;
int fillWidth = (int)(this.Width * percent);
// 填充背景(灰色)
e.Graphics.FillRectangle(Brushes.LightGray, 0, 0, this.Width, this.Height);
// 填充进度条(自定义颜色)
e.Graphics.FillRectangle(new SolidBrush(_progressColor), 0, 0, fillWidth, this.Height);
// 可选:绘制进度百分比文字
string text = $"{_value} / {_maximum}";
SizeF textSize = e.Graphics.MeasureString(text, this.Font);
e.Graphics.DrawString(text, this.Font, Brushes.Black,
(this.Width - textSize.Width) / 2, (this.Height - textSize.Height) / 2);
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,59 @@
namespace Oshima.FunGame.OshimaModes
{
public partial class PlayerStatusControl : UserControl
{
public Label PlayerNameLabel { get; }
public PictureBox AvatarBox { get; }
public CustomProgressBar HPBar { get; }
public CustomProgressBar MPBar { get; }
public PlayerStatusControl(int index)
{
// 玩家名标签
PlayerNameLabel = new()
{
Text = "Player " + index,
TextAlign = ContentAlignment.MiddleCenter,
ImageAlign = ContentAlignment.MiddleCenter,
Dock = DockStyle.Top,
AutoSize = true
};
// 头像框
AvatarBox = new()
{
BorderStyle = BorderStyle.FixedSingle,
SizeMode = PictureBoxSizeMode.StretchImage,
Height = 100,
Width = 100,
Dock = DockStyle.Top
};
// HP条
HPBar = new()
{
Maximum = 100,
Value = 75.5, // 支持浮点数
ProgressColor = Color.Red, // 自定义颜色
Dock = DockStyle.Bottom,
Height = 20
};
// MP条
MPBar = new()
{
Maximum = 100,
Value = 50.7, // 支持浮点数
ProgressColor = Color.Blue, // 自定义颜色
Dock = DockStyle.Bottom,
Height = 20
};
// 添加控件到用户控件
this.Controls.Add(MPBar);
this.Controls.Add(HPBar);
this.Controls.Add(AvatarBox);
this.Controls.Add(PlayerNameLabel);
}
}
}

View File

@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@ -0,0 +1,29 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Characters
{
public class ColdBlue : Character
{
public ColdBlue() : base()
{
Id = 10;
Name = "Cold";
FirstName = "Blue";
NickName = "冷蓝";
PrimaryAttribute = PrimaryAttribute.STR;
InitialATK = 28;
InitialHP = 95;
InitialMP = 25;
InitialSTR = 22;
STRGrowth = 1.9;
InitialAGI = 4;
AGIGrowth = 0.6;
InitialINT = 4;
INTGrowth = 0.6;
InitialSPD = 300;
InitialHR = 4;
InitialMR = 2;
}
}
}

View File

@ -0,0 +1,29 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Characters
{
public class DokyoMayor : Character
{
public DokyoMayor() : base()
{
Id = 6;
Name = "Dokyo";
FirstName = "Mayor";
NickName = "铎京市长";
PrimaryAttribute = PrimaryAttribute.AGI;
InitialATK = 21;
InitialHP = 120;
InitialMP = 20;
InitialSTR = 7;
STRGrowth = 1;
InitialAGI = 21;
AGIGrowth = 1.8;
InitialINT = 2;
INTGrowth = 0.2;
InitialSPD = 300;
InitialHR = 4;
InitialMR = 2;
}
}
}

View File

@ -0,0 +1,29 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Characters
{
public class MagicalGirl : Character
{
public MagicalGirl() : base()
{
Id = 7;
Name = "Magical";
FirstName = "Girl";
NickName = "魔法少女";
PrimaryAttribute = PrimaryAttribute.AGI;
InitialATK = 20;
InitialHP = 95;
InitialMP = 35;
InitialSTR = 7;
STRGrowth = 0.3;
InitialAGI = 15;
AGIGrowth = 2.3;
InitialINT = 8;
INTGrowth = 0.4;
InitialSPD = 300;
InitialHR = 4;
InitialMR = 2;
}
}
}

View File

@ -0,0 +1,29 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Characters
{
public class NanGanYu : Character
{
public NanGanYu() : base()
{
Id = 4;
Name = "Nan";
FirstName = "Ganyu";
NickName = "男甘雨";
PrimaryAttribute = PrimaryAttribute.INT;
InitialATK = 17;
InitialHP = 115;
InitialMP = 80;
InitialSTR = 6;
STRGrowth = 0.6;
InitialAGI = 7;
AGIGrowth = 0.7;
InitialINT = 17;
INTGrowth = 1.7;
InitialSPD = 300;
InitialHR = 4;
InitialMR = 2;
}
}
}

View File

@ -0,0 +1,29 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Characters
{
public class NiuNan : Character
{
public NiuNan() : base()
{
Id = 5;
Name = "Niu";
FirstName = "Nan";
NickName = "牛腩";
PrimaryAttribute = PrimaryAttribute.INT;
InitialATK = 16;
InitialHP = 75;
InitialMP = 90;
InitialSTR = 0;
STRGrowth = 0;
InitialAGI = 0;
AGIGrowth = 0;
InitialINT = 30;
INTGrowth = 3;
InitialSPD = 300;
InitialHR = 4;
InitialMR = 2;
}
}
}

View File

@ -0,0 +1,29 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Characters
{
public class OshimaShiya : Character
{
public OshimaShiya() : base()
{
Id = 1;
Name = "Oshima";
FirstName = "Shiya";
NickName = "大島シヤ";
PrimaryAttribute = PrimaryAttribute.STR;
InitialATK = 25;
InitialHP = 85;
InitialMP = 10;
InitialSTR = 35;
STRGrowth = 3.5;
InitialAGI = 0;
AGIGrowth = 0;
InitialINT = 0;
INTGrowth = 0;
InitialSPD = 300;
InitialHR = 4;
InitialMR = 2;
}
}
}

View File

@ -0,0 +1,29 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Characters
{
public class QWQAQW : Character
{
public QWQAQW() : base()
{
Id = 9;
Name = "QWQ";
FirstName = "AQW";
NickName = "LUOLI66";
PrimaryAttribute = PrimaryAttribute.INT;
InitialATK = 18;
InitialHP = 125;
InitialMP = 45;
InitialSTR = 0;
STRGrowth = 0;
InitialAGI = 15;
AGIGrowth = 1.5;
InitialINT = 15;
INTGrowth = 1.5;
InitialSPD = 300;
InitialHR = 4;
InitialMR = 2;
}
}
}

View File

@ -0,0 +1,29 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Characters
{
public class QingXiang : Character
{
public QingXiang() : base()
{
Id = 8;
Name = "Qing";
FirstName = "Xiang";
NickName = "清香";
PrimaryAttribute = PrimaryAttribute.INT;
InitialATK = 26;
InitialHP = 110;
InitialMP = 80;
InitialSTR = 6;
STRGrowth = 0.5;
InitialAGI = 4;
AGIGrowth = 0.5;
InitialINT = 20;
INTGrowth = 2;
InitialSPD = 300;
InitialHR = 4;
InitialMR = 2;
}
}
}

View File

@ -0,0 +1,29 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Characters
{
public class Quduoduo : Character
{
public Quduoduo() : base()
{
Id = 12;
Name = "Qu";
FirstName = "Duoduo";
NickName = "趣多多";
PrimaryAttribute = PrimaryAttribute.STR;
InitialATK = 19;
InitialHP = 90;
InitialMP = 40;
InitialSTR = 13;
STRGrowth = 1.5;
InitialAGI = 13;
AGIGrowth = 1.2;
InitialINT = 4;
INTGrowth = 0.3;
InitialSPD = 300;
InitialHR = 4;
InitialMR = 2;
}
}
}

View File

@ -0,0 +1,30 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Characters
{
public class XinYin : Character
{
public XinYin() : base()
{
Id = 2;
Name = "Xiyue";
FirstName = "XinYin";
NickName = "心音";
PrimaryAttribute = PrimaryAttribute.AGI;
InitialATK = 22;
InitialHP = 80;
InitialMP = 60;
InitialSTR = 8;
STRGrowth = 0.9;
InitialAGI = 19;
AGIGrowth = 1.7;
InitialINT = 3;
INTGrowth = 0.4;
InitialSPD = 300;
InitialHR = 4;
InitialMR = 2;
}
}
}

View File

@ -0,0 +1,29 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Characters
{
public class Yang : Character
{
public Yang() : base()
{
Id = 3;
Name = "Ya";
FirstName = "Yang";
NickName = "吖养";
PrimaryAttribute = PrimaryAttribute.STR;
InitialATK = 23;
InitialHP = 105;
InitialMP = 55;
InitialSTR = 11;
STRGrowth = 1.8;
InitialAGI = 9;
AGIGrowth = 0.5;
InitialINT = 10;
INTGrowth = 0.7;
InitialSPD = 300;
InitialHR = 4;
InitialMR = 2;
}
}
}

View File

@ -0,0 +1,29 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Characters
{
public class dddovo : Character
{
public dddovo() : base()
{
Id = 11;
Name = "ddd";
FirstName = "ovo";
NickName = "绿拱门";
PrimaryAttribute = PrimaryAttribute.AGI;
InitialATK = 22;
InitialHP = 65;
InitialMP = 22;
InitialSTR = 10;
STRGrowth = 1;
InitialAGI = 20;
AGIGrowth = 2;
InitialINT = 0;
INTGrowth = 0;
InitialSPD = 300;
InitialHR = 4;
InitialMR = 2;
}
}
}

View File

@ -0,0 +1,7 @@
namespace Oshima.FunGame.OshimaModules.Controllers
{
public class Controller
{
}
}

View File

@ -0,0 +1,35 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Effects
{
public class : Effect
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"增加角色 {实际冷却缩减加成 * 100:0.##}% 冷却缩减。" + (!TargetSelf ? $"来自:[ {Source} ]" + (Item != null ? $" 的 [ {Item.Name} ]" : "") : "");
public override EffectType EffectType => EffectType.Item;
public override bool TargetSelf => true;
public Item? Item { get; }
private readonly double = 0;
public override void OnEffectGained(Character character)
{
character.ExCDR += ;
}
public override void OnEffectLost(Character character)
{
character.ExCDR -= ;
}
public (Skill skill, Character? source, Item? item, double exCdr) : base(skill)
{
ActionQueue = skill.ActionQueue;
Source = source;
Item = item;
= exCdr;
}
}
}

View File

@ -0,0 +1,52 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Effects
{
public class : Effect
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"减少角色的所有主动技能 {实际硬直时间减少} 硬直时间。" + (!TargetSelf ? $"来自:[ {Source} ]" + (Item != null ? $" 的 [ {Item.Name} ]" : "") : "");
public override EffectType EffectType => EffectType.Item;
public override bool TargetSelf => true;
public Item? Item { get; }
private readonly double = 2;
public override void OnEffectGained(Character character)
{
foreach (Skill s in character.Skills)
{
s.HardnessTime = Calculation.Round2Digits(s.HardnessTime - );
}
foreach (Skill? s in character.Items.Select(i => i.Skills.Active))
{
if (s != null)
s.HardnessTime = Calculation.Round2Digits(s.HardnessTime - );
}
}
public override void OnEffectLost(Character character)
{
foreach (Skill s in character.Skills)
{
s.HardnessTime = Calculation.Round2Digits(s.HardnessTime + );
}
foreach (Skill? s in character.Items.Select(i => i.Skills.Active))
{
if (s != null)
s.HardnessTime = Calculation.Round2Digits(s.HardnessTime + );
}
}
public (Skill skill, Character? source, Item? item, double reduce) : base(skill)
{
ActionQueue = skill.ActionQueue;
Source = source;
Item = item;
= reduce;
}
}
}

View File

@ -0,0 +1,35 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Effects
{
public class : Effect
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"增加角色 {实际攻击力加成} 点攻击力。" + (!TargetSelf ? $"来自:[ {Source} ]" + (Item != null ? $" 的 [ {Item.Name} ]" : "") : "");
public override EffectType EffectType => EffectType.Item;
public override bool TargetSelf => true;
public Item? Item { get; }
private readonly double = 0;
public override void OnEffectGained(Character character)
{
character.ExATK2 += ;
}
public override void OnEffectLost(Character character)
{
character.ExATK2 -= ;
}
public (Skill skill, Character? source, Item? item, double exATK) : base(skill)
{
ActionQueue = skill.ActionQueue;
Source = source;
Item = item;
= exATK;
}
}
}

View File

@ -0,0 +1,36 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Effects
{
public class : Effect
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"减少角色的普通攻击 {实际硬直时间减少} 硬直时间。" + (!TargetSelf ? $"来自:[ {Source} ]" + (Item != null ? $" 的 [ {Item.Name} ]" : "") : "");
public override EffectType EffectType => EffectType.Item;
public override bool TargetSelf => true;
public Item? Item { get; }
private readonly double = 2;
public override void OnEffectGained(Character character)
{
character.NormalAttack.HardnessTime = Calculation.Round2Digits(character.NormalAttack.HardnessTime - ); ;
}
public override void OnEffectLost(Character character)
{
character.NormalAttack.HardnessTime = Calculation.Round2Digits(character.NormalAttack.HardnessTime + ); ;
}
public (Skill skill, Character? source, Item? item, double reduce) : base(skill)
{
ActionQueue = skill.ActionQueue;
Source = source;
Item = item;
= reduce;
}
}
}

View File

@ -0,0 +1,35 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Effects
{
public class : Effect
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"增加角色 {实际物理护甲加成} 点物理护甲。" + (!TargetSelf ? $"来自:[ {Source} ]" + (Item != null ? $" 的 [ {Item.Name} ]" : "") : "");
public override EffectType EffectType => EffectType.Item;
public override bool TargetSelf => true;
public Item? Item { get; }
private readonly double = 0;
public override void OnEffectGained(Character character)
{
character.ExDEF2 += ;
}
public override void OnEffectLost(Character character)
{
character.ExDEF2 -= ;
}
public (Skill skill, Character? source, Item? item, double exDef) : base(skill)
{
ActionQueue = skill.ActionQueue;
Source = source;
Item = item;
= exDef;
}
}
}

View File

@ -0,0 +1,47 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Effects
{
public class : Effect
{
public override long Id => 4101;
public override string Name => "眩晕";
public override string Description => $"此角色被眩晕了,不能行动。来自:[ {Source} ] 的 [ {Skill.Name} ]";
public override EffectType EffectType => EffectType.Stun;
public override bool TargetSelf => true;
public override Character Source => _sourceCharacter;
public override bool Durative => _durative;
public override double Duration => _duration;
public override int DurationTurn => _durationTurn;
private readonly Character _sourceCharacter;
private readonly bool _durative;
private readonly double _duration;
private readonly int _durationTurn;
public (Skill skill, Character sourceCharacter, bool durative = false, double duration = 0, int durationTurn = 1) : base(skill)
{
ActionQueue = skill.ActionQueue;
_sourceCharacter = sourceCharacter;
_durative = durative;
_duration = duration;
_durationTurn = durationTurn;
}
public override void OnEffectGained(Character character)
{
if (_durative) RemainDuration = Duration;
else RemainDurationTurn = DurationTurn;
character.CharacterEffectStates.Add(this, [CharacterState.NotActionable]);
character.UpdateCharacterState();
InterruptCasting(character, Source);
}
public override void OnEffectLost(Character character)
{
character.CharacterEffectStates.Remove(this);
character.UpdateCharacterState();
}
}
}

View File

@ -0,0 +1,24 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Effects
{
public class : Effect
{
public override long Id => 4102;
public override string Name => "累积之压标记";
public override string Description => $"此角色持有累积之压标记,已累计 {MarkLevel} 层。来自:[ {Source} ]";
public override EffectType EffectType => EffectType.Mark;
public override bool TargetSelf => true;
public override Character Source => _sourceCharacter;
public int MarkLevel { get; set; } = 1;
private readonly Character _sourceCharacter;
public (Skill skill, Character sourceCharacter) : base(skill)
{
ActionQueue = skill.ActionQueue;
_sourceCharacter = sourceCharacter;
}
}
}

View File

@ -0,0 +1,62 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
using Oshima.FunGame.OshimaModules.Effects;
using Oshima.FunGame.OshimaModules.Skills;
namespace Oshima.FunGame.OshimaModules.Items
{
public class 10 : Item
{
public override long Id => (long)AccessoryID.10;
public override string Name => "攻击之爪 +10";
public override string Description => Skills.Passives.Count > 0 ? Skills.Passives.First().Description : "";
public 10(Character? character = null) : base(ItemType.Accessory, slot: EquipSlotType.Accessory)
{
Skills.Passives.Add(new (character, this, 10));
}
}
public class 30 : Item
{
public override long Id => (long)AccessoryID.30;
public override string Name => "攻击之爪 +30";
public override string Description => Skills.Passives.Count > 0 ? Skills.Passives.First().Description : "";
public 30(Character? character = null) : base(ItemType.Accessory, slot: EquipSlotType.Accessory)
{
Skills.Passives.Add(new (character, this, 30));
}
}
public class 50 : Item
{
public override long Id => (long)AccessoryID.50;
public override string Name => "攻击之爪 +50";
public override string Description => Skills.Passives.Count > 0 ? Skills.Passives.First().Description : "";
public 50(Character? character = null) : base(ItemType.Accessory, slot: EquipSlotType.Accessory)
{
Skills.Passives.Add(new (character, this, 50));
}
}
public class : Skill
{
public override long Id => (long)ItemPassiveID.;
public override string Name => "攻击之爪";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public (Character? character = null, Item? item = null, double exATK = 0) : base(SkillType.Passive, character)
{
Level = 1;
Item = item;
Effects.Add(new (this, character, item, exATK));
}
public override IEnumerable<Effect> AddInactiveEffectToCharacter()
{
return Effects;
}
}
}

View File

@ -0,0 +1,9 @@
namespace Oshima.FunGame.OshimaModules.Items
{
public enum AccessoryID : long
{
10 = 14001,
30 = 14002,
50 = 14003,
}
}

View File

@ -0,0 +1,43 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
using Oshima.FunGame.OshimaModules.Effects;
namespace Oshima.FunGame.OshimaModules.Items
{
[Obsolete]
public class : Item
{
public override long Id => 11999;
public override string Name => "独奏弓";
public override string Description => Skills.Passives.Count > 0 ? Skills.Passives.First().Description : "";
public (Character? character = null) : base(ItemType.Weapon, slot: EquipSlotType.Weapon)
{
WeaponType = WeaponType.Bow;
Skills.Passives.Add(new (character, this));
}
}
public class : Skill
{
public override long Id => 5999;
public override string Name => "独奏弓";
public override string Description => $"增加角色 {攻击力加成} 点攻击力,减少普通攻击 {硬直时间减少} 硬直时间。";
private readonly double = 80;
private readonly double = 2;
public (Character? character, Item item) : base(SkillType.Passive, character)
{
Level = 1;
Item = item;
Effects.Add(new (this, character, item, ));
Effects.Add(new (this, character, item, ));
}
public override IEnumerable<Effect> AddInactiveEffectToCharacter()
{
return Effects;
}
}
}

View File

@ -0,0 +1,23 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
namespace Oshima.FunGame.OshimaModules
{
public class CharacterModule : Milimoe.FunGame.Core.Library.Common.Addon.CharacterModule
{
public override string Name => OshimaGameModuleConstant.Character;
public override string Description => OshimaGameModuleConstant.Description;
public override string Version => OshimaGameModuleConstant.Version;
public override string Author => OshimaGameModuleConstant.Author;
public override List<Character> Characters
{
get
{
EntityModuleConfig<Character> config = new(OshimaGameModuleConstant.General, OshimaGameModuleConstant.Character);
config.LoadConfig();
return [.. config.Values];
}
}
}
}

View File

@ -0,0 +1,23 @@
using Milimoe.FunGame.Core.Library.Common.Addon;
namespace Oshima.FunGame.OshimaModules
{
public class OshimaGameModuleConstant
{
public const string General = "oshima-studios";
public const string FastAuto = "oshima.fungame.fastauto";
public const string Character = "oshima.fungame.characters";
public const string Skill = "oshima.fungame.skills";
public const string Item = "oshima.fungame.items";
public const string Description = "Oshima Studios Presents";
public const string Version = "1.0.0";
public const string Author = "Oshima Studios";
public const string FastAutoMap = "oshima.fungame.fastauto.map";
private static readonly string[] Maps = [FastAutoMap];
private static readonly string[] Characters = [Character];
private static readonly string[] Skills = [Skill];
private static readonly string[] Items = [Item];
public static GameModuleDepend GameModuleDepend { get; } = new(Maps, Characters, Skills, Items);
}
}

View File

@ -0,0 +1,58 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
using Oshima.FunGame.OshimaModules.Items;
namespace Oshima.FunGame.OshimaModules
{
public class ItemModule : Milimoe.FunGame.Core.Library.Common.Addon.ItemModule
{
public override string Name => OshimaGameModuleConstant.Item;
public override string Description => OshimaGameModuleConstant.Description;
public override string Version => OshimaGameModuleConstant.Version;
public override string Author => OshimaGameModuleConstant.Author;
public override List<Item> Items
{
get
{
EntityModuleConfig<Item> config = new(OshimaGameModuleConstant.General, OshimaGameModuleConstant.Item);
config.LoadConfig();
foreach (string key in config.Keys)
{
Item prev = config[key];
Item? next = GetItem(prev.Id, prev.Name, prev.ItemType);
if (next != null)
{
prev.SetPropertyToItemModuleNew(next);
config[key] = next;
}
}
return [.. config.Values];
}
}
public override Item? GetItem(long id, string name, ItemType type)
{
if (type == ItemType.MagicCardPack)
{
}
if (type == ItemType.Accessory)
{
switch ((AccessoryID)id)
{
case AccessoryID.10:
return new 10();
case AccessoryID.30:
return new 30();
case AccessoryID.50:
return new 50();
}
}
return null;
}
}
}

View File

@ -0,0 +1,125 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
using Oshima.FunGame.OshimaModules.Items;
using Oshima.FunGame.OshimaModules.Skills;
namespace Oshima.FunGame.OshimaModules
{
public class SkillModule : Milimoe.FunGame.Core.Library.Common.Addon.SkillModule
{
public override string Name => OshimaGameModuleConstant.Skill;
public override string Description => OshimaGameModuleConstant.Description;
public override string Version => OshimaGameModuleConstant.Version;
public override string Author => OshimaGameModuleConstant.Author;
public override List<Skill> Skills
{
get
{
EntityModuleConfig<Skill> config = new(OshimaGameModuleConstant.General, OshimaGameModuleConstant.Skill);
config.LoadConfig();
foreach (string key in config.Keys)
{
Skill prev = config[key];
Skill? next = GetSkill(prev.Id, prev.Name, prev.SkillType);
if (next != null)
{
config[key] = next;
}
}
return [.. config.Values];
}
}
public override Skill? GetSkill(long id, string name, SkillType type)
{
if (type == SkillType.Magic)
{
switch ((MagicID)id)
{
case MagicID.:
return new ();
}
}
if (type == SkillType.Skill)
{
switch ((SkillID)id)
{
case SkillID.:
return new ();
}
}
if (type == SkillType.SuperSkill)
{
switch ((SuperSkillID)id)
{
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
case SuperSkillID.:
return new ();
}
}
if (type == SkillType.Passive)
{
switch ((PassiveID)id)
{
case PassiveID.META马:
return new META马();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
case PassiveID.:
return new ();
}
switch ((ItemPassiveID)id)
{
case ItemPassiveID.:
return new ();
}
}
return null;
}
}
}

View File

@ -7,6 +7,9 @@
<RootNamespace>Oshima.FunGame.$(MSBuildProjectName.Replace(" ", "_"))</RootNamespace>
<Company>Oshima Studios</Company>
<Authors>Oshima Studios</Authors>
<OutputType>Library</OutputType>
<UseWindowsForms>False</UseWindowsForms>
<BaseOutputPath>..\bin\</BaseOutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
@ -19,16 +22,10 @@
<NoWarn>1701;1702;CS8981;IDE1006</NoWarn>
</PropertyGroup>
<ItemGroup>
<Folder Include="Characters\" />
<Folder Include="Items\" />
<Folder Include="Skills\" />
</ItemGroup>
<ItemGroup>
<Reference Include="FunGame.Core">
<HintPath>..\FunGame.Core\bin\Debug\net8.0\FunGame.Core.dll</HintPath>
<HintPath>..\..\FunGame.Core\bin\Debug\net8.0\FunGame.Core.dll</HintPath>
</Reference>
</ItemGroup>
</Project>

View File

@ -0,0 +1,65 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
using Oshima.FunGame.OshimaModules.Effects;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)SuperSkillID.;
public override string Name => "嗜血本能";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public override double EPCost => 100;
public override double CD => 42 - 1 * (Level - 1);
public override double HardnessTime { get; set; } = 12;
public (Character? character = null) : base(SkillType.SuperSkill, character)
{
Effects.Add(new (this));
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"{Duration} 时间内,攻击拥有标记的角色将根据标记层数获得 {吸血 * 100:0.##}% 吸血每层。";
public override bool TargetSelf => true;
public override bool Durative => true;
public override double Duration => 30;
public HashSet<Character> { get; } = [];
private double => Calculation.Round4Digits(0.03 * Level);
public override void AfterDamageCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
{
if (character == Skill.Character && damageResult != DamageResult.Evaded && character.HP < character.MaxHP)
{
int = 0;
if (enemy.Effects.Where(e => e is ).FirstOrDefault() is e)
{
= e.MarkLevel;
}
else if (.Remove(enemy))
{
= 4;
}
double = Calculation.Round2Digits( * * damage);
character.HP += ;
WriteLine($"[ {character} ] 回复了 {实际吸血} 点生命值!");
}
}
public override void OnSkillCasted(Character caster, List<Character> enemys, List<Character> teammates, Dictionary<string, object> others)
{
RemainDuration = Duration;
if (!caster.Effects.Contains(this))
{
.Clear();
caster.Effects.Add(this);
OnEffectGained(caster);
}
}
}
}

View File

@ -0,0 +1,90 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
using Oshima.FunGame.OshimaModules.Effects;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)PassiveID.;
public override string Name => "累积之压";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public (Character? character = null) : base(SkillType.Passive, character)
{
Effects.Add(new (this));
}
public override IEnumerable<Effect> AddInactiveEffectToCharacter()
{
return Effects;
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"每次造成伤害都可以叠一层标记,累计 4 层时回收该角色所有标记并造成眩晕 1 回合,额外对该角色造成 {系数 * 100:0.##}% 最大生命值的物理伤害。";
public override bool TargetSelf => true;
private readonly double = 0.12;
private bool = false;
public override void AfterDamageCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
{
if (character == Skill.Character && damageResult != DamageResult.Evaded && !)
{
// 叠标记
IEnumerable<Effect> effects = enemy.Effects.Where(e => e is );
if (effects.Any() && effects.First() is e)
{
e.MarkLevel++;
IEnumerable<Effect> effects2 = character.Effects.Where(e => e is );
if (effects2.Any() && effects2.First() is e2)
{
if (e.MarkLevel >= 4)
{
e2..Add(enemy);
}
else
{
e2..Remove(enemy);
}
}
if (e.MarkLevel >= 4)
{
// 移除标记
enemy.Effects.Remove(e);
double = Calculation.Round2Digits(enemy.MaxHP * );
WriteLine($"[ {character} ] 发动了累积之压!将对 [ {enemy} ] 造成眩晕和额外伤害!");
// 眩晕
IEnumerable<Effect> effects3 = enemy.Effects.Where(e => e is && e.Skill == Skill);
if (effects3.Any())
{
effects3.First().RemainDurationTurn++;
}
else
{
e3 = new(Skill, character, false, 0, 1);
enemy.Effects.Add(e3);
e3.OnEffectGained(enemy);
}
= true;
DamageToEnemy(character, enemy, false, magicType, );
}
}
else
{
enemy.Effects.Add(new (Skill, character));
}
}
if (character == Skill.Character && )
{
= false;
}
}
}
}

View File

@ -0,0 +1,59 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)PassiveID.;
public override string Name => "毁灭之势";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public (Character? character = null) : base(SkillType.Passive, character)
{
Effects.Add(new (this));
}
public override IEnumerable<Effect> AddInactiveEffectToCharacter()
{
return Effects;
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"每时间提升 5.5% 所有伤害,无上限,但受到伤害时效果清零。" + ( > 0 ? $"(当前总提升:{累计伤害 * 100:0.##}%" : "");
public override bool TargetSelf => true;
private readonly double = 0.055;
private double = 0;
public override bool AlterActualDamageAfterCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
{
if (damageResult != DamageResult.Evaded)
{
if (enemy == Skill.Character && damage > 0 && !enemy.Effects.Where(e => e is ).Any())
{
= 0;
}
if (character == Skill.Character)
{
double = Calculation.Round2Digits(damage * );
damage = Calculation.Round2Digits(damage + );
if ( > 0) WriteLine($"[ {character} ] 的伤害提升了 {实际伤害提升} 点!");
}
}
return false;
}
public override void OnTimeElapsed(Character character, double eapsed)
{
= Calculation.Round4Digits( + * eapsed);
WriteLine($"[ {character} ] 的 [ {Name} ] 效果增加了,当前总提升:{累计伤害 * 100:0.##}%。");
}
}
}

View File

@ -0,0 +1,74 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)SuperSkillID.;
public override string Name => "绝对领域";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public override double EPCost => Math.Max(100, Character?.EP ?? 100);
public override double CD => 32 + (1 * (Level - 1));
public override double HardnessTime { get; set; } = 12;
public (Character? character = null) : base(SkillType.SuperSkill, character)
{
Effects.Add(new (this));
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"{Duration} 时间内无法受到任何伤害,且敏捷提升 {系数 * 100:0.##}% [ {敏捷提升} ]。此技能会消耗至少 100 点能量。";
public override bool TargetSelf => true;
public override bool Durative => true;
public override double Duration => Calculation.Round2Digits(16 + * 0.03);
private double => Calculation.Round4Digits(0.3 + 0.03 * (Level - 1));
private double => Calculation.Round2Digits( * Skill.Character?.BaseAGI ?? 0);
private double = 0;
private double = 0;
public override void OnEffectGained(Character character)
{
= ;
character.ExAGI += ;
WriteLine($"[ {character} ] 的敏捷提升了 {系数 * 100:0.##}% [ {实际敏捷提升} ] ");
}
public override void OnEffectLost(Character character)
{
character.ExAGI -= ;
}
public override bool AlterActualDamageAfterCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
{
if (enemy == Skill.Character && damageResult != DamageResult.Evaded)
{
WriteLine($"[ {enemy} ] 发动了绝对领域,巧妙的化解了此伤害!");
return true;
}
return false;
}
public override void OnSkillCasting(Character caster)
{
= caster.EP;
}
public override void OnSkillCasted(Character caster, List<Character> enemys, List<Character> teammates, Dictionary<string, object> others)
{
RemainDuration = Duration;
if (!caster.Effects.Contains(this))
{
= 0;
caster.Effects.Add(this);
OnEffectGained(caster);
}
}
}
}

View File

@ -0,0 +1,64 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)SuperSkillID.;
public override string Name => "精准打击";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public override double EPCost => 100;
public override double CD => 40 - 1 * (Level - 1);
public override double HardnessTime { get; set; } = 8;
public (Character? character = null) : base(SkillType.SuperSkill, character)
{
Effects.Add(new (this));
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"30 时间内暴击率提升 {暴击率提升 * 100:0.##}%,暴击伤害再提升 {暴击伤害提升 * 100:0.##}%。";
public override bool TargetSelf => true;
public override bool Durative => true;
public override double Duration => 30;
private double => Calculation.Round4Digits(0.2 + 0.03 * (Level - 1));
private double => Calculation.Round4Digits(0.8 + 0.04 * (Level - 1));
private double = 0;
private double = 0;
public override void OnEffectGained(Character character)
{
= ;
= ;
character.ExCritRate += ;
WriteLine($"[ {character} ] 的暴击率提升了 [ {实际暴击率提升 * 100:0.##}% ] ");
character.ExCritDMG += ;
WriteLine($"[ {character} ] 的暴击伤害提升了 [ {实际暴击伤害提升 * 100:0.##}% ] ");
}
public override void OnEffectLost(Character character)
{
character.ExCritRate -= ;
character.ExCritDMG -= ;
}
public override void OnSkillCasted(Character caster, List<Character> enemys, List<Character> teammates, Dictionary<string, object> others)
{
RemainDuration = Duration;
if (!caster.Effects.Contains(this))
{
= 0;
= 0;
caster.Effects.Add(this);
OnEffectGained(caster);
}
}
}
}

View File

@ -0,0 +1,40 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)PassiveID.;
public override string Name => "致命打击";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public (Character? character = null) : base(SkillType.Passive, character)
{
Effects.Add(new (this));
}
public override IEnumerable<Effect> AddInactiveEffectToCharacter()
{
return Effects;
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"暴击伤害提升 70%。";
public override bool TargetSelf => true;
public override void OnEffectGained(Character character)
{
character.ExCritDMG += 0.7;
}
public override void OnEffectLost(Character character)
{
character.ExCritDMG -= 0.7;
}
}
}

View File

@ -0,0 +1,64 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)SuperSkillID.;
public override string Name => "三重叠加";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public override double EPCost => 100;
public override double CD => 35 - 2 * (Level - 1);
public override double HardnessTime { get; set; } = 10;
public (Character? character = null) : base(SkillType.SuperSkill, character)
{
Effects.Add(new (this));
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => "三重叠加";
public override string Description => $"使 [ 灵能反射 ] 支持普通攻击,且当前释放魔法次数归零,最大硬直消除次数提高到 {灵能反射次数} 次;在魔法命中和普通攻击命中时能够回复所回复能量值的 10 倍魔法值,持续 {技能持续次数} 次(灵能反射每消除次数达到最大时算一次)。" +
$"(剩余:{剩余持续次数} 次)";
public override bool TargetSelf => true;
public int { get; set; } = 0;
private readonly int = 3;
private readonly int = 2;
public override void OnEffectGained(Character character)
{
IEnumerable<Effect> effects = character.Effects.Where(e => e is );
if (effects.Any() && effects.First() is e)
{
e. = true;
e. = 3;
e. = 0;
}
}
public override void OnEffectLost(Character character)
{
IEnumerable<Effect> effects = character.Effects.Where(e => e is );
if (effects.Any() && effects.First() is e)
{
e. = false;
e. = 2;
}
}
public override void OnSkillCasted(Character caster, List<Character> enemys, List<Character> teammates, Dictionary<string, object> others)
{
= ;
if (!caster.Effects.Contains(this))
{
caster.Effects.Add(this);
OnEffectGained(caster);
}
}
}
}

View File

@ -0,0 +1,103 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)PassiveID.;
public override string Name => "灵能反射";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public (Character? character = null) : base(SkillType.Passive, character)
{
Effects.Add(new (this));
}
public override IEnumerable<Effect> AddInactiveEffectToCharacter()
{
return Effects;
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"每释放 {触发硬直次数} 次魔法才会触发硬直时间,且魔法命中时基于 25% 智力 [ {获得额外能量值} ] 获得额外能量值。";
public override bool TargetSelf => true;
public bool { get; set; } = false;
public int { get; set; } = 2;
public int { get; set; } = 0;
public double
{
get
{
return Calculation.Round2Digits(0.25 * Skill.Character?.INT ?? 0);
}
}
public override void AfterDamageCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
{
if (character == Skill.Character && ( && isNormalAttack || isMagicDamage) && damageResult != DamageResult.Evaded && character.EP < 200)
{
double = ;
character.EP += ;
WriteLine("[ " + character + " ] 发动了灵能反射!额外获得了 " + + " 能量!");
IEnumerable<Effect> effects = character.Effects.Where(e => e is );
if (effects.Any() && effects.First() is e)
{
double = Calculation.Round2Digits( * 10);
character.MP += ;
WriteLine("[ " + character + " ] 发动了三重叠加!回复了 " + + " 魔法值!");
}
}
}
public override void AlterHardnessTimeAfterNormalAttack(Character character, ref double baseHardnessTime, ref bool isCheckProtected)
{
if ()
{
AlterHardnessTime(character, ref baseHardnessTime, ref isCheckProtected);
}
}
public override void AlterHardnessTimeAfterCastSkill(Character character, Skill skill, ref double baseHardnessTime, ref bool isCheckProtected)
{
if (skill.SkillType == SkillType.Magic)
{
AlterHardnessTime(character, ref baseHardnessTime, ref isCheckProtected);
}
}
public void AlterHardnessTime(Character character, ref double baseHardnessTime, ref bool isCheckProtected)
{
++;
if ( < )
{
baseHardnessTime = 0;
isCheckProtected = false;
WriteLine($"[ {character} ] 发动了灵能反射,消除了硬直时间!!");
}
else
{
= 0;
IEnumerable<Effect> effects = character.Effects.Where(e => e is );
if (effects.Any() && effects.First() is e)
{
baseHardnessTime = 0;
isCheckProtected = false;
WriteLine($"[ {character} ] 发动了灵能反射,消除了硬直时间!!");
e.--;
if (e. == 0)
{
character.Effects.Remove(e);
e.OnEffectLost(character);
}
}
}
}
}
}

View File

@ -0,0 +1,77 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)SuperSkillID.;
public override string Name => "变幻之心";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public override double EPCost => 100;
public override double CD => 30;
public override double HardnessTime { get; set; } = 10;
public (Character? character = null) : base(SkillType.SuperSkill, character)
{
Effects.Add(new (this));
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => "变幻之心";
public override string Description => $"检查 [ 智慧与力量 ] 的模式。在力量模式下,立即回复 {生命值回复 * 100:0.##}% 生命值;智力模式下,下一次魔法伤害提升 {伤害提升 * 100:0.##}%。";
public override bool TargetSelf => true;
private double => Calculation.Round4Digits(0.25 + 0.03 * (Level - 1));
private double => Calculation.Round4Digits(0.55 + 0.25 * (Level - 1));
public override void OnEffectGained(Character character)
{
Skill.IsInEffect = true;
}
public override void OnEffectLost(Character character)
{
Skill.IsInEffect = false;
}
public override void AlterExpectedDamageBeforeCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType)
{
if (character == Skill.Character && isMagicDamage)
{
double = ;
double = Calculation.Round2Digits(damage * );
damage = Calculation.Round2Digits(damage + );
WriteLine("[ " + character + " ] 发动了变幻之心!伤害提升了 " + + " 点!");
character.Effects.Remove(this);
OnEffectLost(character);
}
}
public override void OnSkillCasted(Character caster, List<Character> enemys, List<Character> teammates, Dictionary<string, object> others)
{
IEnumerable<Effect> effects = caster.Effects.Where(e => e is );
if (effects.Any())
{
if (caster.PrimaryAttribute == PrimaryAttribute.STR)
{
double = Calculation.Round2Digits( * caster.MaxHP);
caster.HP += ;
WriteLine("[ " + caster + " ] 回复了 " + + " 点生命值!");
}
else if (caster.PrimaryAttribute == PrimaryAttribute.INT)
{
if (!caster.Effects.Contains(this))
{
caster.Effects.Add(this);
OnEffectGained(caster);
}
}
}
}
}
}

View File

@ -0,0 +1,91 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)PassiveID.;
public override string Name => "智慧与力量";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public (Character? character = null) : base(SkillType.Passive, character)
{
Effects.Add(new (this));
}
public override IEnumerable<Effect> AddInactiveEffectToCharacter()
{
return Effects;
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"当生命值低于 30% 时,智力转化为力量;当生命值高于或等于 30% 时,力量转化为智力。" +
(Skill.Character != null ? "(当前模式:" + CharacterSet.GetPrimaryAttributeName(Skill.Character.PrimaryAttribute) + "" : "");
public override bool TargetSelf => true;
private double = 0;
private double = 0;
public override void OnAttributeChanged(Character character)
{
if (Skill.Character != null)
{
if (Skill.Character.PrimaryAttribute == PrimaryAttribute.INT)
{
double diff = character.ExSTR - ;
character.ExINT = + character.BaseSTR + diff;
}
else if (Skill.Character.PrimaryAttribute == PrimaryAttribute.STR)
{
double diff = character.ExINT - ;
character.ExSTR = + character.BaseINT + diff;
}
}
}
public override void OnTimeElapsed(Character character, double elapsed)
{
if (Skill.Character != null)
{
Character c = Skill.Character;
if (c.HP < c.MaxHP * 0.3)
{
if (c.PrimaryAttribute == PrimaryAttribute.INT)
{
double pastHP = c.HP;
double pastMaxHP = c.MaxHP;
double pastMP = c.MP;
double pastMaxMP = c.MaxMP;
c.PrimaryAttribute = PrimaryAttribute.STR;
= c.ExINT;
= c.ExSTR;
c.ExINT = -c.BaseINT;
c.ExSTR = + c.BaseINT + ;
c.Recovery(pastHP, pastMP, pastMaxHP, pastMaxMP);
}
}
else
{
if (c.PrimaryAttribute == PrimaryAttribute.STR)
{
double pastHP = c.HP;
double pastMaxHP = c.MaxHP;
double pastMP = c.MP;
double pastMaxMP = c.MaxMP;
c.PrimaryAttribute = PrimaryAttribute.INT;
= c.ExINT;
= c.ExSTR;
c.ExINT = + c.BaseSTR + ;
c.ExSTR = -c.BaseSTR;
c.Recovery(pastHP, pastMP, pastMaxHP, pastMaxMP);
}
}
}
}
}
}

View File

@ -0,0 +1,47 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class META马 : Skill
{
public override long Id => (long)PassiveID.META马;
public override string Name => "META马";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public META马(Character? character = null) : base(SkillType.Passive, character)
{
Effects.Add(new META马特效(this));
}
public override IEnumerable<Effect> AddInactiveEffectToCharacter()
{
return Effects;
}
}
public class META马特效(Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"META马专属被动力量+5力量成长+0.5在受到伤害时获得的能量提升50%,每回合开始还能获得额外的 [ {EP} ] 能量值。";
public override bool TargetSelf => true;
public static double EP => 10;
public override void AlterEPAfterGetDamage(Character character, ref double baseEP)
{
baseEP = Calculation.Round2Digits(baseEP * 1.5);
if (Skill.Character != null) WriteLine("[ " + Skill.Character + " ] 发动了META马专属被动本次获得了 " + baseEP + " 能量!");
}
public override void OnTurnStart(Character character)
{
if (character.EP < 200)
{
character.EP += EP;
WriteLine("[ " + character + " ] 发动了META马专属被动本次获得了 " + EP + " 能量!");
}
}
}
}

View File

@ -0,0 +1,58 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)SuperSkillID.;
public override string Name => "力量爆发";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public override double EPCost => 100;
public override double CD => 55;
public override double HardnessTime { get; set; } = 0;
public (Character? character = null) : base(SkillType.SuperSkill, character)
{
Effects.Add(new (this));
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => "力量爆发";
public override string Description => $"获得 150% 力量 [ {攻击力加成} ] 的攻击力加成,持续 {Duration} 时间。";
public override bool TargetSelf => true;
public override bool Durative => true;
public override double Duration => 10 + 1 * (Level - 1);
private double => Calculation.Round2Digits(Skill.Character?.STR * 1.5 ?? 0);
private double = 0;
public override void OnEffectGained(Character character)
{
= ;
character.ExATK2 += ;
WriteLine($"[ {character} ] 的攻击力增加了 [ {实际攻击力加成} ] ");
}
public override void OnEffectLost(Character character)
{
// 恢复到原始攻击力
character.ExATK2 -= ;
}
public override void OnSkillCasted(Character caster, List<Character> enemys, List<Character> teammates, Dictionary<string, object> others)
{
RemainDuration = Duration;
if (!caster.Effects.Contains(this))
{
= 0;
caster.Effects.Add(this);
OnEffectGained(caster);
}
}
}
}

View File

@ -0,0 +1,101 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)PassiveID.;
public override string Name => "玻璃大炮";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public (Character? character = null) : base(SkillType.Passive, character)
{
Effects.Add(new (this));
}
public override IEnumerable<Effect> AddInactiveEffectToCharacter()
{
return Effects;
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"生命值高于 30% 时,受到额外的 [ {高于30额外伤害下限}~{高于30额外伤害上限}% ] 伤害,但是获得 [ 累计所受伤害的 {高于30的加成下限}~{高于30的加成上限}% ] 伤害加成;生命值低于等于 30% 时,不会受到额外的伤害,仅能获得 [ 累计受到的伤害 {低于30的加成下限}~{低于30的加成上限}% ] 伤害加成。" +
$"在没有受到任何伤害的时候,将获得 {常规伤害加成 * 100:0.##}% 伤害加成。" + ( > 0 ? $"(当前累计受到伤害:{累计受到的伤害}" : "");
public override bool TargetSelf => true;
private double = 0;
private double = 0;
private double HP = 0;
private double = 0;
private readonly double = 0.35;
private readonly int 30 = 40;
private readonly int 30 = 20;
private readonly int 30 = 100;
private readonly int 30 = 80;
private readonly int 30 = 60;
private readonly int 30 = 40;
private double (double damage)
{
double = ;
Character? character = Skill.Character;
if (character != null && != 0)
{
if (character.HP > character.MaxHP * 0.3)
{
= Calculation.Round4Digits(1.0 + ((new Random().Next(30, 30) + 0.0) / 100));
}
else
{
= Calculation.Round4Digits(1.0 + ((new Random().Next(30, 30) + 0.0) / 100));
}
return Calculation.Round2Digits( * );
}
return Calculation.Round2Digits( * damage);
}
public override void AlterExpectedDamageBeforeCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType)
{
if (character == Skill.Character)
{
= (damage);
damage = Calculation.Round2Digits(damage + );
WriteLine($"[ {character} ] 发动了玻璃大炮,获得了 {这次的伤害加成} 点伤害加成!");
= 0;
}
if (enemy == Skill.Character)
{
HP = enemy.HP;
if (enemy.HP > enemy.MaxHP * 0.3)
{
// 额外受到伤害
double = Calculation.Round4Digits((new Random().Next(30, 30) + 0.0) / 100);
= Calculation.Round2Digits(damage * );
damage = Calculation.Round2Digits(damage + );
WriteLine($"[ {enemy} ] 的玻璃大炮触发,将额外受到 {这次受到的额外伤害} 点伤害!");
}
else = 0;
}
}
public override void AfterDamageCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
{
if (enemy == Skill.Character && damageResult != DamageResult.Evaded)
{
= Calculation.Round2Digits( + damage);
if (enemy.HP < 0 && HP - damage + > 0)
{
enemy.HP = 10;
WriteLine($"[ {enemy} ] 的玻璃大炮触发,保护了自己不进入死亡!!");
}
}
}
}
}

View File

@ -0,0 +1,67 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)SuperSkillID.;
public override string Name => "迅捷之势";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public override double EPCost => 100;
public override double CD => 60 - 2 * (Level - 1);
public override double HardnessTime { get; set; } = 15;
public (Character? character = null) : base(SkillType.SuperSkill, character)
{
Effects.Add(new (this));
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"{Duration} 时间内普通攻击转为魔法伤害且硬直时间减少50%,并基于 {智力系数 * 100:0.##}% 智力 [{智力加成}] 强化普通攻击伤害。";
public override bool TargetSelf => true;
public override bool Durative => true;
public override double Duration => 40;
private double => Calculation.Round4Digits(1.4 + 0.4 * (Level - 1));
private double => Calculation.Round2Digits( * Skill.Character?.INT ?? 0);
public override void OnEffectGained(Character character)
{
character.NormalAttack.SetMagicType(true, character.MagicType);
}
public override void OnEffectLost(Character character)
{
character.NormalAttack.SetMagicType(false, character.MagicType);
}
public override void AlterExpectedDamageBeforeCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType)
{
if (character == Skill.Character && isNormalAttack)
{
damage = Calculation.Round2Digits(damage + );
}
}
public override void AlterHardnessTimeAfterNormalAttack(Character character, ref double baseHardnessTime, ref bool isCheckProtected)
{
baseHardnessTime = Calculation.Round2Digits(baseHardnessTime * 0.5);
}
public override void OnSkillCasted(Character caster, List<Character> enemys, List<Character> teammates, Dictionary<string, object> others)
{
RemainDuration = Duration;
if (!caster.Effects.Contains(this))
{
caster.Effects.Add(this);
OnEffectGained(caster);
}
}
}
}

View File

@ -0,0 +1,57 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)PassiveID.;
public override string Name => "枯竭打击";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public (Character? character = null) : base(SkillType.Passive, character)
{
Effects.Add(new (this));
}
public override IEnumerable<Effect> AddInactiveEffectToCharacter()
{
return Effects;
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"每次造成伤害都会随机减少对方 [ 10~25 ] 点能量值,对能量值低于一半的角色额外造成 30% 伤害。对于枯竭打击而言能量值大于100且小于150时视为低于一半。";
public override bool TargetSelf => true;
private bool = false;
public override void AfterDamageCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
{
if (character == Skill.Character && damageResult != DamageResult.Evaded && !)
{
// 减少能量
double EP = new Random().Next(10, 25);
enemy.EP -= EP;
WriteLine($"[ {character} ] 发动了枯竭打击![ {enemy} ] 的能量值被减少了 {EP} 点!现有能量:{enemy.EP}。");
// 额外伤害
if (enemy.EP >= 0 && enemy.EP < 50 || enemy.EP >= 100 && enemy.EP < 150)
{
double = Calculation.Round2Digits(damage * 0.3);
WriteLine($"[ {character} ] 发动了枯竭打击!将造成额外伤害!");
= true;
DamageToEnemy(character, enemy, isMagicDamage, magicType, );
}
}
if (character == Skill.Character && )
{
= false;
}
}
}
}

View File

@ -0,0 +1,45 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)SuperSkillID.;
public override string Name => "能量毁灭";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public override double EPCost => 100;
public override double CD => 55 - 3 * (Level - 1);
public override double HardnessTime { get; set; } = 25;
public (Character? character = null) : base(SkillType.SuperSkill, character)
{
Effects.Add(new (this));
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"对所有角色造成 " +
$"{能量系数 * 100:0.##}% 其现有能量值 + {智力系数 * 100:0.##}% 智力 [ {智力伤害} ] 的魔法伤害。";
public override bool TargetSelf => false;
public override double TargetRange => 999;
private double => Calculation.Round4Digits(0.55 * Level);
private double => Calculation.Round2Digits( * Skill.Character?.INT ?? 0);
private double => Calculation.Round4Digits(0.75 * Level);
public override void OnSkillCasted(Character caster, List<Character> enemys, List<Character> teammates, Dictionary<string, object> others)
{
foreach (Character c in enemys)
{
WriteLine($"[ {caster} ] 正在毁灭 [ {c} ] 的能量!!");
double ep = c.EP;
DamageToEnemy(caster, c, true, MagicType, Calculation.Round2Digits(ep * + ));
}
}
}
}

View File

@ -0,0 +1,52 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)PassiveID.;
public override string Name => "弱者猎手";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public (Character? character = null) : base(SkillType.Passive, character)
{
Effects.Add(new (this));
}
public override IEnumerable<Effect> AddInactiveEffectToCharacter()
{
return Effects;
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"优先攻击血量更低的角色,对生命值百分比低于自己的角色造成 150% 伤害。";
public override bool TargetSelf => true;
public override void AlterExpectedDamageBeforeCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType)
{
if (character == Skill.Character && (enemy.HP / enemy.MaxHP) <= (character.HP / character.MaxHP))
{
double = Calculation.Round2Digits(damage * 0.5);
damage = Calculation.Round2Digits(damage + );
}
}
public override bool AlterEnemyListBeforeAction(Character character, List<Character> enemys, List<Character> teammates, List<Skill> skills, Dictionary<Character, int> continuousKilling, Dictionary<Character, int> earnedMoney)
{
IEnumerable<Character> list = [.. enemys.OrderBy(e => Calculation.Round4Digits(e.HP / e.MaxHP))];
if (list.Any())
{
enemys.Clear();
enemys.Add(list.First());
WriteLine($"[ {character} ] 发动了弱者猎手![ {list.First()} ] 被盯上了!");
}
return true;
}
}
}

View File

@ -0,0 +1,51 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)SuperSkillID.;
public override string Name => "血之狂欢";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public override double EPCost => 100;
public override double CD => 45;
public override double HardnessTime { get; set; } = 7;
public (Character? character = null) : base(SkillType.SuperSkill, character)
{
Effects.Add(new (this));
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"获得 40% 吸血,持续 {Duration} 时间。";
public override bool TargetSelf => true;
public override bool Durative => true;
public override double Duration => 30;
public override void AfterDamageCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
{
if (character == Skill.Character && damageResult != DamageResult.Evaded && character.HP < character.MaxHP)
{
double = Calculation.Round2Digits(0.4 * damage);
character.HP += ;
WriteLine($"[ {character} ] 回复了 {实际吸血} 点生命值!");
}
}
public override void OnSkillCasted(Character caster, List<Character> enemys, List<Character> teammates, Dictionary<string, object> others)
{
RemainDuration = Duration;
if (!caster.Effects.Contains(this))
{
caster.Effects.Add(this);
OnEffectGained(caster);
}
}
}
}

View File

@ -0,0 +1,54 @@
namespace Oshima.FunGame.OshimaModules.Skills
{
public enum MagicID : long
{
= 1001,
}
public enum SkillID : long
{
= 2001,
}
public enum SuperSkillID : long
{
= 3001,
= 3002,
= 3003,
= 3004,
= 3005,
= 3006,
= 3007,
= 3008,
= 3009,
= 3010,
= 3011,
= 3012,
}
public enum PassiveID : long
{
META马 = 4001,
= 4002,
= 4003,
= 4004,
= 4005,
= 4006,
= 4007,
= 4008,
= 4009,
= 4010,
= 4011,
= 4012,
}
public enum ItemPassiveID : long
{
= 5001,
}
public enum ItemActiveID : long
{
}
}

View File

@ -0,0 +1,90 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)SuperSkillID.;
public override string Name => "天赐之力";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public override double EPCost => 100;
public override double CD => 60;
public override double HardnessTime { get; set; } = 15;
public (Character? character = null) : base(SkillType.SuperSkill, character)
{
Effects.Add(new (this));
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"{Duration} 时间内,增加 40% 攻击力 [ {攻击力提升} ]、30% 物理穿透和 25% 闪避率(不可叠加),普通攻击硬直时间额外减少 20%,基于 {系数 * 100:0.##}% 敏捷 [ {伤害加成} ] 强化普通攻击的伤害。在持续时间内,【心灵之火】的冷却时间降低至 3 时间。";
public override bool TargetSelf => false;
public override int TargetCount => 1;
public override bool Durative => true;
public override double Duration => 40;
private double => Calculation.Round4Digits(1.2 * (1 + 0.6 * (Skill.Level - 1)));
private double => Calculation.Round2Digits( * Skill.Character?.AGI ?? 0);
private double => Calculation.Round2Digits(0.4 * Skill.Character?.BaseATK ?? 0);
private double = 0;
public override void OnEffectGained(Character character)
{
= ;
character.ExATK2 += ;
character.PhysicalPenetration += 0.3;
character.ExEvadeRate += 0.25;
if (character.Effects.Where(e => e is ).FirstOrDefault() is e)
{
e. = 3;
if (e. > e.) e. = e.;
}
}
public override void OnEffectLost(Character character)
{
character.ExATK2 -= ;
character.PhysicalPenetration -= 0.3;
character.ExEvadeRate -= 0.25;
if (character.Effects.Where(e => e is ).FirstOrDefault() is e)
{
e. = 8;
}
}
public override CharacterActionType AlterActionTypeBeforeAction(Character character, CharacterState state, ref bool canUseItem, ref bool canCastSkill, ref double pUseItem, ref double pCastSkill, ref double pNormalAttack)
{
pNormalAttack += 0.1;
return CharacterActionType.None;
}
public override void AlterExpectedDamageBeforeCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType)
{
if (character == Skill.Character && isNormalAttack)
{
damage = Calculation.Round2Digits(damage + );
}
}
public override void AlterHardnessTimeAfterNormalAttack(Character character, ref double baseHardnessTime, ref bool isCheckProtected)
{
baseHardnessTime = Calculation.Round2Digits(baseHardnessTime * 0.8);
}
public override void OnSkillCasted(Character caster, List<Character> enemys, List<Character> teammates, Dictionary<string, object> others)
{
RemainDuration = Duration;
if (!caster.Effects.Contains(this))
{
caster.Effects.Add(this);
OnEffectGained(caster);
}
}
}
}

View File

@ -0,0 +1,69 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)PassiveID.;
public override string Name => "心灵之火";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public (Character? character = null) : base(SkillType.Passive, character)
{
Effects.Add(new (this));
}
public override IEnumerable<Effect> AddInactiveEffectToCharacter()
{
return Effects;
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"普通攻击硬直时间减少 20%。每次使用普通攻击时,额外再发动一次普通攻击,伤害特效可叠加,冷却 {基础冷却时间:0.##} 时间。" +
( > 0 ? $"(正在冷却:剩余 {冷却时间:0.##} 时间)" : "");
public override bool TargetSelf => true;
public double { get; set; } = 0;
public double { get; set; } = 20;
private bool = false;
public override void AfterDamageCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
{
if (character == Skill.Character && isNormalAttack && == 0 && ! && ActionQueue != null)
{
WriteLine($"[ {character} ] 发动了心灵之火!额外进行一次普通攻击!");
= ;
= true;
character.NormalAttack.Attack(ActionQueue, character, enemy);
}
if (character == Skill.Character && )
{
= false;
}
}
public override void OnTimeElapsed(Character character, double elapsed)
{
if ( > 0)
{
= Calculation.Round2Digits( - elapsed);
if ( <= 0)
{
= 0;
}
}
}
public override void AlterHardnessTimeAfterNormalAttack(Character character, ref double baseHardnessTime, ref bool isCheckProtected)
{
baseHardnessTime = Calculation.Round2Digits(baseHardnessTime * 0.8);
}
}
}

View File

@ -0,0 +1,65 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)SuperSkillID.;
public override string Name => "魔法涌流";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public override double EPCost => 100;
public override double CD => 35;
public override double HardnessTime { get; set; } = 10;
public (Character? character = null) : base(SkillType.SuperSkill, character)
{
Effects.Add(new (this));
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => "魔法涌流";
public override string Description => $"{Duration} 时间内,增加所有伤害的 {减伤比例 * 100:0.##}% 伤害减免,并将普通攻击转为魔法伤害,可叠加魔法震荡的效果。";
public override bool TargetSelf => true;
public override bool Durative => true;
public override double Duration => 25;
private double => Calculation.Round2Digits(0.1 + 0.02 * (Level - 1));
private double = 0;
public override void OnEffectGained(Character character)
{
= ;
character.NormalAttack.SetMagicType(true, character.MagicType);
}
public override void OnEffectLost(Character character)
{
character.NormalAttack.SetMagicType(false, character.MagicType);
}
public override bool AlterActualDamageAfterCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
{
if (enemy == Skill.Character)
{
damage = Calculation.Round2Digits(damage * (1 - ));
}
return false;
}
public override void OnSkillCasted(Character caster, List<Character> enemys, List<Character> teammates, Dictionary<string, object> others)
{
RemainDuration = Duration;
if (!caster.Effects.Contains(this))
{
= 0;
caster.Effects.Add(this);
OnEffectGained(caster);
}
}
}
}

View File

@ -0,0 +1,50 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
using Oshima.FunGame.OshimaModules.Effects;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)PassiveID.;
public override string Name => "魔法震荡";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public (Character? character = null) : base(SkillType.Passive, character)
{
Effects.Add(new (this));
}
public override IEnumerable<Effect> AddInactiveEffectToCharacter()
{
return Effects;
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"造成魔法伤害时有 35% 几率使敌人眩晕 1 回合。";
public override bool TargetSelf => true;
public override void AfterDamageCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
{
if (character == Skill.Character && isMagicDamage && damageResult != DamageResult.Evaded && new Random().NextDouble() < 0.35)
{
IEnumerable<Effect> effects = enemy.Effects.Where(e => e is && e.Skill == Skill);
if (effects.Any())
{
effects.First().RemainDurationTurn++;
}
else
{
e = new(Skill, character, false, 0, 1);
enemy.Effects.Add(e);
e.OnEffectGained(enemy);
}
WriteLine($"[ {character} ] 的魔法伤害触发了魔法震荡,[ {enemy} ] 被眩晕了!");
}
}
}
}

View File

@ -0,0 +1,70 @@
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)SuperSkillID.;
public override string Name => "平衡强化";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public override double EPCost => 100;
public override double CD => 55 - (1 * (Level - 1));
public override double HardnessTime { get; set; } = 12;
public (Character? character = null) : base(SkillType.SuperSkill, character)
{
Effects.Add(new (this));
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"敏捷提高 20%,然后将目前的力量补充到与敏捷持平,持续 {Duration} 时间。";
public override bool TargetSelf => true;
public override bool Durative => true;
public override double Duration => 30;
private double = 0;
private double = 0;
public override void OnEffectGained(Character character)
{
double pastHP = character.HP;
double pastMaxHP = character.MaxHP;
double pastMP = character.MP;
double pastMaxMP = character.MaxMP;
= character.BaseAGI * 0.2;
character.ExAGI += ;
= character.AGI - character.STR;
character.ExSTR += ;
character.Recovery(pastHP, pastMP, pastMaxHP, pastMaxMP);
WriteLine($"[ {character} ] 敏捷提升了 {本次提升的敏捷:0.##},力量提升了 {本次提升的力量:0.##}");
}
public override void OnEffectLost(Character character)
{
double pastHP = character.HP;
double pastMaxHP = character.MaxHP;
double pastMP = character.MP;
double pastMaxMP = character.MaxMP;
character.ExAGI -= character.BaseAGI * 0.2;
character.ExSTR -= ;
character.Recovery(pastHP, pastMP, pastMaxHP, pastMaxMP);
}
public override void OnSkillCasted(Character caster, List<Character> enemys, List<Character> teammates, Dictionary<string, object> others)
{
RemainDuration = Duration;
if (!caster.Effects.Contains(this))
{
= 0;
= 0;
caster.Effects.Add(this);
OnEffectGained(caster);
}
}
}
}

View File

@ -0,0 +1,50 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)PassiveID.;
public override string Name => "敏捷之刃";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public (Character? character = null) : base(SkillType.Passive, character)
{
Effects.Add(new (this));
}
public override IEnumerable<Effect> AddInactiveEffectToCharacter()
{
return Effects;
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"每次普通攻击都将附带基于 {敏捷系数 * 100:0.##}% 敏捷 [ {敏捷伤害} ] 的魔法伤害。";
public override bool TargetSelf => true;
private double => Calculation.Round2Digits( * Skill.Character?.AGI ?? 0);
private readonly double = 2.5;
private bool = false;
public override void AfterDamageCalculation(Character character, Character enemy, double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
{
if (character == Skill.Character && isNormalAttack && damageResult != DamageResult.Evaded && !)
{
WriteLine($"[ {character} ] 发动了敏捷之刃!将造成额外伤害!");
= true;
DamageToEnemy(character, enemy, true, magicType, );
}
if (character == Skill.Character && )
{
= false;
}
}
}
}

View File

@ -0,0 +1,85 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)SkillID.;
public override string Name => "疾风步";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public override double EPCost => 60;
public override double CD => 35;
public override double HardnessTime { get; set; } = 5;
public (Character? character = null) : base(SkillType.Skill, character)
{
Effects.Add(new (this));
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"进入不可选中状态,获得 100 行动速度,提高 8% 暴击率,持续 {Duration} 时间。破隐一击:在持续时间内,首次造成伤害会附加 {系数 * 100:0.##}% 敏捷 [ {伤害加成} ] 的强化伤害,并解除不可选中状态。";
public override bool TargetSelf => true;
public override bool Durative => true;
public override double Duration => 12 + (1 * (Level - 1));
private double => Calculation.Round4Digits(0.5 + 0.5 * (Skill.Level - 1));
private double => Calculation.Round2Digits( * Skill.Character?.AGI ?? 0);
private bool { get; set; } = true;
private bool { get; set; } = false;
public override void OnEffectGained(Character character)
{
Skill.IsInEffect = true;
character.CharacterEffectTypes.Add(this, [EffectType.Unselectable]);
character.UpdateCharacterState();
character.ExSPD += 100;
character.ExCritRate += 0.08;
}
public override void OnEffectLost(Character character)
{
Skill.IsInEffect = false;
if (!)
{
// 在没有打出破隐一击的情况下,恢复角色状态
character.CharacterEffectTypes.Remove(this);
character.UpdateCharacterState();
}
character.ExSPD -= 100;
character.ExCritRate -= 0.08;
}
public override bool AlterActualDamageAfterCalculation(Character character, Character enemy, ref double damage, bool isNormalAttack, bool isMagicDamage, MagicType magicType, DamageResult damageResult)
{
if (character == Skill.Character && )
{
= false;
= true;
character.CharacterEffectTypes.Remove(this);
character.UpdateCharacterState();
double d = ;
damage = Calculation.Round2Digits(damage + d);
WriteLine($"[ {character} ] 触发了疾风步破隐一击,获得了 [ {d} ] 点伤害加成!");
}
return false;
}
public override void OnSkillCasted(Character caster, List<Character> enemys, List<Character> teammates, Dictionary<string, object> others)
{
if (!caster.Effects.Contains(this))
{
= true;
= false;
RemainDuration = Duration;
caster.Effects.Add(this);
OnEffectGained(caster);
}
}
}
}

View File

@ -0,0 +1,53 @@
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Oshima.FunGame.OshimaModules.Skills
{
public class : Skill
{
public override long Id => (long)MagicID.;
public override string Name => "冰霜攻击";
public override string Description => Effects.Count > 0 ? Effects.First().Description : "";
public override double MPCost => 30 + (50 * (Level - 1));
public override double CD => 20;
public override double CastTime => 6;
public override double HardnessTime { get; set; } = 3;
public (Character? character = null) : base(SkillType.Magic, character)
{
Effects.Add(new (this));
}
}
public class (Skill skill) : Effect(skill)
{
public override long Id => Skill.Id;
public override string Name => Skill.Name;
public override string Description => $"对目标敌人造成 {Calculation.Round2Digits(90 + 60 * (Skill.Level - 1))} + {Calculation.Round2Digits((1.2 + 1.8 * (Skill.Level - 1)) * 100)}% 智力 [ {Damage} ] 点{CharacterSet.GetMagicDamageName(MagicType)}。";
public override bool TargetSelf => false;
public override int TargetCount => 1;
private double Damage
{
get
{
double d = 0;
if (Skill.Character != null)
{
d = Calculation.Round2Digits(90 + 60 * (Skill.Level - 1) + (1.2 + 1.8 * (Skill.Level - 1)) * Skill.Character.INT);
}
return d;
}
}
public override void OnSkillCasted(Character caster, List<Character> enemys, List<Character> teammates, Dictionary<string, object> others)
{
if (enemys.Count > 0)
{
Character enemy = enemys[new Random().Next(enemys.Count)];
DamageToEnemy(caster, enemy, true, MagicType, Damage);
}
}
}
}

View File

@ -0,0 +1,594 @@
using System.Text;
using Milimoe.FunGame.Core.Api.Transmittal;
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Interface.Base;
using Milimoe.FunGame.Core.Library.Common.Addon;
using Milimoe.FunGame.Core.Library.Constant;
using Oshima.FunGame.OshimaModules;
using Oshima.FunGame.OshimaModules.Items;
using Oshima.FunGame.OshimaModules.Skills;
namespace Oshima.FunGame.OshimaServers
{
public class FastAutoServer : GameModuleServer
{
public override string Name => OshimaGameModuleConstant.FastAuto;
public override string Description => OshimaGameModuleConstant.Description;
public override string Version => OshimaGameModuleConstant.Version;
public override string Author => OshimaGameModuleConstant.Author;
public override string DefaultMap => OshimaGameModuleConstant.FastAutoMap;
public override GameModuleDepend GameModuleDepend => OshimaGameModuleConstant.GameModuleDepend;
public static List<Character> Characters { get; } = [];
public static Dictionary<Character, CharacterStatistics> CharacterStatistics { get; } = [];
public static PluginConfig StatsConfig { get; } = new(OshimaGameModuleConstant.FastAuto, nameof(CharacterStatistics));
public static GameModuleLoader? GameModuleLoader { get; set; } = null;
public static List<User> ConnectedUsers { get; } = [];
public override Dictionary<string, object> GamingMessageHandler(string username, GamingType type, Dictionary<string, object> data)
{
Dictionary<string, object> result = [];
switch (type)
{
case GamingType.Connect:
string un = (DataRequest.GetDictionaryJsonObject<string>(data, "un") ?? "").Trim();
if (un != "" && !ConnectedUsers.Where(u => u.Username == un).Any())
{
ConnectedUsers.Add(Users.Where(u => u.Username == un).First());
Controller.WriteLine(un + " 已连接至房间。");
}
break;
case GamingType.Disconnect:
break;
case GamingType.Reconnect:
break;
case GamingType.BanCharacter:
break;
case GamingType.PickCharacter:
break;
case GamingType.Random:
break;
case GamingType.Round:
break;
case GamingType.LevelUp:
break;
case GamingType.Move:
break;
case GamingType.Attack:
break;
case GamingType.Skill:
break;
case GamingType.Item:
break;
case GamingType.Magic:
break;
case GamingType.Buy:
break;
case GamingType.SuperSkill:
break;
case GamingType.Pause:
break;
case GamingType.Unpause:
break;
case GamingType.Surrender:
break;
case GamingType.UpdateInfo:
break;
case GamingType.Punish:
break;
case GamingType.None:
default:
break;
}
return result;
}
public override bool StartServer(string GameModule, Room Room, List<User> Users, IServerModel RoomMasterServerModel, Dictionary<string, IServerModel> ServerModels, params object[] Args)
{
// 将参数转为本地属性
this.Room = Room;
this.Users = Users;
RoomMaster = RoomMasterServerModel;
All = ServerModels;
TaskUtility.NewTask(StartGame).OnError(Controller.Error);
return true;
}
public async Task StartGame()
{
try
{
while (true)
{
if (ConnectedUsers.Count == Users.Count)
{
break;
}
await Task.Delay(500);
}
Dictionary<User, Character> characters = [];
List<Character> characterPickeds = [];
Dictionary<string, object> data = [];
// 抽取角色
foreach (User user in Users)
{
List<Character> list = [.. Characters.Where(c => !characterPickeds.Contains(c))];
Character cr = list[Random.Shared.Next(list.Count - 1)];
string msg = $"{user.Username} 抽到了 [ {cr} ]";
characterPickeds.Add(cr);
characters.Add(user, cr.Copy());
Controller.WriteLine(msg);
SendAllGamingMessage(data, msg);
}
int clevel = 60;
int slevel = 6;
int mlevel = 8;
List<Character> inGameCharacters = [.. characters.Values];
// 升级和赋能
foreach (Character c in inGameCharacters)
{
c.Level = clevel;
c.NormalAttack.Level = mlevel;
Skill = new (c)
{
Level = mlevel
};
c.Skills.Add();
Skill = new (c)
{
Level = slevel
};
c.Skills.Add();
if (c.Id == 1)
{
Skill META马 = new META马(c)
{
Level = 1
};
c.Skills.Add(META马);
Skill = new (c)
{
Level = mlevel
};
c.Skills.Add();
}
if (c.Id == 2)
{
Skill = new (c)
{
Level = 1
};
c.Skills.Add();
Skill = new (c)
{
Level = slevel
};
c.Skills.Add();
}
if (c.Id == 3)
{
Skill = new (c)
{
Level = 1
};
c.Skills.Add();
Skill = new (c)
{
Level = slevel
};
c.Skills.Add();
}
if (c.Id == 4)
{
Skill = new (c)
{
Level = 1
};
c.Skills.Add();
Skill = new (c)
{
Level = slevel
};
c.Skills.Add();
}
if (c.Id == 5)
{
Skill = new (c)
{
Level = 1
};
c.Skills.Add();
Skill = new (c)
{
Level = slevel
};
c.Skills.Add();
}
if (c.Id == 6)
{
Skill = new (c)
{
Level = 1
};
c.Skills.Add();
Skill = new (c)
{
Level = slevel
};
c.Skills.Add();
}
if (c.Id == 7)
{
Skill = new (c)
{
Level = 1
};
c.Skills.Add();
Skill = new (c)
{
Level = slevel
};
c.Skills.Add();
}
if (c.Id == 8)
{
Skill = new (c)
{
Level = 1
};
c.Skills.Add();
Skill = new (c)
{
Level = slevel
};
c.Skills.Add();
}
if (c.Id == 9)
{
Skill = new (c)
{
Level = 1
};
c.Skills.Add();
Skill = new (c)
{
Level = slevel
};
c.Skills.Add();
}
if (c.Id == 10)
{
Skill = new (c)
{
Level = 1
};
c.Skills.Add();
Skill = new (c)
{
Level = slevel
};
c.Skills.Add();
}
if (c.Id == 11)
{
Skill = new (c)
{
Level = 1
};
c.Skills.Add();
Skill = new (c)
{
Level = slevel
};
c.Skills.Add();
}
if (c.Id == 12)
{
Skill = new (c)
{
Level = 1
};
c.Skills.Add();
Skill = new (c)
{
Level = slevel
};
c.Skills.Add();
}
SendAllGamingMessage(data, c.GetInfo());
}
ActionQueue actionQueue = new(inGameCharacters, (str) =>
{
SendAllGamingMessage(data, str);
});
// 总游戏时长
double totalTime = 0;
// 总死亡数
int deaths = 0;
// 开始空投
(actionQueue, totalTime);
// 总回合数
int i = 1;
while (i < 999)
{
if (i == 998)
{
SendAllGamingMessage(data, $"=== 终局审判 ===");
Dictionary<Character, double> = [];
foreach (Character c in inGameCharacters)
{
.TryAdd(c, Calculation.Round4Digits(c.HP / c.MaxHP));
}
double max = .Values.Max();
Character winner = .Keys.Where(c => [c] == max).First();
SendAllGamingMessage(data, "[ " + winner + " ] 成为了天选之人!!");
foreach (Character c in inGameCharacters.Where(c => c != winner && c.HP > 0))
{
SendAllGamingMessage(data, "[ " + winner + " ] 对 [ " + c + " ] 造成了 99999999999 点真实伤害。");
actionQueue.DeathCalculation(winner, c);
}
actionQueue.EndGameInfo(winner);
break;
}
// 检查是否有角色可以行动
Character? characterToAct = actionQueue.NextCharacter();
// 处理回合
if (characterToAct != null)
{
SendAllGamingMessage(data, $"=== Round {i++} ===");
SendAllGamingMessage(data, "现在是 [ " + characterToAct + " ] 的回合!");
if (actionQueue.Queue.Count == 0)
{
break;
}
bool isGameEnd = actionQueue.ProcessTurn(characterToAct);
if (isGameEnd)
{
break;
}
actionQueue.DisplayQueue();
}
// 模拟时间流逝
totalTime += actionQueue.TimeLapse();
if (actionQueue.Eliminated.Count > deaths)
{
deaths = actionQueue.Eliminated.Count;
}
}
SendAllGamingMessage(data, "--- End ---");
SendAllGamingMessage(data, "总游戏时长:" + Calculation.Round2Digits(totalTime));
// 赛后统计
SendAllGamingMessage(data, "=== 伤害排行榜 ===");
int top = inGameCharacters.Count;
int count = 1;
foreach (Character character in actionQueue.CharacterStatistics.OrderByDescending(d => d.Value.TotalDamage).Select(d => d.Key))
{
StringBuilder builder = new();
CharacterStatistics stats = actionQueue.CharacterStatistics[character];
builder.AppendLine($"{count++}. [ {character.ToStringWithLevel()} ] {stats.Kills} / {stats.Assists}");
builder.AppendLine($"存活时长:{stats.LiveTime} / 存活回合数:{stats.LiveRound} / 行动回合数:{stats.ActionTurn}");
builder.AppendLine($"总计伤害:{stats.TotalDamage} / 总计物理伤害:{stats.TotalPhysicalDamage} / 总计魔法伤害:{stats.TotalMagicDamage}");
builder.AppendLine($"总承受伤害:{stats.TotalTakenDamage} / 总承受物理伤害:{stats.TotalTakenPhysicalDamage} / 总承受魔法伤害:{stats.TotalTakenMagicDamage}");
builder.Append($"每秒伤害:{stats.DamagePerSecond} / 每回合伤害:{stats.DamagePerTurn}");
SendAllGamingMessage(data, builder.ToString());
CharacterStatistics? totalStats = CharacterStatistics.Where(kv => kv.Key.GetName() == character.GetName()).Select(kv => kv.Value).FirstOrDefault();
if (totalStats != null)
{
// 统计此角色的所有数据
totalStats.TotalDamage = Calculation.Round2Digits(totalStats.TotalDamage + stats.TotalDamage);
totalStats.TotalPhysicalDamage = Calculation.Round2Digits(totalStats.TotalPhysicalDamage + stats.TotalPhysicalDamage);
totalStats.TotalMagicDamage = Calculation.Round2Digits(totalStats.TotalMagicDamage + stats.TotalMagicDamage);
totalStats.TotalRealDamage = Calculation.Round2Digits(totalStats.TotalRealDamage + stats.TotalRealDamage);
totalStats.TotalTakenDamage = Calculation.Round2Digits(totalStats.TotalTakenDamage + stats.TotalTakenDamage);
totalStats.TotalTakenPhysicalDamage = Calculation.Round2Digits(totalStats.TotalTakenPhysicalDamage + stats.TotalTakenPhysicalDamage);
totalStats.TotalTakenMagicDamage = Calculation.Round2Digits(totalStats.TotalTakenMagicDamage + stats.TotalTakenMagicDamage);
totalStats.TotalTakenRealDamage = Calculation.Round2Digits(totalStats.TotalTakenRealDamage + stats.TotalTakenRealDamage);
totalStats.LiveRound += stats.LiveRound;
totalStats.ActionTurn += stats.ActionTurn;
totalStats.LiveTime = Calculation.Round2Digits(totalStats.LiveTime + stats.LiveTime);
totalStats.TotalEarnedMoney += stats.TotalEarnedMoney;
totalStats.Kills += stats.Kills;
totalStats.Deaths += stats.Deaths;
totalStats.Assists += stats.Assists;
totalStats.LastRank = stats.LastRank;
double totalRank = totalStats.AvgRank * totalStats.Plays + totalStats.LastRank;
totalStats.Plays += stats.Plays;
if (totalStats.Plays != 0) totalStats.AvgRank = Calculation.Round2Digits(totalRank / totalStats.Plays);
totalStats.Wins += stats.Wins;
totalStats.Top3s += stats.Top3s;
totalStats.Loses += stats.Loses;
if (totalStats.Plays != 0)
{
totalStats.AvgDamage = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.Plays);
totalStats.AvgPhysicalDamage = Calculation.Round2Digits(totalStats.TotalPhysicalDamage / totalStats.Plays);
totalStats.AvgMagicDamage = Calculation.Round2Digits(totalStats.TotalMagicDamage / totalStats.Plays);
totalStats.AvgRealDamage = Calculation.Round2Digits(totalStats.TotalRealDamage / totalStats.Plays);
totalStats.AvgTakenDamage = Calculation.Round2Digits(totalStats.TotalTakenDamage / totalStats.Plays);
totalStats.AvgTakenPhysicalDamage = Calculation.Round2Digits(totalStats.TotalTakenPhysicalDamage / totalStats.Plays);
totalStats.AvgTakenMagicDamage = Calculation.Round2Digits(totalStats.TotalTakenMagicDamage / totalStats.Plays);
totalStats.AvgTakenRealDamage = Calculation.Round2Digits(totalStats.TotalTakenRealDamage / totalStats.Plays);
totalStats.AvgLiveRound = totalStats.LiveRound / totalStats.Plays;
totalStats.AvgActionTurn = totalStats.ActionTurn / totalStats.Plays;
totalStats.AvgLiveTime = Calculation.Round2Digits(totalStats.LiveTime / totalStats.Plays);
totalStats.AvgEarnedMoney = totalStats.TotalEarnedMoney / totalStats.Plays;
totalStats.Winrates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Wins) / Convert.ToDouble(totalStats.Plays));
totalStats.Top3rates = Calculation.Round4Digits(Convert.ToDouble(totalStats.Top3s) / Convert.ToDouble(totalStats.Plays));
}
if (totalStats.LiveRound != 0) totalStats.DamagePerRound = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.LiveRound);
if (totalStats.ActionTurn != 0) totalStats.DamagePerTurn = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.ActionTurn);
if (totalStats.LiveTime != 0) totalStats.DamagePerSecond = Calculation.Round2Digits(totalStats.TotalDamage / totalStats.LiveTime);
}
}
// 显示每个角色的信息
for (i = actionQueue.Eliminated.Count - 1; i >= 0; i--)
{
Character character = actionQueue.Eliminated[i];
SendAllGamingMessage(data, $"=== 角色 [ {character} ] ===\r\n{character.GetInfo()}");
}
lock (StatsConfig)
{
foreach (Character c in CharacterStatistics.Keys)
{
StatsConfig.Add(c.ToStringWithOutUser(), CharacterStatistics[c]);
}
StatsConfig.SaveConfig();
}
// 结束
SendAll(SocketMessageType.EndGame, Room, Users);
foreach (IServerModel model in All.Values)
{
model.NowGamingServer = null;
}
ConnectedUsers.Clear();
}
catch (Exception e)
{
TXTHelper.AppendErrorLog(e.ToString());
}
}
public static void (ActionQueue queue, double totalTime)
{
Item[] ;
if (totalTime == 0)
{
foreach (Character character in queue.Queue)
{
= [new 50()];
foreach (Item item in )
{
queue.Equip(character, EquipItemToSlot.Accessory1, item);
}
}
}
}
public void SendAllGamingMessage(Dictionary<string, object> data, string str, bool showmessage = false)
{
data.Clear();
data.Add("msg", str);
data.Add("showmessage", showmessage);
SendAllGamingMessage(GamingType.UpdateInfo, data);
}
public override void AfterLoad(params object[] args)
{
foreach (Character c in GameModuleDepend.Characters)
{
Character character = c.Copy();
Characters.Add(character);
CharacterStatistics.Add(character, new());
}
StatsConfig.LoadConfig();
foreach (Character character in CharacterStatistics.Keys)
{
if (StatsConfig.ContainsKey(character.ToStringWithOutUser()))
{
CharacterStatistics[character] = StatsConfig.Get<CharacterStatistics>(character.ToStringWithOutUser()) ?? CharacterStatistics[character];
}
}
}
protected Room Room = General.HallInstance;
protected List<User> Users = [];
protected IServerModel? RoomMaster;
protected Dictionary<string, IServerModel> All = [];
protected void SendAllGamingMessage(GamingType type, Dictionary<string, object> data)
{
// 循环服务线程,向所有玩家发送局内消息
foreach (IServerModel s in All.Values)
{
if (s != null && s.Socket != null)
{
s.Send(s.Socket, SocketMessageType.Gaming, type, data);
}
}
}
protected void SendGamingMessage(string username, GamingType type, Dictionary<string, object> data)
{
// 向指定玩家发送局内消息
IServerModel s = All[username];
if (s != null && s.Socket != null)
{
s.Send(s.Socket, SocketMessageType.Gaming, type, data);
}
}
protected void SendAll(SocketMessageType type, params object[] args)
{
// 循环服务线程,向所有玩家发送消息
foreach (IServerModel s in All.Values)
{
if (s != null && s.Socket != null)
{
s.Send(s.Socket, type, args);
}
}
}
protected void Send(string username, SocketMessageType type, params object[] args)
{
// 向指定玩家发送消息
IServerModel s = All[username];
if (s != null && s.Socket != null)
{
s.Send(s.Socket, type, args);
}
}
}
}

View File

@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<BaseOutputPath>..\bin\</BaseOutputPath>
<Authors>Oshima Studios</Authors>
<RootNamespace>Oshima.FunGame.$(MSBuildProjectName.Replace(" ", "_"))</RootNamespace>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\OshimaModules\OshimaModules.csproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="FunGame.Core">
<HintPath>..\..\FunGame.Core\bin\Debug\net8.0\FunGame.Core.dll</HintPath>
</Reference>
</ItemGroup>
</Project>

View File

@ -1 +1,7 @@
# Oshima Studios定制的FunGame游戏模组
# FunGame 定制模组
Oshima Studios 巨献
设定可参考:[Oshima Core 文档 | 喔 是吗?](https://docs.milimoe.com)
FunGame 原项目地址:[https://github.com/project-redbud/FunGame-Core](https://github.com/project-redbud/FunGame-Core)

BIN
实体编辑器.lnk Normal file

Binary file not shown.