[RF] Move sub-config classes to their own directory

pull/78/head
Clansty 2024-10-28 05:56:54 +08:00
parent 0af137ba8c
commit 6945032077
No known key found for this signature in database
GPG Key ID: 3A6BE8BAF2EDE134
11 changed files with 693 additions and 667 deletions

View File

@ -0,0 +1,21 @@
using AquaMai.Attributes;
namespace AquaMai.Cheat;
public class Config
{
[ConfigComment(
en: "Unlock normally event-only tickets",
zh: "解锁游戏里所有可能的跑图券")]
public bool TicketUnlock { get; set; }
[ConfigComment(
en: "Unlock maps that are not in this version",
zh: "解锁游戏里所有的区域,包括非当前版本的(并不会帮你跑完)")]
public bool MapUnlock { get; set; }
[ConfigComment(
en: "Unlock Utage without the need of DXRating 10000",
zh: "不需要万分也可以进宴会场")]
public bool UnlockUtage { get; set; }
}

View File

@ -2,671 +2,55 @@ using System.Diagnostics.CodeAnalysis;
using AquaMai.Attributes;
using AquaMai.CustomKeyMap;
namespace AquaMai
namespace AquaMai;
[SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")]
public class Config
{
[SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")]
public class Config
{
[ConfigComment(
en: "UX: User Experience Improvements",
zh: """
使 MaiChartManager AquaMai
https://github.com/clansty/MaiChartManager
""")]
public UXConfig UX { get; set; } = new();
[ConfigComment(
en: "Cheat: You control the buttons you press",
zh: "“作弊”功能")]
public CheatConfig Cheat { get; set; } = new();
[ConfigComment(
en: "Fix: Fix some potential issues",
zh: "修复一些潜在的问题")]
public FixConfig Fix { get; set; } = new();
[ConfigComment(
zh: "实用工具")]
public UtilsConfig Utils { get; set; } = new();
[ConfigComment(
en: "Time Saving: Skip some unnecessary screens",
zh: "节省一些不知道有用没用的时间,跳过一些不必要的界面")]
public TimeSavingConfig TimeSaving { get; set; } = new();
[ConfigComment(
zh: "窗口相关设置")]
public WindowStateConfig WindowState { get; set; } = new();
[ConfigComment(
en: "Custom camera ID settings",
zh: "自定义摄像头 ID")]
public CustomCameraIdConfig CustomCameraId { get; set; } = new();
[ConfigComment(
zh: "触摸灵敏度设置")]
public TouchSensitivityConfig TouchSensitivity { get; set; } = new();
[ConfigComment(
zh: "自定义按键映射")]
public CustomKeyMapConfig CustomKeyMap { get; set; } = new();
public class CheatConfig
{
[ConfigComment(
en: "Unlock normally event-only tickets",
zh: "解锁游戏里所有可能的跑图券")]
public bool TicketUnlock { get; set; }
[ConfigComment(
en: "Unlock maps that are not in this version",
zh: "解锁游戏里所有的区域,包括非当前版本的(并不会帮你跑完)")]
public bool MapUnlock { get; set; }
[ConfigComment(
en: "Unlock Utage without the need of DXRating 10000",
zh: "不需要万分也可以进宴会场")]
public bool UnlockUtage { get; set; }
}
public class UXConfig
{
[ConfigComment(
en: "Language for mod UI, supports en and zh",
zh: "Mod 界面的语言,支持 en 和 zh")]
public string Locale { get; set; } = "";
[ConfigComment(
en: "Single player: Show 1P only, at the center of the screen",
zh: "单人模式,不显示 2P")]
public bool SinglePlayer { get; set; }
[ConfigComment(
en: "Remove the circle mask in the game",
zh: "移除遮罩")]
public bool HideMask { get; set; }
[ConfigComment(
en: "Load Jacket image from folder \"LocalAssets\" and filename \"{MusicID}.png\" for self-made charts",
zh: "通过游戏目录下 `LocalAssets\\000000歌曲 ID.png` 加载封面,自制谱用")]
public bool LoadAssetsPng { get; set; }
[ConfigComment(
en: "Add \".ab\" image resources without the need of rebuilding a manifest",
zh: """
AssetBundleImages.manifest ab
""")]
public bool LoadAssetBundleWithoutManifest { get; set; }
[ConfigComment(
en: """
Press key "7" for 1 second to skip to next step or restart current song
Hold the bottom four buttons (3456) for official quick retry (non-utage only)
""",
zh: """
Service 7 ADX
-
-
7 Service 1P
3456使
""")]
public bool QuickSkip { get; set; }
[ConfigComment(
en: """
Random BGM, put Mai2Cue.{acb,awb} of old version of the game in `LocalAssets\Mai2Cue` and rename them
Do not enable when SinglePlayer is off
""",
zh: """
`LocalAssets\Mai2Cue` Mai2Cue.{acb,awb} BGM BGM
2P 'SinglePlayer'
""")]
public bool RandomBgm { get; set; }
[ConfigComment(
en: "Play \"Master\" difficulty on Demo screen",
zh: "在闲置时的演示画面上播放紫谱而不是绿谱")]
public bool DemoMaster { get; set; }
[ConfigComment(
en: """
Disable timers
Not recommand to enable when SinglePlayer is off
""",
zh: """
'SinglePlayer'
""")]
public bool ExtendTimer { get; set; }
[ConfigComment(
en: "Save immediate after playing a song",
zh: "打完一首歌的时候立即向服务器保存成绩")]
public bool ImmediateSave { get; set; }
[ConfigComment(
en: """
Use the png jacket above as BGA if BGA is not found for self-made charts
Use together with `LoadJacketPng`
""",
zh: """
dat BGA
`LoadJacketPng`
""")]
public bool LoadLocalBga { get; set; }
[ConfigComment(
en: "Prevent accidental touch of the Test button, requires 1 second long press to take effect",
zh: "防止你不小心按到 Test 键Test 键需要长按 1 秒才能生效")]
public bool TestProof { get; set; }
[ConfigComment(
en: """
In the song selection screen, press the Service button or the "7" key (the round button in the middle of the arrow keys in the default ADX firmware) to toggle the display of self-made charts.
A directory is considered to contain self-made charts if it does not have DataConfig.xml or OfficialChartsMark.txt in the Axxx directory.
""",
zh: """
Service 7 ADX
Axxx DataConfig.xml OfficialChartsMark.txt
""")]
public bool HideSelfMadeCharts { get; set; }
[ConfigComment(
en: """
Place font.ttf in the LocalAssets directory to replace the game's global font
Cannot be used together with FontFix
""",
zh: """
LocalAssets font.ttf
FontFix 使
""")]
public bool CustomFont { get; set; }
[ConfigComment(
en: """
Provide the ability to use custom skins (advanced feature)
Load skin textures from LocalAssets\Skins
""",
zh: """
LocalAssets\Skins
""")]
public bool CustomSkins { get; set; }
[ConfigComment(
en: """
More detailed judgment display
Requires CustomSkins to be enabled and the resource file to be downloaded
https://github.com/hykilpikonna/AquaDX/releases/download/nightly/JudgeDisplay4B.7z
""",
zh: """
CustomSkins
https://github.com/hykilpikonna/AquaDX/releases/download/nightly/JudgeDisplay4B.7z
""")]
public bool JudgeDisplay4B { get; set; }
[ConfigComment(
en: """
Custom track start difficulty image (not really custom difficulty)
Requires CustomSkins to be enabled
Will load four image resources through custom skins: musicBase, musicTab, musicLvBase, musicLvText
""",
zh: """
()
: musicBase, musicTab, musicLvBase, musicLvText
""")]
public bool CustomTrackStartDiff { get; set; }
[ConfigComment(
en: "Map touch actions to buttons",
zh: "映射触摸操作至实体按键")]
public bool TouchToButtonInput { get; set; }
[ConfigComment(
en: """
Delayed the animation of the song start screen
For recording chart confirmation
""",
zh: """
""")]
public bool TrackStartProcessTweak { get; set; }
[ConfigComment(
en: """
Disable the TRACK X text, DX/Standard display box, and the derakkuma at the bottom of the screen in the song start screen
For recording chart confirmation
""",
zh: """
, TRACK X , DX/,
""")]
public bool DisableTrackStartTabs { get; set; }
[ConfigComment(
en: "Cannot be used together with HanabiFix",
zh: """
HanabiFix 使
""")]
public bool HideHanabi { get; set; }
[ConfigComment(
en: "Set the version string displayed at the top-right corner of the screen",
zh: "把右上角的版本更改为自定义文本")]
public string CustomVersionString { get; set; } = "";
[ConfigComment(
en: """
Custom shop name in photo
Also enable shop name display in SDGA
""",
zh: """
SDGA
""")]
public string CustomPlaceName { get; set; } = "";
[ConfigComment(
en: "Execute some command on game idle",
zh: """
""")]
public string ExecOnIdle { get; set; } = "";
[ConfigComment(
en: "Execute some command on game start",
zh: "在玩家登录的时候执行指定的命令脚本")]
public string ExecOnEntry { get; set; } = "";
}
public class FixConfig
{
[ConfigComment(
en: "Allow login with higher data version",
zh: """
""")]
public bool SkipVersionCheck { get; set; }
[ConfigComment(
zh: """
API
""")]
public bool RemoveEncryption { get; set; }
[ConfigComment(
zh: "如果要配置店内招募的话,应该要把这个关闭")]
public bool ForceAsServer { get; set; } = true;
[ConfigComment(
en: "Force the game to be in FreePlay mode",
zh: "强制改为免费游玩FreePlay")]
public bool ForceFreePlay { get; set; } = true;
[ConfigComment(
en: "Force the game to be in PaidPlay mode with 24 coins locked, conflicts with ForceFreePlay",
zh: "强制付费游玩并锁定 24 个币,和 ForceFreePlay 冲突")]
public bool ForcePaidPlay { get; set; }
[ConfigComment(
en: "Add notes sprite to the pool to prevent use up",
zh: "增加更多待命的音符贴图,防止奇怪的自制谱用完音符贴图池")]
public int ExtendNotesPool { get; set; }
[ConfigComment(
en: "Force the frame rate limit to 60 FPS and disable vSync. Do not use if your game has no issues",
zh: "强制设置帧率上限为 60 帧并关闭垂直同步。如果你的游戏没有问题,请不要使用")]
public bool FrameRateLock { get; set; }
[ConfigComment(
en: """
Use Microsoft YaHei Bold to display characters not in the font library
Cannot be used together with CustomFont
""",
zh: """
使 Bold
CustomFont 使
""")]
public bool FontFix { get; set; }
[ConfigComment(
en: """
Make the judgment display of Wifi Slide different in up and down (originally all Wifi judgment displays are towards the center), just like in majdata
The reason for this bug is that SEGA forgot to assign EndButtonId to Wifi
""",
zh: """
Patch Wifi Slide ( Wifi ), majdata
bug SBGA Wifi EndButtonId
""")]
public bool FanJudgeFlip { get; set; }
[ConfigComment(
en: """
This Patch makes the Critical judgment of BreakSlide also flicker like BreakTap
Recommended to use with custom skins (otherwise the visual effect may not be good)
""",
zh: """
Patch BreakSlide Critical BreakTap
使 ()
""")]
public bool BreakSlideJudgeBlink { get; set; }
[ConfigComment(
en: """
Make the AutoPlay random judgment mode really randomize all judgments (down to sub-judgments)
// The original random judgment will only produce all 15 judgment results from Miss(TooFast) ~ Critical ~ Miss(TooLate)
// Here, it is changed to a triangular distribution to produce all 15 judgment results from Miss(TooFast) ~ Critical ~ Miss(TooLate)
// Of course, it will not consider whether the original Note really has a corresponding judgment (such as Slide should not have non-Critical Prefect)
""",
zh: """
AutoPlay ()
// 原本的随机判定只会等概率产生 Critical, LateGreat1st, LateGood, Miss(TooLate)
// 这里改成三角分布产生从 Miss(TooFast) ~ Critical ~ Miss(TooLate) 的所有 15 种判定结果
// 当然, 此处并不会考虑原本那个 Note 是不是真的有对应的判定 (比如 Slide 实际上不应该有小 p 之类的)
""")]
public bool RealisticRandomJudge { get; set; }
[ConfigComment(
en: "Cannot be used together with HideHanabi",
zh: """
1p
HideHanabi 使
""")]
public bool HanabiFix { get; set; }
[ConfigComment(
en: "Prevent gray network caused by mistakenly thinking it's an AimeDB server issue",
zh: "防止因错误认为 AimeDB 服务器问题引起的灰网,建议开启")]
public bool IgnoreAimeServerError { get; set; }
}
public class UtilsConfig
{
[ConfigComment(
en: "Log user ID on login",
zh: "登录时将 UserID 输出到日志")]
public bool LogUserId { get; set; }
[ConfigComment(
en: "Globally increase A judgment, unit is the same as in the game",
zh: "全局增加 A 判,单位和游戏里一样")]
public float JudgeAdjustA { get; set; }
[ConfigComment(
en: "Globally increase B judgment, unit is the same as in the game",
zh: "全局增加 B 判,单位和游戏里一样")]
public float JudgeAdjustB { get; set; }
[ConfigComment(
en: "Touch screen delay, unit is milliseconds, one second = 1000 milliseconds. Must be an integer",
zh: "触摸屏延迟,单位为毫秒,一秒 = 1000 毫秒。必须是整数")]
public int TouchDelay { get; set; }
[ConfigComment(
en: """
Practice mode, activated by pressing Test in the game
Must be used together with TestProof
""",
zh: """
Test
TestProof
""")]
public bool PractiseMode { get; set; }
[ConfigComment(
en: "Show detail of selected song in music selection screen",
zh: "选歌界面显示选择的歌曲的详情")]
public bool SelectionDetail { get; set; }
[ConfigComment(
en: "Show Network error detail in the game",
zh: "出现灰网时显示原因")]
public bool ShowNetErrorDetail { get; set; }
[ConfigComment(
en: "Show error log in the game",
zh: "在游戏中显示错误日志窗口而不是关闭游戏进程")]
public bool ShowErrorLog { get; set; }
[ConfigComment(
en: "Display framerate",
zh: "显示帧率")]
public bool FrameRateDisplay { get; set; }
[ConfigComment(
en: """
Adjust the baud rate of the touch screen serial port, default value is 9600
Requires hardware support. If you are unsure whether you can use it, you cannot use it
Set to 0 to disable
""",
zh: """
9600
使使
0
""")]
public int TouchPanelBaudRate { get; set; }
}
public class TimeSavingConfig
{
[ConfigComment(
en: "Skip the warning screen and logo shown after the POST sequence",
zh: "跳过日服启动时候的 WARNING 界面")]
public bool SkipWarningScreen { get; set; }
[ConfigComment(
en: "Disable some useless delays to speed up the game boot process",
zh: """
""")]
public bool ImproveLoadSpeed { get; set; }
[ConfigComment(
en: "Directly enter the song selection screen after login",
zh: "登录完成后直接进入选歌界面")]
public bool SkipToMusicSelection { get; set; }
[ConfigComment(
en: "Skip possible prompts like \"New area discovered\", \"New songs added\", \"There are events\" during game login/registration",
zh: "跳过登录 / 注册游戏时候可能的 “发现了新的区域哟” “乐曲增加” “有活动哟” 之类的提示")]
public bool SkipEventInfo { get; set; }
[ConfigComment(
en: "Skip the \"Do not tap or slide vigorously\" screen, immediately proceed to the next screen once data is loaded",
zh: "跳过“不要大力拍打或滑动哦”这个界面,数据一旦加载完就立马进入下一个界面")]
public bool IWontTapOrSlideVigorously { get; set; }
[ConfigComment(
en: "Skip the \"Goodbye\" screen at the end of the game",
zh: "跳过游戏结束的“再见”界面")]
public bool SkipGameOverScreen { get; set; }
[ConfigComment(
en: "Skip TrackStart screen",
zh: "跳过乐曲开始界面")]
public bool SkipTrackStart { get; set; }
[ConfigComment(
en: "Show a \"skip\" button like AstroDX after the notes end",
zh: "音符结束之后显示像 AstroDX 一样的“跳过”按钮")]
public bool ShowQuickEndPlay { get; set; }
}
public class WindowStateConfig
{
[ConfigComment(
en: "If not enabled, no operations will be performed on the game window",
zh: "不启用的话,不会对游戏窗口做任何操作")]
public bool Enable { get; set; }
[ConfigComment(
en: "Window the game",
zh: "窗口化游戏")]
public bool Windowed { get; set; }
[ConfigComment(
en: """
Width and height for windowed mode, rendering resolution for fullscreen mode
If set to 0, windowed mode will remember the user-set size, fullscreen mode will use the current display resolution
""",
zh: """
0使
""")]
public int Width { get; set; }
[ConfigComment(
zh: "高度")]
public int Height { get; set; }
}
public class CustomCameraIdConfig
{
[ConfigComment(
en: """
Enable custom CameraId
If enabled, you can customize the game to use the specified camera
""",
zh: """
ID
使
""")]
public bool Enable { get; set; }
[ConfigComment(
en: "Print the camera list to the log when starting, can be used as a basis for modification",
zh: "启动时打印摄像头列表到日志中,可以作为修改的依据")]
public bool PrintCameraList { get; set; } = false;
[ConfigComment(
en: "DX Pass 1P",
zh: "DX Pass 1P")]
public int LeftQrCamera { get; set; } = 0;
[ConfigComment(
en: "DX Pass 2P",
zh: "DX Pass 2P")]
public int RightQrCamera { get; set; } = 0;
[ConfigComment(
zh: "玩家摄像头")]
public int PhotoCamera { get; set; } = 0;
[ConfigComment(
zh: "二维码扫描摄像头")]
public int ChimeCamera { get; set; } = 0;
}
public class TouchSensitivityConfig
{
[ConfigComment(
en: """
Enable custom sensitivity
When enabled, the settings in Test mode will not take effect
When disabled, the settings in Test mode can still be used
""",
zh: """
Test
Test
""")]
public bool Enable { get; set; }
[ConfigComment(
en: """
Sensitivity adjustments in Test mode are not linear
Default sensitivity in area A: 90, 80, 70, 60, 50, 40, 30, 26, 23, 20, 10
Default sensitivity in other areas: 70, 60, 50, 40, 30, 20, 15, 10, 5, 1, 1
A setting of 0 in Test mode corresponds to 40, 20 here, -5 corresponds to 90, 70, +5 corresponds to 10, 1
The higher the number in Test mode, the lower the number here, resulting in higher sensitivity for official machines
For ADX, the sensitivity is reversed, so the higher the number here, the higher the sensitivity
""",
zh: """
Test 线
A 90, 80, 70, 60, 50, 40, 30, 26, 23, 20, 10
70, 60, 50, 40, 30, 20, 15, 10, 5, 1, 1
Test 0 40, 20 -5 90, 70+5 10, 1
Test
ADX ADX
""")]
public byte A1 { get; set; } = 40;
public byte A2 { get; set; } = 40;
public byte A3 { get; set; } = 40;
public byte A4 { get; set; } = 40;
public byte A5 { get; set; } = 40;
public byte A6 { get; set; } = 40;
public byte A7 { get; set; } = 40;
public byte A8 { get; set; } = 40;
public byte B1 { get; set; } = 20;
public byte B2 { get; set; } = 20;
public byte B3 { get; set; } = 20;
public byte B4 { get; set; } = 20;
public byte B5 { get; set; } = 20;
public byte B6 { get; set; } = 20;
public byte B7 { get; set; } = 20;
public byte B8 { get; set; } = 20;
public byte C1 { get; set; } = 20;
public byte C2 { get; set; } = 20;
public byte D1 { get; set; } = 20;
public byte D2 { get; set; } = 20;
public byte D3 { get; set; } = 20;
public byte D4 { get; set; } = 20;
public byte D5 { get; set; } = 20;
public byte D6 { get; set; } = 20;
public byte D7 { get; set; } = 20;
public byte D8 { get; set; } = 20;
public byte E1 { get; set; } = 20;
public byte E2 { get; set; } = 20;
public byte E3 { get; set; } = 20;
public byte E4 { get; set; } = 20;
public byte E5 { get; set; } = 20;
public byte E6 { get; set; } = 20;
public byte E7 { get; set; } = 20;
public byte E8 { get; set; } = 20;
}
public class CustomKeyMapConfig
{
[ConfigComment(
en: "These settings will work regardless of whether you have enabled segatools' io4 emulation",
zh: "这里的设置无论你是否启用了 segatools 的 io4 模拟都会工作")]
public bool Enable { get; set; }
public KeyCodeID Test { get; set; } = (KeyCodeID)115;
public KeyCodeID Service { get; set; } = (KeyCodeID)5;
public KeyCodeID Button1_1P { get; set; } = (KeyCodeID)67;
public KeyCodeID Button2_1P { get; set; } = (KeyCodeID)49;
public KeyCodeID Button3_1P { get; set; } = (KeyCodeID)48;
public KeyCodeID Button4_1P { get; set; } = (KeyCodeID)47;
public KeyCodeID Button5_1P { get; set; } = (KeyCodeID)68;
public KeyCodeID Button6_1P { get; set; } = (KeyCodeID)70;
public KeyCodeID Button7_1P { get; set; } = (KeyCodeID)45;
public KeyCodeID Button8_1P { get; set; } = (KeyCodeID)61;
public KeyCodeID Select_1P { get; set; } = (KeyCodeID)25;
public KeyCodeID Button1_2P { get; set; } = (KeyCodeID)80;
public KeyCodeID Button2_2P { get; set; } = (KeyCodeID)81;
public KeyCodeID Button3_2P { get; set; } = (KeyCodeID)78;
public KeyCodeID Button4_2P { get; set; } = (KeyCodeID)75;
public KeyCodeID Button5_2P { get; set; } = (KeyCodeID)74;
public KeyCodeID Button6_2P { get; set; } = (KeyCodeID)73;
public KeyCodeID Button7_2P { get; set; } = (KeyCodeID)76;
public KeyCodeID Button8_2P { get; set; } = (KeyCodeID)79;
public KeyCodeID Select_2P { get; set; } = (KeyCodeID)84;
}
}
[ConfigComment(
en: "UX: User Experience Improvements",
zh: """
使 MaiChartManager AquaMai
https://github.com/clansty/MaiChartManager
""")]
public UX.Config UX { get; set; } = new();
[ConfigComment(
en: "Cheat: You control the buttons you press",
zh: "“作弊”功能")]
public Cheat.Config Cheat { get; set; } = new();
[ConfigComment(
en: "Fix: Fix some potential issues",
zh: "修复一些潜在的问题")]
public Fix.Config Fix { get; set; } = new();
[ConfigComment(
zh: "实用工具")]
public Utils.Config Utils { get; set; } = new();
[ConfigComment(
en: "Time Saving: Skip some unnecessary screens",
zh: "节省一些不知道有用没用的时间,跳过一些不必要的界面")]
public TimeSaving.Config TimeSaving { get; set; } = new();
[ConfigComment(
zh: "窗口相关设置")]
public WindowState.Config WindowState { get; set; } = new();
[ConfigComment(
en: "Custom camera ID settings",
zh: "自定义摄像头 ID")]
public CustomCameraId.Config CustomCameraId { get; set; } = new();
[ConfigComment(
zh: "触摸灵敏度设置")]
public TouchSensitivity.Config TouchSensitivity { get; set; } = new();
[ConfigComment(
zh: "自定义按键映射")]
public CustomKeyMap.Config CustomKeyMap { get; set; } = new();
}

View File

@ -0,0 +1,40 @@
using AquaMai.Attributes;
namespace AquaMai.CustomCameraId;
public class Config
{
[ConfigComment(
en: """
Enable custom CameraId
If enabled, you can customize the game to use the specified camera
""",
zh: """
ID
使
""")]
public bool Enable { get; set; }
[ConfigComment(
en: "Print the camera list to the log when starting, can be used as a basis for modification",
zh: "启动时打印摄像头列表到日志中,可以作为修改的依据")]
public bool PrintCameraList { get; set; } = false;
[ConfigComment(
en: "DX Pass 1P",
zh: "DX Pass 1P")]
public int LeftQrCamera { get; set; } = 0;
[ConfigComment(
en: "DX Pass 2P",
zh: "DX Pass 2P")]
public int RightQrCamera { get; set; } = 0;
[ConfigComment(
zh: "玩家摄像头")]
public int PhotoCamera { get; set; } = 0;
[ConfigComment(
zh: "二维码扫描摄像头")]
public int ChimeCamera { get; set; } = 0;
}

View File

@ -0,0 +1,32 @@
using AquaMai.Attributes;
namespace AquaMai.CustomKeyMap;
public class Config
{
[ConfigComment(
en: "These settings will work regardless of whether you have enabled segatools' io4 emulation",
zh: "这里的设置无论你是否启用了 segatools 的 io4 模拟都会工作")]
public bool Enable { get; set; }
public KeyCodeID Test { get; set; } = (KeyCodeID)115;
public KeyCodeID Service { get; set; } = (KeyCodeID)5;
public KeyCodeID Button1_1P { get; set; } = (KeyCodeID)67;
public KeyCodeID Button2_1P { get; set; } = (KeyCodeID)49;
public KeyCodeID Button3_1P { get; set; } = (KeyCodeID)48;
public KeyCodeID Button4_1P { get; set; } = (KeyCodeID)47;
public KeyCodeID Button5_1P { get; set; } = (KeyCodeID)68;
public KeyCodeID Button6_1P { get; set; } = (KeyCodeID)70;
public KeyCodeID Button7_1P { get; set; } = (KeyCodeID)45;
public KeyCodeID Button8_1P { get; set; } = (KeyCodeID)61;
public KeyCodeID Select_1P { get; set; } = (KeyCodeID)25;
public KeyCodeID Button1_2P { get; set; } = (KeyCodeID)80;
public KeyCodeID Button2_2P { get; set; } = (KeyCodeID)81;
public KeyCodeID Button3_2P { get; set; } = (KeyCodeID)78;
public KeyCodeID Button4_2P { get; set; } = (KeyCodeID)75;
public KeyCodeID Button5_2P { get; set; } = (KeyCodeID)74;
public KeyCodeID Button6_2P { get; set; } = (KeyCodeID)73;
public KeyCodeID Button7_2P { get; set; } = (KeyCodeID)76;
public KeyCodeID Button8_2P { get; set; } = (KeyCodeID)79;
public KeyCodeID Select_2P { get; set; } = (KeyCodeID)84;
}

View File

@ -9,7 +9,7 @@ public class Enable
[HarmonyPostfix]
public static void JvsButtonTableRecordConstructor(JvsButtonTableRecord __instance, string Name)
{
var prop = (DB.KeyCodeID)typeof(Config.CustomKeyMapConfig).GetProperty(Name).GetValue(AquaMai.AppConfig.CustomKeyMap);
var prop = (DB.KeyCodeID)typeof(Config).GetProperty(Name).GetValue(AquaMai.AppConfig.CustomKeyMap);
__instance.SubstituteKey = prop;
}
}

View File

@ -0,0 +1,107 @@
using AquaMai.Attributes;
namespace AquaMai.Fix;
public class Config
{
[ConfigComment(
en: "Allow login with higher data version",
zh: """
""")]
public bool SkipVersionCheck { get; set; }
[ConfigComment(
zh: """
API
""")]
public bool RemoveEncryption { get; set; }
[ConfigComment(
zh: "如果要配置店内招募的话,应该要把这个关闭")]
public bool ForceAsServer { get; set; } = true;
[ConfigComment(
en: "Force the game to be in FreePlay mode",
zh: "强制改为免费游玩FreePlay")]
public bool ForceFreePlay { get; set; } = true;
[ConfigComment(
en: "Force the game to be in PaidPlay mode with 24 coins locked, conflicts with ForceFreePlay",
zh: "强制付费游玩并锁定 24 个币,和 ForceFreePlay 冲突")]
public bool ForcePaidPlay { get; set; }
[ConfigComment(
en: "Add notes sprite to the pool to prevent use up",
zh: "增加更多待命的音符贴图,防止奇怪的自制谱用完音符贴图池")]
public int ExtendNotesPool { get; set; }
[ConfigComment(
en: "Force the frame rate limit to 60 FPS and disable vSync. Do not use if your game has no issues",
zh: "强制设置帧率上限为 60 帧并关闭垂直同步。如果你的游戏没有问题,请不要使用")]
public bool FrameRateLock { get; set; }
[ConfigComment(
en: """
Use Microsoft YaHei Bold to display characters not in the font library
Cannot be used together with CustomFont
""",
zh: """
使 Bold
CustomFont 使
""")]
public bool FontFix { get; set; }
[ConfigComment(
en: """
Make the judgment display of Wifi Slide different in up and down (originally all Wifi judgment displays are towards the center), just like in majdata
The reason for this bug is that SEGA forgot to assign EndButtonId to Wifi
""",
zh: """
Patch Wifi Slide ( Wifi ), majdata
bug SBGA Wifi EndButtonId
""")]
public bool FanJudgeFlip { get; set; }
[ConfigComment(
en: """
This Patch makes the Critical judgment of BreakSlide also flicker like BreakTap
Recommended to use with custom skins (otherwise the visual effect may not be good)
""",
zh: """
Patch BreakSlide Critical BreakTap
使 ()
""")]
public bool BreakSlideJudgeBlink { get; set; }
[ConfigComment(
en: """
Make the AutoPlay random judgment mode really randomize all judgments (down to sub-judgments)
The original random judgment will only produce all 15 judgment results from Miss(TooFast) ~ Critical ~ Miss(TooLate)
Here, it is changed to a triangular distribution to produce all 15 judgment results from Miss(TooFast) ~ Critical ~ Miss(TooLate)
Of course, it will not consider whether the original Note really has a corresponding judgment (such as Slide should not have non-Critical Prefect)
""",
zh: """
AutoPlay ()
Critical, LateGreat1st, LateGood, Miss(TooLate)
Miss(TooFast) ~ Critical ~ Miss(TooLate) 15
, Note ( Slide p )
""")]
public bool RealisticRandomJudge { get; set; }
[ConfigComment(
en: "Cannot be used together with HideHanabi",
zh: """
1p
HideHanabi 使
""")]
public bool HanabiFix { get; set; }
[ConfigComment(
en: "Prevent gray network caused by mistakenly thinking it's an AimeDB server issue",
zh: "防止因错误认为 AimeDB 服务器问题引起的灰网,建议开启")]
public bool IgnoreAimeServerError { get; set; }
}

View File

@ -0,0 +1,49 @@
using AquaMai.Attributes;
namespace AquaMai.TimeSaving;
public class Config
{
[ConfigComment(
en: "Skip the warning screen and logo shown after the POST sequence",
zh: "跳过日服启动时候的 WARNING 界面")]
public bool SkipWarningScreen { get; set; }
[ConfigComment(
en: "Disable some useless delays to speed up the game boot process",
zh: """
""")]
public bool ImproveLoadSpeed { get; set; }
[ConfigComment(
en: "Directly enter the song selection screen after login",
zh: "登录完成后直接进入选歌界面")]
public bool SkipToMusicSelection { get; set; }
[ConfigComment(
en: "Skip possible prompts like \"New area discovered\", \"New songs added\", \"There are events\" during game login/registration",
zh: "跳过登录 / 注册游戏时候可能的 “发现了新的区域哟” “乐曲增加” “有活动哟” 之类的提示")]
public bool SkipEventInfo { get; set; }
[ConfigComment(
en: "Skip the \"Do not tap or slide vigorously\" screen, immediately proceed to the next screen once data is loaded",
zh: "跳过“不要大力拍打或滑动哦”这个界面,数据一旦加载完就立马进入下一个界面")]
public bool IWontTapOrSlideVigorously { get; set; }
[ConfigComment(
en: "Skip the \"Goodbye\" screen at the end of the game",
zh: "跳过游戏结束的“再见”界面")]
public bool SkipGameOverScreen { get; set; }
[ConfigComment(
en: "Skip TrackStart screen",
zh: "跳过乐曲开始界面")]
public bool SkipTrackStart { get; set; }
[ConfigComment(
en: "Show a \"skip\" button like AstroDX after the notes end",
zh: "音符结束之后显示像 AstroDX 一样的“跳过”按钮")]
public bool ShowQuickEndPlay { get; set; }
}

View File

@ -0,0 +1,72 @@
using AquaMai.Attributes;
namespace AquaMai.TouchSensitivity;
public class Config
{
[ConfigComment(
en: """
Enable custom sensitivity
When enabled, the settings in Test mode will not take effect
When disabled, the settings in Test mode can still be used
""",
zh: """
Test
Test
""")]
public bool Enable { get; set; }
[ConfigComment(
en: """
Sensitivity adjustments in Test mode are not linear
Default sensitivity in area A: 90, 80, 70, 60, 50, 40, 30, 26, 23, 20, 10
Default sensitivity in other areas: 70, 60, 50, 40, 30, 20, 15, 10, 5, 1, 1
A setting of 0 in Test mode corresponds to 40, 20 here, -5 corresponds to 90, 70, +5 corresponds to 10, 1
The higher the number in Test mode, the lower the number here, resulting in higher sensitivity for official machines
For ADX, the sensitivity is reversed, so the higher the number here, the higher the sensitivity
""",
zh: """
Test 线
A 90, 80, 70, 60, 50, 40, 30, 26, 23, 20, 10
70, 60, 50, 40, 30, 20, 15, 10, 5, 1, 1
Test 0 40, 20 -5 90, 70+5 10, 1
Test
ADX ADX
""")]
public byte A1 { get; set; } = 40;
public byte A2 { get; set; } = 40;
public byte A3 { get; set; } = 40;
public byte A4 { get; set; } = 40;
public byte A5 { get; set; } = 40;
public byte A6 { get; set; } = 40;
public byte A7 { get; set; } = 40;
public byte A8 { get; set; } = 40;
public byte B1 { get; set; } = 20;
public byte B2 { get; set; } = 20;
public byte B3 { get; set; } = 20;
public byte B4 { get; set; } = 20;
public byte B5 { get; set; } = 20;
public byte B6 { get; set; } = 20;
public byte B7 { get; set; } = 20;
public byte B8 { get; set; } = 20;
public byte C1 { get; set; } = 20;
public byte C2 { get; set; } = 20;
public byte D1 { get; set; } = 20;
public byte D2 { get; set; } = 20;
public byte D3 { get; set; } = 20;
public byte D4 { get; set; } = 20;
public byte D5 { get; set; } = 20;
public byte D6 { get; set; } = 20;
public byte D7 { get; set; } = 20;
public byte D8 { get; set; } = 20;
public byte E1 { get; set; } = 20;
public byte E2 { get; set; } = 20;
public byte E3 { get; set; } = 20;
public byte E4 { get; set; } = 20;
public byte E5 { get; set; } = 20;
public byte E6 { get; set; } = 20;
public byte E7 { get; set; } = 20;
public byte E8 { get; set; } = 20;
}

View File

@ -0,0 +1,220 @@
using AquaMai.Attributes;
namespace AquaMai.UX;
public class Config
{
[ConfigComment(
en: "Language for mod UI, supports en and zh",
zh: "Mod 界面的语言,支持 en 和 zh")]
public string Locale { get; set; } = "";
[ConfigComment(
en: "Single player: Show 1P only, at the center of the screen",
zh: "单人模式,不显示 2P")]
public bool SinglePlayer { get; set; }
[ConfigComment(
en: "Remove the circle mask in the game",
zh: "移除遮罩")]
public bool HideMask { get; set; }
[ConfigComment(
en: "Load Jacket image from folder \"LocalAssets\" and filename \"{MusicID}.png\" for self-made charts",
zh: "通过游戏目录下 `LocalAssets\\000000歌曲 ID.png` 加载封面,自制谱用")]
public bool LoadAssetsPng { get; set; }
[ConfigComment(
en: "Add \".ab\" image resources without the need of rebuilding a manifest",
zh: """
AssetBundleImages.manifest ab
""")]
public bool LoadAssetBundleWithoutManifest { get; set; }
[ConfigComment(
en: """
Press key "7" for 1 second to skip to next step or restart current song
Hold the bottom four buttons (3456) for official quick retry (non-utage only)
""",
zh: """
Service 7 ADX
-
-
7 Service 1P
3456使
""")]
public bool QuickSkip { get; set; }
[ConfigComment(
en: """
Random BGM, put Mai2Cue.{acb,awb} of old version of the game in `LocalAssets\Mai2Cue` and rename them
Do not enable when SinglePlayer is off
""",
zh: """
`LocalAssets\Mai2Cue` Mai2Cue.{acb,awb} BGM BGM
2P 'SinglePlayer'
""")]
public bool RandomBgm { get; set; }
[ConfigComment(
en: "Play \"Master\" difficulty on Demo screen",
zh: "在闲置时的演示画面上播放紫谱而不是绿谱")]
public bool DemoMaster { get; set; }
[ConfigComment(
en: """
Disable timers
Not recommand to enable when SinglePlayer is off
""",
zh: """
'SinglePlayer'
""")]
public bool ExtendTimer { get; set; }
[ConfigComment(
en: "Save immediate after playing a song",
zh: "打完一首歌的时候立即向服务器保存成绩")]
public bool ImmediateSave { get; set; }
[ConfigComment(
en: """
Use the png jacket above as BGA if BGA is not found for self-made charts
Use together with `LoadJacketPng`
""",
zh: """
dat BGA
`LoadJacketPng`
""")]
public bool LoadLocalBga { get; set; }
[ConfigComment(
en: "Prevent accidental touch of the Test button, requires 1 second long press to take effect",
zh: "防止你不小心按到 Test 键Test 键需要长按 1 秒才能生效")]
public bool TestProof { get; set; }
[ConfigComment(
en: """
In the song selection screen, press the Service button or the "7" key (the round button in the middle of the arrow keys in the default ADX firmware) to toggle the display of self-made charts.
A directory is considered to contain self-made charts if it does not have DataConfig.xml or OfficialChartsMark.txt in the Axxx directory.
""",
zh: """
Service 7 ADX
Axxx DataConfig.xml OfficialChartsMark.txt
""")]
public bool HideSelfMadeCharts { get; set; }
[ConfigComment(
en: """
Place font.ttf in the LocalAssets directory to replace the game's global font
Cannot be used together with FontFix
""",
zh: """
LocalAssets font.ttf
FontFix 使
""")]
public bool CustomFont { get; set; }
[ConfigComment(
en: """
Provide the ability to use custom skins (advanced feature)
Load skin textures from LocalAssets\Skins
""",
zh: """
LocalAssets\Skins
""")]
public bool CustomSkins { get; set; }
[ConfigComment(
en: """
More detailed judgment display
Requires CustomSkins to be enabled and the resource file to be downloaded
https://github.com/hykilpikonna/AquaDX/releases/download/nightly/JudgeDisplay4B.7z
""",
zh: """
CustomSkins
https://github.com/hykilpikonna/AquaDX/releases/download/nightly/JudgeDisplay4B.7z
""")]
public bool JudgeDisplay4B { get; set; }
[ConfigComment(
en: """
Custom track start difficulty image (not really custom difficulty)
Requires CustomSkins to be enabled
Will load four image resources through custom skins: musicBase, musicTab, musicLvBase, musicLvText
""",
zh: """
()
: musicBase, musicTab, musicLvBase, musicLvText
""")]
public bool CustomTrackStartDiff { get; set; }
[ConfigComment(
en: "Map touch actions to buttons",
zh: "映射触摸操作至实体按键")]
public bool TouchToButtonInput { get; set; }
[ConfigComment(
en: """
Delayed the animation of the song start screen
For recording chart confirmation
""",
zh: """
""")]
public bool TrackStartProcessTweak { get; set; }
[ConfigComment(
en: """
Disable the TRACK X text, DX/Standard display box, and the derakkuma at the bottom of the screen in the song start screen
For recording chart confirmation
""",
zh: """
, TRACK X , DX/,
""")]
public bool DisableTrackStartTabs { get; set; }
[ConfigComment(
en: "Cannot be used together with HanabiFix",
zh: """
HanabiFix 使
""")]
public bool HideHanabi { get; set; }
[ConfigComment(
en: "Set the version string displayed at the top-right corner of the screen",
zh: "把右上角的版本更改为自定义文本")]
public string CustomVersionString { get; set; } = "";
[ConfigComment(
en: """
Custom shop name in photo
Also enable shop name display in SDGA
""",
zh: """
SDGA
""")]
public string CustomPlaceName { get; set; } = "";
[ConfigComment(
en: "Execute some command on game idle",
zh: """
""")]
public string ExecOnIdle { get; set; } = "";
[ConfigComment(
en: "Execute some command on game start",
zh: "在玩家登录的时候执行指定的命令脚本")]
public string ExecOnEntry { get; set; } = "";
}

View File

@ -0,0 +1,70 @@
using AquaMai.Attributes;
namespace AquaMai.Utils;
public class Config
{
[ConfigComment(
en: "Log user ID on login",
zh: "登录时将 UserID 输出到日志")]
public bool LogUserId { get; set; }
[ConfigComment(
en: "Globally increase A judgment, unit is the same as in the game",
zh: "全局增加 A 判,单位和游戏里一样")]
public float JudgeAdjustA { get; set; }
[ConfigComment(
en: "Globally increase B judgment, unit is the same as in the game",
zh: "全局增加 B 判,单位和游戏里一样")]
public float JudgeAdjustB { get; set; }
[ConfigComment(
en: "Touch screen delay, unit is milliseconds, one second = 1000 milliseconds. Must be an integer",
zh: "触摸屏延迟,单位为毫秒,一秒 = 1000 毫秒。必须是整数")]
public int TouchDelay { get; set; }
[ConfigComment(
en: """
Practice mode, activated by pressing Test in the game
Must be used together with TestProof
""",
zh: """
Test
TestProof
""")]
public bool PractiseMode { get; set; }
[ConfigComment(
en: "Show detail of selected song in music selection screen",
zh: "选歌界面显示选择的歌曲的详情")]
public bool SelectionDetail { get; set; }
[ConfigComment(
en: "Show Network error detail in the game",
zh: "出现灰网时显示原因")]
public bool ShowNetErrorDetail { get; set; }
[ConfigComment(
en: "Show error log in the game",
zh: "在游戏中显示错误日志窗口而不是关闭游戏进程")]
public bool ShowErrorLog { get; set; }
[ConfigComment(
en: "Display framerate",
zh: "显示帧率")]
public bool FrameRateDisplay { get; set; }
[ConfigComment(
en: """
Adjust the baud rate of the touch screen serial port, default value is 9600
Requires hardware support. If you are unsure whether you can use it, you cannot use it
Set to 0 to disable
""",
zh: """
9600
使使
0
""")]
public int TouchPanelBaudRate { get; set; }
}

View File

@ -0,0 +1,31 @@
using AquaMai.Attributes;
namespace AquaMai.WindowState;
public class Config
{
[ConfigComment(
en: "If not enabled, no operations will be performed on the game window",
zh: "不启用的话,不会对游戏窗口做任何操作")]
public bool Enable { get; set; }
[ConfigComment(
en: "Window the game",
zh: "窗口化游戏")]
public bool Windowed { get; set; }
[ConfigComment(
en: """
Width and height for windowed mode, rendering resolution for fullscreen mode
If set to 0, windowed mode will remember the user-set size, fullscreen mode will use the current display resolution
""",
zh: """
0使
""")]
public int Width { get; set; }
[ConfigComment(
zh: "高度")]
public int Height { get; set; }
}