<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Purple Martians update</title>
		<link>http://www.allegro.cc/forums/view/617539</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 14 Aug 2018 03:00:40 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hi all,</p><p>I have been working on cleaning up and documenting my Purple Martians project.</p><p>I wrote some HTML pages of detailed code descriptions.</p><p>I was planning on hosting then on allegro.cc, but I don&#39;t have a members.allegro.cc account.  I have been a member for almost 20 years, but never have signed up for the free web site.  I requested one from Matt a few months ago, but I guess he rarely makes an appearance here anymore.  So sad.  I hope this doesn&#39;t mean that allegro.cc is going the way of the dodo.</p><p>Anyway, if anyone would like to look at my detailed code descriptions and give any feedback, I would be most grateful.</p><p>I have attached them to this post in a zip file, but they are also available with the rest of my project on <a href="https://github.com/mweiss001/purple_martians">https://github.com/mweiss001/purple_martians</a></p><p>Of particular note, I am most proud of the netgame code, followed by the dynamic screen resizing while the game is running.  The use of splines in the logo is neat too.</p><p>The code is almost all straight C, at one point I was going to convert it all to C++, but gave up due to to sheer enormity of the task.</p><p>I break some good programming styles, mostly with my use of global variables, but I honestly can&#39;t see a way around it that isn&#39;t more complicated and non-intuitive.  I always try to minimize my use of globals, but some variables just need to be visible in lots of different scopes.</p><p>I&#39;m setting programming aside for now to switch back to my other creative outlet, writing and recording music.  I took almost a year of all my spare time fixing up and polishing this project.  I have to call an end to it at some time. There is no end to what I could add, change, redo, etc.  But as it stands now, I am proud of what I have been able to accomplish.</p><p>The one thing I like most about allegro is that it is a game programming library, not a game engine.  You are free to implement your game however you want.  I looked into Unity once, and even though it is very impressive and you could do some amazing things with it, you have to do things their way.  For me, most of the enjoyment comes from figuring out from scratch, how to do things my way.</p><p>This is mostly a vanity project.  I did it because I wanted to.  I wanted to prove to myself that I could do it.  I would be just icing on the cake if other people liked it too.</p><p>I also write and record original music, and there are many parallels between that creative endeavor and programming.  </p><p>I create something that did not exist before.  I give it away for free.  I do it mostly for me, but would love it if others appreciated it also.</p><p>So please have a look at the detailed code descriptions and tell me your thoughts.  Good, bad, ugly, whatever.</p><p>Thanks everyone!</p><p>Michael Weiss</p><p>my email:<br />mweiss001@gmail.com</p><p>Download Purple Martians from itch.io:<br /><a href="https://mweiss001.itch.io/purple-martians">https://mweiss001.itch.io/purple-martians</a></p><p>Purple Martians project page on allegro.cc:<br /><a href="https://www.allegro.cc/depot/PurpleMartians">https://www.allegro.cc/depot/PurpleMartians</a></p><p>Github repository for my project:<br /><a href="https://github.com/mweiss001/purple_martians">https://github.com/mweiss001/purple_martians</a></p><p>My youtube channel with game videos and original music:<br /><a href="https://www.youtube.com/user/mweiss0001">https://www.youtube.com/user/mweiss0001</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Michael Weiss)</author>
		<pubDate>Sun, 12 Aug 2018 00:28:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>WOW <img src="http://www.allegro.cc/forums/smileys/shocked.gif" alt=":o" /></p><p>Now this is what I call a documentation! I took a look and there&#39;s nothing I can tell to do better. In fact it is so well documented that I feel it&#39;s rather like a tutorial for someone (or for yourself) to understand the structure of your source code <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /></p><p>I like how the screen resizing works in the game though sometimes I think that screen can go off-center (see attached screenshot).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Frank Drebin)</author>
		<pubDate>Sun, 12 Aug 2018 17:58:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks Frank,</p><p>I tried to make the documentation very thorough, especially for the complicated parts.<br />What you might not have noticed though is there are large parts that I haven&#39;t even started to document.  If I had more time maybe...</p><p>As far as the centering thing goes, I know what you mean, I am not 100% satisfied with that myself.</p><p>The player is not supposed to be in the exact center anyways.</p><p>I originally had it that way, but later changed it to a method with a hysteresis rectangle in the center of the screen that the player was free to move in without causing the level to scroll.</p><p>Its size is customizable in the code: </p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span>
<span class="number">  2</span><span class="k1">void</span> get_new_screen_buffer<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="number">  3</span><span class="k2">{</span>
<span class="number">  4</span>   <a href="http://www.allegro.cc/manual/al_set_target_backbuffer"><span class="a">al_set_target_backbuffer</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>   <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>   <span class="k1">int</span> alp <span class="k3">=</span> active_local_player<span class="k2">;</span>
<span class="number">  8</span>   <span class="k1">int</span> c <span class="k3">=</span> players<span class="k2">[</span>alp<span class="k2">]</span>.color<span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span>   <span class="c">// draw frame in local player's color</span>
<span class="number"> 11</span>   <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x <span class="k3">&lt;</span> BORDER_WIDTH<span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 12</span>      <a href="http://www.allegro.cc/manual/al_draw_rectangle"><span class="a">al_draw_rectangle</span></a><span class="k2">(</span>x<span class="k3">+</span><span class="n">0</span>.<span class="n">5f</span>, x<span class="k3">+</span><span class="n">0</span>.<span class="n">5f</span>, <span class="k2">(</span>SCREEN_W-1-x<span class="k2">)</span><span class="k3">+</span><span class="n">0</span>.<span class="n">5f</span>, <span class="k2">(</span>SCREEN_H-1-x<span class="k2">)</span><span class="k3">+</span><span class="n">0</span>.<span class="n">5f</span>,  <a href="http://www.allegro.cc/manual/palette_color"><span class="a">palette_color</span></a><span class="k2">[</span>c <span class="k3">+</span> <span class="k2">(</span>x <span class="k3">*</span> <span class="n">16</span><span class="k2">)</span><span class="k2">]</span>, <span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>
<span class="number"> 14</span>   <span class="c">// default place and size to draw on screen_buffer</span>
<span class="number"> 15</span>   <span class="k1">int</span> bw <span class="k3">=</span> BORDER_WIDTH<span class="k2">;</span>
<span class="number"> 16</span>   <span class="k1">int</span> sbx <span class="k3">=</span> bw<span class="k2">;</span>
<span class="number"> 17</span>   <span class="k1">int</span> sby <span class="k3">=</span> bw<span class="k2">;</span>
<span class="number"> 18</span>   <span class="k1">int</span> sbw <span class="k3">=</span> SCREEN_W-bw<span class="k3">*</span><span class="n">2</span><span class="k2">;</span>
<span class="number"> 19</span>   <span class="k1">int</span> sbh <span class="k3">=</span> SCREEN_H-bw<span class="k3">*</span><span class="n">2</span><span class="k2">;</span>
<span class="number"> 20</span>
<span class="number"> 21</span>   <span class="c">// how big is the entire level after scale factor is applied?</span>
<span class="number"> 22</span>   <span class="k1">int</span> sls <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><span class="n">2000</span> <span class="k3">*</span> scale_factor_current<span class="k2">)</span><span class="k2">;</span> <span class="c">// sls = scaled level size</span>
<span class="number"> 23</span>
<span class="number"> 24</span>   <span class="c">// is the entire level smaller than the screen buffer width?</span>
<span class="number"> 25</span>   <span class="k1">if</span> <span class="k2">(</span>sls <span class="k3">&lt;</span> sbw<span class="k2">)</span>
<span class="number"> 26</span>   <span class="k2">{</span>
<span class="number"> 27</span>      <span class="k1">int</span> a <span class="k3">=</span> sbw <span class="k3">-</span> sls<span class="k2">;</span> <span class="c">// how much smaller?</span>
<span class="number"> 28</span>      sbw <span class="k3">=</span> sls<span class="k2">;</span>         <span class="c">// new screen_buffer blit width = sls</span>
<span class="number"> 29</span>      sbx <span class="k3">+</span><span class="k3">=</span> a<span class="k3">/</span><span class="n">2</span><span class="k2">;</span>        <span class="c">// new screen_buffer blit xpos</span>
<span class="number"> 30</span>   <span class="k2">}</span>
<span class="number"> 31</span>
<span class="number"> 32</span>   <span class="c">// is the entire level smaller than the screen buffer height?</span>
<span class="number"> 33</span>   <span class="k1">if</span> <span class="k2">(</span>sls <span class="k3">&lt;</span> sbh<span class="k2">)</span>
<span class="number"> 34</span>   <span class="k2">{</span>
<span class="number"> 35</span>      <span class="k1">int</span> a <span class="k3">=</span> sbh <span class="k3">-</span> sls<span class="k2">;</span> <span class="c">// how much smaller?</span>
<span class="number"> 36</span>      sbh <span class="k3">=</span> sls<span class="k2">;</span>         <span class="c">// new screen_buffer blit height = sls</span>
<span class="number"> 37</span>      sby <span class="k3">+</span><span class="k3">=</span> a<span class="k3">/</span><span class="n">2</span><span class="k2">;</span>        <span class="c">// new screen_buffer blit ypos</span>
<span class="number"> 38</span>   <span class="k2">}</span>
<span class="number"> 39</span>
<span class="number"> 40</span>   <span class="c">// find the size of the source screen from actual screen size and scaler</span>
<span class="number"> 41</span>   <span class="k1">int</span> SW <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a> <span class="k3">-</span> bw <span class="k3">*</span><span class="n">2</span><span class="k2">)</span> <span class="k3">/</span> scale_factor_current<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 42</span>   <span class="k1">int</span> SH <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a> <span class="k3">-</span> bw <span class="k3">*</span><span class="n">2</span><span class="k2">)</span> <span class="k3">/</span> scale_factor_current<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 43</span>   <span class="k1">if</span> <span class="k2">(</span>SW <span class="k3">&gt;</span> <span class="n">2000</span><span class="k2">)</span> SW <span class="k3">=</span> <span class="n">2000</span><span class="k2">;</span>
<span class="number"> 44</span>   <span class="k1">if</span> <span class="k2">(</span>SH <span class="k3">&gt;</span> <span class="n">2000</span><span class="k2">)</span> SH <span class="k3">=</span> <span class="n">2000</span><span class="k2">;</span>
<span class="number"> 45</span>
<span class="number"> 46</span>   <span class="c">// find where to grab the source screen from based on the players position</span>
<span class="number"> 47</span>   <span class="k1">int</span> PX <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_fixtoi"><span class="a">al_fixtoi</span></a><span class="k2">(</span>players<span class="k2">[</span>alp<span class="k2">]</span>.PX<span class="k2">)</span> <span class="k3">+</span> <span class="n">10</span><span class="k2">;</span>
<span class="number"> 48</span>   <span class="k1">int</span> PY <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_fixtoi"><span class="a">al_fixtoi</span></a><span class="k2">(</span>players<span class="k2">[</span>alp<span class="k2">]</span>.PY<span class="k2">)</span> <span class="k3">+</span> <span class="n">10</span><span class="k2">;</span>
<span class="number"> 49</span>
<span class="number"> 50</span>   <span class="c">// this method always has the player in the middle of the screen</span>
<span class="number"> 51</span>   <span class="c">//int WX = PX - SW/2 -10; // set window from PX, PY</span>
<span class="number"> 52</span>   <span class="c">//int WY = PY - SH/2 -10;</span>
<span class="number"> 53</span>
<span class="number"> 54</span>   <span class="c">// set the scroll hysteresis (a rectangle in the middle of the screen where there is no scroll)</span>
<span class="number"> 55</span>   <span class="k1">int</span> x_size <span class="k3">=</span> SW <span class="k3">/</span> <span class="n">8</span><span class="k2">;</span> <span class="c">// larger number is smaller window</span>
<span class="number"> 56</span>   <span class="k1">int</span> y_size <span class="k3">=</span> SH <span class="k3">/</span> <span class="n">12</span><span class="k2">;</span>
<span class="number"> 57</span>
<span class="number"> 58</span>   <span class="k1">if</span> <span class="k2">(</span>WX <span class="k3">&lt;</span> PX <span class="k3">-</span> SW<span class="k3">/</span><span class="n">2</span> <span class="k3">-</span> x_size<span class="k2">)</span> WX <span class="k3">=</span> PX <span class="k3">-</span> SW<span class="k3">/</span><span class="n">2</span> <span class="k3">-</span> x_size<span class="k2">;</span> <span class="c">// hit right edge</span>
<span class="number"> 59</span>   <span class="k1">if</span> <span class="k2">(</span>WX <span class="k3">&gt;</span> PX <span class="k3">-</span> SW<span class="k3">/</span><span class="n">2</span> <span class="k3">+</span> x_size<span class="k2">)</span> WX <span class="k3">=</span> PX <span class="k3">-</span> SW<span class="k3">/</span><span class="n">2</span> <span class="k3">+</span> x_size<span class="k2">;</span> <span class="c">// hit left edge</span>
<span class="number"> 60</span>   <span class="k1">if</span> <span class="k2">(</span>WY <span class="k3">&lt;</span> PY <span class="k3">-</span> SH<span class="k3">/</span><span class="n">2</span> <span class="k3">-</span> y_size<span class="k2">)</span> WY <span class="k3">=</span> PY <span class="k3">-</span> SH<span class="k3">/</span><span class="n">2</span> <span class="k3">-</span> y_size<span class="k2">;</span> <span class="c">// hit bottom edge</span>
<span class="number"> 61</span>   <span class="k1">if</span> <span class="k2">(</span>WY <span class="k3">&gt;</span> PY <span class="k3">-</span> SH<span class="k3">/</span><span class="n">2</span> <span class="k3">+</span> y_size<span class="k2">)</span> WY <span class="k3">=</span> PY <span class="k3">-</span> SH<span class="k3">/</span><span class="n">2</span> <span class="k3">+</span> y_size<span class="k2">;</span> <span class="c">// hit top edge</span>
<span class="number"> 62</span>
<span class="number"> 63</span>   <span class="c">// correct for edges</span>
<span class="number"> 64</span>   <span class="k1">if</span> <span class="k2">(</span>WX <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span> WX <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 65</span>   <span class="k1">if</span> <span class="k2">(</span>WY <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span> WY <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 66</span>   <span class="k1">if</span> <span class="k2">(</span>WX <span class="k3">&gt;</span> <span class="k2">(</span><span class="n">2000</span> <span class="k3">-</span> SW<span class="k2">)</span><span class="k2">)</span> WX <span class="k3">=</span> <span class="n">2000</span> <span class="k3">-</span> SW<span class="k2">;</span>
<span class="number"> 67</span>   <span class="k1">if</span> <span class="k2">(</span>WY <span class="k3">&gt;</span> <span class="k2">(</span><span class="n">2000</span> <span class="k3">-</span> SH<span class="k2">)</span><span class="k2">)</span> WY <span class="k3">=</span> <span class="n">2000</span> <span class="k3">-</span> SH<span class="k2">;</span>
<span class="number"> 68</span>
<span class="number"> 69</span>   <span class="c">// used by get_new_background to only get what is needed</span>
<span class="number"> 70</span>   level_display_region_x <span class="k3">=</span> WX<span class="k2">;</span>
<span class="number"> 71</span>   level_display_region_y <span class="k3">=</span> WY<span class="k2">;</span>
<span class="number"> 72</span>   level_display_region_w <span class="k3">=</span> SW<span class="k2">;</span>
<span class="number"> 73</span>   level_display_region_h <span class="k3">=</span> SH<span class="k2">;</span>
<span class="number"> 74</span>
<span class="number"> 75</span>   <span class="c">// this is what all the previous calculation have been building up to:</span>
<span class="number"> 76</span>   <a href="http://www.allegro.cc/manual/al_draw_scaled_bitmap"><span class="a">al_draw_scaled_bitmap</span></a><span class="k2">(</span>level_buffer, WX, WY, SW, SH, sbx, sby, sbw, sbh, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 77</span>
<span class="number"> 78</span>   <span class="p">#ifdef SHOW_HYSTERESIS_WINDOW</span>
<span class="number"> 79</span>   <span class="k1">float</span> hx1 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a><span class="k3">/</span><span class="n">2</span> <span class="k3">-</span> x_size <span class="k3">*</span> scale_factor_current<span class="k2">;</span>
<span class="number"> 80</span>   <span class="k1">float</span> hx2 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a><span class="k3">/</span><span class="n">2</span> <span class="k3">+</span> x_size <span class="k3">*</span> scale_factor_current<span class="k2">;</span>
<span class="number"> 81</span>   <span class="k1">float</span> hy1 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a><span class="k3">/</span><span class="n">2</span> <span class="k3">-</span> y_size <span class="k3">*</span> scale_factor_current<span class="k2">;</span>
<span class="number"> 82</span>   <span class="k1">float</span> hy2 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a><span class="k3">/</span><span class="n">2</span> <span class="k3">+</span> y_size <span class="k3">*</span> scale_factor_current<span class="k2">;</span>
<span class="number"> 83</span>   <a href="http://www.allegro.cc/manual/al_draw_rectangle"><span class="a">al_draw_rectangle</span></a><span class="k2">(</span>hx1, hy1, hx2, hy2, <a href="http://www.allegro.cc/manual/palette_color"><span class="a">palette_color</span></a><span class="k2">[</span><span class="n">10</span><span class="k2">]</span>, <span class="n">2</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 84</span>   <span class="p">#endif</span>
<span class="number"> 85</span>
<span class="number"> 86</span><span class="k2">}</span>
</div></div><p>

It seems to works pretty good, except when changing screen size, the player gets pushed up against the edge of the hysteresis window.  I&#39;ve noticed it myself, but couldn&#39;t think of a way to do anything about it.<br />I mean, its doing what it was designed to do.  The player is staying in the hysteresis window.<br />Sometimes things you are interested in seeing are off the screen, but I can&#39;t think of an automated way to tell what you want to see and scroll it back on the screen.<br />So I just decided to live with it.  Its pretty minor.  And if you want to see more, just zoom out a bit.</p><p>What did you think about the netgame code?</p><p>PS I checked out Brutalo Deluxe back when you released v3.30 and liked it.<br />Especially the particle and blood effects.<br />I just ported my game from A4 to A5 like you did.<br />I wasn&#39;t as bad as I had thought, although it was very time consuming.<br />I would be happy to share my experiences, or try to give advice if you want.<br />I am curious how you handle events and timing, and what your main game loop looks like.</p><p>Thanks for the feedback...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Michael Weiss)</author>
		<pubDate>Sun, 12 Aug 2018 22:13:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The netcode looks reasonable, however, I didn&#39;t set up a net game to test the functionality by myself. Are you using TCP or UDP?</p><p>Well I think I am using pretty much the same game loop like all the Allegro 5 tutorials suggest and the same one you are using in the &#39;Events&#39;-section of your documentation - so nothing secret here...</p><p>BTW: When porting a game from Allegro 4 to Allegro 5 I found <a href="https://wiki.allegro.cc/index.php?title=Porting_from_A4_to_A5">this</a> article quite useful - most of what I had to do is mentioned here.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Frank Drebin)</author>
		<pubDate>Tue, 14 Aug 2018 02:41:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It would do you some good to add some organization to your data. Use structs to group data that belongs together.</p><p>Globals ARE bad. If every file needs to access every piece of data throughout the program, it means your code is not modular. Wrap your data in a struct, and then pass a pointer to that struct. Voila, you now have access to everything you did before, but you don&#39;t need to share it with every module you have.</p><p>To be honest, your code suffers from what I call &quot;Urban Sprawl&quot;. My old Spiraloid program looked like that. There were dirty hacks all over the place, and functions were way too long.</p><p>Your documentation is awesome, but hard to find in your repo.</p><p>I applaud your work. You&#39;ve made quite the awesome little game.</p><p>If you were to rewrite the game from scratch, I&#39;m sure the code would look completely different, but there&#39;s no really no point doing that when you have something that already works.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/617539/1038883#target">Michael Weiss</a> said:</div><div class="quote"><p>
I was planning on hosting then on allegro.cc, but I don&#39;t have a members.allegro.cc account. I have been a member for almost 20 years, but never have signed up for the free web site. I requested one from Matt a few months ago, but I guess he rarely makes an appearance here anymore. So sad. I hope this doesn&#39;t mean that allegro.cc is going the way of the dodo.
</p></div></div><p>
The best way to reach Matthew is by email, or PM.
</p><div class="spoiler"><p>
matthew@allegro.cc
</p></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 14 Aug 2018 03:00:40 +0000</pubDate>
	</item>
</rss>
