This repository has been archived on 2022-04-04. You can view files and clone it, but cannot push or open issues or pull requests.

221 lines
16 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source of the Rust file `game&#x2F;game_logic&#x2F;src&#x2F;lib.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>lib.rs - source</title><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Regular.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../FiraSans-Medium.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Regular.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceSerif4-Bold.ttf.woff2"><link rel="preload" as="font" type="font/woff2" crossorigin href="../../SourceCodePro-Semibold.ttf.woff2"><link rel="stylesheet" type="text/css" href="../../normalize.css"><link rel="stylesheet" type="text/css" href="../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../ayu.css" disabled><link rel="stylesheet" type="text/css" href="../../dark.css" disabled><link rel="stylesheet" type="text/css" href="../../light.css" id="themeStyle"><script id="default-settings" ></script><script src="../../storage.js"></script><script src="../../crates.js"></script><script defer src="../../main.js"></script><script defer src="../../source-script.js"></script><script defer src="../../source-files.js"></script>
<noscript><link rel="stylesheet" href="../../noscript.css"></noscript><link rel="alternate icon" type="image/png" href="../../favicon-16x16.png"><link rel="alternate icon" type="image/png" href="../../favicon-32x32.png"><link rel="icon" type="image/svg+xml" href="../../favicon.svg"></head><body class="rustdoc source"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu" role="button">&#9776;</div><a class="sidebar-logo" href="../../game_logic/index.html"><div class="logo-container"><img class="rust-logo" src="../../rust-logo.png" alt="logo"></div>
</a></nav><main><div class="width-limiter"><div class="sub-container"><a class="sub-logo-container" href="../../game_logic/index.html"><img class="rust-logo" src="../../rust-logo.png" alt="logo"></a><nav class="sub"><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!" aria-haspopup="menu" title="themes"><img width="18" height="18" alt="Pick another theme!" src="../../brush.svg"></button><div id="theme-choices" role="menu"></div></div><form class="search-form"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"></div><button type="button" id="help-button" title="help">?</button><a id="settings-menu" href="../../settings.html" title="settings"><img width="18" height="18" alt="Change settings" src="../../wheel.svg"></a></div></form></nav></div><section id="main-content" class="content"><div class="example-wrap"><pre class="line-numbers"><span id="1"> 1</span>
<span id="2"> 2</span>
<span id="3"> 3</span>
<span id="4"> 4</span>
<span id="5"> 5</span>
<span id="6"> 6</span>
<span id="7"> 7</span>
<span id="8"> 8</span>
<span id="9"> 9</span>
<span id="10"> 10</span>
<span id="11"> 11</span>
<span id="12"> 12</span>
<span id="13"> 13</span>
<span id="14"> 14</span>
<span id="15"> 15</span>
<span id="16"> 16</span>
<span id="17"> 17</span>
<span id="18"> 18</span>
<span id="19"> 19</span>
<span id="20"> 20</span>
<span id="21"> 21</span>
<span id="22"> 22</span>
<span id="23"> 23</span>
<span id="24"> 24</span>
<span id="25"> 25</span>
<span id="26"> 26</span>
<span id="27"> 27</span>
<span id="28"> 28</span>
<span id="29"> 29</span>
<span id="30"> 30</span>
<span id="31"> 31</span>
<span id="32"> 32</span>
<span id="33"> 33</span>
<span id="34"> 34</span>
<span id="35"> 35</span>
<span id="36"> 36</span>
<span id="37"> 37</span>
<span id="38"> 38</span>
<span id="39"> 39</span>
<span id="40"> 40</span>
<span id="41"> 41</span>
<span id="42"> 42</span>
<span id="43"> 43</span>
<span id="44"> 44</span>
<span id="45"> 45</span>
<span id="46"> 46</span>
<span id="47"> 47</span>
<span id="48"> 48</span>
<span id="49"> 49</span>
<span id="50"> 50</span>
<span id="51"> 51</span>
<span id="52"> 52</span>
<span id="53"> 53</span>
<span id="54"> 54</span>
<span id="55"> 55</span>
<span id="56"> 56</span>
<span id="57"> 57</span>
<span id="58"> 58</span>
<span id="59"> 59</span>
<span id="60"> 60</span>
<span id="61"> 61</span>
<span id="62"> 62</span>
<span id="63"> 63</span>
<span id="64"> 64</span>
<span id="65"> 65</span>
<span id="66"> 66</span>
<span id="67"> 67</span>
<span id="68"> 68</span>
<span id="69"> 69</span>
<span id="70"> 70</span>
<span id="71"> 71</span>
<span id="72"> 72</span>
<span id="73"> 73</span>
<span id="74"> 74</span>
<span id="75"> 75</span>
<span id="76"> 76</span>
<span id="77"> 77</span>
<span id="78"> 78</span>
<span id="79"> 79</span>
<span id="80"> 80</span>
<span id="81"> 81</span>
<span id="82"> 82</span>
<span id="83"> 83</span>
<span id="84"> 84</span>
<span id="85"> 85</span>
<span id="86"> 86</span>
<span id="87"> 87</span>
<span id="88"> 88</span>
<span id="89"> 89</span>
<span id="90"> 90</span>
<span id="91"> 91</span>
<span id="92"> 92</span>
<span id="93"> 93</span>
<span id="94"> 94</span>
<span id="95"> 95</span>
<span id="96"> 96</span>
<span id="97"> 97</span>
<span id="98"> 98</span>
<span id="99"> 99</span>
<span id="100">100</span>
<span id="101">101</span>
<span id="102">102</span>
<span id="103">103</span>
<span id="104">104</span>
<span id="105">105</span>
<span id="106">106</span>
<span id="107">107</span>
<span id="108">108</span>
</pre><pre class="rust"><code><span class="doccomment">//! This file is the main entry point for the game logic.</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! ## Overview</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! The main function in this module is `entrypoint()`. This is called from `desktop_wrapper` to start the game.</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! This module also includes all the other sub-modules of the game. If you are viewing this document from the web, click on the modules below to see more info.</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! ## Programming Guide</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! The game code is split into two parts: the core code, and the actual game logic.</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! [@ewpratten](https://github.com/ewpratten) has written most of the core code to bootstrap the game, and provide convenience functions.</span>
<span class="doccomment">//! This stuff probably won&#39;t need to be touched.</span>
<span class="doccomment">//! Most of the game logic is expected to live in `src/scenes` and `src/model` (rendering and data).</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! ## Important Functions and Files</span>
<span class="doccomment">//!</span>
<span class="doccomment">//! - If you are wanting to write rendering code, check out [`process_ingame_frame`](scenes/fn.process_ingame_frame.html).</span>
<span class="doccomment">//! - If you want to have something load at the start of the game and stay in memory, check out [`GlobalResources`](global_resource_package/struct.GlobalResources.html).</span>
<span class="doccomment">//! - If you want to add data to the save state file or settings file, check out the [`persistent`](persistent/index.html) module.</span>
<span class="attribute">#![<span class="ident">doc</span>(<span class="ident">issue_tracker_base_url</span> <span class="op">=</span> <span class="string">&quot;https://github.com/Ewpratten/ludum-dare-50/issues/&quot;</span>)]</span>
<span class="kw">use</span> <span class="ident">discord_sdk::activity::Assets</span>;
<span class="kw">use</span> <span class="kw">crate</span>::{
<span class="ident">asset_manager::load_json_structure</span>,
<span class="ident">discord</span>::{<span class="ident">DiscordRpcSignal</span>, <span class="ident">DiscordRpcThreadHandle</span>},
<span class="ident">project_constants::ProjectConstants</span>,
};
<span class="attribute">#[<span class="ident">macro_use</span>]</span>
<span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">approx</span>; <span class="comment">// For the macro `relative_eq!`</span>
<span class="attribute">#[<span class="ident">macro_use</span>]</span>
<span class="kw">extern</span> <span class="kw">crate</span> <span class="ident">log</span>; <span class="comment">// For the `info!`, `warn!`, etc. macros</span>
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">mod</span> <span class="ident">asset_manager</span>;
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">mod</span> <span class="ident">coord_convert</span>;
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">mod</span> <span class="ident">discord</span>;
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">mod</span> <span class="ident">global_resource_package</span>;
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">mod</span> <span class="ident">model</span>;
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">mod</span> <span class="ident">persistent</span>;
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">mod</span> <span class="ident">project_constants</span>;
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">mod</span> <span class="ident">rendering</span>;
<span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">mod</span> <span class="ident">scenes</span>;
<span class="doccomment">/// This is the game logic entrypoint. Despite being async,</span>
<span class="doccomment">/// this is expected to block the main thread for rendering and stuff.</span>
<span class="doccomment">///</span>
<span class="doccomment">/// Setting `force_recreate_savefiles` will cause the game to recreate its settings and savestate files.</span>
<span class="kw">pub</span> <span class="kw">async</span> <span class="kw">fn</span> <span class="ident">entrypoint</span>(<span class="ident">force_recreate_savefiles</span>: <span class="ident">bool</span>) {
<span class="macro">log::info!</span>(<span class="string">&quot;Game main thread handed off to logic crate.&quot;</span>);
<span class="comment">// Load the project constants</span>
<span class="kw">let</span> <span class="ident">project_constants</span>: <span class="ident">ProjectConstants</span> <span class="op">=</span>
<span class="ident">load_json_structure</span>(<span class="string">&quot;project-constants.json&quot;</span>).<span class="ident">expect</span>(<span class="string">&quot;Could not load project constants&quot;</span>);
<span class="comment">// Load the game settings</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">settings</span> <span class="op">=</span>
<span class="ident">persistent::settings::PersistentGameSettings::load_or_create</span>(<span class="ident">force_recreate_savefiles</span>)
.<span class="ident">expect</span>(<span class="string">&quot;Failed to parse game settings from disk. Possibly corrupt file?&quot;</span>);
<span class="comment">// Load the game save state</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">save_state</span> <span class="op">=</span>
<span class="ident">persistent::save_state::GameSaveState::load_or_create</span>(<span class="ident">force_recreate_savefiles</span>)
.<span class="ident">expect</span>(<span class="string">&quot;Failed to parse game save state from disk. Possibly corrupt file?&quot;</span>);
<span class="comment">// Connect to Discord</span>
<span class="kw">let</span> <span class="ident">discord</span> <span class="op">=</span> <span class="ident">DiscordRpcThreadHandle::new</span>(<span class="ident">project_constants</span>.<span class="ident">discord</span>.<span class="ident">app_id</span>)
.<span class="kw">await</span>
.<span class="ident">expect</span>(<span class="string">&quot;Failed to connect to Discord RPC&quot;</span>);
<span class="kw">let</span> <span class="ident">event_loop_discord_tx</span> <span class="op">=</span> <span class="ident">discord</span>.<span class="ident">get_channel</span>();
<span class="kw">let</span> <span class="ident">discord_task_handle</span> <span class="op">=</span> <span class="ident">discord</span>.<span class="ident">begin_thread_non_blocking</span>();
<span class="ident">event_loop_discord_tx</span>
.<span class="ident">send</span>(<span class="ident">DiscordRpcSignal::ChangeAssets</span>(<span class="ident">Assets::default</span>().<span class="ident">large</span>(
<span class="ident">project_constants</span>.<span class="ident">discord</span>.<span class="ident">artwork</span>.<span class="ident">get</span>(<span class="string">&quot;logo&quot;</span>).<span class="ident">unwrap</span>(),
<span class="prelude-val">Some</span>(<span class="string">&quot;&quot;</span>),
)))
.<span class="kw">await</span>.<span class="ident">unwrap</span>();
<span class="comment">// Blocking call to the graphics rendering loop.</span>
<span class="ident">rendering::event_loop::handle_graphics_blocking</span>(
<span class="op">|</span><span class="ident">builder</span><span class="op">|</span> {
<span class="ident">builder</span>
.<span class="ident">msaa_4x</span>()
.<span class="ident">resizable</span>()
<span class="comment">// .vsync()</span>
.<span class="ident">title</span>(<span class="ident">project_constants</span>.<span class="ident">game_name</span>.<span class="ident">as_str</span>())
.<span class="ident">height</span>(<span class="ident">project_constants</span>.<span class="ident">base_window_size</span>.<span class="number">1</span> <span class="kw">as</span> <span class="ident">i32</span>)
.<span class="ident">width</span>(<span class="ident">project_constants</span>.<span class="ident">base_window_size</span>.<span class="number">0</span> <span class="kw">as</span> <span class="ident">i32</span>);
},
<span class="ident">project_constants</span>.<span class="ident">target_fps</span>,
<span class="kw-2">&amp;</span><span class="ident">project_constants</span>,
<span class="ident">event_loop_discord_tx</span>,
<span class="kw-2">&amp;mut</span> <span class="ident">settings</span>,
<span class="kw-2">&amp;mut</span> <span class="ident">save_state</span>,
)
.<span class="kw">await</span>;
<span class="comment">// Clean up any resources</span>
<span class="ident">settings</span>
.<span class="ident">save</span>()
.<span class="ident">expect</span>(<span class="string">&quot;Could not save game settings to disk.&quot;</span>);
<span class="ident">save_state</span>
.<span class="ident">save</span>()
.<span class="ident">expect</span>(<span class="string">&quot;Could not save game save state to disk.&quot;</span>);
<span class="ident">discord_task_handle</span>.<span class="ident">abort</span>();
}
</code></pre></div>
</section><section id="search" class="content hidden"></section></div></main><div id="rustdoc-vars" data-root-path="../../" data-current-crate="game_logic" data-themes="ayu,dark,light" data-resource-suffix="" data-rustdoc-version="1.59.0 (9d1b2106e 2022-02-23)" ></div>
</body></html>