From 61a01665999a2e572c4f406db4957e4abf3ab80a Mon Sep 17 00:00:00 2001 From: Stone_Red <56473591+Stone-Red-Code@users.noreply.github.com> Date: Wed, 26 Jul 2023 19:36:42 +0200 Subject: [PATCH] Initial commit --- .gitattributes | 2 + .gitignore | 398 +++++++++++ LICENSE | 674 ++++++++++++++++++ README.md | 2 + StoneRed.LogicSimulator.sln | 25 + .../.config/dotnet-tools.json | 36 + StoneRed.LogicSimulator/Content/Content.mgcb | 22 + .../Content/ContextMenu.xmmp | 8 + .../Content/File.spritefont | 60 ++ .../Content/LoadingScreen.xmmp | 7 + .../Content/ManoloMono.ttf | Bin 0 -> 9232 bytes .../Content/QuickMenu.xmmp | 10 + .../Content/SettingsWindow.xmmp | 24 + .../Content/StartScreen.xmmp | 13 + .../Content/WorldScreen.xmmp | 21 + .../Content/stylesheet/ManoloMono.ttf | Bin 0 -> 9232 bytes .../Content/stylesheet/default_ui_skin.png | Bin 0 -> 103818 bytes .../Content/stylesheet/default_ui_skin.xmat | 110 +++ .../Content/stylesheet/default_ui_skin.xmms | 141 ++++ StoneRed.LogicSimulator/Icon.bmp | Bin 0 -> 262282 bytes StoneRed.LogicSimulator/Icon.ico | Bin 0 -> 147541 bytes StoneRed.LogicSimulator/Program.cs | 2 + .../Simulation/LogicGateSimulator.cs | 127 ++++ .../Simulation/LogicGates/Button.cs | 42 ++ .../Simulation/LogicGates/Clock.cs | 78 ++ .../LogicGates/Interfaces/IColorable.cs | 8 + .../LogicGates/Interfaces/IInteractable.cs | 10 + .../LogicGates/Interfaces/LogicGate.cs | 130 ++++ .../Simulation/LogicGates/Lamp.cs | 19 + .../LogicGates/LogicGateMetadata.cs | 13 + .../Simulation/LogicGates/Pin.cs | 18 + .../Simulation/LogicGates/Switch.cs | 46 ++ .../Simulation/LogicGates/TestLogicGate.cs | 20 + StoneRed.LogicSimulator/Srls.cs | 177 +++++ .../StoneRed.LogicSimulator.csproj | 75 ++ .../UserInterface/Screens/LoadingScreen.cs | 128 ++++ .../UserInterface/Screens/SrlsScreen.cs | 105 +++ .../UserInterface/Screens/StartScreen.cs | 29 + .../UserInterface/Screens/WorldScreen.cs | 250 +++++++ .../UserInterface/Windows/QuickMenu.cs | 35 + .../UserInterface/Windows/SettingsWindow.cs | 68 ++ .../UserInterface/Windows/SrlsWindow.cs | 42 ++ .../Utilities/BitHelper.cs | 36 + .../Utilities/ResolutionCalculator.cs | 61 ++ .../Utilities/SdlMethods.cs | 18 + StoneRed.LogicSimulator/Utilities/Settings.cs | 26 + StoneRed.LogicSimulator/app.manifest | 43 ++ 47 files changed, 3159 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 StoneRed.LogicSimulator.sln create mode 100644 StoneRed.LogicSimulator/.config/dotnet-tools.json create mode 100644 StoneRed.LogicSimulator/Content/Content.mgcb create mode 100644 StoneRed.LogicSimulator/Content/ContextMenu.xmmp create mode 100644 StoneRed.LogicSimulator/Content/File.spritefont create mode 100644 StoneRed.LogicSimulator/Content/LoadingScreen.xmmp create mode 100644 StoneRed.LogicSimulator/Content/ManoloMono.ttf create mode 100644 StoneRed.LogicSimulator/Content/QuickMenu.xmmp create mode 100644 StoneRed.LogicSimulator/Content/SettingsWindow.xmmp create mode 100644 StoneRed.LogicSimulator/Content/StartScreen.xmmp create mode 100644 StoneRed.LogicSimulator/Content/WorldScreen.xmmp create mode 100644 StoneRed.LogicSimulator/Content/stylesheet/ManoloMono.ttf create mode 100644 StoneRed.LogicSimulator/Content/stylesheet/default_ui_skin.png create mode 100644 StoneRed.LogicSimulator/Content/stylesheet/default_ui_skin.xmat create mode 100644 StoneRed.LogicSimulator/Content/stylesheet/default_ui_skin.xmms create mode 100644 StoneRed.LogicSimulator/Icon.bmp create mode 100644 StoneRed.LogicSimulator/Icon.ico create mode 100644 StoneRed.LogicSimulator/Program.cs create mode 100644 StoneRed.LogicSimulator/Simulation/LogicGateSimulator.cs create mode 100644 StoneRed.LogicSimulator/Simulation/LogicGates/Button.cs create mode 100644 StoneRed.LogicSimulator/Simulation/LogicGates/Clock.cs create mode 100644 StoneRed.LogicSimulator/Simulation/LogicGates/Interfaces/IColorable.cs create mode 100644 StoneRed.LogicSimulator/Simulation/LogicGates/Interfaces/IInteractable.cs create mode 100644 StoneRed.LogicSimulator/Simulation/LogicGates/Interfaces/LogicGate.cs create mode 100644 StoneRed.LogicSimulator/Simulation/LogicGates/Lamp.cs create mode 100644 StoneRed.LogicSimulator/Simulation/LogicGates/LogicGateMetadata.cs create mode 100644 StoneRed.LogicSimulator/Simulation/LogicGates/Pin.cs create mode 100644 StoneRed.LogicSimulator/Simulation/LogicGates/Switch.cs create mode 100644 StoneRed.LogicSimulator/Simulation/LogicGates/TestLogicGate.cs create mode 100644 StoneRed.LogicSimulator/Srls.cs create mode 100644 StoneRed.LogicSimulator/StoneRed.LogicSimulator.csproj create mode 100644 StoneRed.LogicSimulator/UserInterface/Screens/LoadingScreen.cs create mode 100644 StoneRed.LogicSimulator/UserInterface/Screens/SrlsScreen.cs create mode 100644 StoneRed.LogicSimulator/UserInterface/Screens/StartScreen.cs create mode 100644 StoneRed.LogicSimulator/UserInterface/Screens/WorldScreen.cs create mode 100644 StoneRed.LogicSimulator/UserInterface/Windows/QuickMenu.cs create mode 100644 StoneRed.LogicSimulator/UserInterface/Windows/SettingsWindow.cs create mode 100644 StoneRed.LogicSimulator/UserInterface/Windows/SrlsWindow.cs create mode 100644 StoneRed.LogicSimulator/Utilities/BitHelper.cs create mode 100644 StoneRed.LogicSimulator/Utilities/ResolutionCalculator.cs create mode 100644 StoneRed.LogicSimulator/Utilities/SdlMethods.cs create mode 100644 StoneRed.LogicSimulator/Utilities/Settings.cs create mode 100644 StoneRed.LogicSimulator/app.manifest diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..426d76d --- /dev/null +++ b/.gitignore @@ -0,0 +1,398 @@ +## 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/main/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/ +[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 +*.tlog +*.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 6 auto-generated project file (contains which files were open etc.) +*.vbp + +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + +# 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/ + +# Visual Studio History (VSHistory) files +.vshistory/ + +# 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 + +# VS Code files for those working on multiple tools +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +*.code-workspace + +# Local History for Visual Studio Code +.history/ + +# Windows Installer files from build outputs +*.cab +*.msi +*.msix +*.msm +*.msp + +# JetBrains Rider +*.sln.iml diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e62ec04 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ +GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..4a857ad --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# StoneRed.LogicSimulator + diff --git a/StoneRed.LogicSimulator.sln b/StoneRed.LogicSimulator.sln new file mode 100644 index 0000000..75354b2 --- /dev/null +++ b/StoneRed.LogicSimulator.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.6.33815.320 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StoneRed.LogicSimulator", "StoneRed.LogicSimulator\StoneRed.LogicSimulator.csproj", "{7B259CCA-2947-4DF8-8252-7CF75FE39B8E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7B259CCA-2947-4DF8-8252-7CF75FE39B8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7B259CCA-2947-4DF8-8252-7CF75FE39B8E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7B259CCA-2947-4DF8-8252-7CF75FE39B8E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7B259CCA-2947-4DF8-8252-7CF75FE39B8E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {34074953-054A-44D9-9F10-203A945F936B} + EndGlobalSection +EndGlobal diff --git a/StoneRed.LogicSimulator/.config/dotnet-tools.json b/StoneRed.LogicSimulator/.config/dotnet-tools.json new file mode 100644 index 0000000..efabe22 --- /dev/null +++ b/StoneRed.LogicSimulator/.config/dotnet-tools.json @@ -0,0 +1,36 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-mgcb": { + "version": "3.8.1.303", + "commands": [ + "mgcb" + ] + }, + "dotnet-mgcb-editor": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor" + ] + }, + "dotnet-mgcb-editor-linux": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor-linux" + ] + }, + "dotnet-mgcb-editor-windows": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor-windows" + ] + }, + "dotnet-mgcb-editor-mac": { + "version": "3.8.1.303", + "commands": [ + "mgcb-editor-mac" + ] + } + } +} \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Content/Content.mgcb b/StoneRed.LogicSimulator/Content/Content.mgcb new file mode 100644 index 0000000..2b8bbb1 --- /dev/null +++ b/StoneRed.LogicSimulator/Content/Content.mgcb @@ -0,0 +1,22 @@ + +#----------------------------- Global Properties ----------------------------# + +/outputDir:bin/$(Platform) +/intermediateDir:obj/$(Platform) +/platform:DesktopGL +/config: +/profile:Reach +/compress:False + +#-------------------------------- References --------------------------------# + + +#---------------------------------- Content ---------------------------------# + +#begin File.spritefont +/importer:FontDescriptionImporter +/processor:FontDescriptionProcessor +/processorParam:PremultiplyAlpha=True +/processorParam:TextureFormat=Compressed +/build:File.spritefont + diff --git a/StoneRed.LogicSimulator/Content/ContextMenu.xmmp b/StoneRed.LogicSimulator/Content/ContextMenu.xmmp new file mode 100644 index 0000000..35e1025 --- /dev/null +++ b/StoneRed.LogicSimulator/Content/ContextMenu.xmmp @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Content/File.spritefont b/StoneRed.LogicSimulator/Content/File.spritefont new file mode 100644 index 0000000..539e882 --- /dev/null +++ b/StoneRed.LogicSimulator/Content/File.spritefont @@ -0,0 +1,60 @@ + + + + + + + Arial + + + 20 + + + 0 + + + true + + + + + + + + + + + + ~ + + + + diff --git a/StoneRed.LogicSimulator/Content/LoadingScreen.xmmp b/StoneRed.LogicSimulator/Content/LoadingScreen.xmmp new file mode 100644 index 0000000..a218905 --- /dev/null +++ b/StoneRed.LogicSimulator/Content/LoadingScreen.xmmp @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Content/ManoloMono.ttf b/StoneRed.LogicSimulator/Content/ManoloMono.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ade15238cc0899a687caa07a9623c5725108ce4c GIT binary patch literal 9232 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 ux%RCwAhedx_G@^ft=cVqjlKqHmLr9Jg + + + + + + + + + \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Content/SettingsWindow.xmmp b/StoneRed.LogicSimulator/Content/SettingsWindow.xmmp new file mode 100644 index 0000000..41a5708 --- /dev/null +++ b/StoneRed.LogicSimulator/Content/SettingsWindow.xmmp @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Content/StartScreen.xmmp b/StoneRed.LogicSimulator/Content/StartScreen.xmmp new file mode 100644 index 0000000..02d7f0d --- /dev/null +++ b/StoneRed.LogicSimulator/Content/StartScreen.xmmp @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Content/WorldScreen.xmmp b/StoneRed.LogicSimulator/Content/WorldScreen.xmmp new file mode 100644 index 0000000..2ad4125 --- /dev/null +++ b/StoneRed.LogicSimulator/Content/WorldScreen.xmmp @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Content/stylesheet/ManoloMono.ttf b/StoneRed.LogicSimulator/Content/stylesheet/ManoloMono.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ade15238cc0899a687caa07a9623c5725108ce4c GIT binary patch literal 9232 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 WodMe6t9C-*XQA^lr#we)?EeE+``P0F literal 0 HcmV?d00001 diff --git a/StoneRed.LogicSimulator/Content/stylesheet/default_ui_skin.xmat b/StoneRed.LogicSimulator/Content/stylesheet/default_ui_skin.xmat new file mode 100644 index 0000000..2e716a3 --- /dev/null +++ b/StoneRed.LogicSimulator/Content/stylesheet/default_ui_skin.xmat @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Content/stylesheet/default_ui_skin.xmms b/StoneRed.LogicSimulator/Content/stylesheet/default_ui_skin.xmms new file mode 100644 index 0000000..ea57bab --- /dev/null +++ b/StoneRed.LogicSimulator/Content/stylesheet/default_ui_skin.xmms @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Icon.bmp b/StoneRed.LogicSimulator/Icon.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2b481653e241818d2894e4ef33234eaff9aad701 GIT binary patch literal 262282 zcmeI5U#w--UB}l@N{bdGr9PBcCDGJ$nrI`=WH|TUUY#_NDiB0LqCT{g1`;L3KcJoR zB$bk?iHSS_+EQP9@eOEV)mmCZn@Z7_(T?-rw9}b;?{o%38)$^4jK5EtQ;%oXIrpry z_dfUcTkAXFaPC=W?{(JteZQZz*4}&VwGZF$(R6X*-$(6rKY#4|-fLgFI=zO^_WhMV zn7;e^?#J)_?|e$%|1TZ>g`0nG;=6_ZylA1V+Surdw0YuCTHCoTt#2Pm>pPF8(e{&R zbo%pYee0N|owd&|q_xxM?Qgx}#Q^Ql5G~OZZP6I5(H!mZKpSpvyOwWCo2PF~qn(eK z51uk#oHQSZ>3B>Jq1o5c+BTlR8+Zh-v`tI=+Fzayp1V1%ZPDJ-{tw|BoxR(1d)k=)wvF|~XT5x`Qd_))r|=dYtDmGeHKc96)7t2NHf>%_ z>tf#Guu3*s`z<_%*X~LqjSKd$nHZ&wGmqOb+e`Ahc;6!r;Jr`S3oq^=3eEiV#cA{W zuh}^4**(&`wZ2aEU3@HsC-Ej8Z3f5{RrHdy|0v_FuZVl~_0BzjNAW72T@fDD{tRvD z9cg1n*XkDUhty~Lh!vj2yBZHH*F4=|*ItfWJ1Rf>@UwJSP6s@UmzSfUy}jOUvHFzr zF`ighj)j)vhNtm%dqgi*@oD}`&Jf2KZPV;)`K$$9`bYMn2@ zIt!n+`TDK2>8hv3FUxoUMrvD=17VdzN3+J-mCWz52_t z{<6k+!QiUb4`9ub=QO`Z?5pp0;Q?4&#v?y@n2+Td<& zu;Qoq?WG4`cp3gVcKC|g{gCbcUiwYH?W?^zvE(`dy0_Ptj^avsEbD<~?h$@geZTsC zd7ugpz;ekk0P74d+t$>u-#Lrd({}FUQG4BIf4|pWx7h35X>IH0?3}7zeq(?}XoY6? z+H)w-5G~QP25&A~hmy6!KW;Hx_ID!g$Guamr*@CMembq4*_YD!lJ-*D`i}sbqAePu zb!+#q!t^34U7ik}d#RDO^0dv9K9bgV-jX&>EfO1TQ%?lY9PRNy#6GLE%rFhxyD4~Q z1AYHjEf!oC>2hs!w>awi7!kk&cmYq8G8Jum*xpT*&s7|Um#uExA9-mybaJ;i==-)J zfG6+<9*M^FqUD9{d8%HOMrUh1E@F+ex2AQC^XC~r-z7X!>)MvE4db(9zPr-4?_sO= zkn5t%il@?JMgXtinMM26NZY~qELFHp5~(h`mGwKO;rs11tG-HC1m;Bm@8F@`d=}|@ z7|+%DG8-4vw7$MW8eScrHTUIID~>Po1wwn>o;Nq0jw&XyQ1gtESpt5h#fO-kZf%gml=yE%0@J?q|~4 z9VL#{wtYt6M}w~;1p6Nhd@l1dn(Nc2ot4)T5x|2H`ubcMVW0I8bKgZsV=cEOB-1X6 zKyMNFoxsNcu>WM>a~SVPqwmjQ>P=8(qzDv501rm!D|2Oh!rHE9?B1r_ciz*Uw_}%! zv`%k^1=SGpk@E8=KBp{XXUv>1n^>xFYjrve>Ujx|6}5R38!k8 zAtHbmy|bPxAMC#nbnY+Dm3`uRyZZl9n`--kB7hgYvtC>I zc*fg6aw=OzpeO=*R`%-0KRoBLNF;5n2n-YfyjWZR>b*WZgLfb~m8~LB6al>GotN6m zC;p2ps*MMXfcRhi_+R`FXlP|!6an!s{)-HwjjM`)_!s{}8Jc@cxlXH>-x$0Y_#T?5 z=LK3B|6iRpb#5u>{FW)WIbSHP4PS`=Hgp!x(mCe=@h@NGe4(^9 zd?EhZ&{;f7=bQ(`zkHGNh0@yah4^nnXYnkZa~=@?@2A# zEUJnQ7=Z|^=gKJl2Q-DUZYBabwj!j7|7I+ziVhfo2(0JIDE2A# zEUJnQ7=Z|^=gKJl2Q-DUZYBabwj!j7|7I+ziVhfo2(0JIDE2A# zEUJnQ7=Z|^=gKJl2Q-DUZYBabwj!j7|7I+ziVhfo2(0JIDE2A# zEUJnQ7=Z|^=gKJl2Q-DUZYBabwj!jp!v7o7p_6}}*0&Sa{X{x+CZax+IRfjs zGPc71)oF7(SN{lUl)VN1@nQr$YAU1n_rETz`1h|-)HXr<`}dak_pg!o_dP<@_}{la zluqOS)wgr%|5qRL(!N6dzkiKNHTAN+`1kKE@$X+FFFco)L;U;qmiYItQ7Ly`wio~Y zy(RwrYvhIJ(sGD@|K1Y+{xvG)&dc`V-@muSzkiLq@LXCB@$cVT;@`hUrQCVhUi|y_ zmiYItkr$pz%OU>#drSQL*Qk^`FWZZM|K1Y+{x$N#b7?umzkhFufBzbla_41x@$cVT z;@`hUUU)7ohxqsJE%EPPqf+j?Y%l)(drSQL*T@UcrR5O+{=Fss{cBXpotN#!zkhFu zfBzbJ;kmRN;@`iw#J_)yO1bm0z4-U9<<86Y;@`iw#J_)yyzpFF4)O2bTjJlpMy1?&*Er|77UyC45_Y=T>QKylhX| zyGOu(4tUW^%v&kPEopt*zcad*@IbmYthWxPjV3g@HLY#8!kw3T-fl7PPM7~2em;%D zdh2i_{NqJ0T$GmMg|v3MbRQ4f-`7b0AGvR#?EYKW?j^*F9+)UC1MHs-+P^&3h_^l% zxNkX<)_1zoT+s0uUi`NP_{W2Iv6MXz+r$17X+7-u<#(jfDc|&VE8QE@p_8ws z^^oUh@Hb_r4&9>Qdv84Gf#qe&0Q-*y?qBY)^B2C|(XDhh1!jNj$6u~oBRn{+YqWRR zk9>aVGsZ_Z!hG-jvA|=qF$<4Z&OaU;*EQNZ?B5pj*o9a#zI;pCsPY)#QX4maGqAVD zEKmpP;=83?u5@@W^6?q$A4+RGW33{-f5`gC<<#@N*RKcHWztK(kw#UH)9~J8J)`{% z`&XpR6Vb{&S>7%4)+K5GQQtI|m+slX-$a*{4$tN4871wj6K(QSfzM$QZ`!X~jxqPy_2e%G*CWTk zznD(ct&B3CTjRCpeJ0G0qx)b5{mlat?b*0q5#QezbS_zr`RTMf(nb~Yf$`dO-J*T| zYd?FPkQBP3xhr1zed9oH|#5w`Q?G-Kb;4c6nT8Jcie1)iFvs%#Z7YCQ-^g zubj-4eOKkjuJ-l?hIC-yKtE3S9j_tW~+@R{>AUakwUUc~*CjVHT$ z1jdL7v6-hn1P8(nU`wHe-O~$p) zzljYon&r<`q~noVuJKK41KTh@FOE+KzZYP-&Xb>+xA8~zTJ>Dvi__-$57@m{HQdiT z8P6g9CPu`Hn9cKP-{0X0yivp4o>{uU_HJ>z)5c-5_OB)Vgw1{C{*9sU8)Q7oJ=XtT zahp1nCx{ub8~T_458wqnF;rc=OyO%N#S&may&m*=*^^c^@uk99> zlJ9@m#<3h{9XDSMS^gICCWge4n3ia;+qP(q_IRL$IKnh+?-m!n|5#(ks2mr4+S-5C za{DRs#4__!Ic}sMdBS4X(p;WZu|rIWEiqo^JPw+oEgGYBt>?LB=>gM=u+KKk%b1l< z3+dda!m$$TBi?JzuzHWZe%0c4qs4{m!F>K*`}`O7`bYC)^mQO2YD&zBJsO||nxG9D zp%tIe4h_)~O(WK`uQHd;wc>v5zJ6QzD3PoUQ_J-#eSLR zFmnB+g>$0vt3SU=lm0Y;;bpI-a;`;M^rwYlsaUSs128-u)0e(;Z8Z8iXRD64eou^h z@c`_0o#XOeod?u;PZGb$mCmw*kWx4HZzt^N&&a)0v&26me)^7jmReP9&y}mf^lFtvNcm224xE3Q` zS*fjDum*EonC*MtA4}J6ZR>pCo{R%)^SA0VyDxz;SnHeLKJvT9u0gi^JX`s8wr>@i z?y-R_80&-8q4GFn&u-FlZM$nNUKGPg55N>`4aIGr`5v}=kJSdqzmxve-^=>}mSCz+ zMu*NzZNTz+uZk7sjO$(w-#SHPf84e(UeWmgpZ_i#! zkC~r-=X`~(3oNerD){)O`D$`J$={@{;I?<@b^eE=(7ukp=de7AJwD`=kJ?%EH@2lt6xl}2Z0X~lPJGh`W* z_x$+6h_|^tv;0z;&U{7PFEC&Kq4@Y4^VJWeYcA;br!{07wjHV*%6GQ@u;FD+@3b%a z{LDQ|x_5ZC5Bg-}WsCK1FR>o%Z`nTV+hkVo1OjrHL z<1sz^p?7`oJlTX;-k&0ajVW&QQ_7R$bMB2V&GAAVsUUK$g;zN)o4 z`}V<5`LS;C0~QyaUr-uPZNI)vfAX-sE>8!~4W$uz^BWqkE!PI%Z9G2o8r?(bzlwZ$ zcFCtKMq+yL7(8q7>T;Z4sw=<6Z%U)ZV}PfJdM;0?ei63k`Gv=I9cnIPJm38{?HF=j zN-JLnhTr73DTCU9+3f%x?)zDs5%}$+j6A>ic02bZkNtmtowL5=4=gU1rb8$Dh;x@b zCxY z#+Eh0qj(k1_8sHa^P?@j)jZbPvFA}c=XOWh*m-^0JmK8~l##Mh=9bz4Jc&2e->=4@ zqqK46<93bvrAo)0%)R?t^V7T1`p#Y)-*;7!GE;WyQ0qKGyoU$zV%K-@P`pZRZ^?Om557=4|)Ghj$0FU7{JU8UE*43*N{};J` z?QYZNY4cf>c?9_B3--Ft%KhVMRDC}}9q+YkJJdN!dySXy6yCyP@kyz_2A7#mH<`yC zG0k``x~G1Jb3~8Z>ozObmFd8#`qjwSkh&8CVnIwiX@qC+4j#fw`5GuSN(2~#-k3%^ z585^Br_5`sx~9lFF8^TXga5?5#9CW#P8(m360=p8lh_a=VnxhWwQdw%z!M)aZ{U%d zj=ff`VWi)?!p>E*z8Zbd5j$7)sQKVY*SP*sNDHl0|CFz!@@Z9>Xho|^ zX)(&oghZPy%>SM@9z%l}GjCAu{C;oVGIu%KJ@?!l!{o4r7=Rq6i}`C}*jDuH?#_Sj z(ohc5(!wx%d;WXyUJM)FNe&w{sQCXO7?yEW4l^<;{=XB3wJty@=@!4Yz_1(bYu7&fPuJk|nzhy3Q(L-FbInCE!&koEwT+Nz3QDC=VaTw4ZBvK3)IcJncsYp*{AE`PBW!L95G))yFul z?-lXE>GGkuvm7^!8Eg5kO`8KcYn3~kT{rcB*41tf3mQ(_$ow+s`gZsB5p?cbUK`a+ z`Ct9!apHIbdPgqFJ8)o*OST*5@OS#-<p*PFK#mSvsSY!GY0>*?L8*+c77CPyq^ zCT{lK<=XN4?8ECWe>}f_dZ(0MI*T2O)JJlZ9kk`vX68qPZtJh5q_r!r!}n<35|8WW z%rg97OhCw^urtQU36TO}q9-UB7zw675d(-VV88jUEVAImQ2I{}I6|S;V zJHsBkVXEpiwT|;uZ*Tm(mNRzzlf^{?ls(OLJLz-kHG28KIh{m&V!{$F%wlxxhYJP$3YNw# zw?1dLXX_+A`(X=P4D6V6ug$k_t?nhoyqWD;kYI4uYh=0|Jg9y+PMd&rLm z=8D|W#{>0x8+Nzxx#D70=u4Y3bQ^Eq(fo@G*K2F+yOVU$sd4jkC%be!tx{UY>Ks}1(Cz5IL~uSVWfSUzH)msw)peeJ{a zV-I?cV%x1VpIqP*8*6egz0u%^@MhY6sS#_f8u%Q_=)UFtu2~NcjyP{($!=%M>=gi=|`wP@s4m%;wbQ-d5<*7be&59;Y*FI-w5p;ht_gqhpHc{Ue&zRMqn~Gf4x7E*; zbhiE*aI0yoORGtK`gZajHb;!VsK40JJ(0cQ^2tU+- zEsq`%H*nU4@DB#_R$?m_eKqagPe z4O32>v7@hT$llD9^k?mJJs)y+?7YXjADhp&nBCesZB4H2&?dbSw*)tEU!|G0 z%wws?!fT-^szKKoN;!8wT)F=IfA#Iw<}BHBwYS;YgQq={X6>n8>(O(S`&7&HH?H#CVQ>bw9RM0=&;}inb_uM+8 z;bz+jJ2AlZromy;-SwS%?2Mc-yP$XDbECpp-m^Az^}ibww&Ly9G=|6HZefPkJEcd> z3wo1nAH;JRuE3=0TzD}cZttlnR%?bh9pTRMzHF9%q{&y88JSKd&DS0rd?mqn|8cwJ z&91FnA>TXBln$AkIZg6 zhHgvx(I-STwabo=p>bvvZPpSqD)0b>k#fl~mPdrrgpo>Rzep@Sz%UN!t9>?)ar!F`X z60~Pk_{*5?dofmwh1KL^TL!&WU@pmCdvbi2DI1P|d%b{hc=DGogQhARJs+*KdeeIJ z?R!q6`;FI58?dUWUw5ov==!27Id9)svagoIk+AU43@Vw z&<@v|z&4&5oPuRpWInw3p=UtyNUH%wZ9F_19JWkzjP9g3C{#H~?s10RGiRsv9_ReN z$#tsl?lviqQ83|`jqd50YI~Qpp2@2YAN)saet0nUN#okD`mSsCXV+`_bg|z;?M?slYP0NmFm}K1hqm9GZ)97k zSe{!v$|39G#+$B8Iabnzd+E2mt~)CF-Y7Wav)|ZTfthx~8tqHQhKY6_SC$%CO;_>{)ajB*f2(kp-drVd zc!Em8aC6o7cbpr~yWYKbgSICkBOZKxl1dBqPZ*lQ{ngILBjxLO*Cgd{#zP_&cfUJ) z!HP@Hjd+htGgBWf+IhvIXy$2`r~5wS@9d~#5fgv4r-$B%Ia#~A+Rhx{T!eL1X>sbo zrhcPUZ~wPCW`%2O^Q9}Z)*hJp-J!nQ@mF$24s#Fo-D%t_^8rKtkzXgC)u~OZ?!D|B zZ%RLKYj{M_y30N6-+8JhTKXJjyqg&Dsqy@MJy?obJqsLob3?i%Y#ZbLMK5sev3j@E z<{UGzUfceE<8DSLq|gg)8ZaYw)nC2n>cCZVTHbxm{_2?bw#WV01{tX#?w8XOebw^} z`mN+8FP3}acem5Cb=RC&fo)BS0xUnySou|pQ$t{?W|TENhgY7e^i z$y}m-)}1e2!GtibeM>(o!KY0&$0;dcKOHmCG#oLA)pW~gFUTLtXyadULUt6jPJ zzv8^j*QLAHe>Lr2(=?q4cJZELzc=WgrTTXL_a%1P-<=DCjlX=(?DKNjw4QPv=^w6W zycv1zbV8B#kmTb7eD8F9=N3K@3o&c=`iuRfN!dGX4Pxl~RaRu(UY5%p){$mX;Ir9GmE-$;Cq#W%)nu8YZ3nYQJkI$AZ}Ot2j`sf?snY#Q*Emkm zpu7$}3DRKJHiwdoQ`*LC6h0x?W%sv(ZI@*}q2G; z*Wy=Z&zePCYJr_~WPDIxH!LEUX&ds{dFlL47Mab)9@F1-SN?#Go?nsUWY@(j8t81F z74J4>OZ-+X$A5>f4jGpaovAU+$aSrn?v~b;0sD*Yns{kA`X1@po0F5ca_^pypYuBP zUTqcOz3ksjUwcg%<>eYO_2uT7Yg4{%b?G}ePhsfw3(6m(uAjE>=+irJ&$f>j)4S~1 z5_W!4Yvn92?9xp{Iu8Aw_eMr{WGd6j#@fGU`KV669YqqMP zZxFY~_O%Uc_x+RYfswueTW^M+{5t0zD*}Sg^7B0#7kyW!W6w?B487azxzi+Z<>ukn z3zSnJ#D_f6c_>S45r3g-KE zmF12unJ4zWe0}lR7%zv6JG)%_jP2}l&_!$b@(Yi`PhNQ1^A$1!*xdUs*{T`sqf}GZ z_Q_sqacx2Sv*G&enI~Pe?kqF8p1Mlzxa;Ce+q@i-51zFf@#@4Dm($@-0-l6+XyFmx z@_UDAYn3~mI29BA{*>Lw7EhbGXDEyw7;HD}6*!umCttC2`k}sVki71}i)!s+&W7J_ z;Le>nAuQ;c;r`UoZyp%G&0Y1tQ}^+$+?4n&z9&ylv(cE>rsa|3hu6FoVxwN18l%SQ zn$auD&ne0{<-)iK??JPSjh^mcC(hYyHVr#9stId!25pl)X6-F!Z`#1UK?C))O;OOC3D;!J4L6Y)`DqIO--I3of2q>dv?xY^V71*3h?0&-=Ty z8Ek}YAG3Gt$5!f$e^C)@iXB(!iS;qU?yEG#nl;73>M0D`2xY2%WJ0J%aQB`6?YPB2 zrDFR+Y-*!zWJ zCmj3TC7&28{*90T8^*t-R-k?1$ZHB2}4^=Qdrvzo@gm}LZUOh)4d(7PWw9V&v z1)3cue2{yTHo|eZLi9zauGd_Yrp6zPvb}f90U7)I5yo@JsrHzkF!-X=q{bufX%!1irU1xMV~V&VrRUaXg#|4!ZG!fej$AeZh|Ya9D7Xlvk) z8KFP=+zBzCy(wha*G@v9jTM~^bp0xjk)^>@*- zq9;z+zgV+ie1tcuvd1|r9n=mx(c}B}*;&dN2ge-P-&}2*_Ib?a;@D$pmuJa0NEl$P z!QOc?J$Y5L?)z;UVyUrjJ6eRkG(6o=`{sf9w^k<38UHgjC@5)(^I7B6a^E^P&TN5?&6Ss{2Iqk*vp|hA{zlBea@Y}uGcx1o*%bUoZPph|M zd$TAS%AGUoDd*TIt#4f}Ir`U6}J3Amcf0fS+j>gx2 z7@8;TtpBxTJ=)sTFh11dw1rcLFV5~`k=l54@@(21_rTnG002&+M!H$l?-fO5(-wKQ0C>4V{;D zG(^YSr8^sZLI;Jsw!FLuejne)X5JoGTsF=*c)xk0jZNCfTm2KdkEa&KNpMV<(7b4k zW#+8g8>TMIo{_nt`EtW8r#gN-J$F~LRlls|;$LeW)h(DC$#^@dyG@b2+C$IJycyTS zmt%cCczw$<$cqJJl!J?pnC&e7C46 z{eM2XbNsqTSB8aq{siMknX}CMYNox}=k_zC5AWWn?~#k{J$A8q8q_)~oH6dXVZV+= z^@mvjMBiz5#RfGxmwNV`-;q>9wZwk)jZ&ix6`q;{Ri|L?<03%oJlO=5#=u`Awlai7ekXV0P(Uwu~N3Y^O zGWQ5vHr_WeY(e{MpS8KG993s@(;qw`BB1f=h)^w0-^a5i=ICU@oaJRZqz#u z?gEQe%FSNA_H3%1nrWsmu;rK`te&p9=d-PpEhCF`^?7X+Tt6}uba&=l)t(;gr|hx) zv~T+HiPzFIE#{tIt((~+&33+H{kOVG*Yg_q-dMc%Ebphn`sJ2#b2Q|X>&xp&cKh5)v#?t=^J~Ykn z?0h_fVSn<+uXCt7M!r7u9Zpt?+O$Bk|IRMUYz;JSG;0|*WJRlAXEq-CdS-&L)dtsN zAMJZ&r0SiX6zX-^A>HlmegnS-d4;?4zg~CPKWeIue}3~}59r@I)?2*KBJZEksHADZ&OV4|n9`WIkO2?-quUXx`&Am2-N79o5!!%=TpuMo7y?&s} zm29=4RzDfnznN?Pt8nPTh37uq-drfKZF%>qtAVq-<+Y^dmOqzm>}%e%rOHF=>E4g^ z(;qMvb=Axqu-bNreQ?a>p;mVs*hvnyhXdk1U_r|*}Z@EyJ%;5}&v|oDuhNpxp5fdFwa0?ti|kQKq5Yu^CSjE+U((t);7B?6xFw zY0s;N=>=;h_>NsuICS%;+l&CcL47do>4Rg^0R(WzYu@ZfI)Hg-d4^#CN~?F#wZw&IdjaD^t`b_w9r7)u-_n`NbQ6ewdJjs3>@;}ex&2JA3x{aY&<4c^3B_&ECPb^V^h54ibHpY6OQBzN+A+k`|cE05bOWa(F( z>Dn_qJPI$Sx6?3E(>H6Hq|RpD+s6o;BUe$i-G zC8trI zFVNW7h2|%074=-Ty;m?a?+o>_V$IwauFh-!?!LdK+T)b;U5n=5rDcS5J2qGTs9uq7 zClC74{qu~>Z*I>S6S+9VpyB9`_M5M38`^m)hYmh6`@E0KSt~|D^dXfWS}H%%=Zw8M zn3K82G3N4vg7tROc|)gdi@kjJ!ifnUOJ05AVcs_yb+me8G!P9qVxxzf4+|Y)zo`p) zc83pWG!lj@aX>?&wE|31v@jFSM2ybeh%q?97@hq9J%7X)+-!95{_rasrxj?%X-7N& zUI0)2R51R~2+7zI(R&!lHu(>iuO#}5c!PKZyaJxpb)d0L5G{cijs1g?xtMm1&$FY5 zcP4d94S4cM*4D_zJ)&eTrpzm<`}n-H#xTU&+6;8g1SI#Dl-#8x_wxDxyagWDHlU^G zAv=GAk~>Lq|4k1NuLrQf#jjyN_K411jnTNdlj2n%s@zM`uPfuYxQ&)hU4Z*~RDEBz zeANMa13sFhJ|W)5qx}3jCwsylfHqpS+lHubhic!;*lv?xS3ri<=_7)^B|?v=d)?Lp zyq{2vMgjEaQ+>L1Tjqjg7Gw!B6&0wloIgkQgdTuQMFD)C4hi)Tfd_T3Io$%;Rtord z9yNadr|KxoAE?Y1gn2uED(w_qgxx{&h$;XY_aP$g<5x=WfO(@f2#1 z+qE-m;0f?XR(3$JEy!P&Ba1p{QSD@YEy9YyT_hVFK*?iGt521ipvhW9pb-1L;ANjVFuP3_fiIBiEvfBkEYp_XdhtjzR36iM0 zm>dA!ky$p0_4nlF@%Ogx#T55%!3S^+NR>aa_X271NBw#fNX7vg=P7AAP`d91S#7@^ zk`YhEMzTl!;w072r0=90Ai|4&d9-8w1Ymd&= zMEN)V&=&1=ZA4un@_4$-6wYl>Ezc zj|{7I|RsQO9XdeS|BCIDsQ*y*UsO)={88Gn2J+8;Bk>Ht8aV%v z!HpwN{wQr(1KH<4^3MPztIm+^`LErcH$bu{QJ+!TkcTXR?DJpY3}CV9Kyl`a%J}?e zI(HCxv=q}#;|`Xk_%R0JAzAXlWzPvFEq%b7&XwKy?{v-~Qfa~IL3zjufOllc9#0p^ zp3dD!Y94g%L7A}2l-&x^@sm_q__D~xATL<}@QzIRgX~Q>6G_d3!Oq79u)C1XE;?s7 zxpWBBdyp5|06YWUktu(Wy-A7|sd)hYG%gdH#8V)RWejeAjK(e?oen}4{Ji>;Mi1}` zct+$$)*WOIz~Cm6o)?|FnG}98IIS@{JBf7s%gX@I6Xi_?0I$mDC;j*264V)-!!pPZ z+L((<@|4B{BUu@xNoIS$s&+BT8{r^L03JzS)C_TPso!;a-V~)uQJ28LfI2O zA>e{=!VqrN0pNu!>U)9?kTu9$5a{ec+42+lwlwYmk^2WmB`PBPtkLyYws;aU7U>SS zSz~~!C;;ty-~riwJ|TDF4zex}bT*^r_=@*&?Ld89wix}BF-A}Af$!gF!XAlmT8zF2 zBR*x;9DX9nzO;_TamD-97GppI>_-VS0d4&Le4v%Qemz3Y72QGB!hptoSZ8=#5pC4> zQau#L3y^U|z_+iJ#}}3+^{p=P%(^1+VGM^j8>Xr1s9%^%=|COT0gxTYP!fPXD;hV4(t$dr10XYyoiu>Ku|j>+ zg_I7|6&(OsA(=@NOg=eK@~s52kSyg-x=YQy1uDxSMKM|i+W4(FxMJ5TtLLAwwClcS*0I$XE z&lj0^2?D~L(%LeA0M=;GIRU7iZ(D7OATFdK%e5ty*&X1m;Jn>x6Gmo47&kz3AZuza z8Q$-O)@T~1c9a^GkQS^ht*LeopOeCqH124hbbK>AA zPFQ@c5#+&*A)OxJ8St*6xtikOUDILl_7$u#!Pgl{Ypq!}M&n%P*V8GTWlkak^7XJmI@qcGu!&pwFX z^HIB#F7tgjDq{z}?+C&P#|_~KxB|`$?q?x(A{(cb*n5FkgH5c(tSlcA{^Rj@xkR!$ z=mmj0@h*qI77?!)<^~_KO5c^>omKj-2=DHt?~s5%bUcBA(!VjxR3LZwu2Uv?3_}^P z1jC~Yn1b&LWwOICl%e3?sKP9hJwl*N_6ULU?#NPxjW$<2xt0+I}9RyblGT=uU5tqK8Cxn9x-jTdPtN8?@2kKoiey}hMY;g%c z%e=ecMiu>ETK<{1l_`EV#f>boI>q)v2RE|Fw1O>k$L$MxKx%>B!Tu=m6LKT$kpe%W zDVS>bUyfg#m7r#jL*Fnr_`wu#dxt;5D<2eC#1sFnSk-$OOM!4HZ?DV0m$&!j--~%b zVBuE2J`t?mfVAK0qcR91CYM1FDLEe@;0pr8T0R1bEO-S|%|}3qAI*(dT*2w!(V#x% z;UV4dU?5{W1N4VGijLO|@DKU}g1N!}@Q*2;4;~#bz#rTpcOGoaVvjB+y5ulj^owM? z7r&AG!;`}Xa1D?zCfeP1><5sGab=h6YW{pQ-Q%* zK+R!Avcc!^B3_WW50jwH8^GyXV|~D4+lvZxmyC3vFBf=28i0-GtU&Vq_1D=NQRM}^ z0Uk-ao*vF^g6vHg#dlH56XF%{Od5dC<&r_ayr?=>cfz5u3<>u!!^cIab>r18_xPB3 zHD!R?97^x2&HK`F8Y8|fLUk==@1@u_NA-a?bu!f9rSg*^9-`J?e_%M=FA||b#{GNB z$CSGMfp1z>`v7m(*66;Me|lMqtF)aAeF~J_Az23ykA(sBBT;LTN#;GO*MP^u`s|=D zkJ5ee`42n>UY7yr+aaqD8Lb_oac?8p?!fak;o4)h`Qq#04nEE#tw{u43;LrBjwuPc zkLEmawqvw(jWVLHOD}*s&>+2ea02BE@tgo@?^8}=-$y#$j!3@F-+>mONvif4jiccJ zZCz=O8KSnHsQcvBCBfkP6ic%Y81Woz5R5BJORk_Je~9;gOWKS)#kZ?+)zFBw*bFR7NEV_{3GV)NSGG*n046C5m#?;zepOs zDLWFCB{a{d+VbPe4gCAR4ft&u3H287UOMyAWP2WJZICscyHjGll@9NPw5MwWgGk1q zHucv)f5P7eK(nNFTUzlc{!3a9NEV+g{?j?SrtFR2dI<@l8TQ~F<*^;c5dDgCGPUs4^a%ke4wr}V!r>#wA^ zQ~FQozoa@;m*Z3V|A*>7*9^@MaQ>q&X_Py%^#5-dQ>OS|vr?w`Pw~HIIZ(5?Q~FQw zzh*g5v$@x1{fF}w=v;S+E=Yq6prsf|gcm_qZRWo;=3hY?WB~Zw(%_vm(jd$Kr}!^g zyPD#^Xnc}}t_w?p;y=ZIVR`}IDEnXi+K;mTqLnMk{)on>ipr>@-zol6{I5udDEm*@ z|B7@&THh)AL)o8-bcwP*)we$k&IQT)SWp^d0F?QPWG?IPzwKuxC4w2;C@IhwB_(Xi zCL^u&*V0)7PtN`W3@%Fw{AZPAoRr>RKRZeFyyTppTDbp)Nm?6;=_B|9X-ONTwf_bK z-vdR$`kRFPXQWlWK?c&ckJ8OW4S^!6W4DzTBkhT9L;8Gj*Up4t;f%g3ULL%?^GJrfFFL8j>{a11R zo034cX!{S-KN;7|Stn>ORmi(Ckk$UfV1s0{|2CY7Iuq>^x)O~G9zu5SEeUcbY>kL_ zgahCLI00^ae?+$XZ-Wj<&kqujZfW?ubu8s{MhAk=fMij6t{ZW_Rk?G1*!jg{jcASunxDx(%f=crO;slgtCDmf5B|Dt zbbby#zchi53&M$zP0748b|m`dkMMKCX(EB=JYE(bH6)zYg3?`Q=6jZuk%A82*eaxgwN2B_6JO3UE^d zodjJ)HwDmDcf=120pbNb6ClSVo=`Z!XIANVMZssmGKKOdpiH^L+0OsRv{X-#Jc!V! zEaT<@#{`upCi(-<9hE1@K#_%hP#J;@@RW7R#Z(;eB@%f&ttniD~SFH(7$*?8VK4hR>hJIVAFVXiNovjyeD zt^ry_^W6Y9z)_m>l6$ioBbw29+uWSmOLsZl!*NA81MZRl?b856voz-FizvTxbX2bY zqNK^ffQIUT$tQHNrcTv-OZ1#l9V4rnt$J5HQpEd`a$1nE8u<6B9?!k8QRV?_Ir`#5B@_tQji60XxDQeb>1S}Bh-_!Xk_lO~3QJc4`BU^$ z@~^deElk&ieWUch+UB1s|5W*>%DAx85UrPTe{jVkmDEq&Q#Bqk|kAKlPi6Y|#VXF(`kAI0X z23WoEPg7n!vE~=S{2Yi=9T0c?Qx@ajCfp$+%bxH@A&$6Eo$+s&13=^{%Dp=CA873V z#L5HkfH>kpb>=^iJ^zKqogy~vgd8BQs8HScFE9s)$WPR}sPms_pUhF(;@Fq+ZP9Er zU)8)y7DzJxNs{?*49;4i^I_<0Z8WdyAex_7BsOnmTXdTbN0TR!Mg74BsTB_4oMIU;juT$6x=tO)7dylZkEH8g2_C>*qV>=0=Sa4TMA}mZ_ML&S3_MQx_COWyB&>fHwkp843PE4-Z9k4QPKL{$6=rNbm0;oh7eMgS7d1puAwuK1ue)1H3uY5x%d` zRfT;a?f+Le4&u@Q=cn-bP*Zr9%@=S1oJ0XScM!5^nKj7svbYnn2b=)6%7Bl1Zmq+; zl!n|2X~56isfBzea3}5{hu?GwFRNf%gv+kBeTVWOSf=@Qrf%R)@Dgyw0r6fO8;Sd% zuvaAP11I9VpQ^&)`?{et#cMOZ!exNBwM5bz+?{~r{s9g8yoaIu*Pn5(U&)@MaizmO1t=yjhovevH zGa=8a%R}Y35OuM4hnzC zb2nF6mZXWlDE=FS5fz~9RfS(w|BF+8Dg4VyhT^~U{Rdg=KeXXQ1!?QQG}@2Qh87j* zZ09QN1%we5L~FlS-UlI0{|SS8x=Q>Zj3^*#|A|QBET~VfDu6z1k@jswdprKt|1BhO z=&P*SwnLw}JJ~v0{p!3&6>PH2CItGI{6@fVYhZ6PQLf`eLVQ5U`r5L#L+XHwU z6j!hxzdHT55TC(C=c0(nJG@U1m1#Qr1{(M0h#aq?^dSvM3(9KM{e^;Up@b6J>-6{q zC}ABRKLQf!^!ObRfS@jqpYkanXpqwQHD@atb3&JhwxP0cqKsb?G=MINRIgQl7tB?o zb0!eU;m?xHUjtl3sq;!Qga^D#i#dOT{SEPZyU;TS;jBUYKL}F+-M@dY-u#X7bnxpq zVyvvxU*gvVaK;$gKjza^k&}eSpjg z(gU>r2K$+4zGp>xk9<-*4U`t7Sry>tc5?qGMmZAnJF0%BL)sOb8)}@|5tZXNq~%>= z15h52mmu(Mhz#;3se-YN3S6@(6Vm(7#{@mo!GX=}$Rb0jd^DTK^BvxLP1;%kGNw<{O6_sz` zn&H9l%wsupWc|gh6HXFJG61=pb5CB@E~s&kFO0 z|AaxM{s(Fs2rYxqc0lKf6MhJ+O%rAB4G2T5V}rPmM#cT-KKOboq4^ivMZVtx{jj3U zTP64iVbOWgRrsHrrRHYLv`9;H10#hyNAN{M_9cE--NWkAb$YhgDA3~ zu?tW-yYTtD{J#BNNY?0EMR^js1nn$=b{9X_-+zgAiJ*VZ?~g%aDI7PUXVSyj^7wyf z45g&+2Feh$;VW)`qkb737V1%8qTU5})Kvf%27p$3!8yTjq19hZ1r$)|g?dR~iJn5P z4hmEDlFL$ZhYK4dk0M<$;dg2^W$~^0`=6LTgVPQ1r_^T`@3}0` zgz-mY1ridlynKYEZ~Q^!w{iyG$^+D;5MS^TC4FJ~1K-L6q+33{^6$d%uifdFFT=mv z2L^YX5W2^eXAcVVyM5r>pi&(wZ{NUIWw3Alo<90U_`r}+h4xLzcp%>n0xpZu75jVI zCH@Nh2Vp9<&t%sxIBncXmEc&)yYjkL`TL|Y@?oGnDyt{?ejM=3rBa`cpGMiViHwN) zlBjneO};GrF-A&fA{hS6;QHhL@$;?FKVe~t7!y;#+>6~aNJ9ZF&R682f83EXRsKR- z6DV#(|CPHGP$~pKT9777T@eF642Fkv(M9-SgX*CdVSwu@@JEC_O8H@2N^}^H%ef}L zoKYMiUqN}(xM=M%>iZCO!GD5bahVF>4Exx@{u~tn{3p2AoglrCc4cviG$G9Ic%b=@ z<@#$xY1<0YBK`QQh4QdGUkMz_=TFdE)xDzlu-{TiUg%j67~JHN|0<5}ULtGYr654M zL_FeNUVdfgyLpvFFE2kq9U$}v_bb?+O7nnc5Xl^+`W2eMf| zO7SSM@5pu*mmeUEC`SY>d|P%J8_4O3UoaPvu#x4;ue)4llmP!yWOYWP&7Cn#^iEtl RJoIeLznU7AhJ`o~_y6Yy51#-4 literal 0 HcmV?d00001 diff --git a/StoneRed.LogicSimulator/Program.cs b/StoneRed.LogicSimulator/Program.cs new file mode 100644 index 0000000..c727631 --- /dev/null +++ b/StoneRed.LogicSimulator/Program.cs @@ -0,0 +1,2 @@ +using StoneRed.LogicSimulator.Srls srls = new StoneRed.LogicSimulator.Srls(); +srls.Run(); \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Simulation/LogicGateSimulator.cs b/StoneRed.LogicSimulator/Simulation/LogicGateSimulator.cs new file mode 100644 index 0000000..befedb3 --- /dev/null +++ b/StoneRed.LogicSimulator/Simulation/LogicGateSimulator.cs @@ -0,0 +1,127 @@ +using StoneRed.LogicSimulator.Simulation.LogicGates.Interfaces; + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading; + +namespace StoneRed.LogicSimulator.Simulation; + +internal class LogicGateSimulator +{ + private readonly ConcurrentDictionary logicGates = new ConcurrentDictionary(); + private DateTime dateTime; + public int TargetTicksPerSecond { get; set; } = 100; + + public int ActualTicksPerSecond { get; private set; } + + public bool IsRunning { get; private set; } + + public bool ClockCalibrating { get; private set; } + + public bool HighPerformanceClock { get; set; } + + public LogicGateSimulator(List logicGates) + { + foreach (LogicGate logicGate in logicGates) + { + AddLogicGate(logicGate); + } + } + + public void Start() + { + Thread thread = new Thread(SimulationThread) + { + IsBackground = true + }; + + IsRunning = true; + + thread.Start(); + } + + public void Stop() + { + IsRunning = false; + } + + public void AddLogicGate(LogicGate gate) + { + gate.Id = logicGates.Count; + _ = logicGates.TryAdd(gate.Id, gate); + } + + public LogicGate GetLogicGate(int id) + { + return logicGates[id]; + } + + public IEnumerable GetLogicGates() + { + return logicGates.Values; + } + + public void RemoveLogicGate(LogicGate logicGate) + { + _ = logicGates.TryRemove(logicGate.Id, out _); + } + + public void SimulationThread() + { + int tps = 0; + float iterations = 10000; + + LogicGate[] logicGatesArray = logicGates.Values.ToArray(); + + while (IsRunning) + { + tps++; + + if (DateTime.Now > dateTime.AddSeconds(1)) + { + ActualTicksPerSecond = tps; + dateTime = DateTime.Now; + tps = 0; + + if (HighPerformanceClock) + { + float percentage = Math.Abs((TargetTicksPerSecond - (float)ActualTicksPerSecond) / Math.Abs((float)ActualTicksPerSecond) * 100); + + if (ActualTicksPerSecond / 2 > TargetTicksPerSecond) + { + iterations *= 2; + } + else if (ActualTicksPerSecond * 2 < TargetTicksPerSecond) + { + iterations /= 2; + } + else if (percentage > 5) + { + iterations *= (float)ActualTicksPerSecond / TargetTicksPerSecond; + } + + ClockCalibrating = percentage > 5; + } + } + for (int i = 0; i < logicGatesArray.Length; i++) + { + logicGatesArray[i].NextTick(); + } + for (int i = 0; i < logicGatesArray.Length; i++) + { + logicGatesArray[i].Update(); + } + + if (HighPerformanceClock) + { + Thread.SpinWait((int)iterations); + } + else + { + Thread.Sleep(Math.Max((int)(1f / TargetTicksPerSecond * 1000), 1)); + } + } + } +} \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Simulation/LogicGates/Button.cs b/StoneRed.LogicSimulator/Simulation/LogicGates/Button.cs new file mode 100644 index 0000000..27dced2 --- /dev/null +++ b/StoneRed.LogicSimulator/Simulation/LogicGates/Button.cs @@ -0,0 +1,42 @@ +using Microsoft.Xna.Framework; + +using MonoGame.Extended.Input; + +using StoneRed.LogicSimulator.Simulation.LogicGates.Interfaces; + +namespace StoneRed.LogicSimulator.Simulation.LogicGates; + +internal class Button : LogicGate, IInteractable, IColorable +{ + public override int OutputCount => 1; + + public override int InputCount => 0; + + public bool IsPressed { get; set; } + public Color Color { get; set; } = Color.Purple; + public string Info { get; set; } = "OFF"; + + public Button() + { + Metadata.Name = "Button"; + } + + public void OnInteraction(MouseStateExtended mouseState, MouseStateExtended previousMouseState, KeyboardStateExtended keyboardStateExtended) + { + IsPressed = mouseState.IsButtonDown(MouseButton.Left); + Color = IsPressed ? Color.Green : Color.Purple; + Info = IsPressed ? "ON" : "OFF"; + } + + protected override void Execute() + { + if (IsPressed) + { + SetOutputBit(1, 0); + } + else + { + SetOutputBit(0, 0); + } + } +} \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Simulation/LogicGates/Clock.cs b/StoneRed.LogicSimulator/Simulation/LogicGates/Clock.cs new file mode 100644 index 0000000..ee37044 --- /dev/null +++ b/StoneRed.LogicSimulator/Simulation/LogicGates/Clock.cs @@ -0,0 +1,78 @@ +using MonoGame.Extended.Input; + +using StoneRed.LogicSimulator.Simulation.LogicGates.Interfaces; + +using System; + +namespace StoneRed.LogicSimulator.Simulation.LogicGates; + +internal class Clock : LogicGate, IInteractable +{ + private int count = 0; + private int tickRate = 0; + public override int OutputCount => 1; + + public override int InputCount => 0; + + public string Info + { + get + { + if (tickRate <= 0) + { + return "Disabled"; + } + + return tickRate + "\n" + ((count > tickRate) ? count - tickRate : count); + } + } + + public Clock() + { + Metadata.Name = "Clock"; + } + + public void OnInteraction(MouseStateExtended mouseState, MouseStateExtended previousMouseState, KeyboardStateExtended keyboardStateExtended) + { + if (mouseState.DeltaScrollWheelValue == 0 || !keyboardStateExtended.IsShiftDown()) + { + return; + } + + if (mouseState.DeltaScrollWheelValue < 0 && tickRate < int.MaxValue - 10) + { + tickRate += keyboardStateExtended.IsControlDown() ? 10 : 1; + } + else if (tickRate >= 1) + { + tickRate -= keyboardStateExtended.IsControlDown() ? 10 : 1; + } + + tickRate = Math.Clamp(tickRate, 0, int.MaxValue); + } + + protected override void Execute() + { + if (tickRate <= 0) + { + SetOutputBit(0, 0); + return; + } + + if (count >= tickRate * 2) + { + count = 0; + } + + count++; + + if (count > tickRate) + { + SetOutputBit(1, 0); + } + else + { + SetOutputBit(0, 0); + } + } +} \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Simulation/LogicGates/Interfaces/IColorable.cs b/StoneRed.LogicSimulator/Simulation/LogicGates/Interfaces/IColorable.cs new file mode 100644 index 0000000..bd7a402 --- /dev/null +++ b/StoneRed.LogicSimulator/Simulation/LogicGates/Interfaces/IColorable.cs @@ -0,0 +1,8 @@ +using Microsoft.Xna.Framework; + +namespace StoneRed.LogicSimulator.Simulation.LogicGates.Interfaces; + +internal interface IColorable +{ + public Color Color { get; protected set; } +} \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Simulation/LogicGates/Interfaces/IInteractable.cs b/StoneRed.LogicSimulator/Simulation/LogicGates/Interfaces/IInteractable.cs new file mode 100644 index 0000000..c60ca95 --- /dev/null +++ b/StoneRed.LogicSimulator/Simulation/LogicGates/Interfaces/IInteractable.cs @@ -0,0 +1,10 @@ +using MonoGame.Extended.Input; + +namespace StoneRed.LogicSimulator.Simulation.LogicGates.Interfaces; + +internal interface IInteractable +{ + public string Info { get; } + + public void OnInteraction(MouseStateExtended mouseState, MouseStateExtended previousMouseState, KeyboardStateExtended keyboardStateExtended); +} \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Simulation/LogicGates/Interfaces/LogicGate.cs b/StoneRed.LogicSimulator/Simulation/LogicGates/Interfaces/LogicGate.cs new file mode 100644 index 0000000..fa05d99 --- /dev/null +++ b/StoneRed.LogicSimulator/Simulation/LogicGates/Interfaces/LogicGate.cs @@ -0,0 +1,130 @@ +using StoneRed.LogicSimulator.Utilities; + +using System; +using System.Collections.Generic; + +namespace StoneRed.LogicSimulator.Simulation.LogicGates.Interfaces; +#pragma warning disable S112 // General exceptions should never be thrown + +internal abstract class LogicGate +{ + private readonly List logicGateConnections = new(); + private int currentInput; + private int newInput; + private int output; + private int cachedOutput; + + public LogicGateMetadata Metadata { get; set; } = new LogicGateMetadata(); + public int Id { get; set; } + public IReadOnlyList LogicGateConnections => logicGateConnections.AsReadOnly(); + public abstract int OutputCount { get; } + + public abstract int InputCount { get; } + + public void NextTick() + { + currentInput = newInput; + newInput = 0; + output = 0; + } + + public void SetInput(int value, int index) + { + if (index >= InputCount) + { + throw new IndexOutOfRangeException(); + } + + // Inputs should act as or gates + + if (value == 1) + { + newInput.SetBit(1, index); + } + } + + public void Connect(LogicGate logicGate, int inputIndex, int outputIndex) + { + if (inputIndex >= logicGate.InputCount) + { + throw new IndexOutOfRangeException(); + } + + if (outputIndex >= OutputCount) + { + throw new IndexOutOfRangeException(); + } + + logicGateConnections.Add(new LogicGateConnection(logicGate, inputIndex, outputIndex)); + } + + public void Disconnect(LogicGate logicGate) + { + int index = logicGateConnections.FindIndex(c => c.LogicGate.Id == logicGate.Id); + logicGateConnections.RemoveAt(index); + } + + public void Update() + { + Execute(); + cachedOutput = output; + PublishOutput(); + } + + public int GetCachedOutputBit(int index) + { + if (index < 0 || index >= OutputCount) + { + throw new IndexOutOfRangeException(); + } + + return cachedOutput.GetBit(index); + } + + protected abstract void Execute(); + + protected int GetInputBit(int index) + { + if (index < 0 || index >= InputCount) + { + throw new IndexOutOfRangeException(); + } + + return currentInput.GetBit(index); + } + + protected void SetOutputBit(int value, int index) + { + if (index < 0 || index >= OutputCount) + { + throw new IndexOutOfRangeException(); + } + + output.SetBit(value, index); + } + + private void PublishOutput() + { + foreach (LogicGateConnection connection in logicGateConnections) + { + connection.LogicGate.SetInput(output.GetBit(connection.OutputIndex), connection.InputIndex); + } + } +} + +#pragma warning restore S112 // General exceptions should never be thrown + +internal class LogicGateConnection +{ + public LogicGate LogicGate { get; } + + public int InputIndex { get; } + public int OutputIndex { get; } + + public LogicGateConnection(LogicGate logicGate, int inputIndex, int outputIndex) + { + LogicGate = logicGate; + InputIndex = inputIndex; + OutputIndex = outputIndex; + } +}; \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Simulation/LogicGates/Lamp.cs b/StoneRed.LogicSimulator/Simulation/LogicGates/Lamp.cs new file mode 100644 index 0000000..6d0d40b --- /dev/null +++ b/StoneRed.LogicSimulator/Simulation/LogicGates/Lamp.cs @@ -0,0 +1,19 @@ +using Microsoft.Xna.Framework; + +using StoneRed.LogicSimulator.Simulation.LogicGates.Interfaces; + +namespace StoneRed.LogicSimulator.Simulation.LogicGates; + +internal class Lamp : LogicGate, IColorable +{ + public override int OutputCount => 0; + + public override int InputCount => 1; + + public Color Color { get; set; } = Color.CadetBlue; + + protected override void Execute() + { + Color = GetInputBit(0) == 0 ? Color.CadetBlue : Color.Yellow; + } +} \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Simulation/LogicGates/LogicGateMetadata.cs b/StoneRed.LogicSimulator/Simulation/LogicGates/LogicGateMetadata.cs new file mode 100644 index 0000000..31e12d3 --- /dev/null +++ b/StoneRed.LogicSimulator/Simulation/LogicGates/LogicGateMetadata.cs @@ -0,0 +1,13 @@ +using Microsoft.Xna.Framework; + +namespace StoneRed.LogicSimulator.Simulation.LogicGates; + +internal record LogicGateMetadata +{ + public Vector2 Position { get; set; } + + public Vector2 Size { get; set; } = new Vector2(100, 100); + + public string Name { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Simulation/LogicGates/Pin.cs b/StoneRed.LogicSimulator/Simulation/LogicGates/Pin.cs new file mode 100644 index 0000000..ce430d7 --- /dev/null +++ b/StoneRed.LogicSimulator/Simulation/LogicGates/Pin.cs @@ -0,0 +1,18 @@ +using StoneRed.LogicSimulator.Simulation.LogicGates.Interfaces; + +namespace StoneRed.LogicSimulator.Simulation.LogicGates; + +internal class Pin : LogicGate +{ + public override int OutputCount => 1; + + public override int InputCount => 1; + + protected override void Execute() + { + for (int i = 0; i < InputCount; i++) + { + SetOutputBit(GetInputBit(i), i); + } + } +} \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Simulation/LogicGates/Switch.cs b/StoneRed.LogicSimulator/Simulation/LogicGates/Switch.cs new file mode 100644 index 0000000..f379c39 --- /dev/null +++ b/StoneRed.LogicSimulator/Simulation/LogicGates/Switch.cs @@ -0,0 +1,46 @@ +using Microsoft.Xna.Framework; + +using MonoGame.Extended.Input; + +using StoneRed.LogicSimulator.Simulation.LogicGates.Interfaces; + +namespace StoneRed.LogicSimulator.Simulation.LogicGates; + +internal class Switch : LogicGate, IInteractable, IColorable +{ + public override int OutputCount => 1; + + public override int InputCount => 0; + + public bool IsPressed { get; set; } + public Color Color { get; set; } = Color.Purple; + public string Info { get; set; } = "OFF"; + + public Switch() + { + Metadata.Name = "Switch"; + } + + public void OnInteraction(MouseStateExtended mouseState, MouseStateExtended previousMouseState, KeyboardStateExtended keyboardStateExtended) + { + if (mouseState.IsButtonDown(MouseButton.Left) && !previousMouseState.IsButtonDown(MouseButton.Left)) + { + IsPressed = !IsPressed; + } + + Color = IsPressed ? Color.Green : Color.Purple; + Info = IsPressed ? "ON" : "OFF"; + } + + protected override void Execute() + { + if (IsPressed) + { + SetOutputBit(1, 0); + } + else + { + SetOutputBit(0, 0); + } + } +} \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Simulation/LogicGates/TestLogicGate.cs b/StoneRed.LogicSimulator/Simulation/LogicGates/TestLogicGate.cs new file mode 100644 index 0000000..1ea8aed --- /dev/null +++ b/StoneRed.LogicSimulator/Simulation/LogicGates/TestLogicGate.cs @@ -0,0 +1,20 @@ +using StoneRed.LogicSimulator.Simulation.LogicGates.Interfaces; + +namespace StoneRed.LogicSimulator.Simulation.LogicGates; + +internal class TestLogicGate : LogicGate +{ + public override int InputCount => 1; + + public override int OutputCount => 1; + + public TestLogicGate() + { + Metadata.Name = "Test"; + } + + protected override void Execute() + { + SetOutputBit(GetInputBit(0) == 1 ? 0 : 1, 0); + } +} \ No newline at end of file diff --git a/StoneRed.LogicSimulator/Srls.cs b/StoneRed.LogicSimulator/Srls.cs new file mode 100644 index 0000000..d7ef1b2 --- /dev/null +++ b/StoneRed.LogicSimulator/Srls.cs @@ -0,0 +1,177 @@ +using FontStashSharp; + +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; + +using MonoGame.Extended.Screens; + +using Myra; +using Myra.Assets; +using Myra.Graphics2D.UI; +using Myra.Utility; + +using StoneRed.LogicSimulator.UserInterface.Screens; +using StoneRed.LogicSimulator.UserInterface.Windows; +using StoneRed.LogicSimulator.Utilities; + +using System.IO; + +namespace StoneRed.LogicSimulator; + +internal class Srls : Game +{ + private readonly ScreenManager screenManager; + private SrlsWindow? currentSrlsWindow = null; + private SrlsScreen? currentSrlsScreen = null; + public float Scale { get; private set; } + public GraphicsDeviceManager Graphics { get; } + + public Desktop Desktop { get; private set; } = null!; + public SpriteBatch SpriteBatch { get; private set; } = null!; + + public FontSystem FontSystem { get; private set; } = null!; + public AssetManager AssetManager { get; private set; } = null!; + + public Settings Settings { get; set; } + + public string ContentPath { get; } + + public string SettingsPath { get; } + + public Srls() + { + Content.RootDirectory = "Content"; + + ContentPath = Path.Combine(PathUtils.ExecutingAssemblyDirectory, "Content"); + SettingsPath = Path.Combine(PathUtils.ExecutingAssemblyDirectory, "settings.json"); + + Settings = Settings.Load(SettingsPath) ?? new Settings() + { + Resolution = new Resolution(GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Width, GraphicsAdapter.DefaultAdapter.CurrentDisplayMode.Height), + Scale = 1 + }; + + Graphics = new GraphicsDeviceManager(this) + { + PreferredBackBufferWidth = Settings.Resolution.Width, + PreferredBackBufferHeight = Settings.Resolution.Height, + }; + + Window.AllowUserResizing = true; + IsMouseVisible = true; + + screenManager = new ScreenManager(); + Components.Add(screenManager); + } + + public void LoadScreen() where T : SrlsScreen, new() + { + LoadScreen(new T()); + } + + public void LoadScreen(SrlsScreen screen) + { + GameScreen gameScreen = screen.Load(this); + + currentSrlsScreen = screen; + + screenManager.LoadScreen(gameScreen); + } + + public void ShowWindow() where T : SrlsWindow, new() + { + ShowWindow(new T()); + } + + public void ShowWindow(SrlsWindow window) + { + currentSrlsWindow?.Close(); + + window.Load(this); + window.Initialize(); + window.Closed += (s, a) => currentSrlsWindow = null; + window.Scale = new Vector2(Scale / 2, Scale / 2); + + window.Show(); + + currentSrlsWindow = window; + } + + public void ShowContextMenu(string title, Point position, params MenuItem[] menuItems) + { + string data = File.ReadAllText(Path.Combine(ContentPath, "ContextMenu.xmmp")); + VerticalStackPanel contextMenu = (VerticalStackPanel)Project.LoadFromXml(data, AssetManager).Root; + + contextMenu.FindChildById