initial commit

master
t0stiman 2023-11-15 17:00:06 +01:00
commit 711f8433ca
10 changed files with 765 additions and 0 deletions

396
.gitignore vendored Normal file
View File

@ -0,0 +1,396 @@
# Local reference configuration
Directory.Build.targets
# Local preferences
.vscode/
# Packaging directories
[Bb]uild/
[Dd]ist/
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Oo]ut/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
## JetBrains Rider
# User-specific stuff
.idea/
*.iml
*.ipr
# File-based project format
*.iws
# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*
# KDE directory preferences
.directory
# Linux trash folder which might appear on any partition or disk
.Trash-*
# .nfs files are created when an open file is removed but is still being accessed
.nfs*

11
README.md Normal file
View File

@ -0,0 +1,11 @@
todo
## Installation instructions
todo
## Credits
This mod's code is based on the mod '[Dumb S282 Tweaks](https://github.com/aeughsendhelp/dumb282tweaks)' by [ÆUGH](https://github.com/aeughsendhelp).
todo model

25
dv_locofaces.sln Normal file
View File

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.5.33627.172
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dv_locofaces", "dv_locofaces\dv_locofaces.csproj", "{29798D2A-7139-4E0D-A6A3-3FFA9E7E5611}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{29798D2A-7139-4E0D-A6A3-3FFA9E7E5611}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{29798D2A-7139-4E0D-A6A3-3FFA9E7E5611}.Debug|Any CPU.Build.0 = Debug|Any CPU
{29798D2A-7139-4E0D-A6A3-3FFA9E7E5611}.Release|Any CPU.ActiveCfg = Release|Any CPU
{29798D2A-7139-4E0D-A6A3-3FFA9E7E5611}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {C1C9BDE2-F852-4FB2-9E3F-0745754DA0EC}
EndGlobalSection
EndGlobal

View File

@ -0,0 +1,124 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<AssemblyName>dv_locofaces</AssemblyName>
<TargetFramework>net48</TargetFramework>
<LangVersion>latest</LangVersion>
<Nullable>disable</Nullable>
<WarningsAsErrors>CS8600;CS8602;CS8603</WarningsAsErrors>
</PropertyGroup>
<!-- Mod Loader -->
<ItemGroup>
<PackageReference Include="UnityModManager" Version="0.27.2" />
</ItemGroup>
<!-- Null Checking -->
<ItemGroup>
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
</ItemGroup>
<ItemGroup>
<!-- Derail Valley -->
<Reference Include="0Harmony" />
<Reference Include="Assembly-CSharp" />
<Reference Include="DV.BrakeSystem" />
<Reference Include="DV.Common" />
<Reference Include="DV.ControllerAnchors" />
<Reference Include="DV.Highlighting" />
<Reference Include="DV.Interaction" />
<Reference Include="DV.Inventory" />
<Reference Include="DV.Localization" />
<Reference Include="DV.NAudio" />
<Reference Include="DV.PointSet" />
<Reference Include="DV.RadioPlayer" />
<Reference Include="DV.Scenarios.CRUD" />
<Reference Include="DV.Simulation" />
<Reference Include="DV.Telemetry" />
<Reference Include="DV.TerrainSystem" />
<Reference Include="DV.TerrainTools" />
<Reference Include="DV.ThingTypes" />
<Reference Include="DV.UI" />
<Reference Include="DV.UIFramework" />
<Reference Include="DV.UserManagement" />
<Reference Include="DV.Utils" />
<Reference Include="DV.WeatherSystem" />
<!-- Unity -->
<Reference Include="UnityEngine" />
<Reference Include="UnityEngine.AccessibilityModule" />
<Reference Include="UnityEngine.AIModule" />
<Reference Include="UnityEngine.AndroidJNIModule" />
<Reference Include="UnityEngine.AnimationModule" />
<Reference Include="UnityEngine.ARModule" />
<Reference Include="UnityEngine.AssetBundleModule" />
<Reference Include="UnityEngine.AudioModule" />
<Reference Include="UnityEngine.ClothModule" />
<Reference Include="UnityEngine.ClusterInputModule" />
<Reference Include="UnityEngine.ClusterRendererModule" />
<Reference Include="UnityEngine.CoreModule" />
<Reference Include="UnityEngine.CrashReportingModule" />
<Reference Include="UnityEngine.DirectorModule" />
<Reference Include="UnityEngine.DSPGraphModule" />
<Reference Include="UnityEngine.GameCenterModule" />
<Reference Include="UnityEngine.GridModule" />
<Reference Include="UnityEngine.HotReloadModule" />
<Reference Include="UnityEngine.ImageConversionModule" />
<Reference Include="UnityEngine.IMGUIModule" />
<Reference Include="UnityEngine.InputLegacyModule" />
<Reference Include="UnityEngine.InputModule" />
<Reference Include="UnityEngine.JSONSerializeModule" />
<Reference Include="UnityEngine.LocalizationModule" />
<Reference Include="UnityEngine.ParticleSystemModule" />
<Reference Include="UnityEngine.PerformanceReportingModule" />
<Reference Include="UnityEngine.Physics2DModule" />
<Reference Include="UnityEngine.PhysicsModule" />
<Reference Include="UnityEngine.ProfilerModule" />
<Reference Include="UnityEngine.ScreenCaptureModule" />
<Reference Include="UnityEngine.SharedInternalsModule" />
<Reference Include="UnityEngine.SpatialTracking" />
<Reference Include="UnityEngine.SpriteMaskModule" />
<Reference Include="UnityEngine.SpriteShapeModule" />
<Reference Include="UnityEngine.StreamingModule" />
<Reference Include="UnityEngine.SubstanceModule" />
<Reference Include="UnityEngine.SubsystemsModule" />
<Reference Include="UnityEngine.TerrainModule" />
<Reference Include="UnityEngine.TerrainPhysicsModule" />
<Reference Include="UnityEngine.TextCoreModule" />
<Reference Include="UnityEngine.TextRenderingModule" />
<Reference Include="UnityEngine.TilemapModule" />
<Reference Include="UnityEngine.TLSModule" />
<Reference Include="UnityEngine.UI" />
<Reference Include="UnityEngine.UIElementsModule" />
<Reference Include="UnityEngine.UIModule" />
<Reference Include="UnityEngine.UmbraModule" />
<Reference Include="UnityEngine.UNETModule" />
<Reference Include="UnityEngine.UnityAnalyticsModule" />
<Reference Include="UnityEngine.UnityConnectModule" />
<Reference Include="UnityEngine.UnityTestProtocolModule" />
<Reference Include="UnityEngine.UnityWebRequestAssetBundleModule" />
<Reference Include="UnityEngine.UnityWebRequestAudioModule" />
<Reference Include="UnityEngine.UnityWebRequestModule" />
<Reference Include="UnityEngine.UnityWebRequestTextureModule" />
<Reference Include="UnityEngine.UnityWebRequestWWWModule" />
<Reference Include="UnityEngine.VehiclesModule" />
<Reference Include="UnityEngine.VFXModule" />
<Reference Include="UnityEngine.VideoModule" />
<Reference Include="UnityEngine.VRModule" />
<Reference Include="UnityEngine.WindModule" />
<Reference Include="UnityEngine.XR.LegacyInputHelpers" />
<Reference Include="UnityEngine.XRModule" />
<Reference Include="UnityModManager" />
</ItemGroup>
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<!-- Copy to build folder -->
<Copy SourceFiles="$(TargetPath)" DestinationFolder="../build/" />
<!-- Package after Release build -->
<Exec Condition="'$(OS)' == 'Windows_NT'" Command="powershell -executionpolicy bypass ../package.ps1 -NoArchive -OutputDirectory 'D:\Programs\Derail Valley\Mods'" />
<!-- todo fix linux below-->
<!-- <Exec Condition="'$(ConfigurationName)' == 'Release' And '$(OS)' != 'Windows_NT'" Command="pwsh -Command &quot;(../package.ps1)&quot;" />-->
</Target>
</Project>

View File

@ -0,0 +1,66 @@
using DV.ThingTypes;
using HarmonyLib;
using UnityEngine;
namespace dv_locofaces
{
[HarmonyPatch(typeof(TrainCar), "Start")]
class CarPatch
{
static void Postfix(ref TrainCar __instance)
{
if (__instance == null)
{
return;
}
switch (__instance.carType)
{
case TrainCarType.LocoS060:
if (Main.MySettings.S060FaceEnabled) {
ApplyS060Face(ref __instance);
}
break;
case TrainCarType.LocoSteamHeavy:
ApplyS282Face(ref __instance);
break;
}
}
private static void ApplyS282Face(ref TrainCar trainCar)
{
switch (Main.MySettings.S282FaceType)
{
case Settings.S282Face.Gordon:
break;
case Settings.S282Face.Henry:
break;
}
}
private static void ApplyS060Face(ref TrainCar locomotive)
{
//hide smoke box door
var smokeboxDoorPath = "LocoS060_Body/Static/smokebox_door";
Transform smokeBoxDoor = locomotive.transform.Find(smokeboxDoorPath);
if (smokeBoxDoor == null)
{
Main.Error($"Couldn't find S060 smoke box door on '{locomotive.transform.gameObject.name}' -> {smokeboxDoorPath}");
return;
}
smokeBoxDoor.gameObject.SetActive(false);
//show face
var bodyPath = "LocoS060_Body/Static";
Transform body = locomotive.transform.Find(bodyPath);
if (body == null)
{
Main.Error($"Couldn't find S060 body on '{locomotive.transform.gameObject.name}' -> {bodyPath}");
return;
}
GameObject.Instantiate(Main.S060FaceObj, body);
}
}
}

62
dv_locofaces/src/Main.cs Normal file
View File

@ -0,0 +1,62 @@
using System;
using System.IO;
using System.Reflection;
using HarmonyLib;
using UnityModManagerNet;
using UnityEngine;
namespace dv_locofaces
{
[EnableReloading]
public static class Main
{
public static UnityModManager.ModEntry MyModEntry { get; private set; }
public static Settings MySettings { get; private set; }
public static GameObject S060FaceObj;
private static bool Load(UnityModManager.ModEntry modEntry)
{
try
{
MyModEntry = modEntry;
MySettings = UnityModManager.ModSettings.Load<Settings>(MyModEntry);
MyModEntry.OnGUI = entry => MySettings.Draw(entry);
MyModEntry.OnSaveGUI = entry => MySettings.Save(entry);
string bundlePath = Path.Combine(MyModEntry.Path, "bundles\\");
S060FaceObj = AssetBundle.LoadFromFile(Path.Combine(bundlePath, "s060face"))
.LoadAsset<GameObject>("assets/tobuild/s060face/s060face.prefab");
var harmony = new Harmony(MyModEntry.Info.Id);
harmony.PatchAll(Assembly.GetExecutingAssembly());
}
catch (Exception ex)
{
MyModEntry.Logger.LogException($"Failed to load {MyModEntry.Info.DisplayName}:", ex);
return false;
}
return true;
}
// Logger Commands
public static void Log(string message)
{
MyModEntry.Logger.Log(message);
}
public static void Warning(string message)
{
MyModEntry.Logger.Warning(message);
}
public static void Error(string message)
{
MyModEntry.Logger.Error(message);
}
}
}

View File

@ -0,0 +1,34 @@
using System;
using UnityEngine;
using UnityModManagerNet;
namespace dv_locofaces
{
public class Settings : UnityModManager.ModSettings
{
public bool S060FaceEnabled = true;
public enum S282Face
{
None,
Henry,
Gordon
}
public S282Face S282FaceType = S282Face.Gordon;
public void Draw(UnityModManager.ModEntry modEntry)
{
GUILayout.Label("S060");
S060FaceEnabled = GUILayout.Toggle(S060FaceEnabled, "Enable S060 face");
GUILayout.Label("S282");
S282FaceType = (S282Face) GUILayout.SelectionGrid((int)S282FaceType, Enum.GetNames(typeof(S282Face)), 1, "toggle");
}
public override void Save(UnityModManager.ModEntry modEntry)
{
Save(this, modEntry);
}
}
}

9
info.json Normal file
View File

@ -0,0 +1,9 @@
{
"Id": "dv_locofaces",
"Version": "0.0.1",
"DisplayName": "Locomotive faces",
"Author": "Tostiman",
"EntryMethod": "dv_locofaces.Main.Load",
"ManagerVersion": "0.27.3",
"Repository": "https://github.com/t0stiman/dv_locofaces/blob/main/repository.json"
}

29
package.ps1 Normal file
View File

@ -0,0 +1,29 @@
param (
[switch]$NoArchive,
[string]$OutputDirectory = $PSScriptRoot
)
Set-Location "$PSScriptRoot"
$FilesToInclude = "info.json","build/*","LICENSE","bundles"
$modInfo = Get-Content -Raw -Path "info.json" | ConvertFrom-Json
$modId = $modInfo.Id
$modVersion = $modInfo.Version
$DistDir = "$OutputDirectory/dist"
if ($NoArchive) {
$ZipWorkDir = "$OutputDirectory"
} else {
$ZipWorkDir = "$DistDir/tmp"
}
$ZipOutDir = "$ZipWorkDir/$modId"
New-Item "$ZipOutDir" -ItemType Directory -Force
Copy-Item -Force -Path $FilesToInclude -Destination "$ZipOutDir"
Copy-Item -Force -Path "bundles/*" -Destination "$ZipOutDir/bundles"
if (!$NoArchive)
{
$FILE_NAME = "$DistDir/${modId}_v$modVersion.zip"
Compress-Archive -Update -CompressionLevel Fastest -Path "$ZipOutDir/*" -DestinationPath "$FILE_NAME"
}

9
repository.json Normal file
View File

@ -0,0 +1,9 @@
{
"Releases": [
{
"Id": "dv_locofaces",
"Version": "0.0.1",
"DownloadUrl": "https://github.com/t0stiman/dv_locofaces/releases/download/0.0.1/dv_locofaces_v0.0.1.zip"
}
]
}