<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Giant Scam - Medium]]></title>
        <description><![CDATA[Game Dev Blog for Nashville-based studio Giant Scam Industries - Medium]]></description>
        <link>https://medium.com/giant-scam?source=rss----8728878035e8---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>Giant Scam - Medium</title>
            <link>https://medium.com/giant-scam?source=rss----8728878035e8---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 19:35:01 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/giant-scam" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Guide: HP Reverb G2 Motion Controller Support for Snapshot VR]]></title>
            <link>https://medium.com/giant-scam/guide-hp-reverb-g2-motion-controller-support-for-snapshot-vr-54eee3851b58?source=rss----8728878035e8---4</link>
            <guid isPermaLink="false">https://medium.com/p/54eee3851b58</guid>
            <category><![CDATA[vr]]></category>
            <dc:creator><![CDATA[Jesse]]></dc:creator>
            <pubDate>Tue, 12 Jan 2021 17:52:55 GMT</pubDate>
            <atom:updated>2021-01-12T17:58:06.214Z</atom:updated>
            <content:encoded><![CDATA[<p>Our friends at Microsoft / Windows Mixed Reality put together this guide for our players using the HP Reverb G2 and HP Motion Controllers. Thanks to Brandon, Pat, Daniel, and team for helping us out!</p><p>Windows Mixed Reality users seeking to play the “<a href="https://store.steampowered.com/app/1133580/Snapshot_VR/">Snapshot VR</a>” SteamVR app using Reverb G2 / HP Motion Controllers will be able to locate the functional bindings profile I created using the following guide:</p><p><strong>Step 1:</strong> <em>After launching into SteamVR and starting the “Snapshot VR” application, open the SteamVR ‘Settings’ menu and select the ‘Controllers’ tab</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/412/1*bnL8X-FqgXhZYzizhJhlaQ.png" /></figure><p><strong>Step 2:</strong> <em>From the ‘Controllers’ tab, select the “Manage Controller Bindings” button</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/414/1*S2apx6xmKlgGPH-W278CRQ.png" /></figure><p><strong>Step 3:</strong> <em>Toggle the ‘Active Controller Binding’ setting to “Custom”</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/414/1*_Y-czkD4jkZD2V6jb9YcEw.png" /></figure><p><strong>Step 4:</strong> <em>Select the “Choose Another” button</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/412/1*086215bF4Ao9S7Vp_MrVLw.png" /></figure><p><strong>Step 5:</strong> <em>From the ‘Edit Controller Bindings’ screen, select “Snapshot VR”</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/613/1*RJxgShfoLa5PxT-eo7tyxg.png" /></figure><p><strong>Step 6:</strong> <em>From the ‘Change Bindings for Snapshot VR’ screen, locate the ‘HP Motion Controllers’ custom bindings profile and select the ‘Activate’ button</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/612/1*1eDNbwjh5jnCRNFsyaIwig.png" /></figure><p>These bindings will become the default for Snapshot VR in the next WMR SteamVR Bridge update. We’ll also be receiving a dev kit for the HP Reverb G2 so that we can test any further customizations. Thanks to our impacted players for being patient as we sorted this out!</p><p>Join us in <a href="https://discord.gg/K4cFksZ">Discord</a> to let us know how it works!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=54eee3851b58" width="1" height="1" alt=""><hr><p><a href="https://medium.com/giant-scam/guide-hp-reverb-g2-motion-controller-support-for-snapshot-vr-54eee3851b58">Guide: HP Reverb G2 Motion Controller Support for Snapshot VR</a> was originally published in <a href="https://medium.com/giant-scam">Giant Scam</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Snapshot VR Year in Review — 2020]]></title>
            <link>https://medium.com/giant-scam/snapshot-vr-year-in-review-2020-a92f5ea656d9?source=rss----8728878035e8---4</link>
            <guid isPermaLink="false">https://medium.com/p/a92f5ea656d9</guid>
            <category><![CDATA[video-game-development]]></category>
            <category><![CDATA[video-games-industry]]></category>
            <category><![CDATA[vr]]></category>
            <category><![CDATA[esports-news]]></category>
            <dc:creator><![CDATA[Jesse]]></dc:creator>
            <pubDate>Sun, 03 Jan 2021 21:04:40 GMT</pubDate>
            <atom:updated>2021-01-05T23:24:17.202Z</atom:updated>
            <content:encoded><![CDATA[<h3>Snapshot VR Year in Review — 2020</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*d5RuJ2BsyOsrn_sQh7EaLg.jpeg" /></figure><p>It has been a heck of a year for Snapshot VR. We transitioned from alpha to beta to early access, and have now been live on both Viveport and Steam for just over 4 months.</p><p>We gathered data from our kill metrics datastore, which is stored in AWS DynamoDB, as well as from Github, Discord, our Changelog, and various other sources to put together as comprehensive of a lookback as possible for the previous year. Some of the numbers that we pulled are still shocking to me and Tanner. It has definitely been humbling for us to see our passion project become what it is today.</p><h3>Let’s start with our beloved Community</h3><p>We started 2020 with just over 200 Discord members, and today<strong> </strong>our community is<strong> 870 members </strong>strong<strong>, </strong>a<strong> growth rate of 335%</strong> over the year. That’s pretty cool.</p><p>We’ve seen over <strong>1300 Snapshot accounts </strong>created and our daily active user base increases by about <strong>10% monthly</strong>. It can be a grind to build a community for an early access game, especially a VR early access game, but we’re fairly happy with the pace so far.</p><p>We also entered the <strong>esports </strong>scene as the <strong>6th game to join the VRML </strong>with a 9 week pre-season. There are currently <strong>13 active teams</strong> of 3–4 members each going into our 7th week and the standings are as follows:</p><p><strong>1st </strong>— Underdogs<br><strong>2nd </strong>— Birthday Snatchers<br><strong>3rd </strong>— Serial Chillerz</p><p>We, of course, couldn’t manage any of this without our mods. Thanks to <strong>Shiva, TickleMeElmo, Chillswitch Engage, Albifons, and Bushido</strong> for keeping this thing alive.</p><h3><strong>Tournaments</strong></h3><p>We saw <strong>2 community-organized tournaments</strong> take place in 2020, each with their own format and rules, and with their own version of a prize pool. All in all we gave away roughly <strong>$500 in prizes</strong> this year to tournament participants.</p><p><strong>Viveport Open</strong><br>August 5th<br>3v3 Format<br>7 Teams<br><strong>1st </strong>— Underage Ballers<br><strong>2nd </strong>— Eastbound &amp; Down<br><strong>3rd </strong>— Blaze</p><p><strong>Steam Open<br></strong>October 3rd<br>5v5 Format<br>7 Teams<br><strong>1st </strong>— Mod Squad<br><strong>2nd </strong>— Team Breakfast<br><strong>3rd </strong>— Blaze</p><p>Marek’s 1v1 Tournament didn’t make the cut by just 2 days, but we’ll make sure to include that in the 2021 recap.</p><h3>The game changed…a lot</h3><p>I think most of our alpha and beta players would agree that Snapshot is a different game than it was a year ago. A year ago Joystick Locomotion didn’t exist, players were getting stuck above the field, guns disappeared from your hands or holster randomly, players could keep shooting after they died, and there were only about 5 hand-crafted maps in the game.</p><p>Scrolling back through the git history, I counted <strong>31 significant features</strong> that made their debut in Snapshot this year. I won’t list them all, but here are some highlights:</p><ul><li>Stat tracking with Snapshot accounts</li><li>Custom maps with the 2D Paintball Field Creator</li><li>A complete netcode swap, taking 3 months of dev time</li><li>Voice chat</li><li>Competitive mode</li><li>Spectator cam, with all the bells and whistles</li><li>Bots</li><li>And so much more…including the all-knowing <strong>Ref Bot</strong></li></ul><p>Tanner and I released <strong>56 versions</strong> of Snapshot (starting at v1.2.4 and ending on v2.2.15). We made <strong>705 code commits</strong>, adding or changing <strong>13,047 lines of code</strong> across <strong>274 files</strong>. The game systems with the most changes this year were:<br><strong>1st </strong>— The Game Server / Game Loop<br><strong>2nd</strong> — Bot Infrastructure<br><strong>3rd </strong>— Voice Chat</p><h3>Arenas</h3><p>We released support for user-created maps in March. Since then, we’ve seen matches on over <strong>150 custom maps</strong>, including revisions, settling at <strong>116 maps currently playable</strong> in the game today.</p><p><strong>NXL Spain 2020</strong> is by far the most popular map, home to <strong>539 matches</strong> and <strong>15,767 kills</strong>. NXL World Cup 2020, MPPL Event 1 2020, and GZ’s own “Holidaze” 5 Man maps were all in the top 5 of both categories as well.</p><h3>The Gameplay Data</h3><p>Very early on we started collecting basic player and position data for every kill that took place on Snapshot servers. We added to this data over time, which has let us pull some <em>pretty interesting</em> metrics from 2020. We’ll explore some of this data here and hand out some <strong>superlatives </strong>as well.</p><p>Let’s start with the high level. In 2020 our players logged <strong>197,555 total kills </strong>within <strong>7,572 matches. </strong>Our <strong>Top 5 Killers</strong> (not including bot kills) are:</p><p><strong>Shiva </strong>— 7408<br><strong>Foxkru </strong>— 5837<br><strong>Marek </strong>— 5558<br><strong>Bushido </strong>— 3409<br><strong>Chillswitch Engage</strong> — 3127</p><h3>Bots</h3><p>We introduced bots to the game in October. While we filter these out from the <a href="http://www.snapshotvr.com/">SnapshotVR.com</a> leaderboards, we still have the ability to include or exclude them from our ad-hoc queries.</p><p>Bots have had quite the run in the few months they’ve been alive. Bots have been killed <strong>41,219 </strong>times by players while racking up <strong>14,055 </strong>kills of their own. We also see plenty of bot vs. bot violence, where bots have killed each other <strong>over 50,000</strong> times. Our most dangerous bot is <strong>“Bot 5”</strong>, who has <strong>over 7,000 </strong>kills by itself.</p><p>A lot of players practice or just spend some recreational time in the game playing bots, so we have to honor our <strong>Top 5 Bot Killers</strong> as well:</p><p><strong>Marek </strong>— 2319<br><strong>Fab </strong>— 2281<br><strong>Leybron </strong>— 1479<br><strong>gzinthehood </strong>— 1355<br><strong>Uncle Randy </strong>— 1266</p><p>These players are the ones starting rooms and getting games going, so we really appreciate this crew.</p><h3><strong>Backstabbers</strong></h3><p>We started penalizing <strong>Team Kills</strong> this year, and it wouldn’t be a complete recap without acknowledging the worst offenders of Ref Bot’s favorite penalty.</p><p>Thankfully, we only saw <strong>2978 team kills</strong> this year, about <strong>3%</strong> of total kills excluding bots. Our <strong>Top (or bottom?) 5 Team Killers</strong> were:</p><p><strong>Foxkru </strong>— 133<br><strong>Chillswitch Engage</strong> — 103<br><strong>Bushido </strong>— 85<br><strong>Marek </strong>— 76<br><strong>Uncle Randy</strong> — 64</p><h3>Headshot!</h3><p>In November we started tracking which collider was impacted to trigger each kill. This was to support the on-field and on-body hit visualizations that we released, but it also allows us to pull metrics about which parts of the player are hit most often.</p><p>The <strong>Most Often Hit Areas</strong> are:</p><p><strong>Chest </strong>— 38.97%<br><strong>Head </strong>— 12.52%<br><strong>Left Thigh</strong> — 8.9%<br><strong>Gun </strong>— 5.72%<br><strong>Right Thigh</strong> — 4.87%</p><p>Our <strong>Least Often Hit Areas</strong> are the <strong>feet </strong>and, hilariously, the ball ends of the <strong>headbands </strong>that give the headbands physics , which were hit <strong>59 times</strong> between the two tails. Notably, the <strong>pumpkin head </strong>Halloween<strong> </strong>cosmetic got shot <strong>513 times</strong>.</p><p>The player with the <strong>most confirmed headshots</strong> so far is <strong>Czechmate </strong>with <strong>390 </strong>headshots. Excluding bot kills, <strong>Marek </strong>leads with <strong>214</strong>.</p><p>This is what we’re able to take away from our 2020 data. Again, we’re very happy with these results, and just pleased that we have the data to understand our game at this level. Have ideas for what we should track in 2021? Let us know in <a href="https://discord.gg/K4cFksZ">Discord</a>.</p><p><strong>Thanks for an amazing year!</strong></p><ul><li>Jesse and Tanner</li></ul><p>P.S — Blue team best team. Blue team accumulated over 30,000 more kills than the Pink team in 2020. So that’s settled… ;-)</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a92f5ea656d9" width="1" height="1" alt=""><hr><p><a href="https://medium.com/giant-scam/snapshot-vr-year-in-review-2020-a92f5ea656d9">Snapshot VR Year in Review — 2020</a> was originally published in <a href="https://medium.com/giant-scam">Giant Scam</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Snapshot VR Viveport Open Recap]]></title>
            <link>https://medium.com/giant-scam/snapshot-vr-viveport-open-recap-9773c23475b5?source=rss----8728878035e8---4</link>
            <guid isPermaLink="false">https://medium.com/p/9773c23475b5</guid>
            <category><![CDATA[esports-market]]></category>
            <category><![CDATA[vr]]></category>
            <category><![CDATA[video-games-news]]></category>
            <dc:creator><![CDATA[Jesse]]></dc:creator>
            <pubDate>Tue, 01 Sep 2020 19:35:32 GMT</pubDate>
            <atom:updated>2020-09-01T19:35:32.338Z</atom:updated>
            <content:encoded><![CDATA[<p>On Saturday, August 15th we sponsored the first ever community-driven Snapshot VR tournament. It was wild.</p><h3>The Setup</h3><p>This tournament was made up of 7 teams of 3 playing a double elimination bracket — all matches prelims through finals taking place on the same day. We got it done in just under 4 hours.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*xh2hczplfVYi0AM71mj9tw.png" /></figure><p>For each match, teams played a best 2 out of 3 maps, where the first team to win 5 rounds claimed the map. We saw everything from 5–0 2 map blowouts to 4–4 clutch points on the 3rd map.</p><p>The full VOD is up on <a href="https://www.twitch.tv/videos/711491758?t=00h10m15s">Twitch</a>, and will be reuploaded to Youtube soon.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fplayer.twitch.tv%2F%3Fvideo%3D711491758%26muted%3Dtrue%26parent%3Dcdn.embedly.com&amp;display_name=Twitch.tv&amp;url=https%3A%2F%2Fwww.twitch.tv%2Fvideos%2F711491758%3Ft%3D00h10m15s&amp;image=https%3A%2F%2Fstatic-cdn.jtvnw.net%2Fcf_vods%2Fd2nvs31859zcd8%2F2180b7c5ae52f0f4bb03_giantscam_2453103777_153382558%2F%2Fthumb%2Fthumb0-640x360.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=twitch" width="620" height="351" frameborder="0" scrolling="no"><a href="https://medium.com/media/ff23d201bcb1c1ebf1319b1458e1ff8c/href">https://medium.com/media/ff23d201bcb1c1ebf1319b1458e1ff8c/href</a></iframe><h3>The Maps</h3><p>All maps were custom made by our community member and mod Shiva Soldier. He put special blocking walls at each pit as well to eliminate ghosting from the dead box.</p><p>Map #1 — Xball</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8q1BDC-u2HvSnxzGx8E3KA.png" /></figure><p>Map #2 — Super Lanes</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Kra5wqPCfWYWwfoYpRwGBQ.png" /></figure><p>Map #3 — Offseason</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*G-Q2wf0o4p9Qk4dS-gW0oA.png" /></figure><h3>Prelims</h3><p>The prelims had a few surprises in store.</p><p>Blaze, a group of our newest members (friends from the <a href="https://vrmasterleague.com/">VRML</a>) had a strong showing in match 1, barely losing to team Tri-hards. Blaze would go on to perform very well in the losers bracket, making it all the way to the losers bracket final, where they lost but secured a 3rd place spot and a share of the prize package.</p><p>NashGameDev, a personal favorite, is made up of other game developers in or from the Nashville scene, including SirCrocketz who made the sound effects for Snapshot VR. They dropped 2 quick matches but tell me they had a good time along the way.</p><h3>Finals</h3><p>The real story here is with our finals teams — Eastbound &amp; Down and Underage Ballers. Each playing very well in prelims until facing each other — where Underage Ballers was able to scrape by and put E&amp;D in the losers bracket. These teams have good stories. Underage Ballers, as their name might imply, is made up of some of our younger (but most experienced) Snapshot players and has players from the US and Norway. E&amp;D has players in the US, Japan, and Australia. Shout out to our international players for playing at very odd hours and at less than perfect pings, but still making it to the finals.</p><p>E&amp;D winning the losers bracket means they needed to beat Underage Ballers twice to secure the championship. And they nearly did just that.</p><p>You can watch both finals matches on Twitch <a href="https://www.twitch.tv/videos/711491758?t=02h48m09s">here</a>.</p><p>The first finals match had Underage Ballers taking map 1, E&amp;D taking map 2, and it coming down to a 4–4 on map 3. Eastbound &amp; Down was able to take the last point and reset the bracket — setting us up for a second finals match.</p><p>The second finals match was nearly the same story, all the way to a 4–4 on map 3. Check out the final moment of that 4–4 point:</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FhzVqbZVOO1c%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DhzVqbZVOO1c&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FhzVqbZVOO1c%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/6317ca42bbcea50fdb2191e6299ceb47/href">https://medium.com/media/6317ca42bbcea50fdb2191e6299ceb47/href</a></iframe><h3>Final Standings</h3><p>1st. Underage Ballers<br>2nd. Eastbound &amp; Down<br>3rd. Blaze<br>4th. str8shooters<br>5th. Pod Chiefs<br>6th. Tri-hards<br>7th. NashGameDev</p><h3>Prizes</h3><p>3rd Place — Each team member received a variety pack of Snapshot VR and Giant Scam stickers.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*89MYCEYkR_Ch-sqFOE414Q.jpeg" /></figure><p>2nd Place — Each team member received their choice of a Giant Scam or Snapshot VR t-shirt</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Up9H5W_M_MHhtBzlo-iZHw.png" /></figure><p>1st Place — Where the real money (figuratively speaking) is at. Each team member got to choose between a custom printed <a href="https://www.savagepaintball.com/">Savage Paintball</a> board or a VR gun stock.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*n6KoQSN3kH-vPqnq6KSvIA.jpeg" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yiRozeBH__FJj_s8yPz_AQ.jpeg" /></figure><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fq-OyGd2i26g%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dq-OyGd2i26g&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fq-OyGd2i26g%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/bf606d5c243e495421a9835b74e5962a/href">https://medium.com/media/bf606d5c243e495421a9835b74e5962a/href</a></iframe><h3>What’s next?</h3><p>Join our <a href="https://snapshotvr.com/">Discord</a> to be the first to hear about our next tournament. We’re announcing the dates this week!</p><p>Thanks to all competitors for a heck of a first event. Looking forward to many more!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9773c23475b5" width="1" height="1" alt=""><hr><p><a href="https://medium.com/giant-scam/snapshot-vr-viveport-open-recap-9773c23475b5">Snapshot VR Viveport Open Recap</a> was originally published in <a href="https://medium.com/giant-scam">Giant Scam</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Training Mode — Adding “Bots” to Snapshot VR Custom Maps]]></title>
            <link>https://medium.com/giant-scam/training-mode-adding-bots-to-snapshot-vr-custom-maps-a48afce725d0?source=rss----8728878035e8---4</link>
            <guid isPermaLink="false">https://medium.com/p/a48afce725d0</guid>
            <category><![CDATA[video-game-development]]></category>
            <category><![CDATA[vr]]></category>
            <dc:creator><![CDATA[Jesse]]></dc:creator>
            <pubDate>Thu, 23 Jul 2020 04:32:23 GMT</pubDate>
            <atom:updated>2021-01-03T21:06:24.827Z</atom:updated>
            <content:encoded><![CDATA[<h3>Training Mode — Adding Targets to Snapshot VR Custom Maps</h3><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgfycat.com%2Fifr%2Fgloriouseveryanhinga&amp;display_name=Gfycat&amp;url=https%3A%2F%2Fgfycat.com%2Fgloriouseveryanhinga&amp;image=https%3A%2F%2Fthumbs.gfycat.com%2FGloriousEveryAnhinga-size_restricted.gif&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=gfycat" width="1920" height="1080" frameborder="0" scrolling="no"><a href="https://medium.com/media/f34bd2432a844537833a027ed2b48520/href">https://medium.com/media/f34bd2432a844537833a027ed2b48520/href</a></iframe><p>Using our integration with 2D Paintball, you can now add both moving and stationary targets to training maps in Snapshot VR. Use these bots to practice laning and snap shooting in single or multiplayer.</p><p>This implementation is a stepping stone to fully functional bots, and we hope you find it useful for practicing in the meantime.</p><p>For more information on creating layouts for Snapshot VR using 2D Paintball’s Field Creator, see our previous <a href="https://medium.com/giant-scam/creating-snapshot-vr-maps-with-the-2d-paintball-field-creator-b6841ac480fa">guide</a>.</p><p>To get started, you have two options.</p><ol><li>Create a new layout in the 2D Paintball Field Creator</li><li>Import an existing layout into the 2D Paintball Field Creator by pasting the contents of any2dp_layoutname.arena.json file in the StreamingAssets/ directory of your Snapshot installation into the Map Data field under Advanced Options in the Field Creator</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/285/1*dWBDXMFlh_vliG3kCMskVA.png" /></figure><p>Once you have the bunkers arranged to your liking, you can take advantage of the <strong>Bot Positions</strong> feature of the Field Creator.</p><p>Selecting Bot Positions gives you similar options as when placing a bunker. You can set the position on the field, set it to mirror, and set some other basic parameters. This option will place a small green object on the field to represent the bot position.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/755/1*7vqABihgtwWFe9_ZRINnOg.png" /></figure><p>Placing these on a layout created in 2D Paintball and importing into Snapshot VR will set the positions as expected, as long as you adhere to the following:</p><ol><li>Any map with bot positions must have the file name formatted like so:<br><strong>2dp_trn_layoutname.arena.json<br></strong>Where ‘trn’ here stands for ‘training.’<br>This will guarantee bots to spawn appropriately when the layout is loaded, and will show the map separately from standard maps in the in-game UI.</li><li>The <strong>type</strong> parameter is extremely important for bot placements.<br>A type of <strong>Crouching</strong> will create a stationary bot for practicing snap shooting. This bot will spawn in the set position and stay there throughout the round.<br>A type of <strong>Stand up</strong> (the default) will create a bot that will break out from the start station and move to that position as similarly as possible to a real player. This is ideal for practicing laning and shooting off the break.</li></ol><p>If all goes well, you will now have your training layout listed in the <strong>Training Layouts</strong> UI after you’ve created a new Room.</p><p>Your training bots will respawn each round. For moving bots, they’ll reset and make their breakout move repeatedly throughout the round. So, you can get a full practice session in without ever pressing the buzzer to change the round if you’d like.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fgfycat.com%2Fifr%2Fambitiouscoldbonobo&amp;display_name=Gfycat&amp;url=https%3A%2F%2Fgfycat.com%2Fambitiouscoldbonobo&amp;image=https%3A%2F%2Fthumbs.gfycat.com%2FAmbitiousColdBonobo-size_restricted.gif&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=gfycat" width="1920" height="1080" frameborder="0" scrolling="no"><a href="https://medium.com/media/d94b58ac0f14f924291e2fa9b03f43e0/href">https://medium.com/media/d94b58ac0f14f924291e2fa9b03f43e0/href</a></iframe><p>Shooting a bot will give you feedback in the form of the classic bell ding you hear when you get a kill in a normal match as well as the kill flash effect at the position where the bot was hit.</p><p>And that’s it! Let us know in our <a href="https://discord.gg/K4cFksZ">Discord</a> if you have feedback or suggestions!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a48afce725d0" width="1" height="1" alt=""><hr><p><a href="https://medium.com/giant-scam/training-mode-adding-bots-to-snapshot-vr-custom-maps-a48afce725d0">Training Mode — Adding “Bots” to Snapshot VR Custom Maps</a> was originally published in <a href="https://medium.com/giant-scam">Giant Scam</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Snapshot VR Registration]]></title>
            <link>https://medium.com/giant-scam/snapshot-vr-registration-173a6510e9f6?source=rss----8728878035e8---4</link>
            <guid isPermaLink="false">https://medium.com/p/173a6510e9f6</guid>
            <dc:creator><![CDATA[Jesse]]></dc:creator>
            <pubDate>Thu, 07 May 2020 22:36:53 GMT</pubDate>
            <atom:updated>2020-05-07T22:36:21.702Z</atom:updated>
            <content:encoded><![CDATA[<p>Today we are launching our cross-platform user profiles on <a href="http://www.snapshotvr.com./">www.snapshotvr.com.</a> Registration is officially open!</p><p>This means you can register with your email address and set your Player Nickname and Icon in your Snapshot account. This account will be accessible regardless of which VR platform you are on, so you can have all of your tracked stats, cosmetics, etc… in one place.</p><p>Today, we are only launching the Nickname and Icon features, but this account will be the destination for all new features going forward.</p><h3>Registering and Logging In</h3><p><a href="http://www.snapshotvr.com/">www.snapshotvr.com</a> now has a login button:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/676/1*5Y-PpfNCYrutvpzU1fpVrg.png" /></figure><p>This takes you to a login/register form:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/484/1*Q5WtM_cG5A2voYS2Zpph_A.png" /></figure><p>Where you can set your email, password, and default Nickname. This Nickname can be changed any time by logging in to your Snapshot account.</p><p>Registration can also be completed entirely in VR. We have a VR-compatible keyboard now to make that easier:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jXlqMwgnNkxZl05Fc9Xrsg.png" /></figure><p>Note: You can still use your PC keyboard once you’ve clicked into these form boxes. This makes things like pasting a complex password much easier.</p><p>Enter your email and password, press Login, and you’ll be connected to our network. This will let you view/edit your selected cosmetics, change your Nickname, view the server browser, etc…</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*inZKMsFQAprbs2ESt92nJw.png" /></figure><p>If you encounter issues, let us know in our <a href="https://discord.gg/K4cFksZ">Discord</a>! Thanks!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=173a6510e9f6" width="1" height="1" alt=""><hr><p><a href="https://medium.com/giant-scam/snapshot-vr-registration-173a6510e9f6">Snapshot VR Registration</a> was originally published in <a href="https://medium.com/giant-scam">Giant Scam</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Creating Snapshot VR Maps with the 2D Paintball Field Creator]]></title>
            <link>https://medium.com/giant-scam/creating-snapshot-vr-maps-with-the-2d-paintball-field-creator-b6841ac480fa?source=rss----8728878035e8---4</link>
            <guid isPermaLink="false">https://medium.com/p/b6841ac480fa</guid>
            <category><![CDATA[virtual-reality]]></category>
            <category><![CDATA[game-development]]></category>
            <category><![CDATA[paintball]]></category>
            <dc:creator><![CDATA[Jesse]]></dc:creator>
            <pubDate>Thu, 26 Mar 2020 18:59:18 GMT</pubDate>
            <atom:updated>2022-02-09T05:39:09.150Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*O-oAHChCZgBzZNFBDKwm-Q.png" /></figure><h3>Overview</h3><p>Through a collaboration with the creators of 2D Paintball, you can now export fields created with 2D Paintball’s Field Creator into Snapshot VR. The field formats between the two games are very different, so we’ve created this guide to help you choose the right settings and set the right parameters on your 2D Paintball bunkers so that they load in Snapshot correctly.</p><p>If you’re interested in playing Snapshot VR during our Alpha (which is <strong>free</strong>) or just following along — join us in our <strong>Discord</strong>, which you can find a link to on our home page <a href="http://www.snapshotvr.com/">http://www.snapshotvr.com</a>. Also join us on Facebook, Instagram, and Twitter @giantscam.</p><p>Using this guide, I was able to take the 2020 NXL Spain layout:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XFyRKT7Go31EnhVHoYGUgg.jpeg" /></figure><p>Map it in 2D Paintball, which took me about 30 minutes:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*k9ypRAx20-_x6n6H3Wxr8Q.png" /></figure><p>And immediately upload into Snapshot VR:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hhmezrn-dZMOagdUhmmx5A.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*b2acInEOdN8Amx5mfa5v7Q.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uX0Ty_8erVeOhSeUWZI8rA.png" /></figure><p><a href="http://www.2dpaintball.com/">2D Paintball</a> is a web-based 2D multiplayer paintball game. You can also support the 2D Paintball developers by buying their game on <a href="https://store.steampowered.com/app/696880/2D_Paintball/">Steam</a>.</p><p>It has a built-in 2D Field Creator that you can access like so:</p><ol><li>Go to <a href="http://www.2dpaintball.com/">http://www.2dpaintball.com/</a></li><li>Create an Account</li><li>Log In</li><li>Click the green <strong>Field Creator Button</strong> in the 2nd header bar next to Leaderboards</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/812/1*zx_51715hM_rhDzTtfRuVQ.png" /></figure><p>Check out this video demoing the Field Creator to learn more about how it works.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2Fw5JcoG94Nao%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3Dw5JcoG94Nao&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2Fw5JcoG94Nao%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/4722f12ad3826fbeda8cf943f095ce5e/href">https://medium.com/media/4722f12ad3826fbeda8cf943f095ce5e/href</a></iframe><p>Using 2D Paintball’s Field Creator with the specification in this guide will give you a field that is compatible with Snapshot VR.</p><h3>Exporting from 2D Paintball</h3><p>When ready to test your field, do the following from within Field Creator:</p><ol><li>Click <strong>Advanced Options</strong> near the bottom left of the Creator.</li><li>Copy the text in <strong>Map Data</strong>.</li><li>Save text to a file named <strong>2dp_</strong>&lt;filename&gt;.arena.json. The preface <strong>2dp_</strong> is what tells Snapshot to use a different format than our usual Snapshot arena file.</li><li>Move the file to the <strong>SnapshotVR_Data/StreamingAssets/</strong> folder as if you were installing a typical custom map. The file will be converted on load.</li></ol><h3>2D Paintball Field Settings</h3><p><strong>Field Size</strong>: 1500x1200 — This will get you the NXL grid as well as Snapshot’s (50x40 size) grid.</p><p><strong>Name</strong>, <strong>Turf Style, Colors</strong>, <strong>Darken</strong>, <strong>Dest</strong>: Any, these are not used by Snapshot VR</p><p><strong>Team Size</strong>: 5</p><p><strong>UPDATE:</strong> Thanks to our community mappers foffles and Fab we now have an NXL template that you can paste into the <strong>Map Data</strong> field in the 2D Paintball Field Creator.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/b73e3ec54a4aed4ef17557c7daeed196/href">https://medium.com/media/b73e3ec54a4aed4ef17557c7daeed196/href</a></iframe><p>That will populate a 2D Paintball field with the default set of bunkers for an NXL layout.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6sxc6S430yu6xJhf4onQnA.png" /></figure><p>Which translate to these bunkers in Snapshot</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sw5XVF_srj9qsSTIEaqSqQ.png" /></figure><h3>2D Paintball Bunker Settings</h3><p><strong>Mirror Bunkers</strong></p><p>In the creator, Mirror Bunkers will create two objects mirrored across the two sides of the field going left to right. It will store both bunkers individually in the file, so creating with or without the Mirrored Bunkers setting should work fine.</p><p><strong>Snap Bunkers to Grid</strong></p><p>This is recommended to be ON, as it standardizes the possible positions of the bunkers in the file. You can experiment with this setting off, but it may have undefined behavior.</p><p><strong>Note on Axes</strong></p><p>The width axis is the x axis that goes across the field left to right.<br>The height axis is the y axis that goes across the field bottom to top.</p><p><strong>Note on Starter Bricks (Spawn Points and Buzzers)</strong></p><p>Snapshot will add a Starter Brick automatically at the position that fits 1500x1200 (50x40) arenas for 2D Paintball arena files.</p><h3>Bunker Mapping</h3><p>This mapping is compatible with Snapshot VR Version <strong>1.2.5</strong> and greater.</p><p>This mapping may be tweaked based on community feedback. Mapping will be updated here as necessary.</p><p><strong>DEFAULT</strong> values are the initial values per bunker type in 2D Paintball. They are called out to indicate which values can stay the same after placing the bunker in 2D Paintball. We had to use a lot of parameters to go from the default set of 3 2D Paintball base bunker types to our full bunker set in Snapshot VR.</p><p>A more readable version of the mapping is kept in this <a href="https://docs.google.com/spreadsheets/d/19348xInelLyNolD8y-v8cD0ocmSjjZp92czss5Bq9BU/edit?usp=sharing">Google Sheet</a>.</p><h3>Can</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/380/1*_q1zXAM44qE4DPKQrlqN2w.png" /></figure><p><strong>2D Paintball Parameters<br></strong>Type: Barrel<br>Radius: 20 (DEFAULT)<br>Standup: Checked (DEFAULT)</p><h3>Pylon</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/380/1*oCsWHoi2vX_XaA5Zj69d5A.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Barrel<br>Radius: 10<br>Standup: Checked (DEFAULT)</p><h3>Column</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/236/1*kvdOULfGqW-PwPeE7jdifw.png" /></figure><p><strong>2D Paintball Parameters<br></strong>Type: Barrel<br>Radius: 10<br>Standup: Not Checked</p><h3>Box</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/547/1*TarNLgpv_d-QPzi8tQwiZQ.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Box/Rectangle<br>Size(width): 35 (DEFAULT)<br>Size(height): 35 (DEFAULT)<br>Standup: Checked (DEFAULT)<br>Rounded: Not Checked</p><h3>Small Box</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/402/1*Q28w3xETwfnBTutryAtPnw.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Box/Rectangle<br>Size(width): 20<br>Size(height): 20<br>Standup: Not Checked<br>Rounded: Not Checked</p><h3>Brick</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/679/1*v6WzKAMFa9v9XzIVgM_bIA.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Box/Rectangle<br>Size(width): 15<br>Size(height): 100<br>Standup: Not Checked<br>Rounded: Not Checked<br>Note: This is typically what we use for snake beams since they are a bit taller for our avatars</p><h3>Giant Brick</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/653/1*SlnAHNhysv1VS1ARs0oJXA.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Box/Rectangle<br>Size(width): 35 (DEFAULT)<br>Size(height): 100<br>Standup: Checked (DEFAULT)<br>Rounded: Checked (DEFAULT)</p><h3>Brick 2022</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/581/1*bUHRtQvwCaCgN-6qRQJGuQ.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Box/Rectangle<br>Size(width): 40<br>Size(height): 60<br>Standup: Checked (DEFAULT)<br>Rounded: Not Checked</p><h3>Brick 2022 Upright</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/327/1*qA-CjsYXAWOvJ3M9tB5v7A.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Box/Rectangle<br>Size(width): 40<br>Size(height): 45<br>Standup: Checked (DEFAULT)<br>Rounded: Not Checked</p><h3>Snake Beam</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/623/1*0wghdhV8pJUx2yCOK38OzA.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Box/Rectangle<br>Size(width): 15<br>Size(height): 100<br>Standup: Not Checked<br>Rounded: Checked (DEFAULT)</p><h3>Large Temple</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/438/1*dWuf2xMXru-AzORAdxig5w.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Box/Rectangle<br>Size(width): 35 (DEFAULT)<br>Size(height): 35 (DEFAULT)<br>Standup: Checked (DEFAULT)<br>Rounded: Checked (DEFAULT)</p><h3>Small Aztec</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/506/1*5ItYjUQk04CbT3Aylq2xWA.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Box/Rectangle<br>Size(width): 35 (DEFAULT)<br>Size(height): 35 (DEFAULT)<br>Standup: Not Checked<br>Rounded: Checked (DEFAULT)</p><h3>Giant Wing</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/357/1*-EBZOFFuhZm1selWz1p_EA.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Box/Rectangle<br>Size(width): 45<br>Size(height): 45<br>Standup: Checked (DEFAULT)<br>Rounded: Checked (DEFAULT)<br>Note: Giant Wing and Giant Wing Flat have a default rotation to where the lower tapered side of the bunker faces the dorito side (top of Field Creator box) of the field. Rotate in Field Creator as necessary.</p><h3>Giant Wing Flat</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/516/1*ApdG9dOh0MUlaElJ_8hC3w.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Box/Rectangle<br>Size(width): 45<br>Size(height): 70<br>Standup: Checked (DEFAULT)<br>Rounded: Checked (DEFAULT)<br>Note: Giant Wing and Giant Wing Flat have a default rotation to where the lower tapered side of the bunker faces the dorito side (top of Field Creator box) of the field. Rotate in Field Creator as necessary.</p><h3>Wing 2022</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/462/1*xcFYAr7k217r6bMkCYvbXw.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Box/Rectangle<br>Size(width): 40<br>Size(height): 60<br>Standup: Checked (DEFAULT)<br>Rounded: Checked (DEFAULT)</p><h3>Wing 2022 Upright</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/315/1*67QNFhxXkuB8cjlK2Xisdw.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Box/Rectangle<br>Size(width): 40<br>Size(height): 45<br>Standup: Checked (DEFAULT)<br>Rounded: Checked (DEFAULT)</p><h3>A</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/602/1*TRUVGRgeRk0NbFrsQ4s-YQ.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Box/Rectangle<br>Size(width): 35 (DEFAULT)<br>Size(height): 140<br>Standup: Checked (DEFAULT)<br>Rounded: Checked (DEFAULT)</p><h3>W (Wall)</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/787/1*b6PoGAlsNVm6kaKs6qzw6g.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Box/Rectangle<br>Size(width): 35 (DEFAULT)<br>Size(height): 135<br>Standup: Checked (DEFAULT)<br>Rounded: Checked (DEFAULT)</p><h3>Mini X</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/479/1*B7FJul6zQ-sP3AxhamI0pg.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Box/Rectangle<br>Size(width): 20 (DEFAULT)<br>Size(height): 50<br>Standup: Checked (DEFAULT)<br>Rounded: Checked (DEFAULT)</p><h3>Mini W</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/580/1*fdWG2kT4UIKleXL4YDlspw.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Box/Rectangle<br>Size(width): 20 (DEFAULT)<br>Size(height): 50<br>Standup: Not Checked<br>Rounded: Checked (DEFAULT)</p><h3>Mini A</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/604/1*nw60pH229olWYbbPvTh6hg.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Box/Rectangle<br>Size(width): 20 (DEFAULT)<br>Size(height): 45<br>Standup: Not Checked<br>Rounded: Checked (DEFAULT)</p><h3>Cone</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/440/1*uM3dyHUTy_dLx2r85YbCyw.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Dorito<br>Radius: 20 (DEFAULT)<br>Standup: Checked (DEFAULT)<br>Rounded: Not Checked</p><h3>Large Torido</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/545/1*kjINL9kijB_3b_1RD5MG1w.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Dorito<br>Radius: 20 (DEFAULT)<br>Standup: Checked (DEFAULT)<br>Rounded: Checked (DEFAULT)<br>Note: Our dorito size is a bit larger than 2D Paintball’s, so leave some space</p><h3>Small Torido</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/415/1*VTt8DiZdXrHa71hamYSPWw.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Dorito<br>Radius: 20 (DEFAULT)<br>Standup: Not Checked<br>Rounded: Checked (DEFAULT)</p><h3>Cake</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/451/1*wxn2Uj6qFdsJB4i_v2F77A.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Dorito<br>Radius: 15<br>Standup: Not Checked<br>Rounded: Checked (DEFAULT)</p><h3>Tall Cake</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/405/1*iUDL6SiIB5JPqvJynUCaFA.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Dorito<br>Radius: 15<br>Standup: Checked (DEFAULT)<br>Rounded: Checked (DEFAULT)</p><h3>Prism</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/341/1*e4CoBsDKHUJDDrHLQWTbEQ.png" /></figure><p><strong>2D Paintball Parameters</strong><br>Type: Dorito<br>Radius: 15<br>Standup: Checked (DEFAULT)<br>Rounded: Not Checked</p><h3>Special Bunkers</h3><h3>Button / Buzzer</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/283/1*Gkb7Sy2fe4WUopm7gvNLNw.jpeg" /></figure><p><strong>2D Paintball Parameters<br></strong>Type: Barrel<br>Radius: 5<br>Standup: <br>- Checked = Blue Button that Pink Team can hit<br>- Not Checked = Pink Button that Blue Team can hit</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b6841ac480fa" width="1" height="1" alt=""><hr><p><a href="https://medium.com/giant-scam/creating-snapshot-vr-maps-with-the-2d-paintball-field-creator-b6841ac480fa">Creating Snapshot VR Maps with the 2D Paintball Field Creator</a> was originally published in <a href="https://medium.com/giant-scam">Giant Scam</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Adding Songs and Beatmaps to Chop It]]></title>
            <link>https://medium.com/giant-scam/adding-songs-and-beatmaps-to-chop-it-d7a7342df69a?source=rss----8728878035e8---4</link>
            <guid isPermaLink="false">https://medium.com/p/d7a7342df69a</guid>
            <category><![CDATA[design]]></category>
            <dc:creator><![CDATA[Jesse]]></dc:creator>
            <pubDate>Sun, 26 Aug 2018 06:06:23 GMT</pubDate>
            <atom:updated>2018-11-28T16:21:31.452Z</atom:updated>
            <content:encoded><![CDATA[<h3>Creating and Importing Songs and Beatmaps</h3><p>We’ve worked hard to make importing of your own songs and beatmaps into the <strong>My Tracks</strong> feature of Chop It simple and accessible. Today we’ll cover the basic features in the VR beatmap editor, which we call the <strong>Mapping Station</strong>, as well as explain the basic directory and file structure for importing your content.</p><p>Along with this article, we’ve made a <a href="https://youtu.be/7BDmpHGecK4">quick start video</a> that shows how to set up the directory for a new song to be imported.</p><p>[2018–09–14] Update: We now have an external 2D mapping tool that runs in your browser. It’s in beta, but you can check out the latest stable build <a href="http://mapit.chopitvr.com/">here</a>. It offers tap along mapping as well as converters for MIDI and Beat Saber tracks.</p><h3>File and Directory Format for Imported Content</h3><p>When you install Chop It, we include Terror Pigeon’s song ‘Chamber of Secrets for 1’ as an example for you to copy or reference.</p><p>You can find this example in the <strong>StreamingAssets</strong> directory within Chop It’s local data. On Steam, this should be at ‘steamapps/common/Chop It/chopit_Data/StreamingAssets’. You can quickly navigate to this directory by selecting Chop It from your Steam Library, going to Properties, and on the Local Files tab clicking the ‘Browse Local Files…’ button.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/0*1WqslAws52Zv4_k4" /></figure><p>Within the StreamingAssets directory you’ll find the ‘TerrorPigeonChamberOfSecretsFor1’ folder which contains all of the files necessary to have a playable song in Chop It.</p><p><strong>ChamberOfSecretsFor1.wav</strong> — the audio file to be played.<br><strong>SongInfo.json</strong> — a json file containing the artist name and song title that you’d like to be displayed in-game.<br><strong>ChamberOfSecretsFor1_beatmap_standard.txt </strong>— the beatmap file, which contains a json object describing the gameplay associated with this audio file. We’ll explain the file format in more detail below.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*MGk4OPPbONmzD_Dk" /></figure><p>Some useful notes about the imported files:</p><ul><li>The <strong>audio file</strong> must be of format <strong>.wav</strong>. This is due to a restriction with Unity around importing external audio files. A quick and easy solution for other file formats is to download the free audio tool Audacity and convert the file to a .wav. You can find a tutorial on how to do this conversion <a href="http://www.stenographsolutions.com/solution/index.php?View=entry&amp;EntryID=130">here</a>.</li><li>The name of the folder containing your files does not matter, as long as it is in the <strong>StreamingAssets</strong> directory.</li><li><strong>SongInfo.json</strong> contains information that is solely for display purposes. Edit this file in Notepad (or similar) to set the display artist name and song title to whatever you’d like.</li><li><strong>Beatmap files</strong> must be of type <strong>.txt</strong> or <strong>.json</strong> and the file name must contain the word ‘<strong>beatmap</strong>’ in order to be imported. This file can be generated in-game when using the VR Mapping Station to create a beatmap.</li></ul><h3>Importing Songs</h3><p>Following the Terror Pigeon example, we can quickly get to mapping our own audio files.</p><p>The first step is to make a new directory in the StreamingAssets folder. For this example, my folder will be named ‘ConBroChillPowerHappy’.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*wUzzOhvBlbYxdK5Z" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*wAWeTd7pAmTHXcSe" /></figure><p>Copy your .wav file into your newly created ConBroChillPowerHappy folder.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*KuFwfAZwzS2q0fNe" /></figure><p>In order for our song to appear in-game, we need to set some display information.</p><p>Create a new text file named ‘SongInfo.json’, or simply copy the existing file from the Terror Pigeon example directory. Within SongInfo.json we simply need this string:</p><p><strong>{“artistName”: “Con Bro Chill”, “songName”: “Power Happy”}</strong></p><p>Set the values of <strong>artistName</strong> and <strong>songName</strong> to be whatever you’d like to appear in-game.</p><p>If you’ve created and populated this file successfully, you will now see your song the next time you load the My Tracks menu in Chop It.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*N5WVuJT0AleLWBZ2" /></figure><p>If you navigate to your new song in Chop It and select it to be played, you’ll notice that it displays the song information but is not playable because there are no selectable beatmaps.</p><p>That means it’s time to create a new beatmap!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*jPFRGAepDQyAaqqm" /></figure><h3>Creating Beatmaps with the VR Mapping Station</h3><p>In that same song information screen, you can hit the <strong>Create/Edit Beatmap</strong> button. Since no beatmap is selected, it will take you to the Mapping Station with a new empty beatmap. Once you have a beatmap created, you can always come back and edit the beatmap by navigating to the song information screen, selecting the beatmap you wish to edit, and hitting the Create/Edit Beatmap button.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*_zlDx-Y2_TIFSfW8" /></figure><p>The Mapping Station is built to give you total control over the player’s experience during the song.</p><p>On each hand, you will see an object in front of your fingers that looks like a small version of a board with a white sphere in the middle. We call the fullobject the <strong>Mapping Tracker</strong> and the white sphere is the <strong>Control</strong>.</p><p>This Mapping Tracker is built to give you a preview of exactly what type of item will be spawned, as well as the final rotation of the item, when you map a beat. As you rotate your hand, you’ll see the item locking to the supported rotation closest to the rotation of your hand. Similarly, if you hold the trigger to make a fist you’ll notice the board switches to a cinderblock.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/640/0*x0-xcQdrEiZqkUC6" /></figure><p>In front of you is the array of <strong>Target Boxes</strong> represented by green cubes. Four on the top row, three in the middle, and four on the bottom. These represent the final landing locations of the items as the Sensei throws them.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*JRhdCbrXXCwjqffE" /></figure><p>Any time the Control of your Mapping Tracker touches a Target Box, a new beat will be added to your beatmap containing the time in the audio file that was playing when the contact occurred, the Target Box ID with which the contact occurred, the item type (board or cinderblock) active at the time of contact, and the rotation of the item at the time of contact. These attributes describe exactly how the beat will be presented to the player when that time occurs in the song. You can see these beats as they are mapped to the right of the Target Boxes on the <strong>Chalkboard</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*IetPZL1bHA_03pot" /></figure><p>You can map beats while the song is playing or paused. There is a <strong>Play/Pause</strong> button under the Target Boxes along with an audio <strong>slider</strong> for you to jump around the song time.</p><p>If the song is playing in the Mapping Station, any previously mapped beats will appear as the song plays. This allows you to preview the flow of the beatmap without having to leave the tool.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*kS-Zvtc5WmRe2i5y" /></figure><p>To further customize the gameplay at a previously-mapped time, you can select a beat from the Chalkboard to the right of the Target Boxes. This will jump to the audio time of that mapped beat as well as preview any beats mapped to that time. You can then map new beats at that same time or delete beats by hitting the red box next to any beat on the Chalkboard. Use this tool to create swipes and combos or really complicated unplayable beatmap art.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/792/0*xCyp_kxCEXfCwLrM" /></figure><p>To save your beatmap at any time hit the <strong>Save to File</strong> button to the right of the Chalkboard. If this is a new beatmap, this will generate a new beatmap file within the same folder as the audio file you are mapping. The name will typically be something like ‘SongName_beatmap_custom_&lt;timestamp&gt;.txt’.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*q_PVvPPis4FOVoYi" /></figure><p>Saving to file is not done automatically, so if you do something like accidentally hit the <strong>Clear Beats</strong> button, you can exit the tool and re-enter and it will reload the beatmap from disk.</p><p>The <strong>Detect Beats</strong> button will algorithmically detect beats in the audio file that you are mapping. This feature can only be activated for new, empty beatmaps. It typically takes 5–15 seconds depending on the file size and is a bit experimental.</p><p>The intention here is to give you a skeleton of a beatmap to further customize. You can, of course, generate a full beatmap with the Detect Beats feature, Save to File, and play it immediately, but in our experience curating a beatmap to play exactly how you want will give players a more enjoyable experience. If you’re interested in the beat detection algorithm, we’ve written a detailed blog and released the working source code <a href="https://medium.com/giant-scam/algorithmic-beat-mapping-in-unity-intro-d4c2c25d2f27">here</a>.</p><p>For those that are interested in the internals of beatmaps, and potentially creating your own tools to create beatmaps, we will go into detail about the contents of a beatmap.</p><h3>Understanding Beatmap Files</h3><p>Beatmap files are essentially json serializations of the beatmaps generated in-game. Since we know some users may prefer to edit beatmaps manually or with an external tool, we’ll describe the properties of the beatmap here:</p><p><strong>mapName</strong> — a display field for the name of the beatmap.</p><p><strong>appVersion</strong> — populated with the current release version of Chop It. Example: “1.5.3”</p><p><strong>randomSenseiMovement</strong> —one of true, false (no quotes)— a setting which enables or disables the Sensei’s ability to jump around the Pagoda during gameplay.</p><p><strong>difficulty</strong> —one of “easy”, “standard”, “hard” — a display field describing the difficulty of the beatmap.</p><p><strong>beats</strong> — a <strong>list</strong> of <strong>Beat objects</strong> listed in order by time — This list is iterated during gameplay and beat times are compared to the audio time as the song plays.</p><p>A beatmap with metadata, but no beats, would look like this:</p><p><strong>{ <br> “mapName”:”Techboy’s Beatmap”,<br> “appVersion”:”0.2.0&quot;,<br> “difficulty”:”standard”,<br> “randomSenseiMovement”:true,<br> “beats”:[]<br>}</strong></p><p>Beat objects are representations of gameplay at a given audio time. The properties of a Beat:</p><p><strong>beatID </strong>— the position of the beat in the sequence starting with the number 0. The first beat you map would have beatID of 0, the second beat you map would have beatID of 1, etc… When a beatmap is saved to file in the Mapping Station, these IDs are automatically generated after the beats are sorted by time.</p><p><strong>time</strong> — the exact time in the audio file that the player is expected to hit an item. This time is in seconds with millisecond precision. Example: 125.004 would represent the audio playing 2 minutes, 5 seconds, and 4 milliseconds into the song.</p><p><strong>rotationID</strong> — one of “H”, “V”, “R”, “L” — The rotation of the item when it is expected to be hit. H (horizontal), V (vertical), R (diagonal with top leaning right), L (diagonal with top leaning left). Default is horizontal.</p><p><strong>itemType</strong> — one of “B”, “C” — The type of item spawned. B (board), C (cinderblock). Default is board.</p><p><strong>targetID</strong> — “A”, “B”, “C”, “D”, “E”, “F”, “G”, “H”, “I”, “J”, “K” — The target location that the item is thrown to. Default is F., which is the center-most target.</p><p>Target locations as they appear to the player:</p><p>A — B — C — D<br>- E — F — G -<br>H — I — J — K</p><p>Regardless of the position of the Sensei, the targets rotate accordingly so this orientation to the player is guaranteed.</p><p>A beat object that is fully populated looks like this:</p><p><strong>{ <br> “beatID”:0,<br> “time”:3.58<br> “targetID”:”F”,<br> “rotationID”:”H”,<br> “itemType”:”B”<br> }</strong></p><p>and a fully functional beatmap with 2 beats looks like this:</p><p><strong>{<br> “mapName”:”Techboy’s Beatmap”,<br> “appVersion”:”0.2.0&quot;,<br> “difficulty”:”standard”,<br> “randomSenseiMovement”:true,<br> “beats”:[<br> {“beatID”:0,“time”:3.58,“targetID”:”F”,“rotationID”:”H”,“itemType”:”B”},<br> {“beatID”:1,“time”:6.91,“targetID”:”D”,“rotationID”:”V”,“itemType”:”C”}]<br>}</strong></p><h3>Summary</h3><p>We’d love your feedback about how we can make the mapping experience better for you. Feel free to send us your beatmaps for us to play and test, and please report any bugs you come across! As always, you can find us on <a href="https://twitter.com/giantscam">Twitter</a>, <a href="https://steamcommunity.com/app/812580/discussions/">Steam</a>, or email us directly at scambot@giantscam.com.</p><p>Thanks!</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fdocs.google.com%2Fforms%2Fd%2Fe%2F1FAIpQLScTeSdUjC0mBENKezdDd1ZPGj0EiULYO8qVD0cc9ZI9jg9EYg%2Fviewform%3Fembedded%3Dtrue&amp;url=https%3A%2F%2Fdocs.google.com%2Fforms%2Fd%2Fe%2F1FAIpQLScTeSdUjC0mBENKezdDd1ZPGj0EiULYO8qVD0cc9ZI9jg9EYg%2Fviewform%3Fusp%3Dsend_form&amp;image=https%3A%2F%2Flh5.googleusercontent.com%2FVJIW9o1yqyJJCYT97WP-mItfbGnMjq47g_j2J89T6LLJ9lF_Yz4CltU_5-LMXRoJWOM%3Dw1200-h630-p&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=google" width="760" height="500" frameborder="0" scrolling="no"><a href="https://medium.com/media/b93d3b6548215877f1aae60456aabd65/href">https://medium.com/media/b93d3b6548215877f1aae60456aabd65/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d7a7342df69a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/giant-scam/adding-songs-and-beatmaps-to-chop-it-d7a7342df69a">Adding Songs and Beatmaps to Chop It</a> was originally published in <a href="https://medium.com/giant-scam">Giant Scam</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[What is Giant Scam?]]></title>
            <link>https://medium.com/giant-scam/what-is-giant-scam-b56f68e72468?source=rss----8728878035e8---4</link>
            <guid isPermaLink="false">https://medium.com/p/b56f68e72468</guid>
            <category><![CDATA[legitimate]]></category>
            <category><![CDATA[humor]]></category>
            <category><![CDATA[game-development]]></category>
            <category><![CDATA[scam]]></category>
            <dc:creator><![CDATA[Jesse]]></dc:creator>
            <pubDate>Thu, 01 Mar 2018 00:02:35 GMT</pubDate>
            <atom:updated>2019-03-26T21:23:39.565Z</atom:updated>
            <content:encoded><![CDATA[<p>It’s a tiny game dev studio in Nashville named Giant Scam Industries. It’s not a scam. It’s a legitimate company.</p><p>Giant Scam was formed in 2017 by Jesse, who is an Engineering Lead by day, and Charlie, who is an excellent Game Designer and Twitch Parter. Today our crew consists of Jesse, Charlie, our technical artist Tanner, and our infrastructure engineer Brandon. We partner with local collective Strange Handle AV for music and NPALL Audio for SFX. We collaborate closely with the <a href="https://www.facebook.com/groups/NashGameDev/">Nashville Game Developers</a> group and also host the bimonthly Game Dev House Party series.</p><p>Our first game, a VR rhythm game named “<a href="http://www.chopitvr.com/">Chop It</a>”, released on Steam in September 2018. Alongside that release, we released an open-source solution for procedural rhythm games that is detailed under the “Algorithmic Beat Mapping in Unity” section of our blog.</p><p>Now, we’re gearing up for our next VR title, which will be announced in Q2 2019.</p><p>You can catch us at:</p><p>Our beautiful home page: <a href="http://www.giantscam.com/">http://www.giantscam.com</a><br>Twitter: <a href="https://twitter.com/giantscam">https://twitter.com/giantsca</a>m<br>Our support line: scambot@giantscam.com<br>Discord: <a href="https://discord.gg/Yq3dzm2">https://discord.gg/Yq3dzm2</a></p><p>If you want to support us outside of game, check out our <a href="https://giantscam.bigcartel.com/">Big Cartel</a> merch store.</p><p>Lastly, feel free to sign up for our Mailing List (no spam/scam guaranteed):</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fdocs.google.com%2Fforms%2Fd%2Fe%2F1FAIpQLScTeSdUjC0mBENKezdDd1ZPGj0EiULYO8qVD0cc9ZI9jg9EYg%2Fviewform%3Fembedded%3Dtrue&amp;url=https%3A%2F%2Fdocs.google.com%2Fforms%2Fd%2Fe%2F1FAIpQLScTeSdUjC0mBENKezdDd1ZPGj0EiULYO8qVD0cc9ZI9jg9EYg%2Fviewform%3Fusp%3Dsend_form&amp;image=https%3A%2F%2Flh5.googleusercontent.com%2FVJIW9o1yqyJJCYT97WP-mItfbGnMjq47g_j2J89T6LLJ9lF_Yz4CltU_5-LMXRoJWOM%3Dw1200-h630-p&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=google" width="760" height="500" frameborder="0" scrolling="no"><a href="https://medium.com/media/b93d3b6548215877f1aae60456aabd65/href">https://medium.com/media/b93d3b6548215877f1aae60456aabd65/href</a></iframe><p>That’s it.</p><p>Thanks!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b56f68e72468" width="1" height="1" alt=""><hr><p><a href="https://medium.com/giant-scam/what-is-giant-scam-b56f68e72468">What is Giant Scam?</a> was originally published in <a href="https://medium.com/giant-scam">Giant Scam</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Algorithmic Beat Mapping in Unity: Outro]]></title>
            <link>https://medium.com/giant-scam/algorithmic-beat-mapping-in-unity-outro-b67006226124?source=rss----8728878035e8---4</link>
            <guid isPermaLink="false">https://medium.com/p/b67006226124</guid>
            <category><![CDATA[unity]]></category>
            <category><![CDATA[game-development]]></category>
            <category><![CDATA[beat-mapping]]></category>
            <dc:creator><![CDATA[Jesse]]></dc:creator>
            <pubDate>Tue, 27 Feb 2018 06:47:03 GMT</pubDate>
            <atom:updated>2018-03-08T03:42:57.699Z</atom:updated>
            <content:encoded><![CDATA[<h3>Posts in this series:</h3><p><a href="https://medium.com/@jesse_87798/d4c2c25d2f27?source=collection_detail----8728878035e8-----3----------------">Intro</a><br><a href="https://medium.com/@jesse_87798/6e9595823ce4?source=collection_detail----8728878035e8-----2----------------">Real-time Audio Analysis Using the Unity API</a><br><a href="https://medium.com/@jesse_87798/d41c339c135a?source=collection_detail----8728878035e8-----1----------------">Preprocessed Audio Analysis</a><br><a href="https://medium.com/@jesse_87798/b67006226124?source=collection_detail----8728878035e8-----0----------------">Outro</a></p><h3>Github Repo</h3><p>This public repo is yours to clone and experiment with. While you’re welcome to contribute, I don’t plan to maintain this code sample long-term. If you get a chance to use it in a project, please give me a shout!</p><p><a href="https://github.com/jesse-scam/algorithmic-beat-mapping-unity">https://github.com/jesse-scam/algorithmic-beat-mapping-unity</a></p><h3>What’s Next?</h3><p>Once you are reliably and accurately detecting beats in your audio files, there are a few things you can experiment with to fit the algorithm to your particular use case:</p><ol><li>Running the spectral flux algorithm on different sub-ranges of the frequency spectrum. I give you a hint on how to do this in <a href="https://medium.com/@jesse_87798/6e9595823ce4?source=collection_detail----8728878035e8-----2----------------">Real-time Audio Analysis Using the Unity API</a>.</li><li>Finding the threshold sensitivity time frame and multiplier that work best for your use case.</li><li>Getting deeper with Threads to speed up the preprocessing analysis. It takes about 8 seconds for a 5 minute song on my machine.</li></ol><p>What you choose to do with the detected beats is what makes each use case unique. Once you have all the peaks in all the frequency ranges you care about, how do you determine which groupings of beats give you the best gameplay? This is completely up to you for what fits your type of game best, but you should now have all of the data to start experimenting!</p><h3>Outro</h3><p>I started this article as self-documentation to reference as I experimented with algorithmic beat mapping. I had never intended to include algorithmic mapping in Chop It, but the engineering challenge seemed interesting so I gave it a shot. After many dead ends and finding a general lack of understanding about how to do something like this in Unity, I wanted to share what I learned with the game dev community.</p><p>Shout outs:</p><p>Dylan Fitterer (<a href="https://twitter.com/dylanfitterer?lang=en">https://twitter.com/dylanfitterer</a>) for nailing this down years ago with Audioshield and inspiring me to take a stab at it.</p><p>Jashan Chittesh (<a href="https://twitter.com/jashan">https://twitter.com/jashan</a>) for great conversation around VR rhythm games and for truly innovating in the genre with Holodance.</p><p>Dr. Eric Carr for proofreading my posts and helping me gain a much deeper and clearer understanding of the audio side of things!</p><p>Mario at Bad Logic Games (<a href="http://www.badlogicgames.com/wordpress/">http://www.badlogicgames.com)</a> for writing an amazing article about onset detection. You made this article series possible!</p><p>Tanner Netterville (<a href="https://twitter.com/rennat">https://twitter.com/rennat</a>) for starting to work on art for Chop It so I don’t sit around for 2 more months writing blogs about algorithmic beat mapping.</p><p>Charlie Winsmore (<a href="https://www.twitch.tv/charliewinsmore">https://www.twitch.tv/charliewinsmore</a>) for helping me create the smallest gaming company with the best name of all time.</p><p>Everyone else that listened to me rant about this at a bar or over lunch for the past 2 months. You are saints.</p><p>Please don’t hesitate to reach out to us at scambot@giantscam.com or on Twitter at <a href="https://twitter.com/giantscam">https://twitter.com/giantscam</a>. Show us what you’re making!</p><p>Until next time!</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fdocs.google.com%2Fforms%2Fd%2Fe%2F1FAIpQLScTeSdUjC0mBENKezdDd1ZPGj0EiULYO8qVD0cc9ZI9jg9EYg%2Fviewform%3Fembedded%3Dtrue&amp;url=https%3A%2F%2Fdocs.google.com%2Fforms%2Fd%2Fe%2F1FAIpQLScTeSdUjC0mBENKezdDd1ZPGj0EiULYO8qVD0cc9ZI9jg9EYg%2Fviewform%3Fusp%3Dsend_form&amp;image=https%3A%2F%2Flh5.googleusercontent.com%2FVJIW9o1yqyJJCYT97WP-mItfbGnMjq47g_j2J89T6LLJ9lF_Yz4CltU_5-LMXRoJWOM%3Dw1200-h630-p&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=google" width="760" height="500" frameborder="0" scrolling="no"><a href="https://medium.com/media/b93d3b6548215877f1aae60456aabd65/href">https://medium.com/media/b93d3b6548215877f1aae60456aabd65/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b67006226124" width="1" height="1" alt=""><hr><p><a href="https://medium.com/giant-scam/algorithmic-beat-mapping-in-unity-outro-b67006226124">Algorithmic Beat Mapping in Unity: Outro</a> was originally published in <a href="https://medium.com/giant-scam">Giant Scam</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Algorithmic Beat Mapping in Unity: Preprocessed Audio Analysis]]></title>
            <link>https://medium.com/giant-scam/algorithmic-beat-mapping-in-unity-preprocessed-audio-analysis-d41c339c135a?source=rss----8728878035e8---4</link>
            <guid isPermaLink="false">https://medium.com/p/d41c339c135a</guid>
            <category><![CDATA[unity]]></category>
            <category><![CDATA[game-development]]></category>
            <category><![CDATA[beat-mapping]]></category>
            <dc:creator><![CDATA[Jesse]]></dc:creator>
            <pubDate>Tue, 27 Feb 2018 06:44:36 GMT</pubDate>
            <atom:updated>2018-03-01T19:35:34.971Z</atom:updated>
            <content:encoded><![CDATA[<h3>Posts in this series:</h3><p><a href="https://medium.com/@jesse_87798/d4c2c25d2f27?source=collection_detail----8728878035e8-----3----------------">Intro</a><br><a href="https://medium.com/@jesse_87798/6e9595823ce4?source=collection_detail----8728878035e8-----2----------------">Real-time Audio Analysis Using the Unity API</a><br><a href="https://medium.com/@jesse_87798/d41c339c135a?source=collection_detail----8728878035e8-----1----------------">Preprocessed Audio Analysis</a><br><a href="https://medium.com/@jesse_87798/b67006226124?source=collection_detail----8728878035e8-----0----------------">Outro</a></p><p>If you haven’t read the previous post in the series, <a href="https://medium.com/@jesse_87798/6e9595823ce4?source=collection_detail----8728878035e8-----1----------------">Real-time Audio Analysis Using the Unity API</a>, please take the time to do so before reading on. It covers many of the core concepts needed to perform our preprocessing analysis.</p><p>When doing real-time analysis, we found that we had to lag slightly behind the currently playing audio in order to detect beats. We also could only use the beats detected up until the current time in the track to make decisions. We can eliminate these limitations by preprocessing the entire audio file up front and detecting all beats before playing audio to the user.</p><h3>Unity Specifics</h3><p>While most of Unity’s helpers are meant for real-time analysis, it does offer us one helper that can get us started. To process an entire audio file up front, we need all of that file’s sample data. Unity allows us to get that data with <a href="https://docs.unity3d.com/ScriptReference/AudioClip.GetData.html"><strong>AudioClip.GetData</strong></a>. As you can see in the documentation example, it allows us to populate an array with <em>all</em> of the samples that the clip contains.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/37bf8897178c88f33e4952e55b1d7536/href">https://medium.com/media/37bf8897178c88f33e4952e55b1d7536/href</a></iframe><p><strong>AudioClip.samples</strong> is the total number of single-channel or combined-channel samples contained within the clip. That means if a clip had 100 samples in stereo, <strong>AudioClip.samples</strong> would be 50. We multiply by <strong>AudioClip.channels</strong> because <strong>AudioClip.GetData</strong> is going to return sample data in interleaved format. Meaning, if we have a clip that is in stereo, the data will come back as:</p><p>L = Left Channel ; R = Right Channel<br>[L, R, L, R, L, R,…]</p><p>That means that, if we want data similar to what Channel 0 returns in the real-time helper <strong>AudioSource.GetOutputData</strong>, we need to go through our full set of samples and average every two samples together to get mono samples. You’ll find that this can be very taxing on the CPU because of the number of samples in a given clip.</p><p>Let’s do the math:</p><p>If I have a 5 minute (300 second) audio track, with a sampling rate of 48000 samples per second, that means we have:</p><p>300 * 48000 = 14,400,000 samples (which can be found in AudioClip.samples)</p><p>BUT, if we are in stereo, we have interleaved samples, which doubles our sample count</p><p>14,400,000 * 2 = 28,800,000 samples</p><p>We really want that 14.4 million samples in mono, so we’ll iterate over the 28.8 million samples and average every pair of stereo samples to get this. If you’d like to do this over a series of frames using the offset parameter to get smaller chunks of the audio samples, you should know that the offset parameter is actually applied against the combined-channel number of samples (<strong>AudioClip.samples</strong>). So if you pass an offset of 10, you’re still going to get interleaved stereo samples, but it will start 20 (10 pairs of stereo) samples into the stereo data.</p><p>No matter what you’re doing, iterating over 28.8 million samples is not going to be fast enough to do on the main thread in Unity. I recommend passing this task to a background thread using the <a href="http://www.mono-project.com/archived/threadsbeginnersguide/"><strong>System.Threading</strong></a> library, which is packaged with Unity C#. We won’t go deeply into <strong>System.Threading</strong> here, but you should know that Unity strongly suggests (often in the form of throwing an exception) that you do not access any Unity API functionality from within a background thread. Grab any values from <strong>AudioSouce</strong> / <strong>AudioClip </strong>that you need, make them accessible, and then do the math inside of the thread and leave all access of the Unity API to the main thread.</p><p>Let’s get set up to convert our stereo samples to mono. First, we need to grab any attributes from the Unity API that we might need later when we spawn the background thread:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/d115040fbf68c53ee73386dc0f091dee/href">https://medium.com/media/d115040fbf68c53ee73386dc0f091dee/href</a></iframe><p>Now the loop for combining channels:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a60e4e97466e123b245c381445d4e911/href">https://medium.com/media/a60e4e97466e123b245c381445d4e911/href</a></iframe><p>Now, our float array <strong>preProcessedSamples </strong>contains data that is of the same format as what’s returned in real-time by <strong>AudioSource.GetOutputData</strong>, but it contains samples from the beginning of the track until the end instead of just the samples for the currently playing audio. You can compare your output to the output of <strong>AudioSource.GetOutputData</strong> for a point in time in the song and see that they are fairly close. One catch here is that <strong>AudioSource.GetOutputData</strong> returns the <em>most recently played</em> 1024 (or length of your array) samples, which might trip you up if you’re doing the math to find the starting point in your preprocessed samples that represent a point in time in the track.</p><h3>Working with Frequencies (and external libraries)</h3><p>We have our sample data, which is amplitude over time, but what we want is spectrum data, or significance over the frequency spectrum at a point in time. In our real-time analysis we achieved this with Unity’s helper <strong>AudioSource.GetSpectrumData</strong> to perform a Fast Fourier Transform. Unity does not have an equivalent helper for performing an FFT on raw sample data, so we’ll want to look elsewhere.</p><p>I landed on a very lightweight C# implementation of the basic Fourier Transform called <a href="https://www.codeproject.com/Articles/1107480/DSPLib-FFT-DFT-Fourier-Transform-Library-for-NET"><strong>DSPLib</strong></a>. It includes both the Discrete Fourier Transform and the Fast Fourier Transform, a number of available windows, and, most importantly, it gives us output that represents the same relative amplitude that we had when using <strong>AudioSource.GetSpectrumData</strong>.</p><p>Click “Download Library C# code only” to download the source code for the FFT, then extract the DSPLib.cs file and place it in a directory in your project.</p><p>There is a catch here. <strong>DSPLib </strong>relies heavily on the <strong>Complex </strong>data type provided by C#.NET’s <strong>System.Numerics</strong> library. You’ll see that Unity is complaining about not being able to find the <strong>Complex </strong>data type or <strong>System.Numerics</strong>. This is because Mono, the flavor of .NET provided by Unity, does not include the <strong>System.Numerics</strong> library. What we can do to get around this is go directly to the source (<a href="https://github.com/Microsoft/referencesource/blob/master/System.Numerics/System/Numerics/Complex.cs">Microsoft’s github page</a> in this case) and download Complex.cs and place it in our project. Complex.cs does require some minor conversions before it will compile in Unity. I’ll place my version of the conversion here:<br><a href="https://github.com/jesse-scam/algorithmic-beat-mapping-unity/blob/master/Assets/Lib/External/NET/Complex.cs">https://github.com/jesse-scam/algorithmic-beat-mapping-unity/blob/master/Assets/Lib/External/NET/Complex.cs</a></p><p>If we add references to our new libraries at the top of our file, we should be able to compile with no issue.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/93b5fb40e2cfa75376fce1212fa6a284/href">https://medium.com/media/93b5fb40e2cfa75376fce1212fa6a284/href</a></iframe><p>I’ll go ahead and show you the code for executing the rest of the sample preparation before we send our spectrum data to our spectral flux algorithm. If we’ve done everything correctly, we won’t have to change our spectral flux algorithm at all.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/a8b20171f74a0110c7a54e25097947f9/href">https://medium.com/media/a8b20171f74a0110c7a54e25097947f9/href</a></iframe><p>Much of what you see here is based on the examples given on the <strong>DSPLib </strong>site. The basic steps are:</p><ol><li>Combine stereo samples to mono</li><li>Iterate over samples in chunks the size of a power of 2. 1024 is our magic number here again.</li><li>Grab the current chunk of samples to be processed</li><li>Scale and window it with one of the available FFT Windows. I found <strong>DSPLib</strong>’s implementation of Hanning to be pretty reliable here.</li><li>Execute the FFT to retrieve complex spectrum values, which will again be half the size of our sample data — 512 in this case.</li><li>Convert our complex data to a usable format (array of doubles)</li><li>Apply our window scale factor to the output</li><li>Calculate the current audio time represented by the current chunk</li><li>Pass our scaled, windowed, converted spectrum data to our spectral flux algorithm. You can see here that I set us up to use floats, and <strong>DSPLib </strong>really likes doubles. I’m adding some overhead by doing the conversion to float instead of converting the spectral flux algorithm to use doubles.</li></ol><p>In the real-time analysis we asked Unity to give us 1024 spectrum values, which means under the hood Unity was sampling 2048 audio samples on the time domain. Here we provide 1024 audio samples from the time domain which gives us 512 spectrum values. That means we have slightly different frequency bin granularity. We could of course provide 2048 audio samples to have the exact same granularity as we did in the real-time analysis, but I found that having 512 bins was very passable for onset detection at different points in the spectrum.</p><p>For 512 bins, we’d simply divide the supported frequency range (our sampling rate / 2 — the Nyquist frequency) by 512 to determine the frequency represented per bin.</p><p>48000 / 2 / 512 = 46.875Hz per bin.</p><p>We don’t need to redefine our Onset Detection using Spectral Flux algorithm here. It stays exactly the same because we’ve formatted our spectrum data in a similar way to what we had available when doing real-time analysis.</p><h3>Navigating the Spectral Flux Output</h3><p>The calculation of audio time is pretty simple. We know that our sample data is amplitude over time, so therefore each index must represent a different point in time. Our sample rate and our current position in the sample data can tell us roughly (within a few milliseconds) what time our current sample chunk is representing.</p><p>Let’s take our Terror Pigeon song from the real-time example. It is 04:27, or 267 seconds long. The clip has a sampling rate of 44100 (<strong>AudioClip.frequency</strong>) samples per second. So, we expect there to be roughly:</p><p>44100 * 267 = 11,774,700 samples</p><p>Logging <strong>AudioClip.samples</strong> gives us 11,782,329 samples. About 8k more samples, or 0.18 more seconds, than we expected. This is only because the track is not exactly 267 seconds long.</p><p>We need to know how much time is being processed per chunk, so that we have some idea of what time is represented by a spectral flux sample.</p><p>1 / 44100 = ~0.0000227 seconds per sample<br>0.0000227 * 1024 = 0.023 seconds per chunk</p><p>We could come to the same result by dividing the track length in seconds by the total number of samples, if we have that information available.</p><p>267 / 11,774,700 = ~0.0000227 seconds per sample<br>0.0000227 * 1024 = 0.023 seconds per chunk</p><p>We can do the math in reverse as well, to know what spectral flux index corresponds to a particular time in the song. Listening to the song , I’m hearing a bass beat about 3.6 seconds in. There are plenty of others, but let’s use this one as an example.</p><p>The time divided by the length of time per sample should give us the index, but we have to remember that we’ve been grouping by 1024 samples per chunk to get our spectral flux.</p><p>So at time 3.6:</p><p>3.6 / 0.023 = 156.52 — so we’d expect to find a peak near index 156.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/34079de969c35bb25e3cc676fbfcacf2/href">https://medium.com/media/34079de969c35bb25e3cc676fbfcacf2/href</a></iframe><h3>Results</h3><p>Each index in our spectral flux output only represents 0.023 seconds, and I picked out time 3.6 by ear, so we may not be right on target. Let’s take a look at 10 samples in each direction from index 156, about a half second total, to see if we’re close.</p><p>Our algorithm found a peak at index 148. So I was 8 indexes, or about 0.184 seconds off. Not too shabby.</p><p>Looking at a larger window in each direction, we can see that we are logging a peak about every 18 indexes, or every 0.414 seconds. This means that the song’s tempo must be ~145 BPM for the section we are analyzing. To be sure, I asked Terror Pigeon what the actual BPM of the song is and he said I was 2 off, it’s 143 BPM for the full song. Not bad for analyzing a ~1 second time frame!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/643/1*5jDYttRR6S70zEIYlziPGQ.png" /></figure><p>You can do a similar comparison with the following code:</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/d1e6d7f1ffbabf05d2c07c2ed9551b76/href">https://medium.com/media/d1e6d7f1ffbabf05d2c07c2ed9551b76/href</a></iframe><p>Let’s plot the output of both the real-time analysis and the preprocessed analysis side-by-side to compare.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/579/0*ltXIXKS0GnHDHSnf." /></figure><p>Our real-time plot is on the top and our preprocessed plot is on the bottom. You can see there is a bit of skew, but the highest 9 peaks on the real-time plot roughly correspond to the same 9 peaks on the preprocessed plot. The skew is because our indexes in real-time are roughly 1 frame’s time apart, which is not the same distance as our indexes in preprocessed which we know are 0.023 seconds apart for this track. You can see that there is less fluctuation and less over-recording in the preprocessed plot and, of course, our preprocessed plot extends beyond real-time. We can jump to any time in the song and our preprocessed spectral flux will be available.</p><p>We are now mapping all beats of an audio file before playing the audio to the user. While results may vary, this should set you up nicely to start creating your own gameplay based on beats within an audio file.</p><p>What to experiment with and where to focus next will be covered briefly in the <a href="https://medium.com/@jesse_87798/b67006226124?source=collection_detail----8728878035e8-----0----------------">Outro</a>.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fdocs.google.com%2Fforms%2Fd%2Fe%2F1FAIpQLScTeSdUjC0mBENKezdDd1ZPGj0EiULYO8qVD0cc9ZI9jg9EYg%2Fviewform%3Fembedded%3Dtrue&amp;url=https%3A%2F%2Fdocs.google.com%2Fforms%2Fd%2Fe%2F1FAIpQLScTeSdUjC0mBENKezdDd1ZPGj0EiULYO8qVD0cc9ZI9jg9EYg%2Fviewform%3Fusp%3Dsend_form&amp;image=https%3A%2F%2Flh5.googleusercontent.com%2FVJIW9o1yqyJJCYT97WP-mItfbGnMjq47g_j2J89T6LLJ9lF_Yz4CltU_5-LMXRoJWOM%3Dw1200-h630-p&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=google" width="760" height="500" frameborder="0" scrolling="no"><a href="https://medium.com/media/b93d3b6548215877f1aae60456aabd65/href">https://medium.com/media/b93d3b6548215877f1aae60456aabd65/href</a></iframe><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d41c339c135a" width="1" height="1" alt=""><hr><p><a href="https://medium.com/giant-scam/algorithmic-beat-mapping-in-unity-preprocessed-audio-analysis-d41c339c135a">Algorithmic Beat Mapping in Unity: Preprocessed Audio Analysis</a> was originally published in <a href="https://medium.com/giant-scam">Giant Scam</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>