1
0
mirror of https://github.com/soarqin/DSP_Mods.git synced 2025-12-10 07:23:28 +08:00

UXAssist v1.0.2, UniverseGenTweaks v1.2.1, CheatEnabler v2.3.4

This commit is contained in:
2023-10-22 15:46:06 +08:00
parent 4635d70faa
commit 3d16baaa9a
20 changed files with 393 additions and 138 deletions

View File

@@ -5,7 +5,7 @@
<TargetFramework>net472</TargetFramework> <TargetFramework>net472</TargetFramework>
<BepInExPluginGuid>org.soardev.cheatenabler</BepInExPluginGuid> <BepInExPluginGuid>org.soardev.cheatenabler</BepInExPluginGuid>
<Description>DSP MOD - CheatEnabler</Description> <Description>DSP MOD - CheatEnabler</Description>
<Version>2.3.2</Version> <Version>2.3.4</Version>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<PackageId>CheatEnabler</PackageId> <PackageId>CheatEnabler</PackageId>

View File

@@ -197,9 +197,8 @@ public static class DysonSpherePatch
{ {
var index = swarm.starData.index; var index = swarm.starData.index;
var delta1 = endVec - swarm.starData.uPosition; var delta1 = endVec - swarm.starData.uPosition;
var delta2 = VectorLF3.Cross(endVec - uPos, swarm.orbits[orbitId].up).normalized * Math.Sqrt(swarm.dysonSphere.gravity / swarm.orbits[orbitId].radius) var delta2 = VectorLF3.Cross(endVec - uPos, swarm.orbits[orbitId].up).normalized * Math.Sqrt(swarm.dysonSphere.gravity / swarm.orbits[orbitId].radius);
+ RandomTable.SphericNormal(ref swarm.randSeed, 0.5); lock (swarm)
lock(swarm)
{ {
var cache = _sailsCache[index]; var cache = _sailsCache[index];
var len = _sailsCacheLen[index]; var len = _sailsCacheLen[index];
@@ -218,7 +217,7 @@ public static class DysonSpherePatch
} }
} }
_sailsCacheLen[index] = len + 1; _sailsCacheLen[index] = len + 1;
cache[len].FromData(delta1, delta2, orbitId); cache[len].FromData(delta1, delta2 + RandomTable.SphericNormal(ref swarm.randSeed, 0.5), orbitId);
} }
} }

View File

@@ -108,7 +108,22 @@ public static class FactoryPatch
[HarmonyPatch(typeof(PlanetData), nameof(PlanetData.NotifyFactoryLoaded))] [HarmonyPatch(typeof(PlanetData), nameof(PlanetData.NotifyFactoryLoaded))]
private static void PlanetData_NotifyFactoryLoaded_Postfix(PlanetData __instance) private static void PlanetData_NotifyFactoryLoaded_Postfix(PlanetData __instance)
{ {
ArrivePlanet(__instance.factory); var main = GameMain.instance;
if (main != null && main._running)
{
ArrivePlanet(__instance.factory);
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(GameMain), nameof(GameMain.Begin))]
private static void GameMain_Begin_Postfix_For_ImmBuild()
{
var factory = GameMain.mainPlayer?.factory;
if (factory != null)
{
ArrivePlanet(factory);
}
} }
private static class ImmediateBuild private static class ImmediateBuild

View File

@@ -4,6 +4,12 @@
#### 添加一些作弊功能,同时屏蔽异常检测 #### 添加一些作弊功能,同时屏蔽异常检测
## Changlog ## Changlog
* 2.3.4
+ Use new tab layout of UXAssist 1.0.2
+ Minor bug fixes
* 2.3.3
+ Fix a crash in `Skip bullet period`.
+ Unlock techs with Alt unlocks VeinUtil to 10000 instead of 7200 now, as bug fixed in UXAssist.
* 2.3.2 * 2.3.2
+ Birth star options moved to [UniverseGenTweaks](https://dsp.thunderstore.io/package/soarqin/UniverseGenTweaks/) + Birth star options moved to [UniverseGenTweaks](https://dsp.thunderstore.io/package/soarqin/UniverseGenTweaks/)
+ Optimize `Quick absorb`, consumes less CPU time and take turns firing to nodes. + Optimize `Quick absorb`, consumes less CPU time and take turns firing to nodes.
@@ -74,8 +80,8 @@
+ Build without condition + Build without condition
+ No collision + No collision
+ Belt signal item generation + Belt signal item generation
+ Count all raws and intermediates in statistics - Count all raws and intermediates in statistics
+ Belt signal alt format - Belt signal alt format
+ Remove space limit between wind turbines and solar panels + Remove space limit between wind turbines and solar panels
+ Boost power generations for kinds of power generators + Boost power generations for kinds of power generators
+ Planet: + Planet:
@@ -100,6 +106,12 @@
* [Multifunction_mod](https://github.com/blacksnipebiu/Multifunction_mod): Some cheat functions * [Multifunction_mod](https://github.com/blacksnipebiu/Multifunction_mod): Some cheat functions
## 更新日志 ## 更新日志
* 2.3.4
+ 使用UXAssist 1.0.2的新页签布局
+ 修复了一些小bug
* 2.3.3
+ 修复了`跳过子弹阶段`可能导致崩溃的问题
+ 使用Alt解锁科技时现在`矿物利用`的科技解锁到10000级而不是7200级因为UXAssist已修复对应bug
* 2.3.2 * 2.3.2
+ 母星系的选项移动到了[UniverseGenTweaks](https://dsp.thunderstore.io/package/soarqin/UniverseGenTweaks/) + 母星系的选项移动到了[UniverseGenTweaks](https://dsp.thunderstore.io/package/soarqin/UniverseGenTweaks/)
+ 优化了`快速吸收`现在消耗更少的CPU并且会轮流打向各节点 + 优化了`快速吸收`现在消耗更少的CPU并且会轮流打向各节点
@@ -170,8 +182,8 @@
+ 无条件建造 + 无条件建造
+ 无碰撞 + 无碰撞
+ 传送带信号物品生成 + 传送带信号物品生成
+ 统计面板中计算所有原材料和中间产物 - 统计面板中计算所有原材料和中间产物
+ 传送带信号替换格式 - 传送带信号替换格式
+ 风力发电机和太阳能板无间距限制 + 风力发电机和太阳能板无间距限制
+ 提升各种发电设备发电量 + 提升各种发电设备发电量
+ 行星: + 行星:

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Reflection.Emit; using System.Reflection.Emit;
using BepInEx.Configuration; using BepInEx.Configuration;
using HarmonyLib; using HarmonyLib;
using JetBrains.Annotations;
namespace CheatEnabler; namespace CheatEnabler;
@@ -37,22 +38,16 @@ public static class TechPatch
} }
} }
private static void UnlockTechRecursive(TechProto proto, int maxLevel = 10000) private static void UnlockTechRecursive([NotNull] TechProto techProto, int maxLevel = 10000)
{ {
var history = GameMain.history; var history = GameMain.history;
var techStates = history.techStates; var techStates = history.techStates;
var techID = proto.ID; var techID = techProto.ID;
if (techStates == null || !techStates.ContainsKey(techID)) if (techStates == null || !techStates.ContainsKey(techID))
{ {
return; return;
} }
var techProto = LDB.techs.Select(techID);
if (techProto == null)
{
return;
}
var value = techStates[techID]; var value = techStates[techID];
if (value.unlocked) if (value.unlocked)
{ {
@@ -128,7 +123,7 @@ public static class TechPatch
} }
else if (VFInput.alt) else if (VFInput.alt)
{ {
UnlockTechRecursive(node.techProto, node.techProto.ID == 3606 ? 7200 : 10000); UnlockTechRecursive(node.techProto, 10000);
} }
} }

View File

@@ -12,7 +12,8 @@ public static class UIConfigWindow
public static void Init() public static void Init()
{ {
I18N.Add("General", "*General*", "*常规*"); I18N.Add("Factory", "Factory", "工厂");
I18N.Add("Planet", "Planet", "行星");
I18N.Add("Enable Dev Shortcuts", "Enable Dev Shortcuts", "开发模式快捷键"); I18N.Add("Enable Dev Shortcuts", "Enable Dev Shortcuts", "开发模式快捷键");
I18N.Add("Disable Abnormal Checks", "Disable Abnormal Checks", "关闭数据异常检查"); I18N.Add("Disable Abnormal Checks", "Disable Abnormal Checks", "关闭数据异常检查");
I18N.Add("Hotkey", "Hotkey", "快捷键"); I18N.Add("Hotkey", "Hotkey", "快捷键");
@@ -25,7 +26,6 @@ public static class UIConfigWindow
"Click tech on tree while holding:\n Shift: Tech level + 1\n Ctrl: Tech level + 10\n Ctrl + Shift: Tech level + 100\n Alt: Tech level to MAX\n\nNote: all direct prerequisites will be unlocked as well.", "Click tech on tree while holding:\n Shift: Tech level + 1\n Ctrl: Tech level + 10\n Ctrl + Shift: Tech level + 100\n Alt: Tech level to MAX\n\nNote: all direct prerequisites will be unlocked as well.",
"按住以下组合键点击科技树:\n Shift科技等级+1\n Ctrl科技等级+10\n Ctrl+Shift科技等级+100\n Alt科技等级升到最大\n\n注意所有直接前置科技也会被解锁"); "按住以下组合键点击科技树:\n Shift科技等级+1\n Ctrl科技等级+10\n Ctrl+Shift科技等级+100\n Alt科技等级升到最大\n\n注意所有直接前置科技也会被解锁");
I18N.Add("Assign game to current account", "Assign game to current account", "将游戏绑定给当前账号"); I18N.Add("Assign game to current account", "Assign game to current account", "将游戏绑定给当前账号");
I18N.Add("Factory", "*Factory*", "*工厂*");
I18N.Add("Finish build immediately", "Finish build immediately", "建造秒完成"); I18N.Add("Finish build immediately", "Finish build immediately", "建造秒完成");
I18N.Add("Architect mode", "Architect mode", "建筑师模式"); I18N.Add("Architect mode", "Architect mode", "建筑师模式");
I18N.Add("Build without condition", "Build without condition check", "无条件建造"); I18N.Add("Build without condition", "Build without condition check", "无条件建造");
@@ -42,11 +42,9 @@ public static class UIConfigWindow
I18N.Add("Boost fuel power", "Boost fuel power(x50,000)", "提升燃料发电(x50,000)"); I18N.Add("Boost fuel power", "Boost fuel power(x50,000)", "提升燃料发电(x50,000)");
I18N.Add("Boost fuel power 2", "(x20,000 for deuteron, x10,000 for antimatter)", "(氘核燃料棒x20,000反物质燃料棒x10,000)"); I18N.Add("Boost fuel power 2", "(x20,000 for deuteron, x10,000 for antimatter)", "(氘核燃料棒x20,000反物质燃料棒x10,000)");
I18N.Add("Boost geothermal power", "Boost geothermal power(x50,000)", "提升地热发电(x50,000)"); I18N.Add("Boost geothermal power", "Boost geothermal power(x50,000)", "提升地热发电(x50,000)");
I18N.Add("Planet", "*Planet*", "*行星*");
I18N.Add("Infinite Natural Resources", "Infinite natural resources", "自然资源采集不消耗"); I18N.Add("Infinite Natural Resources", "Infinite natural resources", "自然资源采集不消耗");
I18N.Add("Fast Mining", "Fast mining", "高速采集"); I18N.Add("Fast Mining", "Fast mining", "高速采集");
I18N.Add("Pump Anywhere", "Pump anywhere", "平地抽水"); I18N.Add("Pump Anywhere", "Pump anywhere", "平地抽水");
I18N.Add("Dyson Sphere", "*Dyson Sphere*", "*戴森球*");
I18N.Add("Skip bullet period", "Skip bullet period", "跳过子弹阶段"); I18N.Add("Skip bullet period", "Skip bullet period", "跳过子弹阶段");
I18N.Add("Skip absorption period", "Skip absorption period", "跳过吸收阶段"); I18N.Add("Skip absorption period", "Skip absorption period", "跳过吸收阶段");
I18N.Add("Quick absorb", "Quick absorb", "快速吸收"); I18N.Add("Quick absorb", "Quick absorb", "快速吸收");
@@ -54,17 +52,6 @@ public static class UIConfigWindow
I18N.Add("Overclock Ejectors", "Overclock Ejectors (10x)", "高速弹射器(10倍射速)"); I18N.Add("Overclock Ejectors", "Overclock Ejectors (10x)", "高速弹射器(10倍射速)");
I18N.Add("Overclock Silos", "Overclock Silos (10x)", "高速发射井(10倍射速)"); I18N.Add("Overclock Silos", "Overclock Silos (10x)", "高速发射井(10倍射速)");
I18N.Add("Terraform without enough sands", "Terraform without enough sands", "沙土不够时依然可以整改地形"); I18N.Add("Terraform without enough sands", "Terraform without enough sands", "沙土不够时依然可以整改地形");
I18N.Add("Birth", "*Birth Sys*", "*母星系*");
I18N.Add("Silicon/Titanium on birth planet", "Silicon/Titanium on birth planet", "母星有硅和钛");
I18N.Add("Fire ice on birth planet", "Fire ice on birth planet", "母星有可燃冰");
I18N.Add("Kimberlite on birth planet", "Kimberlite on birth planet", "母星有金伯利矿");
I18N.Add("Fractal silicon on birth planet", "Fractal silicon on birth planet", "母星有分形硅");
I18N.Add("Organic crystal on birth planet", "Organic crystal on birth planet", "母星有有机晶体");
I18N.Add("Optical grating crystal on birth planet", "Optical grating crystal on birth planet", "母星有光栅石");
I18N.Add("Spiniform stalagmite crystal on birth planet", "Spiniform stalagmite crystal on birth planet", "母星有刺笋结晶");
I18N.Add("Unipolar magnet on birth planet", "Unipolar magnet on birth planet", "母星有单极磁石");
I18N.Add("Birth planet is solid flat (no water at all)", "Birth planet is solid flat (no water at all)", "母星是纯平的(没有水)");
I18N.Add("Birth star has high luminosity", "Birth star has high luminosity", "母星系恒星高亮");
I18N.Apply(); I18N.Apply();
MyConfigWindow.OnUICreated += CreateUI; MyConfigWindow.OnUICreated += CreateUI;
MyConfigWindow.OnUpdateUI += UpdateUI; MyConfigWindow.OnUpdateUI += UpdateUI;
@@ -76,6 +63,8 @@ public static class UIConfigWindow
// General tab // General tab
var x = 0f; var x = 0f;
var y = 10f; var y = 10f;
wnd.AddSplitter(trans, 10f);
wnd.AddTabGroup(trans, "Cheat Enabler", "tab-group-cheatenabler");
var tab1 = wnd.AddTab(_windowTrans, "General"); var tab1 = wnd.AddTab(_windowTrans, "General");
MyCheckBox.CreateCheckBox(x, y, tab1, DevShortcuts.Enabled, "Enable Dev Shortcuts"); MyCheckBox.CreateCheckBox(x, y, tab1, DevShortcuts.Enabled, "Enable Dev Shortcuts");
y += 36f; y += 36f;

View File

@@ -1,10 +1,10 @@
{ {
"name": "CheatEnabler", "name": "CheatEnabler",
"version_number": "2.3.2", "version_number": "2.3.4",
"website_url": "https://github.com/soarqin/DSP_Mods/tree/master/CheatEnabler", "website_url": "https://github.com/soarqin/DSP_Mods/tree/master/CheatEnabler",
"description": "Add various cheat functions while disabling abnormal determinants / 添加一些作弊功能,同时屏蔽异常检测", "description": "Add various cheat functions while disabling abnormal determinants / 添加一些作弊功能,同时屏蔽异常检测",
"dependencies": [ "dependencies": [
"xiaoye97-BepInEx-5.4.17", "xiaoye97-BepInEx-5.4.17",
"soarqin-UXAssist-1.0.0" "soarqin-UXAssist-1.0.2"
] ]
} }

76
UXAssist/Common/WinApi.cs Normal file
View File

@@ -0,0 +1,76 @@
using System;
using System.Runtime.InteropServices;
namespace UXAssist.Common;
[Flags]
public enum WindowStyles: int
{
WS_BORDER = 0x00800000,
WS_CAPTION = 0x00C00000,
WS_CHILD = 0x40000000,
WS_CHILDWINDOW = 0x40000000,
WS_CLIPCHILDREN = 0x02000000,
WS_CLIPSIBLINGS = 0x04000000,
WS_DISABLED = 0x08000000,
WS_DLGFRAME = 0x00400000,
WS_GROUP = 0x00020000,
WS_HSCROLL = 0x00100000,
WS_ICONIC = 0x20000000,
WS_MAXIMIZE = 0x01000000,
WS_MAXIMIZEBOX = 0x00010000,
WS_MINIMIZE = 0x20000000,
WS_MINIMIZEBOX = 0x00020000,
WS_OVERLAPPED = 0x00000000,
WS_OVERLAPPEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
WS_POPUP = unchecked((int)0x80000000),
WS_POPUPWINDOW = WS_POPUP | WS_BORDER | WS_SYSMENU,
WS_SIZEBOX = 0x00040000,
WS_SYSMENU = 0x00080000,
WS_TABSTOP = 0x00010000,
WS_THICKFRAME = 0x00040000,
WS_TILED = 0x00000000,
WS_TILEDWINDOW = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX,
WS_VISIBLE = 0x10000000,
WS_VSCROLL = 0x00200000
}
[Flags]
public enum WindowLongFlags: int
{
GWL_EXSTYLE = -20,
GWLP_HINSTANCE = -6,
GWLP_HWNDPARENT = -8,
GWLP_ID = -12,
GWL_STYLE = -16,
GWLP_USERDATA = -21,
GWLP_WNDPROC = -4,
DWLP_DLGPROC = 0x4,
DWLP_MSGRESULT = 0,
DWLP_USER = 0x8
}
public static class WinApi
{
[StructLayout(LayoutKind.Sequential)]
public struct Rect
{
public int Left, Top, Right, Bottom;
}
[DllImport("user32", CharSet = CharSet.Unicode)]
public static extern int GetWindowLong(IntPtr hwnd, int nIndex);
[DllImport("user32", CharSet = CharSet.Unicode)]
public static extern int SetWindowLong(IntPtr hwnd, int nIndex, int dwNewLong);
[DllImport("user32", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32", ExactSpelling = true)]
public static extern bool GetWindowRect(IntPtr hwnd, out Rect lpRect);
[DllImport("user32", ExactSpelling = true)]
public static extern bool SetWindowPos(IntPtr hwnd, IntPtr hWndInsertAfter, int x, int y, int cx, int cy, int flags);
}

103
UXAssist/GamePatch.cs Normal file
View File

@@ -0,0 +1,103 @@
using System;
using BepInEx.Configuration;
using HarmonyLib;
using UnityEngine;
using UXAssist.Common;
namespace UXAssist;
public static class GamePatch
{
private const string GameWindowClass = "UnityWndClass";
private const string GameWindowTitle = "Dyson Sphere Program";
public static ConfigEntry<bool> EnableWindowResizeEnabled;
public static ConfigEntry<bool> LoadLastWindowRectEnabled;
public static ConfigEntry<Vector4> LastWindowRect;
private static Harmony _gamePatch;
public static void Init()
{
EnableWindowResizeEnabled.SettingChanged += (_, _) => EnableWindowResize.Enable(EnableWindowResizeEnabled.Value);
LoadLastWindowRectEnabled.SettingChanged += (_, _) => LoadLastWindowRect.Enable(LoadLastWindowRectEnabled.Value);
EnableWindowResize.Enable(EnableWindowResizeEnabled.Value);
LoadLastWindowRect.Enable(LoadLastWindowRectEnabled.Value);
_gamePatch ??= Harmony.CreateAndPatchAll(typeof(GamePatch));
}
public static void Uninit()
{
LoadLastWindowRect.Enable(false);
EnableWindowResize.Enable(false);
_gamePatch?.UnpatchSelf();
_gamePatch = null;
}
[HarmonyPrefix, HarmonyPatch(typeof(Application), nameof(Application.Quit), new Type[]{})]
private static void Application_Quit_Prefix()
{
var wnd = WinApi.FindWindow(GameWindowClass, GameWindowTitle);
if (wnd == IntPtr.Zero) return;
WinApi.GetWindowRect(wnd, out var rect);
LastWindowRect.Value = new Vector4(rect.Left, rect.Top, Screen.width, Screen.height);
}
private static class EnableWindowResize
{
public static void Enable(bool on)
{
var wnd = WinApi.FindWindow(GameWindowClass, GameWindowTitle);
if (wnd == IntPtr.Zero) return;
if (on)
WinApi.SetWindowLong(wnd, (int)WindowLongFlags.GWL_STYLE,
WinApi.GetWindowLong(wnd, (int)WindowLongFlags.GWL_STYLE) | (int)WindowStyles.WS_THICKFRAME | (int)WindowStyles.WS_MAXIMIZEBOX);
else
WinApi.SetWindowLong(wnd, (int)WindowLongFlags.GWL_STYLE,
WinApi.GetWindowLong(wnd, (int)WindowLongFlags.GWL_STYLE) & ~((int)WindowStyles.WS_THICKFRAME | (int)WindowStyles.WS_MAXIMIZEBOX));
}
}
private static class LoadLastWindowRect
{
private static Harmony _patch;
public static void Enable(bool on)
{
if (on)
{
_patch ??= Harmony.CreateAndPatchAll(typeof(LoadLastWindowRect));
return;
}
_patch?.UnpatchSelf();
_patch = null;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(Screen), nameof(Screen.SetResolution), typeof(int), typeof(int), typeof(FullScreenMode), typeof(int))]
private static void Screen_SetResolution_Prefix(ref int width, ref int height, FullScreenMode fullscreenMode)
{
if (fullscreenMode is FullScreenMode.ExclusiveFullScreen or FullScreenMode.FullScreenWindow or FullScreenMode.MaximizedWindow || GameMain.isRunning) return;
var rect = LastWindowRect.Value;
if (rect.z == 0f && rect.w == 0f) return;
var w = Mathf.RoundToInt(rect.z);
var h = Mathf.RoundToInt(rect.w);
width = w;
height = h;
}
[HarmonyPostfix]
[HarmonyPatch(typeof(Screen), nameof(Screen.SetResolution), typeof(int), typeof(int), typeof(FullScreenMode), typeof(int))]
private static void Screen_SetResolution_Postfix()
{
var wnd = WinApi.FindWindow(GameWindowClass, GameWindowTitle);
if (wnd == IntPtr.Zero) return;
var rect = LastWindowRect.Value;
if (rect.z == 0f && rect.w == 0f) return;
var x = Mathf.RoundToInt(rect.x);
var y = Mathf.RoundToInt(rect.y);
WinApi.SetWindowPos(wnd, IntPtr.Zero, x, y, 0, 0, 0x0235);
if (EnableWindowResizeEnabled.Value)
WinApi.SetWindowLong(wnd, (int)WindowLongFlags.GWL_STYLE,
WinApi.GetWindowLong(wnd, (int)WindowLongFlags.GWL_STYLE) | (int)WindowStyles.WS_THICKFRAME | (int)WindowStyles.WS_MAXIMIZEBOX);
}
}
}

View File

@@ -4,6 +4,11 @@
#### 一些提升用户体验的功能和补丁 #### 一些提升用户体验的功能和补丁
## Changlog ## Changlog
* 1.0.2
+ Redesign config tabs, for clearer layout.
+ Add 2 new options:
- Enable game window resize.
- Remember window position and size on last exit.
* 1.0.1 * 1.0.1
+ Fix config button text and tips while returning to title menu. + Fix config button text and tips while returning to title menu.
+ Fix that error occurs while returning to title menu, with `Stop ejectors when available nodes are all filled up` enabled. + Fix that error occurs while returning to title menu, with `Stop ejectors when available nodes are all filled up` enabled.
@@ -20,20 +25,25 @@
+ Strict hotkey dectection for build menu, thus building hotkeys(0~9, F1~F10, X, U) are not triggered while holding Ctrl/Alt/Shift. + Strict hotkey dectection for build menu, thus building hotkeys(0~9, F1~F10, X, U) are not triggered while holding Ctrl/Alt/Shift.
+ Fix a bug that warning popup on `Veins Utilization` upgraded to level 8000+ + Fix a bug that warning popup on `Veins Utilization` upgraded to level 8000+
* Features: * Features:
+ Unlimited interactive range + General
+ Sunlight at night - Enable game window resize
+ Remove some build conditions - Remember window position and size on last exit
+ Remove build count and range limit + Planet/Factory
+ Larger area for upgrade and dismantle(30x30 at max) - Unlimited interactive range
+ Larger area for terraform(30x30 at max) - Sunlight at night
+ Enable player actions in globe view - Remove some build conditions
+ Enhanced count control for hand-make - Remove build count and range limit
+ Re-intialize planet (without reseting veins) - Larger area for upgrade and dismantle(30x30 at max)
+ Quick dismantle all buildings (without drops) - Larger area for terraform(30x30 at max)
+ Stop ejectors when available nodes are all filled up - Enable player actions in globe view
+ Construct only nodes but frames - Enhanced count control for hand-make
+ Re-initialize Dyson Spheres - Re-intialize planet (without reseting veins)
+ Quick dismantle Dyson Shells - Quick dismantle all buildings (without drops)
+ Dyson Sphere
- Stop ejectors when available nodes are all filled up
- Construct only nodes but frames
- Re-initialize Dyson Spheres
- Quick dismantle Dyson Shells
## Notes ## Notes
* Please upgrade `BepInEx` 5.4.21 or later if using with [BlueprintTweaks](https://dsp.thunderstore.io/package/kremnev8/BlueprintTweaks/) to avoid possible conflicts. * Please upgrade `BepInEx` 5.4.21 or later if using with [BlueprintTweaks](https://dsp.thunderstore.io/package/kremnev8/BlueprintTweaks/) to avoid possible conflicts.
@@ -46,6 +56,11 @@
* [LSTM](https://github.com/hetima/DSP_LSTM) & [PlanetFinder](https://github.com/hetima/DSP_PlanetFinder): UI implementations * [LSTM](https://github.com/hetima/DSP_LSTM) & [PlanetFinder](https://github.com/hetima/DSP_PlanetFinder): UI implementations
## 更新日志 ## 更新日志
* 1.0.2
+ 重新设计了配置面板,使布局更清晰
+ 添加了两个新选项:
- 可调整游戏窗口大小(可最大化和拖动边框)
- 记住上次退出时的窗口位置和大小
* 1.0.1 * 1.0.1
+ 修复了返回标题界面后设置按钮文本和提示信息不正确的问题 + 修复了返回标题界面后设置按钮文本和提示信息不正确的问题
+ 修复了`当可用节点全部造完时停止弹射`选项启用时返回标题界面可能导致崩溃的问题 + 修复了`当可用节点全部造完时停止弹射`选项启用时返回标题界面可能导致崩溃的问题
@@ -62,20 +77,25 @@
+ 更严格的建造菜单热键检测因此在按住Ctrl/Alt/Shift时不再会触发建造热键(0~9, F1~F10, X, U) + 更严格的建造菜单热键检测因此在按住Ctrl/Alt/Shift时不再会触发建造热键(0~9, F1~F10, X, U)
+ 修复了`矿物利用`升级到8000级以上时弹出警告的bug + 修复了`矿物利用`升级到8000级以上时弹出警告的bug
* 功能: * 功能:
+ 无限交互距离 + 通用
+ 夜间日光灯 -可调整游戏窗口大小(可最大化和拖动边框)
+ 移除部分不影响游戏逻辑的建造条件 - 记住上次退出时的窗口位置和大小
+ 移除建造数量和范围限制 + 行星/工厂
+ 范围升级和拆除的最大区域扩大(最大30x30) - 无限交互距离
+ 范围铺设地基的最大区域扩大(最大30x30) - 夜间日光灯
+ 在行星视图中允许玩家操作 - 移除部分不影响游戏逻辑的建造条件
+ 手动制造物品的数量控制改进 - 移除建造数量和范围限制
+ 初始化本行星(不重置矿脉) - 范围升级和拆除的最大区域扩大(最大30x30)
+ 快速拆除所有建筑(不掉落) - 范围铺设地基的最大区域扩大(最大30x30)
+ 可用节点全部造完时停止弹射 - 在行星视图中允许玩家操作
+ 只建造节点不建造框架 - 手动制造物品的数量控制改进
+ 初始化戴森球 - 初始化本行星(不重置矿脉)
+ 快速拆除戴森壳 - 快速拆除所有建筑(不掉落)
+ 戴森球
- 可用节点全部造完时停止弹射
- 只建造节点不建造框架
- 初始化戴森球
- 快速拆除戴森壳
## 注意事项 ## 注意事项
* 如果和[BlueprintTweaks](https://dsp.thunderstore.io/package/kremnev8/BlueprintTweaks/)一起使用,请升级`BepInEx`到5.4.21或更高版本,以避免可能的冲突。 * 如果和[BlueprintTweaks](https://dsp.thunderstore.io/package/kremnev8/BlueprintTweaks/)一起使用,请升级`BepInEx`到5.4.21或更高版本,以避免可能的冲突。

View File

@@ -18,7 +18,7 @@ public class MyConfigWindow : MyWindowWithTabs
public override void _OnCreate() public override void _OnCreate()
{ {
_windowTrans = GetComponent<RectTransform>(); _windowTrans = GetComponent<RectTransform>();
_windowTrans.sizeDelta = new Vector2(700f, 472f); _windowTrans.sizeDelta = new Vector2(810f, 440f);
OnUICreated?.Invoke(this, _windowTrans); OnUICreated?.Invoke(this, _windowTrans);
SetCurrentTab(0); SetCurrentTab(0);

View File

@@ -211,7 +211,7 @@ public class MyWindow: ManualBehaviour
public class MyWindowWithTabs : MyWindow public class MyWindowWithTabs : MyWindow
{ {
private readonly List<Tuple<RectTransform, UIButton>> _tabs = new(); private readonly List<Tuple<RectTransform, UIButton>> _tabs = new();
private float _tabX = 36f; private float _tabY = 54f;
public override void TryClose() public override void TryClose()
{ {
_Close(); _Close();
@@ -222,18 +222,18 @@ public class MyWindowWithTabs : MyWindow
return true; return true;
} }
private RectTransform AddTabInternal(float x, int index, RectTransform parent, string label) private RectTransform AddTabInternal(float y, int index, RectTransform parent, string label)
{ {
var tab = new GameObject(); var tab = new GameObject();
var tabRect = tab.AddComponent<RectTransform>(); var tabRect = tab.AddComponent<RectTransform>();
Util.NormalizeRectWithMargin(tabRect, 54f + 28f, 36f, 0f, 0f, parent); Util.NormalizeRectWithMargin(tabRect, 48f, 145f, 0f, 0f, parent);
tab.name = "tab-" + index; tab.name = "tab-" + index;
var swarmPanel = UIRoot.instance.uiGame.dysonEditor.controlPanel.hierarchy.swarmPanel; var swarmPanel = UIRoot.instance.uiGame.dysonEditor.controlPanel.hierarchy.swarmPanel;
var src = swarmPanel.orbitButtons[0]; var src = swarmPanel.orbitButtons[0];
var btn = Instantiate(src); var btn = Instantiate(src);
var btnRect = Util.NormalizeRectWithTopLeft(btn, x, 54f, parent); var btnRect = Util.NormalizeRectWithTopLeft(btn, 30, y, parent);
btn.name = "tab-btn-" + index; btn.name = "tab-btn-" + index;
btnRect.sizeDelta = new Vector2(105f, 24f); btnRect.sizeDelta = new Vector2(105f, 27f);
btn.transform.Find("frame").gameObject.SetActive(false); btn.transform.Find("frame").gameObject.SetActive(false);
if (btn.transitions.Length >= 3) if (btn.transitions.Length >= 3)
{ {
@@ -258,11 +258,27 @@ public class MyWindowWithTabs : MyWindow
public RectTransform AddTab(RectTransform parent, string label) public RectTransform AddTab(RectTransform parent, string label)
{ {
var result = AddTabInternal(_tabX, _tabs.Count, parent, label); var result = AddTabInternal(_tabY, _tabs.Count, parent, label);
_tabX += 105f; _tabY += 28f;
return result; return result;
} }
public void AddSplitter(RectTransform parent, float spacing)
{
var img = Instantiate(UIRoot.instance.optionWindow.transform.Find("tab-line").Find("bar"));
Destroy(img.Find("tri").gameObject);
_tabY += spacing;
var rect = Util.NormalizeRectWithTopLeft(img, 28, _tabY, parent);
rect.sizeDelta = new Vector2(107, 2);
_tabY += 2;
}
public void AddTabGroup(RectTransform parent, string label, string objName = "tabl-group-label")
{
AddText(28, _tabY - 2, parent, label, 16, objName);
_tabY += 28f;
}
public override void _OnRegEvent() public override void _OnRegEvent()
{ {
if (!EventRegistered) if (!EventRegistered)

View File

@@ -7,12 +7,17 @@ namespace UXAssist;
public static class UIConfigWindow public static class UIConfigWindow
{ {
private static RectTransform _windowTrans; private static RectTransform _windowTrans;
private static RectTransform _tab; private static RectTransform _dysonTab;
private static readonly UIButton[] DysonLayerBtn = new UIButton[10]; private static readonly UIButton[] DysonLayerBtn = new UIButton[10];
public static void Init() public static void Init()
{ {
I18N.Add("UXAssist", "UXAssist", "UX助手"); I18N.Add("UXAssist", "UXAssist", "UX助手");
I18N.Add("General", "General", "常规");
I18N.Add("Planet/Factory", "Planet/Factory", "行星/工厂");
I18N.Add("Dyson Sphere", "Dyson Sphere", "戴森球");
I18N.Add("Enable game window resize", "Enable game window resize (maximum box and thick frame)", "可调整游戏窗口大小(可最大化和拖动边框)");
I18N.Add("Remeber window position and size on last exit", "Remeber window position and size on last exit", "记住上次退出时的窗口位置和大小");
I18N.Add("Unlimited interactive range", "Unlimited interactive range", "无限交互距离"); I18N.Add("Unlimited interactive range", "Unlimited interactive range", "无限交互距离");
I18N.Add("Night Light", "Sunlight at night", "夜间日光灯"); I18N.Add("Night Light", "Sunlight at night", "夜间日光灯");
I18N.Add("Remove some build conditions", "Remove some build conditions", "移除部分不影响游戏逻辑的建造条件"); I18N.Add("Remove some build conditions", "Remove some build conditions", "移除部分不影响游戏逻辑的建造条件");
@@ -36,47 +41,59 @@ public static class UIConfigWindow
private static void CreateUI(MyConfigWindow wnd, RectTransform trans) private static void CreateUI(MyConfigWindow wnd, RectTransform trans)
{ {
_windowTrans = trans; _windowTrans = trans;
var tab1 = wnd.AddTab(_windowTrans, "UXAssist"); wnd.AddTabGroup(trans, "UXAssist", "tab-group-uxassist");
var tab1 = wnd.AddTab(trans, "General");
var x = 0f; var x = 0f;
var y = 10f; var y = 10f;
MyCheckBox.CreateCheckBox(x, y, tab1, FactoryPatch.UnlimitInteractiveEnabled, "Unlimited interactive range"); MyCheckBox.CreateCheckBox(x, y, tab1, GamePatch.EnableWindowResizeEnabled, "Enable game window resize");
y += 36f; y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab1, FactoryPatch.NightLightEnabled, "Night Light"); MyCheckBox.CreateCheckBox(x, y, tab1, GamePatch.LoadLastWindowRectEnabled, "Remeber window position and size on last exit");
x += 10f;
y = 278f;
MyKeyBinder.CreateKeyBinder(x, y, tab1, UXAssist.Hotkey, "Hotkey");
var tab2 = wnd.AddTab(trans, "Planet/Factory");
x = 0f;
y = 10f;
MyCheckBox.CreateCheckBox(x, y, tab2, FactoryPatch.UnlimitInteractiveEnabled, "Unlimited interactive range");
y += 36f; y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab1, FactoryPatch.RemoveSomeConditionEnabled, "Remove some build conditions"); MyCheckBox.CreateCheckBox(x, y, tab2, FactoryPatch.RemoveSomeConditionEnabled, "Remove some build conditions");
y += 36f; y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab1, FactoryPatch.RemoveBuildRangeLimitEnabled, "Remove build range limit"); MyCheckBox.CreateCheckBox(x, y, tab2, FactoryPatch.RemoveBuildRangeLimitEnabled, "Remove build range limit");
y += 36f; y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab1, FactoryPatch.LargerAreaForUpgradeAndDismantleEnabled, "Larger area for upgrade and dismantle"); MyCheckBox.CreateCheckBox(x, y, tab2, FactoryPatch.NightLightEnabled, "Night Light");
y += 36f; y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab1, FactoryPatch.LargerAreaForTerraformEnabled, "Larger area for terraform"); MyCheckBox.CreateCheckBox(x, y, tab2, FactoryPatch.LargerAreaForUpgradeAndDismantleEnabled, "Larger area for upgrade and dismantle");
y += 36f; y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab1, PlanetPatch.PlayerActionsInGlobeViewEnabled, "Enable player actions in globe view"); MyCheckBox.CreateCheckBox(x, y, tab2, FactoryPatch.LargerAreaForTerraformEnabled, "Larger area for terraform");
y += 36f; y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab1, PlayerPatch.EnhancedMechaForgeCountControlEnabled, "Enhanced count control for hand-make"); MyCheckBox.CreateCheckBox(x, y, tab2, PlanetPatch.PlayerActionsInGlobeViewEnabled, "Enable player actions in globe view");
y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab2, PlayerPatch.EnhancedMechaForgeCountControlEnabled, "Enhanced count control for hand-make");
x = 240f; x = 240f;
y += 6f; y += 6f;
MyWindow.AddTipsButton(x, y, tab1, "Enhanced count control for hand-make", "Enhanced count control for hand-make tips", "enhanced-count-control-tips"); MyWindow.AddTipsButton(x, y, tab2, "Enhanced count control for hand-make", "Enhanced count control for hand-make tips", "enhanced-count-control-tips");
x = 0f;
y += 30f;
MyCheckBox.CreateCheckBox(x, y, tab1, DysonSpherePatch.StopEjectOnNodeCompleteEnabled, "Stop ejectors when available nodes are all filled up");
y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab1, DysonSpherePatch.OnlyConstructNodesEnabled, "Construct only nodes but frames");
x = 400f; x = 400f;
y = 10f; y = 10f;
wnd.AddButton(x, y, tab1, "Initialize This Planet", 16, "button-init-planet", () => { PlanetFunctions.RecreatePlanet(true); }); wnd.AddButton(x, y, tab2, "Initialize This Planet", 16, "button-init-planet", () => { PlanetFunctions.RecreatePlanet(true); });
y += 36f; y += 36f;
wnd.AddButton(x, y, tab1, "Dismantle All Buildings", 16, "button-dismantle-all", () => { PlanetFunctions.DismantleAll(false); }); wnd.AddButton(x, y, tab2, "Dismantle All Buildings", 16, "button-dismantle-all", () => { PlanetFunctions.DismantleAll(false); });
var tab3 = wnd.AddTab(trans, "Dyson Sphere");
x = 0f;
y = 10f;
MyCheckBox.CreateCheckBox(x, y, tab3, DysonSpherePatch.StopEjectOnNodeCompleteEnabled, "Stop ejectors when available nodes are all filled up");
y += 36f; y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab3, DysonSpherePatch.OnlyConstructNodesEnabled, "Construct only nodes but frames");
x = 400f;
y = 10f;
wnd.AddButton(x, y, tab3, "Initialize Dyson Sphere", 16, "init-dyson-sphere", () => { DysonSpherePatch.InitCurrentDysonSphere(-1); });
y += 36f; y += 36f;
wnd.AddButton(x, y, tab1, "Initialize Dyson Sphere", 16, "init-dyson-sphere", () => { DysonSpherePatch.InitCurrentDysonSphere(-1); }); MyWindow.AddText(x, y, tab3, "Click to dismantle selected layer", 16, "text-dismantle-layer");
y += 36f;
MyWindow.AddText(x, y, tab1, "Click to dismantle selected layer", 16, "text-dismantle-layer");
y += 26f; y += 26f;
for (var i = 0; i < 10; i++) for (var i = 0; i < 10; i++)
{ {
var id = i + 1; var id = i + 1;
var btn = wnd.AddFlatButton(x, y, tab1, id.ToString(), 12, "dismantle-layer-" + id, () => { DysonSpherePatch.InitCurrentDysonSphere(id); }); var btn = wnd.AddFlatButton(x, y, tab3, id.ToString(), 12, "dismantle-layer-" + id, () => { DysonSpherePatch.InitCurrentDysonSphere(id); });
((RectTransform)btn.transform).sizeDelta = new Vector2(40f, 20f); ((RectTransform)btn.transform).sizeDelta = new Vector2(40f, 20f);
DysonLayerBtn[i] = btn; DysonLayerBtn[i] = btn;
if (i == 4) if (i == 4)
@@ -89,11 +106,7 @@ public static class UIConfigWindow
x += 40f; x += 40f;
} }
} }
x = 400f; _dysonTab = tab3;
y += 72f;
MyKeyBinder.CreateKeyBinder(x, y, tab1, UXAssist.Hotkey, "Hotkey");
_tab = tab1;
} }
private static void UpdateUI() private static void UpdateUI()
@@ -103,7 +116,7 @@ public static class UIConfigWindow
private static void UpdateDysonShells() private static void UpdateDysonShells()
{ {
if (!_tab.gameObject.activeSelf) return; if (!_dysonTab.gameObject.activeSelf) return;
var star = GameMain.localStar; var star = GameMain.localStar;
if (star != null) if (star != null)
{ {

View File

@@ -25,6 +25,12 @@ public class UXAssist : BaseUnityPlugin
private void Awake() private void Awake()
{ {
Hotkey = Config.Bind("General", "Shortcut", KeyboardShortcut.Deserialize("BackQuote + LeftAlt"), "Shortcut to open config window"); Hotkey = Config.Bind("General", "Shortcut", KeyboardShortcut.Deserialize("BackQuote + LeftAlt"), "Shortcut to open config window");
GamePatch.EnableWindowResizeEnabled = Config.Bind("Game", "EnableWindowResize", false,
"Enable game window resize (maximum box and thick frame)");
GamePatch.LoadLastWindowRectEnabled = Config.Bind("Game", "LoadLastWindowRect", false,
"Load last window position and size when game starts");
GamePatch.LastWindowRect = Config.Bind("Game", "LastWindowRect", new Vector4(0f, 0f, 0f, 0f),
"Last window position and size");
FactoryPatch.UnlimitInteractiveEnabled = Config.Bind("Factory", "UnlimitInteractive", false, FactoryPatch.UnlimitInteractiveEnabled = Config.Bind("Factory", "UnlimitInteractive", false,
"Unlimit interactive range"); "Unlimit interactive range");
FactoryPatch.RemoveSomeConditionEnabled = Config.Bind("Factory", "RemoveSomeBuildConditionCheck", false, FactoryPatch.RemoveSomeConditionEnabled = Config.Bind("Factory", "RemoveSomeBuildConditionCheck", false,
@@ -55,6 +61,7 @@ public class UXAssist : BaseUnityPlugin
MyWindowManager.Init(); MyWindowManager.Init();
UIConfigWindow.Init(); UIConfigWindow.Init();
GamePatch.Init();
FactoryPatch.Init(); FactoryPatch.Init();
PlanetPatch.Init(); PlanetPatch.Init();
PlayerPatch.Init(); PlayerPatch.Init();
@@ -67,6 +74,7 @@ public class UXAssist : BaseUnityPlugin
PlayerPatch.Uninit(); PlayerPatch.Uninit();
PlanetPatch.Uninit(); PlanetPatch.Uninit();
FactoryPatch.Uninit(); FactoryPatch.Uninit();
GamePatch.Uninit();
MyWindowManager.Uninit(); MyWindowManager.Uninit();
_patch?.UnpatchSelf(); _patch?.UnpatchSelf();

View File

@@ -4,7 +4,7 @@
<TargetFramework>net472</TargetFramework> <TargetFramework>net472</TargetFramework>
<BepInExPluginGuid>org.soardev.uxassist</BepInExPluginGuid> <BepInExPluginGuid>org.soardev.uxassist</BepInExPluginGuid>
<Description>DSP MOD - UXAssist</Description> <Description>DSP MOD - UXAssist</Description>
<Version>1.0.1</Version> <Version>1.0.2</Version>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
<PackageId>UXAssist</PackageId> <PackageId>UXAssist</PackageId>

View File

@@ -1,6 +1,6 @@
{ {
"name": "UXAssist", "name": "UXAssist",
"version_number": "1.0.1", "version_number": "1.0.2",
"website_url": "https://github.com/soarqin/DSP_Mods/tree/master/UXAssist", "website_url": "https://github.com/soarqin/DSP_Mods/tree/master/UXAssist",
"description": "Some functions and patches for better user experience / 一些提升用户体验的功能和补丁", "description": "Some functions and patches for better user experience / 一些提升用户体验的功能和补丁",
"dependencies": [ "dependencies": [

View File

@@ -4,6 +4,8 @@
#### 宇宙生成参数调节 #### 宇宙生成参数调节
## Changelog ## Changelog
* 1.2.1
+ Use new tab layout of UXAssist 1.0.2
* 1.2.0 * 1.2.0
+ Depends on [UXAssist](https://dsp.thunderstore.io/package/soarqin/UXAssist/) now. + Depends on [UXAssist](https://dsp.thunderstore.io/package/soarqin/UXAssist/) now.
+ Add `Birth star` options + Add `Birth star` options
@@ -18,8 +20,8 @@
## Features ## Features
* Depends on [UXAssist](https://dsp.thunderstore.io/package/soarqin/UXAssist/), all tabs around with '+' are options for this mod. * Depends on [UXAssist](https://dsp.thunderstore.io/package/soarqin/UXAssist/), all tabs around with '+' are options for this mod.
* More options on universe generation * More options on universe generation
* Can set maximum star count(128 by default, up to 1024) in config file. + Can set maximum star count(128 by default, up to 1024) in config file.
+ Note: there is performance issue on galaxy view with large amount of stars. - Note: there is performance issue on galaxy view with large amount of stars.
* Epic difficulty * Epic difficulty
* 0.01x resources and 0.25x oils (very hard difficulty has 0.5x oils). * 0.01x resources and 0.25x oils (very hard difficulty has 0.5x oils).
* Same oil mining speed as very hard difficuly * Same oil mining speed as very hard difficuly
@@ -29,6 +31,8 @@
* High luminosity for birth star * High luminosity for birth star
## 更新日志 ## 更新日志
* 1.2.1
+ 使用UXAssist 1.0.2的新页签布局
* 1.2.0 * 1.2.0
+ 现在依赖于[UXAssist](https://dsp.thunderstore.io/package/soarqin/UXAssist/) + 现在依赖于[UXAssist](https://dsp.thunderstore.io/package/soarqin/UXAssist/)
+ 增加`母星系`选项 + 增加`母星系`选项
@@ -43,8 +47,8 @@
## 功能 ## 功能
* 依赖于[UXAssist](https://dsp.thunderstore.io/package/soarqin/UXAssist/),所有带有'+'的页签都是本mod的选项 * 依赖于[UXAssist](https://dsp.thunderstore.io/package/soarqin/UXAssist/),所有带有'+'的页签都是本mod的选项
* 生成宇宙时提供更多选项 * 生成宇宙时提供更多选项
* 可以在配置文件中设置最大恒星数(默认128, 最多1024) +可以在配置文件中设置最大恒星数(默认128, 最多1024)
+ 注意: 大量恒星会导致宇宙视图出现性能问题 - 注意: 大量恒星会导致宇宙视图出现性能问题
* 史诗难度 * 史诗难度
* 资源0.01倍油井储量0.25倍(极难是0.5倍) * 资源0.01倍油井储量0.25倍(极难是0.5倍)
* 采油速度和极难相同 * 采油速度和极难相同

View File

@@ -10,7 +10,8 @@ public static class UIConfigWindow
public static void Init() public static void Init()
{ {
I18N.Add("GalaxyGen", "+UniverseGen+", "+宇宙生成+"); I18N.Add("UniverseGen", "UniverseGen", "宇宙生成");
I18N.Add("Birth Star", "Birth Star", "母星系");
I18N.Add("Enable more settings on UniverseGen", "Enable more settings on UniverseGen", "启用更多宇宙生成设置"); I18N.Add("Enable more settings on UniverseGen", "Enable more settings on UniverseGen", "启用更多宇宙生成设置");
I18N.Add("* Requires game restart to take effect", "* Requires game restart to take effect", "* 需要重启游戏才能生效"); I18N.Add("* Requires game restart to take effect", "* Requires game restart to take effect", "* 需要重启游戏才能生效");
I18N.Add("Maximum star count", "Maximum star count", "最大恒星数"); I18N.Add("Maximum star count", "Maximum star count", "最大恒星数");
@@ -37,32 +38,34 @@ public static class UIConfigWindow
// General tab // General tab
var x = 0f; var x = 0f;
var y = 10f; var y = 10f;
var tab = wnd.AddTab(_windowTrans, "GalaxyGen"); wnd.AddSplitter(trans, 10f);
MyCheckBox.CreateCheckBox(x, y, tab, MoreSettings.Enabled, "Enable more settings on UniverseGen"); wnd.AddTabGroup(trans, "UniverseGen", "tab-group-galaxygen");
var tab1 = wnd.AddTab(_windowTrans, "General");
MyCheckBox.CreateCheckBox(x, y, tab1, MoreSettings.Enabled, "Enable more settings on UniverseGen");
x += 20f; x += 20f;
y += 26f; y += 26f;
MyWindow.AddText(x, y, tab, "* Requires game restart to take effect", 13); MyWindow.AddText(x, y, tab1, "* Requires game restart to take effect", 13);
x -= 20f; x -= 20f;
y += 36f; y += 36f;
x += 10f; x += 10f;
MyWindow.AddText(x, y, tab, "Maximum star count", 16); MyWindow.AddText(x, y, tab1, "Maximum star count", 16);
x += 20f; x += 20f;
y += 26f; y += 26f;
var sl0 = MySlider.CreateSlider(x, y, tab, MoreSettings.MaxStarCount.Value, 64f, 1024f, "G", 240f); var sl0 = MySlider.CreateSlider(x, y, tab1, MoreSettings.MaxStarCount.Value, 64f, 1024f, "G", 240f);
sl0.OnValueChanged += () => sl0.OnValueChanged += () =>
{ {
sl0.Value = MoreSettings.MaxStarCount.Value = (Mathf.RoundToInt(sl0.Value) + 7) & ~7; sl0.Value = MoreSettings.MaxStarCount.Value = (Mathf.RoundToInt(sl0.Value) + 7) & ~7;
}; };
x -= 30f; x -= 30f;
y += 36f; y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab, EpicDifficulty.Enabled, "Enable Epic difficulty"); MyCheckBox.CreateCheckBox(x, y, tab1, EpicDifficulty.Enabled, "Enable Epic difficulty");
y += 36f; y += 36f;
x += 10f; x += 10f;
MyWindow.AddText(x, y, tab, "Resource multiplier", 16); MyWindow.AddText(x, y, tab1, "Resource multiplier", 16);
x += 20f; x += 20f;
y += 26f; y += 26f;
var index = EpicDifficulty.ResourceMultiplierToIndex(EpicDifficulty.ResourceMultiplier.Value); var index = EpicDifficulty.ResourceMultiplierToIndex(EpicDifficulty.ResourceMultiplier.Value);
var sl1 = MySlider.CreateSlider(x, y, tab, index, 0f, (float)EpicDifficulty.ResourceMultipliersCount() - 1, "G", 240f); var sl1 = MySlider.CreateSlider(x, y, tab1, index, 0f, (float)EpicDifficulty.ResourceMultipliersCount() - 1, "G", 240f);
sl1.SetLabelText(EpicDifficulty.IndexToResourceMultiplier(Mathf.RoundToInt(sl1.Value)).ToString(sl1.labelFormat)); sl1.SetLabelText(EpicDifficulty.IndexToResourceMultiplier(Mathf.RoundToInt(sl1.Value)).ToString(sl1.labelFormat));
sl1.OnValueChanged += () => sl1.OnValueChanged += () =>
{ {
@@ -73,11 +76,11 @@ public static class UIConfigWindow
x -= 30f; x -= 30f;
y += 31f; y += 31f;
x += 10f; x += 10f;
MyWindow.AddText(x, y, tab, "Oil multiplier (relative to Very Hard)", 16); MyWindow.AddText(x, y, tab1, "Oil multiplier (relative to Very Hard)", 16);
x += 20f; x += 20f;
y += 26f; y += 26f;
index = EpicDifficulty.OilMultiplierToIndex(EpicDifficulty.OilMultiplier.Value); index = EpicDifficulty.OilMultiplierToIndex(EpicDifficulty.OilMultiplier.Value);
var sl2 = MySlider.CreateSlider(x, y, tab, index, 0f, (float)EpicDifficulty.OilMultipliersCount() - 1, "G", 240f); var sl2 = MySlider.CreateSlider(x, y, tab1, index, 0f, (float)EpicDifficulty.OilMultipliersCount() - 1, "G", 240f);
sl2.SetLabelText(EpicDifficulty.IndexToOilMultiplier(Mathf.RoundToInt(sl2.Value)).ToString(sl2.labelFormat)); sl2.SetLabelText(EpicDifficulty.IndexToOilMultiplier(Mathf.RoundToInt(sl2.Value)).ToString(sl2.labelFormat));
sl2.OnValueChanged += () => sl2.OnValueChanged += () =>
{ {
@@ -85,26 +88,28 @@ public static class UIConfigWindow
EpicDifficulty.OilMultiplier.Value = val; EpicDifficulty.OilMultiplier.Value = val;
sl2.SetLabelText(val.ToString(sl2.labelFormat)); sl2.SetLabelText(val.ToString(sl2.labelFormat));
}; };
var tab2 = wnd.AddTab(_windowTrans, "Birth Star");
x = 0f;
y = 10f;
MyCheckBox.CreateCheckBox(x, y, tab2, BirthPlanetPatch.SitiVeinsOnBirthPlanet, "Silicon/Titanium on birth planet");
y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab2, BirthPlanetPatch.FireIceOnBirthPlanet, "Fire ice on birth planet");
y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab2, BirthPlanetPatch.KimberliteOnBirthPlanet, "Kimberlite on birth planet");
y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab2, BirthPlanetPatch.FractalOnBirthPlanet, "Fractal silicon on birth planet");
y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab2, BirthPlanetPatch.OrganicOnBirthPlanet, "Organic crystal on birth planet");
y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab2, BirthPlanetPatch.OpticalOnBirthPlanet, "Optical grating crystal on birth planet");
y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab2, BirthPlanetPatch.SpiniformOnBirthPlanet, "Spiniform stalagmite crystal on birth planet");
y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab2, BirthPlanetPatch.UnipolarOnBirthPlanet, "Unipolar magnet on birth planet");
x = 300f; x = 300f;
y = 10f; y = 10f;
MyCheckBox.CreateCheckBox(x, y, tab, BirthPlanetPatch.SitiVeinsOnBirthPlanet, "Silicon/Titanium on birth planet"); MyCheckBox.CreateCheckBox(x, y, tab2, BirthPlanetPatch.FlatBirthPlanet, "Birth planet is solid flat (no water at all)");
y += 36f; y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab, BirthPlanetPatch.FireIceOnBirthPlanet, "Fire ice on birth planet"); MyCheckBox.CreateCheckBox(x, y, tab2, BirthPlanetPatch.HighLuminosityBirthStar, "Birth star has high luminosity");
y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab, BirthPlanetPatch.KimberliteOnBirthPlanet, "Kimberlite on birth planet");
y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab, BirthPlanetPatch.FractalOnBirthPlanet, "Fractal silicon on birth planet");
y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab, BirthPlanetPatch.OrganicOnBirthPlanet, "Organic crystal on birth planet");
y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab, BirthPlanetPatch.OpticalOnBirthPlanet, "Optical grating crystal on birth planet");
y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab, BirthPlanetPatch.SpiniformOnBirthPlanet, "Spiniform stalagmite crystal on birth planet");
y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab, BirthPlanetPatch.UnipolarOnBirthPlanet, "Unipolar magnet on birth planet");
y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab, BirthPlanetPatch.FlatBirthPlanet, "Birth planet is solid flat (no water at all)");
y += 36f;
MyCheckBox.CreateCheckBox(x, y, tab, BirthPlanetPatch.HighLuminosityBirthStar, "Birth star has high luminosity");
} }
} }

View File

@@ -6,7 +6,7 @@
<AssemblyName>UniverseGenTweaks</AssemblyName> <AssemblyName>UniverseGenTweaks</AssemblyName>
<BepInExPluginGuid>org.soardev.universegentweaks</BepInExPluginGuid> <BepInExPluginGuid>org.soardev.universegentweaks</BepInExPluginGuid>
<Description>DSP MOD - UniverseGenTweaks</Description> <Description>DSP MOD - UniverseGenTweaks</Description>
<Version>1.2.0</Version> <Version>1.2.1</Version>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<LangVersion>latest</LangVersion> <LangVersion>latest</LangVersion>
</PropertyGroup> </PropertyGroup>

View File

@@ -1,10 +1,10 @@
{ {
"name": "UniverseGenTweaks", "name": "UniverseGenTweaks",
"version_number": "1.2.0", "version_number": "1.2.1",
"website_url": "https://github.com/soarqin/DSP_Mods/tree/master/UniverseGenTweaks", "website_url": "https://github.com/soarqin/DSP_Mods/tree/master/UniverseGenTweaks",
"description": "Universe Generation Tweaks / 宇宙生成参数调节", "description": "Universe Generation Tweaks / 宇宙生成参数调节",
"dependencies": [ "dependencies": [
"xiaoye97-BepInEx-5.4.17", "xiaoye97-BepInEx-5.4.17",
"soarqin-UXAssist-1.0.0" "soarqin-UXAssist-1.0.2"
] ]
} }