<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://ulysseszh.github.io/feed/tags/rgss.xml" rel="self" type="application/atom+xml" /><link href="https://ulysseszh.github.io/" rel="alternate" type="text/html" hreflang="en-US" /><updated>2026-04-19T16:48:01-07:00</updated><id>https://ulysseszh.github.io/feed/tags/rgss.xml</id><title type="html"><![CDATA[Ulysses’ trip]]></title><subtitle>Here we are at the awesome (awful) blog written by UlyssesZhan!</subtitle><author><name>UlyssesZhan</name><email>ulysseszhan@gmail.com</email></author><entry><title type="html"><![CDATA[Simulating a mechanical system using rpg_core.js]]></title><link href="https://ulysseszh.github.io/physics/2020/05/14/simulation-rpgmv.html" rel="alternate" type="text/html" title="Simulating a mechanical system using rpg_core.js" /><published>2020-05-13T09:57:39-07:00</published><updated>2020-05-13T09:57:39-07:00</updated><id>https://ulysseszh.github.io/physics/2020/05/14/simulation-rpgmv</id><content type="html" xml:base="https://ulysseszh.github.io/physics/2020/05/14/simulation-rpgmv.html"><![CDATA[<p>This post is the continuation of <a href="/physics/2020/04/28/simulation-rgss.html">the last post</a>.</p>
<p>If you visit <a href="/rpg/mechsimul/">the page</a> I have just created, you may find the simulation of a mechanical system.</p>
<figure>
<img src="/assets/images/figures/2020-05-14-simulation-rpgmv/rpgmv_simul.png" alt="Result of simulation"/>

</figure>
<p>It is currently <span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi mathvariant="script">H</mi><mo>=</mo><msubsup><mi>p</mi><mn>1</mn><mn>2</mn></msubsup><mo>+</mo><msubsup><mi>p</mi><mn>2</mn><mn>2</mn></msubsup><mo>−</mo><mi>cos</mi><mo>⁡</mo><msub><mi>q</mi><mn>1</mn></msub><mo>−</mo><mi>cos</mi><mo>⁡</mo><msub><mi>q</mi><mn>2</mn></msub><mo>−</mo><mi>cos</mi><mo>⁡</mo><mtext> ⁣</mtext><mrow><mo fence="true">(</mo><msub><mi>q</mi><mn>1</mn></msub><mo>−</mo><msub><mi>q</mi><mn>2</mn></msub><mo fence="true">)</mo></mrow></mrow><annotation encoding="application/x-tex">
    \mathcal H=p_1^2+p_2^2-\cos q_1-\cos q_2-
    \cos\!\left(q_1-q_2\right)
</annotation></semantics></math></span></span></span> depicting two pendulum coupled with a spring (with <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>l</mi><mn>1</mn></msub><mo>=</mo><msub><mi>l</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">l_1=l_2</annotation></semantics></math></span></span> and <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>m</mi><mn>1</mn></msub><mo>=</mo><msub><mi>m</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">m_1=m_2</annotation></semantics></math></span></span>, and the original length of the spring is zero, and the two hanging points overlap),</p>
<figure>
<img src="/assets/images/figures/2020-05-14-simulation-rpgmv/spring_coupled_pendulum.png" class="dark-adaptive" alt="Spring-coupled pendulums"/>

</figure>
<p class="no-indent">
which is a classical example of non-linearly coupled system.
</p>
<p>The pattern of the oscillation can be analyzed using discrete Fourier transformation, whose result can be found by clicking the buttons in the up-left corner (after the simulator has detected a period).</p>
<figure>
<img src="/assets/images/figures/2020-05-14-simulation-rpgmv/rpgmv_simul_fft.png" alt="Result of DFT"/>

</figure>
<p class="no-indent">
Hitting the space bar can make the simulation pause.
</p>
<p>If you want to use it to simulate other mechanical systems, you can study <a href="/rpg/mechsimul/js/mechsimul.js">the codes</a> I wrote and write your own codes in the console.</p>
<p>By the way, the <a href="https://github.com/UlyssesZh/OpenRGSS/" target="_blank" rel="external">OpenRGSS</a> version of the simulator is open-source <a href="https://github.com/UlyssesZh/mechsimul/" target="_blank" rel="external">here</a>. Please star the repo if you like it.</p>]]></content><author><name>UlyssesZhan</name><email>ulysseszhan@gmail.com</email></author><category term="physics" /><category term="javascript" /><category term="rgss" /><category term="hamiltonian" /><category term="calculus" /><category term="ode" /><category term="web" /><category term="fourier transform" /><summary type="html"><![CDATA[Continuing my last work of simulating a mechanical system using RGSS3, I made a new version using rpg_core.js, the game scripting system shipped with RPG Maker MV. This version is live <a href="/rpg/mechsimul">on web</a>!]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ulysseszh.github.io/assets/images/covers/2020-05-14-simulation-rpgmv.png" /><media:content medium="image" url="https://ulysseszh.github.io/assets/images/covers/2020-05-14-simulation-rpgmv.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html"><![CDATA[Simulating a mechanical system using RGSS3]]></title><link href="https://ulysseszh.github.io/physics/2020/04/28/simulation-rgss.html" rel="alternate" type="text/html" title="Simulating a mechanical system using RGSS3" /><published>2020-04-27T20:51:17-07:00</published><updated>2020-04-27T20:51:17-07:00</updated><id>https://ulysseszh.github.io/physics/2020/04/28/simulation-rgss</id><content type="html" xml:base="https://ulysseszh.github.io/physics/2020/04/28/simulation-rgss.html"><![CDATA[<p>Our goal is to simulate a mechanical system according to its Hamiltonian <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">H</mi><mtext> ⁣</mtext><mrow><mo fence="true">(</mo><mi mathvariant="bold">q</mi><mo separator="true">,</mo><mi mathvariant="bold">p</mi><mo separator="true">,</mo><mi>t</mi><mo fence="true">)</mo></mrow></mrow><annotation encoding="application/x-tex">\mathcal H\!\left(\mathbf q,\mathbf p,t\right)</annotation></semantics></math></span></span>.</p>
<p>To utilize the canonical equations <span id="eq:canonical" data-label="(1)"><span class="katex-display-table"> <span class="katex-display-numbered"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mfrac><mrow><mi mathvariant="normal">d</mi><mi mathvariant="bold">q</mi></mrow><mrow><mi mathvariant="normal">d</mi><mi>t</mi></mrow></mfrac><mo>=</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><mi mathvariant="script">H</mi></mrow><mrow><mi mathvariant="normal">∂</mi><mi mathvariant="bold">p</mi></mrow></mfrac><mo separator="true">,</mo><mspace width="1em"/><mfrac><mrow><mi mathvariant="normal">d</mi><mi mathvariant="bold">p</mi></mrow><mrow><mi mathvariant="normal">d</mi><mi>t</mi></mrow></mfrac><mo>=</mo><mo>−</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><mi mathvariant="script">H</mi></mrow><mrow><mi mathvariant="normal">∂</mi><mi mathvariant="bold">p</mi></mrow></mfrac><mo separator="true">,</mo></mrow><annotation encoding="application/x-tex">\frac{\mathrm d\mathbf q}{\mathrm dt}=
    \frac{\partial\mathcal H}{\partial\mathbf p},\quad
    \frac{\mathrm d\mathbf p}{\mathrm dt}=
    -\frac{\partial\mathcal H}{\partial\mathbf p},</annotation></semantics></math></span></span></span></span> <span class="katex-display-number"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(1)</annotation></semantics></math></span></span></span></span> </span></span> we need to calculate the partial derivatives of <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">H</mi></mrow><annotation encoding="application/x-tex">\mathcal H</annotation></semantics></math></span></span>. Here is a simple code to calculate partial derivatives.</p>
<table class="rouge-table">
  <tbody>
    <tr>
      <td class="highlight language-ruby">
        <pre>
          <code>
            <span class="line line-1"><span class="k">def</span> <span class="nf">div</span> <span class="n">x0</span><span class="p">,</span> <span class="n">dx</span><span class="p">,</span> <span class="n">f</span>
</span>
            <span class="line line-2">	<span class="n">f0</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="p">(</span><span class="n">x0</span><span class="p">)</span>
</span>
            <span class="line line-3">	<span class="n">n</span> <span class="o">=</span> <span class="n">x0</span><span class="p">.</span><span class="nf">size</span>
</span>
            <span class="line line-4">	<span class="no">Array</span><span class="p">.</span><span class="nf">new</span> <span class="n">n</span> <span class="k">do</span> <span class="o">|</span><span class="n">i</span><span class="o">|</span>
</span>
            <span class="line line-5">		<span class="p">(</span><span class="n">f</span><span class="o">.</span><span class="p">(</span><span class="n">x0</span> <span class="o">+</span> <span class="no">Vector</span><span class="p">.</span><span class="nf">basis</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">i</span><span class="p">)</span> <span class="o">*</span> <span class="n">dx</span><span class="p">)</span> <span class="o">-</span> <span class="n">f0</span><span class="p">)</span> <span class="o">/</span> <span class="n">dx</span>
</span>
            <span class="line line-6">	<span class="k">end</span>
</span>
            <span class="line line-7"><span class="k">end</span>
</span>
          </code>
        </pre>
      </td>
    </tr>
  </tbody>
</table>
<p class="no-indent">
(RGSS do not have <code>matrix.rb</code>, you can copy one from the attached file below.) Here <code>x0</code> is a <code>Vector</code>, <code>f</code> is a <code>call</code>-able object as a function of vectors, <code>dx</code> is a small scalar which we are going to take <code>1e-6</code>.
</p>
<p>Let <code>x = Vector[*q, *p]</code>, and then Formula <a href="#eq:canonical">1</a> has the form <span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mfrac><mrow><mi mathvariant="normal">d</mi><mi mathvariant="bold">x</mi></mrow><mrow><mi mathvariant="normal">d</mi><mi>t</mi></mrow></mfrac><mo>=</mo><mi>f</mi><mtext> ⁣</mtext><mrow><mo fence="true">(</mo><mi mathvariant="bold">x</mi><mo fence="true">)</mo></mrow><mi mathvariant="normal">.</mi></mrow><annotation encoding="application/x-tex">\frac{\mathrm d\mathbf x}{\mathrm dt}=f\!\left(\mathbf x\right).</annotation></semantics></math></span></span></span> To solve this equation numerically, we need to use a famous method called the (explicit) Runge–Kutta method.</p>
<table class="rouge-table">
  <tbody>
    <tr>
      <td class="highlight language-ruby">
        <pre>
          <code>
            <span class="line line-1"><span class="k">def</span> <span class="nf">runge_kutta</span> <span class="n">initial</span><span class="p">,</span> <span class="n">max_t</span><span class="p">,</span> <span class="n">dt</span><span class="p">,</span> <span class="p">(</span><span class="o">*</span><span class="n">pyramid</span><span class="p">,</span> <span class="n">coefs</span><span class="p">),</span> <span class="n">func</span>
</span>
            <span class="line line-2">	<span class="p">(</span><span class="mi">0</span><span class="o">..</span><span class="n">max_t</span><span class="p">).</span><span class="nf">step</span><span class="p">(</span><span class="n">dt</span><span class="p">).</span><span class="nf">reduce</span> <span class="n">initial</span> <span class="k">do</span> <span class="o">|</span><span class="n">ret</span><span class="p">,</span> <span class="n">t</span><span class="o">|</span>
</span>
            <span class="line line-3">		<span class="vg">$canvas</span><span class="p">.</span><span class="nf">trace</span> <span class="n">t</span><span class="p">,</span> <span class="n">ret</span> <span class="k">if</span> <span class="vg">$canvas</span>
</span>
            <span class="line line-4">		<span class="n">coefs</span><span class="p">.</span><span class="nf">zip</span><span class="p">(</span><span class="n">pyramid</span><span class="p">).</span><span class="nf">each_with_object</span><span class="p">([]).</span><span class="nf">sum</span> <span class="k">do</span> <span class="o">|</span><span class="p">(</span><span class="n">coef</span><span class="p">,</span> <span class="n">row</span><span class="p">),</span> <span class="n">ary</span><span class="o">|</span>
</span>
            <span class="line line-5">			<span class="n">coef</span> <span class="o">*</span> <span class="n">ary</span><span class="p">.</span><span class="nf">push</span><span class="p">(</span><span class="n">func</span><span class="o">.</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">row</span><span class="p">.</span><span class="nf">inner</span><span class="p">(</span><span class="n">ary</span><span class="p">)</span> <span class="o">*</span> <span class="n">dt</span> <span class="o">+</span> <span class="n">ret</span><span class="p">)).</span><span class="nf">last</span>
</span>
            <span class="line line-6">		<span class="k">end</span> <span class="o">*</span> <span class="n">dt</span> <span class="o">+</span> <span class="n">ret</span><span class="c1">#p(ret)</span>
</span>
            <span class="line line-7">	<span class="k">end</span>
</span>
            <span class="line line-8"><span class="k">end</span>
</span>
          </code>
        </pre>
      </td>
    </tr>
  </tbody>
</table>
<p class="no-indent">
Note that Runge–Kutta is a family of methods. The argument <code>(*pyramid, coefs)</code> takes one of the following, each of which is a single Runge–Kutta method.
</p>
<table class="rouge-table">
  <tbody>
    <tr>
      <td class="highlight language-ruby">
        <pre>
          <code>
            <span class="line line-1"><span class="no">FORWARD_EULER</span> <span class="o">=</span> <span class="p">[[],[</span><span class="mi">1</span><span class="p">]]</span>
</span>
            <span class="line line-2"><span class="no">EXPLICIT_MIDPOINT</span> <span class="o">=</span> <span class="p">[[],[</span><span class="mi">1</span><span class="o">/</span><span class="mf">2.0</span><span class="p">],[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">]]</span>
</span>
            <span class="line line-3"><span class="no">HEUN</span> <span class="o">=</span> <span class="p">[[],[</span><span class="mi">1</span><span class="p">],[</span><span class="mi">1</span><span class="o">/</span><span class="mf">2.0</span><span class="p">,</span><span class="mi">1</span><span class="o">/</span><span class="mf">2.0</span><span class="p">]]</span>
</span>
            <span class="line line-4"><span class="no">RALSTON</span> <span class="o">=</span> <span class="p">[[],[</span><span class="mi">2</span><span class="o">/</span><span class="mf">3.0</span><span class="p">],[</span><span class="mi">1</span><span class="o">/</span><span class="mf">4.0</span><span class="p">,</span><span class="mi">3</span><span class="o">/</span><span class="mf">4.0</span><span class="p">]]</span>
</span>
            <span class="line line-5"><span class="no">KUTTA_3RD</span> <span class="o">=</span> <span class="p">[[],[</span><span class="mi">1</span><span class="o">/</span><span class="mf">2.0</span><span class="p">],[</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">],[</span><span class="mi">1</span><span class="o">/</span><span class="mf">6.0</span><span class="p">,</span><span class="mi">2</span><span class="o">/</span><span class="mf">3.0</span><span class="p">,</span><span class="mi">1</span><span class="o">/</span><span class="mf">6.0</span><span class="p">]]</span>
</span>
            <span class="line line-6"><span class="no">HEUN_3RD</span> <span class="o">=</span> <span class="p">[[],[</span><span class="mi">1</span><span class="o">/</span><span class="mf">3.0</span><span class="p">],[</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="o">/</span><span class="mf">3.0</span><span class="p">],[</span><span class="mi">1</span><span class="o">/</span><span class="mf">4.0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">3</span><span class="o">/</span><span class="mf">4.0</span><span class="p">]]</span>
</span>
            <span class="line line-7"><span class="no">RALSTON_3RD</span> <span class="o">=</span> <span class="p">[[],[</span><span class="mi">1</span><span class="o">/</span><span class="mf">2.0</span><span class="p">],[</span><span class="mi">0</span><span class="p">,</span><span class="mi">3</span><span class="o">/</span><span class="mf">4.0</span><span class="p">],[</span><span class="mi">2</span><span class="o">/</span><span class="mf">9.0</span><span class="p">,</span><span class="mi">1</span><span class="o">/</span><span class="mf">3.0</span><span class="p">,</span><span class="mi">4</span><span class="o">/</span><span class="mf">9.0</span><span class="p">]]</span>
</span>
            <span class="line line-8"><span class="no">SSPRK3</span> <span class="o">=</span> <span class="p">[[],[</span><span class="mi">1</span><span class="p">],[</span><span class="mi">1</span><span class="o">/</span><span class="mf">4.0</span><span class="p">,</span><span class="mi">1</span><span class="o">/</span><span class="mf">4.0</span><span class="p">],[</span><span class="mi">1</span><span class="o">/</span><span class="mf">6.0</span><span class="p">,</span><span class="mi">1</span><span class="o">/</span><span class="mf">6.0</span><span class="p">,</span><span class="mi">2</span><span class="o">/</span><span class="mf">3.0</span><span class="p">]]</span>
</span>
            <span class="line line-9"><span class="no">CLASSIC_4TH</span> <span class="o">=</span> <span class="p">[[],[</span><span class="mi">1</span><span class="o">/</span><span class="mf">2.0</span><span class="p">],[</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="o">/</span><span class="mf">2.0</span><span class="p">],[</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">],[</span><span class="mi">1</span><span class="o">/</span><span class="mf">6.0</span><span class="p">,</span><span class="mi">1</span><span class="o">/</span><span class="mf">3.0</span><span class="p">,</span><span class="mi">1</span><span class="o">/</span><span class="mf">3.0</span><span class="p">,</span><span class="mi">1</span><span class="o">/</span><span class="mf">6.0</span><span class="p">]]</span>
</span>
            <span class="line line-10"><span class="no">RALSTON_4TH</span> <span class="o">=</span> <span class="p">[[],[</span><span class="mf">0.4</span><span class="p">],[</span><span class="mf">0.29697761</span><span class="p">,</span><span class="mf">0.15875964</span><span class="p">],[</span><span class="mf">0.21810040</span><span class="p">,</span><span class="o">-</span><span class="mf">3.05096516</span><span class="p">,</span>
</span>
            <span class="line line-11">		<span class="mf">3.83286476</span><span class="p">],[</span><span class="mf">0.17476028</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.55148066</span><span class="p">,</span> <span class="mf">1.20553560</span><span class="p">,</span> <span class="mf">0.17118478</span><span class="p">]]</span>
</span>
            <span class="line line-12"><span class="no">THREE_EIGHTH_4TH</span> <span class="o">=</span> <span class="p">[[],[</span><span class="mi">1</span><span class="o">/</span><span class="mf">3.0</span><span class="p">],[</span><span class="o">-</span><span class="mi">1</span><span class="o">/</span><span class="mf">3.0</span><span class="p">,</span><span class="mi">1</span><span class="p">],[</span><span class="mi">1</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">],[</span><span class="mi">1</span><span class="o">/</span><span class="mf">8.0</span><span class="p">,</span><span class="mi">3</span><span class="o">/</span><span class="mf">8.0</span><span class="p">,</span><span class="mi">3</span><span class="o">/</span><span class="mf">8.0</span><span class="p">,</span><span class="mi">1</span><span class="o">/</span><span class="mf">8.0</span><span class="p">]]</span>
</span>
          </code>
        </pre>
      </td>
    </tr>
  </tbody>
</table>
<p>Here we are going to take <code>CLASSIC_4TH</code>.</p>
<p>The <code>$canvas</code> appearing here is an object that is going to draw the result onto the screen.</p>
<p>Here we also need to have some patches to get it work.</p>
<table class="rouge-table">
  <tbody>
    <tr>
      <td class="highlight language-ruby">
        <pre>
          <code>
            <span class="line line-1"><span class="k">class</span> <span class="nc">Float</span>
</span>
            <span class="line line-2">	<span class="k">alias</span> <span class="n">ulysses20200426121236_add</span> <span class="o">+</span>
</span>
            <span class="line line-3">	<span class="k">def</span> <span class="nf">+</span> <span class="n">other</span>
</span>
            <span class="line line-4">		<span class="k">if</span> <span class="n">zero?</span> <span class="o">&amp;&amp;</span> <span class="p">[</span><span class="no">Vector</span><span class="p">,</span> <span class="no">Matrix</span><span class="p">].</span><span class="nf">any?</span> <span class="p">{</span> <span class="o">|</span><span class="n">c</span><span class="o">|</span> <span class="n">other</span><span class="p">.</span><span class="nf">is_a?</span> <span class="n">c</span> <span class="p">}</span>
</span>
            <span class="line line-5">			<span class="n">other</span>
</span>
            <span class="line line-6">		<span class="k">else</span>
</span>
            <span class="line line-7">			<span class="n">ulysses20200426121236_add</span> <span class="n">other</span>
</span>
            <span class="line line-8">		<span class="k">end</span>
</span>
            <span class="line line-9">	<span class="k">end</span>
</span>
            <span class="line line-10"><span class="k">end</span>
</span>
            <span class="line line-11"><span class="k">module</span> <span class="nn">Enumerable</span>
</span>
            <span class="line line-12">	<span class="k">def</span> <span class="nf">sum</span> <span class="n">init</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span>
</span>
            <span class="line line-13">		<span class="p">(</span><span class="n">block</span> <span class="p">?</span> <span class="n">map</span><span class="p">(</span><span class="o">&amp;</span><span class="n">block</span><span class="p">)</span> <span class="p">:</span> <span class="nb">self</span><span class="p">).</span><span class="nf">reduce</span> <span class="n">init</span><span class="p">,</span> <span class="p">:</span><span class="o">+</span>
</span>
            <span class="line line-14">	<span class="k">end</span>
</span>
            <span class="line line-15"><span class="k">end</span>
</span>
            <span class="line line-16"><span class="k">class</span> <span class="nc">Array</span>
</span>
            <span class="line line-17">	<span class="k">def</span> <span class="nf">inner</span> <span class="n">other</span>
</span>
            <span class="line line-18">		<span class="n">zip</span><span class="p">(</span><span class="n">other</span><span class="p">).</span><span class="nf">sum</span> <span class="p">{</span> <span class="o">|</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="o">|</span> <span class="n">a</span> <span class="o">*</span> <span class="n">b</span> <span class="p">}</span>
</span>
            <span class="line line-19">	<span class="k">end</span>
</span>
            <span class="line line-20"><span class="k">end</span>
</span>
          </code>
        </pre>
      </td>
    </tr>
  </tbody>
</table>
<p class="no-indent">
(Again, note that this is Ruby 1.9.2.)
</p>
<p>Finally, just combine them up, and we can solve a Hamiltonian numerically.</p>
<table class="rouge-table">
  <tbody>
    <tr>
      <td class="highlight language-ruby">
        <pre>
          <code>
            <span class="line line-1"><span class="k">def</span> <span class="nf">solve_hamiltonian</span> <span class="n">n</span><span class="p">,</span> <span class="n">qp0</span><span class="p">,</span> <span class="n">max_t</span><span class="p">,</span> <span class="n">dt</span><span class="p">,</span> <span class="n">hamiltonian</span>
</span>
            <span class="line line-2">	<span class="n">runge_kutta</span> <span class="n">qp0</span><span class="p">,</span> <span class="n">max_t</span><span class="p">,</span> <span class="n">dt</span><span class="p">,</span> <span class="no">CLASSIC_4TH</span><span class="p">,</span> <span class="o">-&gt;</span><span class="n">t</span><span class="p">,</span> <span class="n">qp</span> <span class="k">do</span>
</span>
            <span class="line line-3">		<span class="n">dqpdt</span> <span class="o">=</span> <span class="n">div</span> <span class="n">qp</span><span class="p">,</span> <span class="mf">1e-6</span><span class="p">,</span> <span class="o">-&gt;</span><span class="n">x</span> <span class="p">{</span> <span class="n">hamiltonian</span><span class="o">.</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span> <span class="p">}</span>
</span>
            <span class="line line-4">		<span class="no">Vector</span><span class="p">[</span><span class="o">*</span><span class="n">dqpdt</span><span class="p">[</span><span class="n">n</span><span class="o">...</span><span class="n">n</span><span class="o">*</span><span class="mi">2</span><span class="p">],</span> <span class="o">*</span><span class="n">dqpdt</span><span class="p">[</span><span class="mi">0</span><span class="o">...</span><span class="n">n</span><span class="p">].</span><span class="nf">map</span><span class="p">(</span><span class="o">&amp;</span><span class="ss">:-@</span><span class="p">)]</span>
</span>
            <span class="line line-5">	<span class="k">end</span>
</span>
            <span class="line line-6"><span class="k">end</span>
</span>
          </code>
        </pre>
      </td>
    </tr>
  </tbody>
</table>
<p>For example, let’s simulate a double pendulum.</p>
<table class="rouge-table">
  <tbody>
    <tr>
      <td class="highlight language-ruby">
        <pre>
          <code>
            <span class="line line-1"><span class="n">solve_hamiltonian</span> <span class="mi">2</span><span class="p">,</span><span class="no">Vector</span><span class="p">[</span><span class="no">PI</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span><span class="mf">0.0</span><span class="p">,</span><span class="mf">0.0</span><span class="p">,</span><span class="mf">0.0</span><span class="p">],</span><span class="no">Float</span><span class="o">::</span><span class="no">INFINITY</span><span class="p">,</span><span class="mf">1e-3</span><span class="p">,</span>
</span>
            <span class="line line-2">		<span class="o">-&gt;</span><span class="n">t</span><span class="p">,(</span><span class="n">q1</span><span class="p">,</span><span class="n">q2</span><span class="p">,</span><span class="n">p1</span><span class="p">,</span><span class="n">p2</span><span class="p">){</span><span class="n">p1</span><span class="o">**</span><span class="mi">2</span><span class="o">+</span><span class="n">p2</span><span class="o">**</span><span class="mi">2</span><span class="o">/</span><span class="mi">2</span><span class="o">+</span><span class="n">cos</span><span class="p">(</span><span class="n">q1</span><span class="o">-</span><span class="n">q2</span><span class="p">)</span><span class="o">*</span><span class="n">p1</span><span class="o">*</span><span class="n">p2</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">q1</span><span class="p">)</span><span class="o">-</span><span class="n">cos</span><span class="p">(</span><span class="n">q2</span><span class="p">)}</span>
</span>
          </code>
        </pre>
      </td>
    </tr>
  </tbody>
</table>
<figure>
<img src="/assets/images/figures/2020-04-28-simulation-rgss/double_pendulum.gif" alt="The simulated motion of a double pendulum."/>

</figure>
<p>The codes are not complete in this post. See the <a href="/assets/codes/RungeKutta.rar">attached file</a> for details. You can open the project using <a href="https://store.steampowered.com/app/220700/RPG_Maker_VX_Ace" target="_blank" rel="external">RPG Maker VX Ace</a>. The <code>Game.exe</code> file is not the official <code>Game.exe</code> executable but the third-party improved version of it called <a href="http://cirno.blog/archives/290" target="_blank" rel="external">RGD</a> (of version 1.3.2, while the latest till now is 1.5.1).</p>]]></content><author><name>UlyssesZhan</name><email>ulysseszhan@gmail.com</email></author><category term="physics" /><category term="ruby" /><category term="rgss" /><category term="hamiltonian" /><category term="calculus" /><category term="ode" /><summary type="html"><![CDATA[Hamiltonian mechanics gives us a good way to simulate mechanical systems as long as we can get its Hamiltonian and its initial conditions. I implemented this simulation in RGSS3, the game scripting system shipped with RPG Maker VX Ace.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ulysseszh.github.io/assets/images/covers/2020-04-28-simulation-rgss.png" /><media:content medium="image" url="https://ulysseszh.github.io/assets/images/covers/2020-04-28-simulation-rgss.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html"><![CDATA[The structure of a basic RM game]]></title><link href="https://ulysseszh.github.io/programming/2020/04/08/basic-rm-game.html" rel="alternate" type="text/html" title="The structure of a basic RM game" /><published>2020-04-07T18:28:05-07:00</published><updated>2020-04-07T18:28:05-07:00</updated><id>https://ulysseszh.github.io/programming/2020/04/08/basic-rm-game</id><content type="html" xml:base="https://ulysseszh.github.io/programming/2020/04/08/basic-rm-game.html"><![CDATA[<p><a href="https://tkool.jp/" target="_blank" rel="external">RPG Maker (RM)</a> is a tool for making games.</p>
<p>I only have experience in using RPG Maker XP, RPG Maker VX, RPG Maker VX Ace, and RPG Maker MV.</p>
<p>Games made by using RM are based on</p>
<table>
<thead>
<tr>
<th>XP</th>
<th>VX</th>
<th>VA</th>
<th>MV</th>
</tr>
</thead>
<tbody>
<tr>
<td>RGSS</td>
<td>RGSS2</td>
<td>RGSS3</td>
<td>rpg_core.js</td>
</tr>
</tbody>
</table>
<p>In most cases, when I say RGSS, I mean RGSS, RGSS2, and RGSS3. RGSS is in Ruby and rpg_core.js is in Javascript.</p>
<p>The scripts of a basic RGSS game look like</p>
<table class="rouge-table">
  <tbody>
    <tr>
      <td class="highlight language-ruby">
        <pre>
          <code>
            <span class="line line-1"><span class="k">def</span> <span class="nf">start</span>
</span>
            <span class="line line-2">	<span class="c1"># some codes</span>
</span>
            <span class="line line-3"><span class="k">end</span>
</span>
            <span class="line line-4"><span class="k">def</span> <span class="nf">update</span>
</span>
            <span class="line line-5">	<span class="c1"># some codes</span>
</span>
            <span class="line line-6"><span class="k">end</span>
</span>
            <span class="line line-7">
</span>
            <span class="line line-8"><span class="n">start</span>
</span>
            <span class="line line-9"><span class="kp">loop</span> <span class="k">do</span>
</span>
            <span class="line line-10">	<span class="n">update</span>
</span>
            <span class="line line-11">	<span class="no">Input</span><span class="p">.</span><span class="nf">update</span>
</span>
            <span class="line line-12">	<span class="no">Graphics</span><span class="p">.</span><span class="nf">update</span>
</span>
            <span class="line line-13"><span class="k">end</span>
</span>
          </code>
        </pre>
      </td>
    </tr>
  </tbody>
</table>
<p>The scripts of a basic rpg_core.js game look like</p>
<table class="rouge-table">
  <tbody>
    <tr>
      <td class="highlight language-javascript">
        <pre>
          <code>
            <span class="line line-1"><span class="kd">function</span> <span class="nf">start</span><span class="p">()</span> <span class="p">{</span>
</span>
            <span class="line line-2">	<span class="c1">// some codes</span>
</span>
            <span class="line line-3"><span class="p">}</span>
</span>
            <span class="line line-4"><span class="kd">function</span> <span class="nf">update</span><span class="p">()</span> <span class="p">{</span>
</span>
            <span class="line line-5">	<span class="c1">// some codes</span>
</span>
            <span class="line line-6"><span class="p">}</span>
</span>
            <span class="line line-7">
</span>
            <span class="line line-8"><span class="nx">Graphics</span><span class="p">.</span><span class="nf">initialize</span><span class="p">(</span><span class="mi">816</span><span class="p">,</span> <span class="mi">624</span><span class="p">,</span> <span class="dl">'</span><span class="s1">webgl</span><span class="dl">'</span><span class="p">);</span>
</span>
            <span class="line line-9"><span class="nx">Graphics</span><span class="p">.</span><span class="nx">boxWidth</span> <span class="o">=</span> <span class="mi">816</span><span class="p">;</span>
</span>
            <span class="line line-10"><span class="nx">Graphics</span><span class="p">.</span><span class="nx">boxHeight</span> <span class="o">=</span> <span class="mi">624</span><span class="p">;</span>
</span>
            <span class="line line-11"><span class="nx">WebAudio</span><span class="p">.</span><span class="nf">initialize</span><span class="p">(</span><span class="kc">false</span><span class="p">);</span>
</span>
            <span class="line line-12"><span class="nx">Input</span><span class="p">.</span><span class="nf">initialize</span><span class="p">();</span>
</span>
            <span class="line line-13"><span class="nx">TouchInput</span><span class="p">.</span><span class="nf">initialize</span><span class="p">();</span>
</span>
            <span class="line line-14"><span class="kd">var</span> <span class="nx">deltaTime</span> <span class="o">=</span> <span class="mf">1.0</span> <span class="o">/</span> <span class="mf">60.0</span><span class="p">;</span>
</span>
            <span class="line line-15"><span class="kd">var</span> <span class="nx">accumulator</span> <span class="o">=</span> <span class="mf">0.0</span><span class="p">;</span>
</span>
            <span class="line line-16"><span class="kd">var</span> <span class="nx">currentTime</span><span class="p">;</span>
</span>
            <span class="line line-17"><span class="nb">window</span><span class="p">.</span><span class="nx">scene</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Stage</span><span class="p">();</span>
</span>
            <span class="line line-18"><span class="nf">start</span><span class="p">();</span>
</span>
            <span class="line line-19"><span class="kd">function</span> <span class="nf">performUpdate</span><span class="p">()</span> <span class="p">{</span>
</span>
            <span class="line line-20">	<span class="nx">Graphics</span><span class="p">.</span><span class="nf">tickStart</span><span class="p">();</span>
</span>
            <span class="line line-21">	<span class="kd">var</span> <span class="nx">newTime</span> <span class="o">=</span> <span class="nx">performance</span><span class="p">.</span><span class="nf">now</span><span class="p">();</span>
</span>
            <span class="line line-22">	<span class="k">if </span><span class="p">(</span><span class="nx">currentTime</span> <span class="o">===</span> <span class="kc">undefined</span><span class="p">)</span> <span class="nx">currentTime</span> <span class="o">=</span> <span class="nx">newTime</span><span class="p">;</span>
</span>
            <span class="line line-23">	<span class="kd">var</span> <span class="nx">fTime</span> <span class="o">=</span> <span class="p">((</span><span class="nx">newTime</span> <span class="o">-</span> <span class="nx">currentTime</span><span class="p">)</span> <span class="o">/</span> <span class="mi">1000</span><span class="p">).</span><span class="nf">clamp</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mf">0.25</span><span class="p">);</span>
</span>
            <span class="line line-24">	<span class="nx">currentTime</span> <span class="o">=</span> <span class="nx">newTime</span><span class="p">;</span>
</span>
            <span class="line line-25">	<span class="nx">accumulator</span> <span class="o">+=</span> <span class="nx">fTime</span><span class="p">;</span>
</span>
            <span class="line line-26">	<span class="k">while </span><span class="p">(</span><span class="nx">accumulator</span> <span class="o">&gt;=</span> <span class="nx">deltaTime</span><span class="p">)</span> <span class="p">{</span>
</span>
            <span class="line line-27">		<span class="nx">Input</span><span class="p">.</span><span class="nf">update</span><span class="p">();</span>
</span>
            <span class="line line-28">		<span class="nx">TouchInput</span><span class="p">.</span><span class="nf">update</span><span class="p">();</span>
</span>
            <span class="line line-29">		<span class="nf">update</span><span class="p">();</span>
</span>
            <span class="line line-30">		<span class="nx">accumulator</span> <span class="o">-=</span> <span class="nx">deltaTime</span><span class="p">;</span>
</span>
            <span class="line line-31">	<span class="p">}</span>
</span>
            <span class="line line-32">	<span class="nx">Graphics</span><span class="p">.</span><span class="nf">render</span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">scene</span><span class="p">);</span>
</span>
            <span class="line line-33">	<span class="nf">requestAnimationFrame</span><span class="p">(</span><span class="nx">performUpdate</span><span class="p">);</span>
</span>
            <span class="line line-34">	<span class="nx">Graphics</span><span class="p">.</span><span class="nf">tickEnd</span><span class="p">();</span>
</span>
            <span class="line line-35"><span class="p">}</span>
</span>
            <span class="line line-36"><span class="nf">performUpdate</span><span class="p">();</span>
</span>
          </code>
        </pre>
      </td>
    </tr>
  </tbody>
</table>
<p>There is a simple rpg_core.js game written by me which can be accessed <a href="/rpg/hello/">here</a>. You can look at its source code by using your browser.</p>
<p>RM also provides a lot of scripts serving as making RPG. There is a simple RPG built by me which can be accessed <a href="/rpg/test/">here</a>.</p>
<p>The source codes of RGSS are secret, but those of rpg_core.js are not a secret and can be seen at <a href="https://github.com/rpgtkoolmv/corescript/" target="_blank" rel="external">its GitHub repo</a>.</p>]]></content><author><name>UlyssesZhan</name><email>ulysseszhan@gmail.com</email></author><category term="programming" /><category term="ruby" /><category term="javascript" /><category term="rgss" /><summary type="html"><![CDATA[In this article, I present minimal examples of a RM game. They only illustrate the basic concepts of how a RM game is structured and what is the running logic of it.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://ulysseszh.github.io/assets/images/covers/2020-04-08-basic-rm-game.png" /><media:content medium="image" url="https://ulysseszh.github.io/assets/images/covers/2020-04-08-basic-rm-game.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>