No edit summary
No edit summary
Line 1: Line 1:
= Main menu =
= Main menu =


When you start '''PC Simulator''', the first place you land is the '''main menu'''. This is where you choose what to do next—open a [[Save]], try the [[Tutorial]] (if the game nudges you), change options, or quit back to your desktop.
The '''main menu''' is the primary user interface presented when '''[[PC Simulator]]''' starts. It is implemented in the Menu scene and provides access to saved games, the [[Tutorial]], configuration options, and application exit. Save data uses the <code>.pc</code> format documented at [[Save]]; external editing is described at [[Save Editor]]. Discoverable interactions that load preset saves are summarized at [[Secrets]]; the hidden-room achievement context appears at [[Achievements:The Hidden Room]].
 
The menu is part of the '''Menu''' scene in the game build. For how saves are stored and edited outside the game, see [[Save]] and [[Save Editor]]; for oddities and easter eggs that sometimes touch the menu flow, see [[Secrets]] and [[Achievements:The Hidden Room]].


{| style="float:right; width:280px; margin:0 0 1em 1em; border-collapse:collapse; border:1px solid #c8ccd1; background:#f8f9fa; font-size:92%;"
{| style="float:right; width:280px; margin:0 0 1em 1em; border-collapse:collapse; border:1px solid #c8ccd1; background:#f8f9fa; font-size:92%;"
|+ style="background:#eaecf0; border:1px solid #c8ccd1; padding:6px; font-weight:bold;" | At a glance
|+ style="background:#eaecf0; border:1px solid #c8ccd1; padding:6px; font-weight:bold;" | Summary
|-
|-
| style="border:1px solid #c8ccd1; padding:6px;" | '''Feels like'''
| style="border:1px solid #c8ccd1; padding:6px;" | '''Function'''
| style="border:1px solid #c8ccd1; padding:6px;" | A hub: pick a save, learn the ropes, or adjust the game before you play
| style="border:1px solid #c8ccd1; padding:6px;" | Front-end hub for starting play, managing saves, and adjusting session settings
|-
|-
| style="border:1px solid #c8ccd1; padding:6px;" | '''Saves'''
| style="border:1px solid #c8ccd1; padding:6px;" | '''Save format'''
| style="border:1px solid #c8ccd1; padding:6px;" | Your <code>.pc</code> files see [[Save]]
| style="border:1px solid #c8ccd1; padding:6px;" | <code>.pc</code> files; see [[Save]]
|-
|-
| style="border:1px solid #c8ccd1; padding:6px;" | '''Money vs crypto'''
| style="border:1px solid #c8ccd1; padding:6px;" | '''Related economy'''
| style="border:1px solid #c8ccd1; padding:6px;" | In-game cash and [[Bitcoin]] (mining apps tie into [[EZ Mining]])
| style="border:1px solid #c8ccd1; padding:6px;" | [[Bitcoin]] and in-game mining ([[EZ Mining]]) apply after gameplay begins
|-
|-
| style="border:1px solid #c8ccd1; padding:6px;" | '''Small touch'''
| style="border:1px solid #c8ccd1; padding:6px;" | '''Presentation'''
| style="border:1px solid #c8ccd1; padding:6px;" | The title blinks, a bit like a cursor
| style="border:1px solid #c8ccd1; padding:6px;" | The title text alternates to simulate a blinking cursor
|}
|}


<div style="clear:both;"></div>
<div style="clear:both;"></div>


== What you can do here ==
== Purpose and functions ==


* '''Load a game''' — Your saves show up as a list (newest usually first). Hardcore runs may show a little marker so you don’t mix them up with normal runs.
The main menu exposes the following capabilities:
* '''Tutorial''' — If you haven’t seen the latest tutorial revision, the game may suggest it. Accepting marks that version as “seen” so it won’t keep asking every launch.
* '''Settings''' — Things like language, resolution, and frame rate options get applied early so the menu already matches how you like to play.
* '''Volume''' — Master volume from your last session is restored before you hear much audio.
* '''Import a save''' — You can pull in a <code>.pc</code> file from somewhere else (handy if you’re [[Modding]] or sharing with friends). Bad or incompatible files show a clear error instead of silently breaking.
* '''Quit''' — Closes the game on builds that support it (in the editor it often does nothing visible).


== How starting a game works (simple) ==
* '''Game load:''' Saved games are listed, typically ordered by most recent file modification time. Saves flagged as hardcore may display a dedicated indicator in the user interface.
* '''Tutorial access:''' If the stored tutorial revision is older than the value configured in the build, a prompt object is shown. Accepting the tutorial updates the stored revision and loads the Tutorial scene.
* '''Settings:''' Frame rate and resolution preferences are restored when the menu initializes so that the initial view matches prior configuration.
* '''Audio:''' Master volume is read from <code>PlayerPrefs</code> and applied to the audio listener before extended playback.
* '''Import:''' External <code>.pc</code> files may be selected, validated, and copied into the user save directory. Invalid or incompatible files produce an error message. This workflow supports distribution and [[Modding]].
* '''Exit:''' The application requests termination via <code>Application.Quit</code>. Behaviour depends on platform; the Unity Editor may show no visible shutdown.


# You pick a save row (or the game loads a preset / example file).
== Load sequence (overview) ==
# The game stores “use this file” for the next scene.
# You’re sent to the '''room''' that save belongs to—not every save uses the same room layout.


Some [[Secrets]] or special triggers load an example file (for instance content tied to [[Achievements:The Hidden Room]]). Under the hood that’s the same pipeline as opening a normal [[Save]], just reading from a different folder.
# The player selects a save entry, or the application loads a preset or example file.
# The active <code>DataLoader</code> instance is registered for the subsequent scene.
# The target scene index is derived from saved <code>GameData.room</code> relative to a configured base build index.
 
Certain [[Secrets]] and achievement-related paths load example content from streaming assets rather than the user save folder. The programmatic path parallels normal save loading once the file contents are obtained. See [[Achievements:The Hidden Room]] for the documented hidden-room case.


== In-depth ==
== In-depth ==


This section is for readers who want '''exact behaviour''' and '''script names'''. It matches the decompiled / project logic; if you’re digging through assets, see [[Decompile]] and [[Modding]].
The following subsection describes implementation-level behaviour consistent with the decompiled project structure. Asset extraction is discussed at [[Decompile]]; extension of behaviour at [[Modding]].


=== Scripts and roles ===
=== Core components ===


{| style="border-collapse:collapse; width:100%; border:1px solid #c8ccd1;"
{| style="border-collapse:collapse; width:100%; border:1px solid #c8ccd1;"
|- style="background:#eaecf0;"
|- style="background:#eaecf0;"
! style="border:1px solid #c8ccd1; padding:8px; text-align:left; width:22%;" | Script
! style="border:1px solid #c8ccd1; padding:8px; text-align:left; width:22%;" | Type
! style="border:1px solid #c8ccd1; padding:8px; text-align:left;" | Role
! style="border:1px solid #c8ccd1; padding:8px; text-align:left;" | Description
|-
|-
| style="border:1px solid #c8ccd1; padding:8px; vertical-align:top;" | <code>MainMenu</code>
| style="border:1px solid #c8ccd1; padding:8px; vertical-align:top;" | <code>MainMenu</code>
| style="border:1px solid #c8ccd1; padding:8px;" | Singleton (<code>MainMenu.Instance</code>). Initializes [[Localization]] (below), restores FPS/resolution, handles tutorial version gating, blinks the title, loads scenes and example files, calls <code>Application.Quit</code>.
| style="border:1px solid #c8ccd1; padding:8px;" | MonoBehaviour singleton exposed as <code>MainMenu.Instance</code>. Initializes localization, restores display settings, controls tutorial gating, drives the title animation, performs asynchronous scene loads, loads example files, and invokes quit.
|-
|-
| style="border:1px solid #c8ccd1; padding:8px; vertical-align:top;" | <code>MenuManager</code>
| style="border:1px solid #c8ccd1; padding:8px; vertical-align:top;" | <code>MenuManager</code>
| style="border:1px solid #c8ccd1; padding:8px;" | Stack of active menu <code>GameObject</code> pages. <code>ShowMenu(string)</code> finds a child whose '''hierarchy name''' matches the string (e.g. <code>Loading</code>). <code>Back</code> pops one level. <code>HideMenu</code> toggles the top without popping. Optional click sounds.
| style="border:1px solid #c8ccd1; padding:8px;" | Maintains a stack of active menu <code>GameObject</code> roots. <code>ShowMenu(string)</code> activates the child whose object name matches the argument (for example <code>Loading</code>). <code>Back</code> removes the current page when the stack depth exceeds one. <code>HideMenu</code> toggles visibility of the top entry without altering stack order. Optional audio feedback may be enabled.
|-
|-
| style="border:1px solid #c8ccd1; padding:8px; vertical-align:top;" | <code>FileMenu</code>
| style="border:1px solid #c8ccd1; padding:8px; vertical-align:top;" | <code>FileMenu</code>
| style="border:1px solid #c8ccd1; padding:8px;" | Scans the save directory for <code>.pc</code> files, sorts by last write time, builds UI rows, supports rename/metadata via <code>FileInformation</code>, delete, and import through a native file picker.
| style="border:1px solid #c8ccd1; padding:8px;" | Enumerates save files, constructs list entries, supports metadata editing through <code>FileInformation</code>, deletion, and import via native file selection.
|}
|}


=== Localization ===
=== Localization ===


On <code>Awake</code>, <code>MainMenu</code> calls <code>Localization.CreateContent()</code>, sets language from <code>PlayerPrefs "Language"</code> or maps <code>Application.systemLanguage</code> to a short code, and subscribes to language changes to persist the choice. See also the standalone page [[Localization]] for strings and language list detail if you document it there.
During <code>Awake</code>, <code>MainMenu</code> invokes <code>Localization.CreateContent()</code>, sets the active language from stored preferences or from <code>Application.systemLanguage</code>, and registers a handler so language changes persist. Further string tables and language codes may be documented at [[Localization]].
 
=== Tutorial gating ===


<code>PlayerPrefs.GetInt("TutorialVersion", -1)</code> is compared to an editor field <code>tutorialVersion</code>. If the stored value is lower, <code>guideToTutorial</code> is shown. <code>Tutorial()</code> writes the current version and loads the <code>"Tutorial"</code> scene by name.
=== Tutorial revision flag ===


=== Loading screen ===
The integer <code>TutorialVersion</code> in <code>PlayerPrefs</code> is compared to the serialized <code>tutorialVersion</code> field. When the stored value is lower, the guide object is enabled. The <code>Tutorial()</code> method writes the current revision and loads the scene named <code>Tutorial</code>.


Any menu-driven scene load shows the <code>Loading</code> page first, then runs an async load coroutine: progress is mapped from Unity’s <code>0…0.9</code> range to a 0–100% display; at <code>0.9</code> it shows 100%, waits 0.5s, then allows scene activation. See [[Loading screen]] for a dedicated write-up if you split it out.
=== Asynchronous loading ===


=== Save load path ===
Scene transitions display a <code>Loading</code> menu page, then execute an asynchronous load. Reported progress is scaled so that the engine’s <code>0.9</code> completion point maps to a 100 percent display value. After reaching that threshold, the interface shows 100 percent, delays for a fixed interval, then permits scene activation. A dedicated article may appear at [[Loading screen]].


<code>LoadFile(DataLoader loader)</code> assigns <code>SaveManager.Loader = loader</code> and loads build index <code>startRoomSceneIndex + GameData.room</code>. The base index is set in the inspector so save data only needs a small room id. Full format notes belong on [[Save]].
=== Save and example loading ===


=== Example / preset loads ===
<code>LoadFile(DataLoader loader)</code> assigns <code>SaveManager.Loader</code> and loads the build index <code>startRoomSceneIndex + GameData.room</code>. The inspector-configured <code>startRoomSceneIndex</code> aligns logical room identifiers with the editor build order.


<code>LoadExample(string name)</code> reads <code>StreamingAssets/Examples/{name}.pc</code>. On Android/WebGL it uses <code>UnityWebRequest</code>; elsewhere <code>File.ReadAllText</code>. Parsed with <code>DataLoader.LoadFromString</code>, then the same <code>LoadFile</code> as user saves. Document bundled filenames on [[StreamingAssets]] if you list them.
<code>LoadExample(string name)</code> reads <code>StreamingAssets/Examples/{name}.pc</code>. On Android and WebGL the implementation uses <code>UnityWebRequest</code>; on other platforms it uses direct file read APIs. The payload is passed to <code>DataLoader.LoadFromString</code>, followed by <code>LoadFile</code>. Bundled asset names may be listed at [[StreamingAssets]].


=== File import (<code>FileMenu.Import</code>) ===
=== Import implementation ===


Native picker filtered to <code>.pc</code>, read permission check, <code>DataLoader.LoadFromPath()</code> validation (failure message mentions compatibility with version 1.7.0+), then <code>File.Copy</code> into the save folder via <code>SaveUtility.GetNewPath</code>, destroy old rows, rescan folder.
<code>FileMenu.Import</code> opens a native picker restricted to <code>.pc</code> extensions, verifies read access, attempts <code>DataLoader.LoadFromPath</code>, copies the file into the save directory using <code>SaveUtility.GetNewPath</code>, destroys existing list rows, and rebuilds the list from disk. Parse failures surface a localized error referencing minimum supported save versions.


=== Related systems ===
=== Ancillary topics ===


* '''In-game pause''' uses the same hide/show idea for UI; short page: [[Pause menu]].
* In-game suspension of menu visibility is related to the [[Pause menu]].
* '''Gallery''' for menu screenshots: [[Gallery]].
* Visual documentation: [[Gallery]].
* '''Credits / people''': [[Cheng Yi-Ming]], [[Yiming Connect]], [[VerdiX]] (link where your wiki places engine or services context).
* Personnel and services context: [[Cheng Yi-Ming]], [[Yiming Connect]], [[VerdiX]].
* '''Wiki conduct''': [[PC Simulator Unofficial Wiki:Rules]].
* Editorial policy: [[PC Simulator Unofficial Wiki:Rules]].


=== Data flow (quick reference) ===
=== Control flow reference ===


{| style="border-collapse:collapse; width:100%; border:1px solid #c8ccd1;"
{| style="border-collapse:collapse; width:100%; border:1px solid #c8ccd1;"
|- style="background:#eaecf0;"
|- style="background:#eaecf0;"
! style="border:1px solid #c8ccd1; padding:8px; text-align:left; width:28%;" | Trigger
! style="border:1px solid #c8ccd1; padding:8px; text-align:left; width:28%;" | Event
! style="border:1px solid #c8ccd1; padding:8px; text-align:left;" | What runs
! style="border:1px solid #c8ccd1; padding:8px; text-align:left;" | Processing
|-
|-
| style="border:1px solid #c8ccd1; padding:8px; vertical-align:top;" | Click save name
| style="border:1px solid #c8ccd1; padding:8px; vertical-align:top;" | Save name activated
| style="border:1px solid #c8ccd1; padding:8px;" | <code>MainMenu.LoadFile</code> <code>SaveManager.Loader</code> → async <code>startRoomSceneIndex + room</code>
| style="border:1px solid #c8ccd1; padding:8px;" | <code>MainMenu.LoadFile</code>; <code>SaveManager.Loader</code> assignment; asynchronous load of <code>startRoomSceneIndex + room</code>
|-
|-
| style="border:1px solid #c8ccd1; padding:8px; vertical-align:top;" | Example / secret preset
| style="border:1px solid #c8ccd1; padding:8px; vertical-align:top;" | Example or secret preset
| style="border:1px solid #c8ccd1; padding:8px;" | <code>LoadExample</code> from streaming path → <code>LoadFile</code> (same as save)
| style="border:1px solid #c8ccd1; padding:8px;" | <code>LoadExample</code> from streaming assets; then <code>LoadFile</code>
|-
|-
| style="border:1px solid #c8ccd1; padding:8px; vertical-align:top;" | Any menu scene transition
| style="border:1px solid #c8ccd1; padding:8px; vertical-align:top;" | Scene transition from menu
| style="border:1px solid #c8ccd1; padding:8px;" | <code>ShowMenu("Loading")</code> then async coroutine
| style="border:1px solid #c8ccd1; padding:8px;" | <code>ShowMenu("Loading")</code>; coroutine until activation allowed
|-
|-
| style="border:1px solid #c8ccd1; padding:8px; vertical-align:top;" | Start tutorial
| style="border:1px solid #c8ccd1; padding:8px; vertical-align:top;" | Tutorial accepted
| style="border:1px solid #c8ccd1; padding:8px;" | Update <code>TutorialVersion</code> <code>LoadScene("Tutorial")</code>
| style="border:1px solid #c8ccd1; padding:8px;" | <code>TutorialVersion</code> updated; <code>LoadScene("Tutorial")</code>
|}
|}


== See also ==
== See also ==


* [[PC Simulator]] — the game this menu belongs to
* [[PC Simulator]]
* [[Save]] · [[Save Editor]] — files and external editing
* [[Save]] · [[Save Editor]]
* [[Secrets]] · [[Achievements:The Hidden Room]] — hidden flows that load special saves
* [[Secrets]] · [[Achievements:The Hidden Room]]
* [[Bitcoin]] · [[EZ Mining]] — economy hooks players meet after leaving the menu
* [[Bitcoin]] · [[EZ Mining]]
* [[Modding]] · [[Decompile]] — digging into <code>MainMenu</code> / <code>MenuManager</code> / <code>FileMenu</code>
* [[Modding]] · [[Decompile]]
* [[Main Page]] - wiki home
* [[Main Page]]

Revision as of 18:19, 22 March 2026

Main menu

The main menu is the primary user interface presented when PC Simulator starts. It is implemented in the Menu scene and provides access to saved games, the Tutorial, configuration options, and application exit. Save data uses the .pc format documented at Save; external editing is described at Save Editor. Discoverable interactions that load preset saves are summarized at Secrets; the hidden-room achievement context appears at Achievements:The Hidden Room.

Summary
Function Front-end hub for starting play, managing saves, and adjusting session settings
Save format .pc files; see Save
Related economy Bitcoin and in-game mining (EZ Mining) apply after gameplay begins
Presentation The title text alternates to simulate a blinking cursor

Purpose and functions

The main menu exposes the following capabilities:

  • Game load: Saved games are listed, typically ordered by most recent file modification time. Saves flagged as hardcore may display a dedicated indicator in the user interface.
  • Tutorial access: If the stored tutorial revision is older than the value configured in the build, a prompt object is shown. Accepting the tutorial updates the stored revision and loads the Tutorial scene.
  • Settings: Frame rate and resolution preferences are restored when the menu initializes so that the initial view matches prior configuration.
  • Audio: Master volume is read from PlayerPrefs and applied to the audio listener before extended playback.
  • Import: External .pc files may be selected, validated, and copied into the user save directory. Invalid or incompatible files produce an error message. This workflow supports distribution and Modding.
  • Exit: The application requests termination via Application.Quit. Behaviour depends on platform; the Unity Editor may show no visible shutdown.

Load sequence (overview)

  1. The player selects a save entry, or the application loads a preset or example file.
  2. The active DataLoader instance is registered for the subsequent scene.
  3. The target scene index is derived from saved GameData.room relative to a configured base build index.

Certain Secrets and achievement-related paths load example content from streaming assets rather than the user save folder. The programmatic path parallels normal save loading once the file contents are obtained. See Achievements:The Hidden Room for the documented hidden-room case.

In-depth

The following subsection describes implementation-level behaviour consistent with the decompiled project structure. Asset extraction is discussed at Decompile; extension of behaviour at Modding.

Core components

Type Description
MainMenu MonoBehaviour singleton exposed as MainMenu.Instance. Initializes localization, restores display settings, controls tutorial gating, drives the title animation, performs asynchronous scene loads, loads example files, and invokes quit.
MenuManager Maintains a stack of active menu GameObject roots. ShowMenu(string) activates the child whose object name matches the argument (for example Loading). Back removes the current page when the stack depth exceeds one. HideMenu toggles visibility of the top entry without altering stack order. Optional audio feedback may be enabled.
FileMenu Enumerates save files, constructs list entries, supports metadata editing through FileInformation, deletion, and import via native file selection.

Localization

During Awake, MainMenu invokes Localization.CreateContent(), sets the active language from stored preferences or from Application.systemLanguage, and registers a handler so language changes persist. Further string tables and language codes may be documented at Localization.

Tutorial revision flag

The integer TutorialVersion in PlayerPrefs is compared to the serialized tutorialVersion field. When the stored value is lower, the guide object is enabled. The Tutorial() method writes the current revision and loads the scene named Tutorial.

Asynchronous loading

Scene transitions display a Loading menu page, then execute an asynchronous load. Reported progress is scaled so that the engine’s 0.9 completion point maps to a 100 percent display value. After reaching that threshold, the interface shows 100 percent, delays for a fixed interval, then permits scene activation. A dedicated article may appear at Loading screen.

Save and example loading

LoadFile(DataLoader loader) assigns SaveManager.Loader and loads the build index startRoomSceneIndex + GameData.room. The inspector-configured startRoomSceneIndex aligns logical room identifiers with the editor build order.

LoadExample(string name) reads StreamingAssets/Examples/{name}.pc. On Android and WebGL the implementation uses UnityWebRequest; on other platforms it uses direct file read APIs. The payload is passed to DataLoader.LoadFromString, followed by LoadFile. Bundled asset names may be listed at StreamingAssets.

Import implementation

FileMenu.Import opens a native picker restricted to .pc extensions, verifies read access, attempts DataLoader.LoadFromPath, copies the file into the save directory using SaveUtility.GetNewPath, destroys existing list rows, and rebuilds the list from disk. Parse failures surface a localized error referencing minimum supported save versions.

Ancillary topics

Control flow reference

Event Processing
Save name activated MainMenu.LoadFile; SaveManager.Loader assignment; asynchronous load of startRoomSceneIndex + room
Example or secret preset LoadExample from streaming assets; then LoadFile
Scene transition from menu ShowMenu("Loading"); coroutine until activation allowed
Tutorial accepted TutorialVersion updated; LoadScene("Tutorial")

See also