]> localhost Git - radev.git/commitdiff
Add initial OSFE proposal sources
authormisomosi <[email protected]>
Mon, 18 May 2026 06:59:20 +0000 (02:59 -0400)
committermisomosi <[email protected]>
Mon, 18 May 2026 06:59:20 +0000 (02:59 -0400)
OSFE/.gitignore [new file with mode: 0644]
OSFE/README.md [new file with mode: 0644]
OSFE/RetroAchievements.cs [new file with mode: 0644]
OSFE/RetroAchievements.csproj [new file with mode: 0644]
OSFE/WorkshopItemInfo.xml [new file with mode: 0644]
OSFE/workshopIcon.png [new file with mode: 0644]

diff --git a/OSFE/.gitignore b/OSFE/.gitignore
new file mode 100644 (file)
index 0000000..5e82362
--- /dev/null
@@ -0,0 +1,4 @@
+# Don't distribute the copyrighted game DLLs, make modders provide their own\r
+lib/*.dll\r
+bin/\r
+obj/\r
diff --git a/OSFE/README.md b/OSFE/README.md
new file mode 100644 (file)
index 0000000..c3f2f97
--- /dev/null
@@ -0,0 +1,29 @@
+# One Step from Eden Standalone
+
+Proposal for Standalone Support for One Step from Eden
+
+## One Step from Eden Modding Intro
+
+One Step from Eden supports mods via LibHarmony and the Steam workshop
+
+LibHarmony allows you to patch a large variety of things in the
+C# application it is loaded in, and we can use this to essentially
+patch any method or class that we would like to patch.
+
+## Hardcore Implementation
+
+There are two methods to install mods. One is through the Steam Workshop
+and the other is through the local Mods folder.
+
+The local mods are always loaded and they are loaded before Steam Workshop mods.
+They can also be assigned a priority to prefer some local mods over others.
+
+Steam workshop mods can be toggled active or inactive and they can be also be assigned a priority.
+Most mods assign a priority of 0, some have a higher finite value (i.e. MoreLuaPower uses 1000).
+
+RetroAchievements must load before any other mod to enforce hardcore mode restrictions,
+so we should assign ourselves a priority of "+Infinity" and check that there are no local
+mods installed (we should be a Steam workshop mod) and that all other mods have finite priorities.
+
+Of course, anyone could cheat and load before us and mess with this process, but it's
+useful to prevent accidental mod loading and make it a bit harder for people to cheat.
diff --git a/OSFE/RetroAchievements.cs b/OSFE/RetroAchievements.cs
new file mode 100644 (file)
index 0000000..dd96cb5
--- /dev/null
@@ -0,0 +1,33 @@
+using HarmonyLib;\r
+using System.IO;\r
+using UnityEngine;\r
+\r
+// We don't actually care much about hooking LoadItemData, but it's\r
+// called soon after mods are loaded, so it gives us an early entrypoint\r
+[HarmonyPatch(typeof(ItemManager), "LoadItemData")]\r
+internal class EntryPoint\r
+{\r
+       // TODO:\r
+       // If we are in hardcore mode, do a basic check to make sure no other mods are loaded.\r
+       // This is a clientside check, so there's only so much we can do, but make a good effort\r
+       // to prevent accidents and require at least some hacking knowledge to cheat.\r
+       // * This is a steam workshop project, so ensure Mods folder is empty (Those mods loaded unconditionally, first)\r
+       // * Make sure we have a priority of Infinity\r
+       // * Make sure all other Steam workshop projects have a finite priority\r
+       static EntryPoint()\r
+       {\r
+               Debug.Log("Hello World!");\r
+       } \r
+       static void Prefix() {}\r
+}\r
+\r
+[HarmonyPatch(typeof(ModCtrl), "_InstallTheseMods")]\r
+internal class InstallTheseMods_patch\r
+{\r
+       // TODO: Allow loading of mods in softcore\r
+       static bool Prefix(FileInfo[] fileInfo, string modsDir)\r
+       {\r
+               Debug.Log("Nope! Can't install any more mods! Not allowed!");\r
+               return false;\r
+       }\r
+}\r
diff --git a/OSFE/RetroAchievements.csproj b/OSFE/RetroAchievements.csproj
new file mode 100644 (file)
index 0000000..7542c9e
--- /dev/null
@@ -0,0 +1,116 @@
+<Project Sdk="Microsoft.NET.Sdk">\r
+\r
+  <PropertyGroup>\r
+    <LangVersion>9.0</LangVersion>\r
+    <TargetFramework>net452</TargetFramework>\r
+    <NoDefaultLib>true</NoDefaultLib>\r
+    <NoStdLib>true</NoStdLib>\r
+  </PropertyGroup>\r
+\r
+  <ItemGroup>\r
+    <Reference Include="LibHarmony"><HintPath>lib/0Harmony.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="Assembly-CSharp-firstpass"><HintPath>lib/Assembly-CSharp-firstpass.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="Assembly-CSharp"><HintPath>lib/Assembly-CSharp.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="E7.Introloop"><HintPath>lib/E7.Introloop.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="GalaxyCSharp"><HintPath>lib/GalaxyCSharp.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="Mono.Posix"><HintPath>lib/Mono.Posix.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="Mono.Security"><HintPath>lib/Mono.Security.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="Rewired_Core"><HintPath>lib/Rewired_Core.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="Rewired_Windows"><HintPath>lib/Rewired_Windows.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="Sirenix.OdinInspector.Attributes"><HintPath>lib/Sirenix.OdinInspector.Attributes.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="Sirenix.OdinInspector.CompatibilityLayer"><HintPath>lib/Sirenix.OdinInspector.CompatibilityLayer.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="Sirenix.Serialization.AOTGenerated"><HintPath>lib/Sirenix.Serialization.AOTGenerated.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="Sirenix.Serialization.Config"><HintPath>lib/Sirenix.Serialization.Config.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="Sirenix.Serialization"><HintPath>lib/Sirenix.Serialization.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="Sirenix.Utilities"><HintPath>lib/Sirenix.Utilities.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="SonicBloom.Koreo"><HintPath>lib/SonicBloom.Koreo.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="SonyNP"><HintPath>lib/SonyNP.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="SonyPS4CommonDialog"><HintPath>lib/SonyPS4CommonDialog.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="SonyPS4SaveData"><HintPath>lib/SonyPS4SaveData.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="System.Configuration"><HintPath>lib/System.Configuration.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="System.Core"><HintPath>lib/System.Core.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="System.Data"><HintPath>lib/System.Data.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="System.Drawing"><HintPath>lib/System.Drawing.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="System.EnterpriseServices"><HintPath>lib/System.EnterpriseServices.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="System.Net.Http"><HintPath>lib/System.Net.Http.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="System.Numerics"><HintPath>lib/System.Numerics.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="System.Runtime.Serialization"><HintPath>lib/System.Runtime.Serialization.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="System.Security"><HintPath>lib/System.Security.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="System.ServiceModel.Internals"><HintPath>lib/System.ServiceModel.Internals.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="System.Transactions"><HintPath>lib/System.Transactions.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="System.Xml.Linq"><HintPath>lib/System.Xml.Linq.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="System.Xml"><HintPath>lib/System.Xml.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="System"><HintPath>lib/System.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="TwitchLib.Unity"><HintPath>lib/TwitchLib.Unity.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="Unity.Analytics.DataPrivacy"><HintPath>lib/Unity.Analytics.DataPrivacy.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="Unity.Analytics.StandardEvents"><HintPath>lib/Unity.Analytics.StandardEvents.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="Unity.Analytics.Tracker"><HintPath>lib/Unity.Analytics.Tracker.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="Unity.TextMeshPro"><HintPath>lib/Unity.TextMeshPro.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.AIModule"><HintPath>lib/UnityEngine.AIModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.ARModule"><HintPath>lib/UnityEngine.ARModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.AccessibilityModule"><HintPath>lib/UnityEngine.AccessibilityModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.AnimationModule"><HintPath>lib/UnityEngine.AnimationModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.AssetBundleModule"><HintPath>lib/UnityEngine.AssetBundleModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.AudioModule"><HintPath>lib/UnityEngine.AudioModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.BaselibModule"><HintPath>lib/UnityEngine.BaselibModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.ClothModule"><HintPath>lib/UnityEngine.ClothModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.ClusterInputModule"><HintPath>lib/UnityEngine.ClusterInputModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.ClusterRendererModule"><HintPath>lib/UnityEngine.ClusterRendererModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.CoreModule"><HintPath>lib/UnityEngine.CoreModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.CrashReportingModule"><HintPath>lib/UnityEngine.CrashReportingModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.DirectorModule"><HintPath>lib/UnityEngine.DirectorModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.FileSystemHttpModule"><HintPath>lib/UnityEngine.FileSystemHttpModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.GameCenterModule"><HintPath>lib/UnityEngine.GameCenterModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.GridModule"><HintPath>lib/UnityEngine.GridModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.HotReloadModule"><HintPath>lib/UnityEngine.HotReloadModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.IMGUIModule"><HintPath>lib/UnityEngine.IMGUIModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.ImageConversionModule"><HintPath>lib/UnityEngine.ImageConversionModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.InputModule"><HintPath>lib/UnityEngine.InputModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.JSONSerializeModule"><HintPath>lib/UnityEngine.JSONSerializeModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.LocalizationModule"><HintPath>lib/UnityEngine.LocalizationModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.Networking"><HintPath>lib/UnityEngine.Networking.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.ParticleSystemModule"><HintPath>lib/UnityEngine.ParticleSystemModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.PerformanceReportingModule"><HintPath>lib/UnityEngine.PerformanceReportingModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.Physics2DModule"><HintPath>lib/UnityEngine.Physics2DModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.PhysicsModule"><HintPath>lib/UnityEngine.PhysicsModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.ProfilerModule"><HintPath>lib/UnityEngine.ProfilerModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.ScreenCaptureModule"><HintPath>lib/UnityEngine.ScreenCaptureModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.SharedInternalsModule"><HintPath>lib/UnityEngine.SharedInternalsModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.SpatialTracking"><HintPath>lib/UnityEngine.SpatialTracking.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.SpriteMaskModule"><HintPath>lib/UnityEngine.SpriteMaskModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.SpriteShapeModule"><HintPath>lib/UnityEngine.SpriteShapeModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.StreamingModule"><HintPath>lib/UnityEngine.StreamingModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.StyleSheetsModule"><HintPath>lib/UnityEngine.StyleSheetsModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.SubstanceModule"><HintPath>lib/UnityEngine.SubstanceModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.TLSModule"><HintPath>lib/UnityEngine.TLSModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.TerrainModule"><HintPath>lib/UnityEngine.TerrainModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.TerrainPhysicsModule"><HintPath>lib/UnityEngine.TerrainPhysicsModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.TextCoreModule"><HintPath>lib/UnityEngine.TextCoreModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.TextRenderingModule"><HintPath>lib/UnityEngine.TextRenderingModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.TilemapModule"><HintPath>lib/UnityEngine.TilemapModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.Timeline"><HintPath>lib/UnityEngine.Timeline.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.TimelineModule"><HintPath>lib/UnityEngine.TimelineModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.UI"><HintPath>lib/UnityEngine.UI.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.UIElementsModule"><HintPath>lib/UnityEngine.UIElementsModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.UIModule"><HintPath>lib/UnityEngine.UIModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.UNETModule"><HintPath>lib/UnityEngine.UNETModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.UmbraModule"><HintPath>lib/UnityEngine.UmbraModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.UnityAnalyticsModule"><HintPath>lib/UnityEngine.UnityAnalyticsModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.UnityConnectModule"><HintPath>lib/UnityEngine.UnityConnectModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.UnityTestProtocolModule"><HintPath>lib/UnityEngine.UnityTestProtocolModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.UnityWebRequestAssetBundleModule"><HintPath>lib/UnityEngine.UnityWebRequestAssetBundleModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.UnityWebRequestAudioModule"><HintPath>lib/UnityEngine.UnityWebRequestAudioModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.UnityWebRequestModule"><HintPath>lib/UnityEngine.UnityWebRequestModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.UnityWebRequestTextureModule"><HintPath>lib/UnityEngine.UnityWebRequestTextureModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.UnityWebRequestWWWModule"><HintPath>lib/UnityEngine.UnityWebRequestWWWModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.VFXModule"><HintPath>lib/UnityEngine.VFXModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.VRModule"><HintPath>lib/UnityEngine.VRModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.VehiclesModule"><HintPath>lib/UnityEngine.VehiclesModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.VideoModule"><HintPath>lib/UnityEngine.VideoModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.WindModule"><HintPath>lib/UnityEngine.WindModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine.XRModule"><HintPath>lib/UnityEngine.XRModule.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="UnityEngine"><HintPath>lib/UnityEngine.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="com.rlabrecque.steamworks.net"><HintPath>lib/com.rlabrecque.steamworks.net.dll</HintPath><Private>False</Private></Reference>\r
+    <Reference Include="mscorlib"><HintPath>lib/mscorlib.dll</HintPath><Private>False</Private></Reference>\r
+  </ItemGroup>\r
+</Project>\r
diff --git a/OSFE/WorkshopItemInfo.xml b/OSFE/WorkshopItemInfo.xml
new file mode 100644 (file)
index 0000000..12e28bf
--- /dev/null
@@ -0,0 +1,8 @@
+<WorkshopItemInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+       <name>RetroAchievements</name>
+       <Description>Integrate with RetroAchievements</Description>
+       <Tags/>
+       <Priority>+Infinity</Priority>
+       <ModVersion>0</ModVersion>
+       <GameVersion>1.3</GameVersion>
+</WorkshopItemInfo>
diff --git a/OSFE/workshopIcon.png b/OSFE/workshopIcon.png
new file mode 100644 (file)
index 0000000..7f4398b
Binary files /dev/null and b/OSFE/workshopIcon.png differ