Moments of Inertia2024-02-11T21:13:58+00:00http://rachelnertia.github.ioRachel Crawfordnershly@gmail.comDarkshards2024-02-11T00:00:00+00:00http://rachelnertia.github.io/hobby/2024/02/11/darkshards<p><img src="/images/2024/02/hobby/darkshards.jpg" alt="" /></p>
<p>Having slogged my way through a Marines Errant kill team for an upcoming Badab War meetup<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>, I ignored my <a href="/hobby/2024/01/06/hobby-plans/">hobby plans</a> and went straight for a quick win by painting up a unit of Darkshards. I’d already done one Darkshard for a Warcry warband and it made me excited to do the rest.</p>
<!--more-->
<p>I keep acquiring dark elves. This is a problem, because while I very much like dark elves, it seems more and more apparent that within a few years every model I have painted for the Darkling Covens branch of my Cities of Sigmar army will be out-of-print and officially unusable. So every time I paint a unit I am basically digging myself deeper into a hole, one which I will have to climb my way out of somehow when the time comes to do something else with these models.</p>
<p>I enjoyed painting these. Green fabric is pretty much my favourite thing to do, and these guys have plenty of it.</p>
<p>A weird aside: while I can’t dispute this is the best generation of Dark Elf Warriors quality-wise, I kinda miss the 6/4 male/female body ratio made explicit by the boob-plate of the previous generation. Most of these could be ladies but it’s impossible to tell, so the hated male-by-default effect kicks in.</p>
<p>The banner is my first successful attempt at a dark-elf-esque representation of the Great Tree of Nuloren.</p>
<p><img src="/images/2024/02/hobby/banner.jpg" alt="" /></p>
<p>The Darkling Covens of Nuloren mostly dwell amongst the Great Tree’s roots, underground, or in secluded enclaves in the surrounding forest. They are a formidable faction in the city’s eternal internal power struggle, but they are by no means united – a constant shadow war ticks along in the background, as various sorceresses, warlocks, assassins and dreadlords vie for supremacy. And that’s without even mentioning the Scourge Privateers who prowl the choppy waves of the Greenwave Bay…</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>I’ll write about these after the event. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
A Fool's Trove in Ulfenkarn2024-02-03T00:00:00+00:00http://rachelnertia.github.io/gaming/2024/02/03/a-fools-trove-in-ulfenkarn<p><img src="/images/2024/02/hobby/darkshard.jpg" alt="" /></p>
<p>A one-day <em>Warcry</em> campaign.</p>
<!--more-->
<p>Back in January I had a few friends over to play “A Fool’s Trove in Ulfenkarn”, a short 4-player narrative campaign for <em>Warcry</em> that was originally published on <a href="https://www.warhammer-community.com/2021/04/01/hunt-treasure-in-the-cursed-city-with-this-free-4-player-warcry-campaign/">Warhammer Community back in 2021</a> and subsequently republished in the Tome of Champions 2021, in which warbands of treasure-seekers explore the Cursed City of Ulfenkarn in search of plunder. Each player plays each other player once and then the campaign culminates in a 4-way Triumph and Treachery battle over the ultimate prize.</p>
<p>I brought a Dark Aelves warband assembled using the new-ish Darkling Covens rules:</p>
<ul>
<li>Black Ark Fleetmaster</li>
<li>Assassin</li>
<li>Sorceress</li>
<li>Drakespawn Knight</li>
<li>Black Guard</li>
<li>2 Bleakswords</li>
<li>Darkshard</li>
<li>2 Black Ark Corsairs (with Crossbows and Blades)</li>
</ul>
<p><img src="/images/2024/02/hobby/dark-aelf-warband.jpg" alt="" />
<em>In the dead of night, in a secluded bay on the Isle of Szargorond, a corsair wolfship weighs anchor. A tenebrous fellowhip disembarks – aelves of the Darkling Covens, from far abroad, here to acquire powerful artifacts of mysterious importance…</em></p>
<p>Alex brought an Order of Azyr themed warband consisting of fighters from two Warhammer Underworlds teams - Xandire’s Truthseekers and Hexbane’s Hunters. Steve brought his Chaos Legionnaires and Kara brought her Unmade (plus Doombull ally).</p>
<p>I have a <em>lot</em> of terrain for <em>Warcry</em>, including some nice ruins and graveyard pieces, so was able to put together two very respectable battlefields.</p>
<p><img src="/images/2024/02/hobby/ulfenkarn-board-1.jpg" alt="" />
<em>The intent was to represent the streets of Ulfenkarn…</em></p>
<p><img src="/images/2024/02/hobby/ulfenkarn-board-2.jpg" alt="" />
<em>… a down-on-its-luck city in the Realm of Death. Of course there would be ruins and mausoleums on every corner!</em></p>
<p>In game 1, I faced off against Alex’s Order of Azyr. Our objective was to score points by standing on top of things.</p>
<p><img src="/images/2024/02/hobby/game-1.jpg" alt="" />
<em>Black Ark Corsairs take pot-shots from up above while witch hunters prowl the street below.</em></p>
<p>Ultimately my aelves won the day, and my Sorceress got to kill a Stormcast who got in range of her Vitriolic Spray – a quad ability that can do massive damage and halves the target’s Toughness – after which she easily finished them off with a poke or two from her staff.</p>
<p><img src="/images/2024/02/hobby/vitriolic-spray.jpg" alt="" /></p>
<p>The campaign adds a unique twist called Nightfall: after a random number of turns, it gets dark (preventing attacks and abilities targeting enemies more than 6” away) and neutral undead start showing up. In the final game Nightfall happens on battle round two, and we ended up with a absolute fuckload of bats and rats on the battlefield.</p>
<p>In the aftermath sequence, fighters who were taken out of action have a 1-in-3 chance of permanently dying. With no ability to reinforce your warband, this adds a real sense of peril to the proceedings – although in Alex’s case some unlucky injury rolls meant he entered the final match with a shell of his original warband.</p>
<p>In game 2 I was up against Kara’s Unmade and their Doombull companion.</p>
<p><img src="/images/2024/02/hobby/game-2.jpg" alt="" /></p>
<p>Our objective was to get as many of our fighters off one board edge while preventing as many of the enemy’s fighters getting off another board edge. I can’t quite remember how this game went down, but I think through some combination of Elf Nonsense I managed to make it a draw, despite being unable to deal with the Doombull and the Awakened One while still playing the objective. I mostly just ran away.</p>
<p><img src="/images/2024/02/hobby/legionnaires-vs-witch-hunters.jpg" alt="" />
<em>Meawhile, Chaos Legionnaires face off against the Order of Azyr.</em></p>
<p>At this point we decided we didn’t have time for the 3rd game and skipped straight to game 4: the big showdown.</p>
<p>In this game Kara, having the highest “progress” score accrued in the previous matches, got the biggest starting advantage. She very nearly won quickly due to some lucky reinforcement rolls and rolls to determine which of the 3 objectives was actually the real one – but unfortunately for her the rest of us wouldn’t let her have her cake and eat it.</p>
<p><img src="/images/2024/02/hobby/game-4.jpg" alt="" /></p>
<p>Consequently the game turned into a horrible endless brawl over the objective, that may have gone on forever had we not called it quits after battle round 6.</p>
<p>The new Darkling Covens rules are fun and I’d like to play them more. Sure, you are fielding a bunch of squishy aelves, but you have some fun tricks up your sleeve.</p>
<p>All-in-all, it was a great day of wargaming and the perfect way to begin the year. I would play A Fool’s Trove in Ulfenkarn, or a campaign like it, again, probably making a few tweaks here and there to fix things that felt unfair or which slowed things down.</p>
<p>Thanks for reading!</p>
Privateers2024-01-13T00:00:00+00:00http://rachelnertia.github.io/hobby/2024/01/13/privateers<p><img src="/images/2024/01/hobby/privateers.jpg" alt="" /></p>
<p>After the Splintered Fang I cracked out a quartet of corsairs and crossbow-aelves.</p>
<!--more-->
<p>Lokhir Fellheart, the kraken-mask guy, is a cool concept but a somewhat poor execution in metal. The way his right leg sort of melts into his sea-dragon cloak is just dreadful. And the flash! Ugh! As you can also see, I put him on a 32mm base (a Fleetmaster should be on a 25mm base) because he has such a wide pose. It doesn’t matter much.</p>
<p>I look forward to getting my hands on the plastic Black Ark Fleetmaster kit so I can see how it compares.</p>
<p>The cloaks turned out particularly well:</p>
<p><img src="/images/2024/01/hobby/privateers-rear.jpg" alt="" />
<em>It’s basically just Terradon Turquoise with some extra highlights. The interior is Fyreslayer Flesh, highlights and then… Druchii Violet? Something to add some purpley depth.</em></p>
<p>I also painted a Darkshard (repeater-crossbowman) to go with them:</p>
<p><img src="/images/2024/01/hobby/darkshard.jpg" alt="" /></p>
<p>After these I have a real hankering to finish up a unit each of Corsairs and Darkshards… and then maybe paint some more Cities of Sigmar aelves :grin:</p>
<p>Here is the complete Darkling Covens warband:</p>
<p><img src="/images/2024/01/hobby/dark-aelf-warband.jpg" alt="" /></p>
<p>All ready to land on Szargorond and find some treasure in the cursed city of Ulfenkarn! It’s not the most competitive warband, but it’ll do…</p>
Hobby Plans - Early 20242024-01-06T00:00:00+00:00http://rachelnertia.github.io/hobby/2024/01/06/hobby-plans<p>I have the next couple of months of painting all planned out, and I can’t stray too much from the plan because a lot of the painting is for meetups/leagues (i.e. there is something to keep me accountable). This means I can commit to writing a blog post about what I’m going to do, safe in the knowledge that I won’t butterfly my way off the path…</p>
<!--more-->
<h2 id="dark-aelves">Dark Aelves</h2>
<p>Next weekend I am hosting a <em>Warcry</em> event! A very small one, that is, in which me and 3 friends will be playing through the <a href="https://www.warhammer-community.com/2021/04/01/hunt-treasure-in-the-cursed-city-with-this-free-4-player-warcry-campaign/">A Fool’s Trove in Ulfenkarn</a> short campaign. For it I’m assembling a warband from the (relatively new) Darkling Covens faction list (found <a href="https://www.warhammer-community.com/wp-content/uploads/2022/08/x9BOHez5AqLFTMHz.pdf">here</a>). I already have lots of painted Dark Aelves for my Cities of Sigmar army from which to assemble a warband, but I wanted to bring some Corsairs to sell the idea that the warband had sailed to Ulfenkarn on a mission, so I’m painting up:</p>
<ul>
<li>A couple Black Ark Corsairs, from the enormous stash of them I have. No, I really mean <em>enormous</em> – at some point I acquired close to 50 of these synchronised-stepping fuckers</li>
<li>A Fleetmaster, who is actually the old metal Lokhir Fellheart model - mounted on too big a base but it shouldn’t matter too much.</li>
<li>One Darkshard because repeater crossbows are cool.</li>
</ul>
<p><img src="/images/2024/01/hobby/dark-elves.jpg" alt="" /></p>
<p>I had a chance to play a game with the warband yesterday and it was fun! The Aelves are squishy, but fast, can hit hard and have some lovely tricks up their sleeve.</p>
<p>Next weekend is gonna be great :grin:</p>
<h2 id="space-marines">Space Marines</h2>
<p>In late February I am attending a little meetup where we will be playing <em>Kill Team</em> using the rules from a fan-made Badab War supplement (found <a href="https://ossifiedsite.wordpress.com/">here</a>). The Badab War was a civil war between various Space Marine chapters – basically just over taxes – so is a great sub-setting if you love Space Marines and want every faction in the conflict to be Space Marines.</p>
<p>I do not love Space Marines.</p>
<p>In fact, I have made a point of expressing my dislike of them on a regular basis for many years.</p>
<p>Yet here I am. <em>Sigh</em>.</p>
<p><img src="/images/2024/01/hobby/space-marine.jpg" alt="" />
<em>My first Space Marine. He is a reference to a Rogue Trader-era marine model who was equipped with a Shuriken Catapult, who you can see in the background.</em></p>
<p>I just want to play <em>Kill Team</em> and hang out with my friends, okay? So I am putting together a squad of <a href="https://wh40k.lexicanum.com/wiki/Marines_Errant">Marines Errant</a>, who appealed to me because they:</p>
<ul>
<li>Have a really basic colour scheme.</li>
<li>Are sailors.</li>
<li>Can take xeno-tech as a special sidegrade option.</li>
</ul>
<p>I’ve only built one model so far, and am waiting for bits to arrive to continue. There’s still plenty of time though.</p>
<h2 id="kings-of-war">Kings of War</h2>
<p>Having played a few games of <em>Kings of War</em> I’m convinced I like it and want to invest more into it.Luckily we have a little grow league starting up here in Edinburgh, starting at 750 points in February and working our way up to 2000 points by July.</p>
<p>I already have 1000 points of Ogres, so the question is not how to start but how to continue. I think I’ll grab some of the <a href="https://www.manticgames.com/kings-of-war/ogres/ogre-warlock-2021/">very</a> <a href="https://www.manticgames.com/kings-of-war/ogres/ogre-paymaster/">characterful</a> <a href="https://www.manticgames.com/kings-of-war/ogres/ogre-berserker-bully/">hero</a> <a href="https://www.manticgames.com/kings-of-war/ogres/ogre-boomer-sergeant/">models</a> and a unit of <a href="https://www.manticgames.com/kings-of-war/ogres/ogre-siege-breaker-horde/">Siege Breakers</a>: heavily armoured ogres who will make a great anvil for the rest of the army to smite things upon. That can be my next few hundred points, and will let me run a few different lists at the lower point levels.</p>
<h2 id="warmaster">Warmaster</h2>
<p>Another few hundred points of Wood Elves, starting with some more Glade Guard. I’m excited to get to know this game more!</p>
<h2 id="loonshrine">Loonshrine</h2>
<p>I am now a proud owner of the frequently out-of-stock Gloomspite Gitz terrain piece. Having played a couple of games with it unpainted, it really does unlock the army and make it playable, so I’m glad I finally got one. I’m going to enjoy painting it, and may even put some LEDs inside it so there is an ominous glow visible beyond the cave mouth.</p>
<p>This is also giving me some motivation to work on more of my Gitz backlog (and get more Gitz…), but now we’re getting into the un-planned world, so I must leave this post where it is.</p>
Splintered Fang2024-01-04T00:00:00+00:00http://rachelnertia.github.io/hobby/2024/01/04/splintered-fang<p>I began my hobby year by finishing off a <em>Warcry</em> warband I was painting for my friend Roland.</p>
<p><img src="/images/2024/01/hobby/splintered-fang-leader.jpg" alt="" />
<em>The leader of the Splintered Fang. A real all-time favourite model of mine. Love the concept, love the execution, love the pose. One day I think I shall have my own.</em></p>
<!--more-->
<p>These are the Splintered Fang, one of the original Chaos warbands released for <em>Warcry</em>. Each warband in this initial series represents what worshippers of the Dark Powers might look like when coming from one of the eight Mortal Realms that make up the <em>Age of Sigmar</em> setting.</p>
<p>The Splintered Fang are from Ghyran, the Realm of Life, and worship the Coiling Ones – Chaos entities who claim to be descended from the dead godbeast Nagendra. They love snakes!</p>
<p><img src="/images/2024/01/hobby/splintered-fang-snakeman.jpg" alt="" />
<em>Although this guy loves snakes a little bit too much!</em></p>
<p>When Warcry came out in 2019 I got my friend Roland into it and he bought, built and partially painted this warband. A few months ago I fancied painting a Splintered Fang warband, remembered he had one, and offered to paint his for him. Kindly he obliged and – very slowly – I got on with the job.</p>
<p><img src="/images/2024/01/hobby/splintered-fang-elf.jpg" alt="" />
<em>This model is the only currently-available Chaos aelf. I think there should be a lot more like them.</em></p>
<p>Roland had painted the blades icy blue and, though I had <em>carte blanche</em> to do whatever I wanted, I took the striking colour choice and ran with it.</p>
<p>Painting these took a long time, in part because I wasn’t quite sure how I wanted to approach them and in part because I was trying my best. I still don’t think they’re quite ‘finished’ as there are so many highlights I could tweak or parts I could try to repaint, but at a certain point you gotta say “Fuck it, that’ll do.”</p>
<p><img src="/images/2024/01/hobby/splintered-fang-bigmook.jpg" alt="" />
<em>A big mook. Everyone in the warband has a snakebite somewhere on their body from some kind of initiation ceremony.</em></p>
<p>While I painted I reflected on how much I like <em>Warcry</em> and the original series of Chaos warbands in particular. The game is fantastic, probably my favourite Games Workshop offering. If you like skirmish games you should give it a go. The warbands add so much detail to the Mortal Realms, demonstrating how diverse tribes, cultures and civilisations are shaped by Chaos. Chaos Undivided isn’t just armour-clad musclebound Norscan himbos now, and that’s great.</p>
<p><img src="/images/2024/01/hobby/splintered-fang-mook.jpg" alt="" />
<em>A mook.</em></p>
<p>Also while I painted I reflected on the experience of painting models for someone else. I feel warm and fuzzy and perhaps a little bit closer to my friend, whose friendship I value greatly – but I <em>also</em> kind of want to keep the warband. Is this how commission painters feel?</p>
<p><img src="/images/2024/01/hobby/splintered-fang.jpg" alt="" />
<em>The whole warband, featuring an extra set of snakes I poached from the old Saurus Knights kit.</em></p>
2023 Lookback2023-12-29T00:00:00+00:00http://rachelnertia.github.io/personal/2023/12/29/lookback<p>2023 was a big year for me, with a lot of growth and a lot of grief.</p>
<!--more-->
<h2 id="spring">Spring</h2>
<p>The early months went quickly. I got ill a few times, so an already-dismal winter became an extra-dismal one in which I was stuck inside a lot. Thankfully I had the date for a long-awaited surgery in late March. With that looming, I had something to look forward to – and also to dread.</p>
<p>Fortunately it went very well and has resulted in a big quality-of-life improvement. I’m hoping to write a bit more about it soon because it could be interesting for other people and for myself to reflect upon my experience.</p>
<h2 id="summer">Summer</h2>
<p>In May I was mostly recovered from the surgery, but I felt stretched thin, doing too much, and then everything became unstuck.</p>
<p>I won’t go into it in detail here because I don’t want to accidentally misrepresent people I care deeply about. For my part, some behavioural patterns I have – like not saying how I feel – had been making things difficult for myself and my relationships. Eventually something had to give.</p>
<p>The summer began with a breakup, continued with another breakup, and went on with several months of difficult but rewarding self-reflection, therapy, exploration and opening up. I gained a lot of confidence and self-worth, two things I hadn’t really realised I lacked. It’s still difficult to keep them up and probably always will be, but I’m better equipped for doing it than I was.</p>
<p>There is, it turns out, a difference between knowing something and feeling it, between intellectually understanding something and emotionally getting it. Crossing that chasm was something I had to do a few times this year.</p>
<h2 id="grief">Grief</h2>
<p>I’ve written <a href="/personal/2019/06/24/grief/">before</a> about my experiences with grief. This year I passed the eight-year mark on losing Danielle, with whom I had my first actual relationship. It will not suprise you to learn that her loss had a deep impact on my psychology, and unfortunately healing from such a wound is not just a matter of time. In fact the passage of time seems to have very little to do with it at all. So this year I healed a bit more, not by waiting but by action. I think I have an inkling of what to do next.</p>
<p>Perhaps the biggest emotional switch that flipped in my heart this year was realising I could (and <em>should</em>) feel grief about other things. They may seem less important, but they are not. All shadows are dark – one may occlude another, but the other is still there.</p>
<p>In the autumn my maternal grandfather Alastair died. At 93 he still had all his wits but for a decade had been fighting a losing battle with his ageing body. I and the rest of his immediate family were able to be with him near the end to say goodbye, for which I am grateful.</p>
<p>As a person he was often frustrating – a trait I have inherited – but he took a genuine interest in everybody he interacted with. In the days following his death our family received correspondences from all over the world from the hundreds of people who knew him, many of whom were friends he had corresponded regularly with for much of his life.</p>
<p>He will be greatly missed.</p>
<h2 id="muscles-muscle">Muscles :muscle:</h2>
<p>On a lighter note, this year I started going to the gym for the first time in my life. My slow-yet-inevitable nerd-to-jock transformation has had me trending towards it for a long time, but I finally took the step with the help of an accompanying friend and some new-found body confidence (thanks, aforementioned surgery!).</p>
<p>Since winter hit I haven’t been going as regularly as I would like to, but every time I make it in I feel great during and after my session. I love lifting weights and seeing how it is changing my body over time.</p>
<p>Exposing myself to the fear of public judgement is another good thing about going to the gym that I am feeling the benefits of.</p>
<h2 id="building-hammer">Building :hammer:</h2>
<p>2023 was also a year in which I spent a lot of time, energy and money on home improvement.</p>
<ul>
<li>I got new windows, replacing the drafty aluminium-frame sash-and-case windows that I’d put up with for years.</li>
<li>I got a new boiler to replace the ancient, inefficient beast that dwelled in my cupboard, making horrible noises and betraying me at inopportune moments.</li>
<li>I also got new plumbing added to a storage closet, allowing me to put a washing machine<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup> in it and freeing space up in the kitchen for a (yet to be added) dishwasher.</li>
</ul>
<p>Miscellaneous other things were fixed and improved, too. It was all worth it but it also put a lot of stress on my mind and finances, so I am hoping to do a lot less of it in 2024.</p>
<h2 id="2024">2024</h2>
<p>I believe I am entering my 30s with a clearer idea of who I am and what I want from life – and how to get it – but really I must accept the likelihood that I am wrong, that I and the conditions around me will change, and that is okay. The challenge is how to adapt to the change. How to make the best of it.</p>
<p>Thank you for reading! I hope you have had a good and less challenging year than I have, and I also hope you have a wonderful 2024 :heart:</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>The washing machine is new, replacing the old one that finally died, choking out smoke. It is a good washing machine but unfortunately drains way way too fast, which has been difficult for my crappy drain pipes that probably need to be scraped clean (or worse, made bigger). A bit of flooding has occurred, but thankfully I had the foresight to waterproof the closet floor. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
RMRO XII2023-11-28T00:00:00+00:00http://rachelnertia.github.io/gaming/2023/11/28/rmro-xii<p>A few days ago I went to Walsall for yet another lovely weekend of socialising and miniature wargaming with the Discord hobby community I am a part of, Rollmodels<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>. This time for our venue we descended upon an old favourite, <a href="https://www.boardinbrum.co.uk/">Board In Brum</a>, although this was my first time at their current location<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>. It remains a great destination for wargaming, with many tables, shedloads of terrain, a well-stocked shop and a crowd of friendly regulars.</p>
<!--more-->
<p>Saturday morning began with a hard landing in the world of <em>Warmaster</em> as Kara and I finally played our first 1000-point game. Yes, we travelled hundreds of miles to play a game with each other we could have played at home. We wanted it to be an exhibition match of sorts, to entice others into the warm <em>Warmaster</em> waters.</p>
<p>After some scrambling for appropriately-scaled terrain, we got down to business.</p>
<p><img src="/images/2023/11/rmro/warmaster.jpg" alt="" title="A Wood Elf army clashes with a Chaos army in a game of Warmaster" />
<em>My Eternal Guard square off against Kara’s Chaos Warriors.</em></p>
<p>I had done some preparation by having watched some <a href="https://www.youtube.com/playlist?list=PLsHhQn7iT5y65Jrk9PerunBIvlHkijAsE">tutorial videos</a> and reading the rulebook on the journey down. It wasn’t enough. While it does get crunchy in the combat phase, <em>Warmaster</em> is not a particularly complicated ruleset – the problem is that every single rule is buried in paragraph upon paragraph of text, written in the most conversational and meandering way possible. This is to be expected from a game written in the early 2000s, but I hoped the <em>Warmaster Revolution</em> team had simplified the text a bit. There are helpful “at a glance” sections at the beginning of each chapter, but they usually elide many key details. Details you must then go digging for in the bloated chapter itself.</p>
<p>Fortunately, Drew was on hand with a print-out of the <em>Warmaster Revolution</em> rulebook<sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">3</a></sup>, which made searching for rules much easier. He also brought with him his own understanding of the rules, which was far more developed than ours, so was able to chime in at key moments and answer our questions. Once she’d thoroughly crushed my Wood Elves, Kara took on his Chaos Dwarfs in a 1,500-point battle.</p>
<p>I came away from my first game bamboozled and tired, itching to play something simpler or which I at least understood better, but nonetheless I am excited to try more <em>Warmaster</em>. I have planned my next 500 points of Wood Elves.</p>
<p><img src="/images/2023/11/rmro/me-master.jpg" alt="" title="Me, thumbs up, at the end of our battle." />
<em>Warmaster: Good. I was wearing a beanie because the venue was cold!</em></p>
<p>John printed out and painted a set of the super-cool <a href="https://darkfantasticmills.com/Blade-Pit-Arena-c148242501">Blade Pit Arena</a> terrain by Dark Fantastic Mills so he could run a special game of <em>Warcry</em>. The first bout had 6 players and took a surprisingly long time, but remained dramatic throughout and was exciting to watch.</p>
<p><img src="/images/2023/11/rmro/warcry-arena.jpg" alt="" /></p>
<p>I got to play in the 2nd match, which in the interests of time had only 3 other players. We still didn’t manage to finish before the shop shut, but I got this cool photo of a fight between a Chaos Legionnaire and a Darkoath Savager:</p>
<p><img src="/images/2023/11/rmro/warcry-fight.jpg" alt="" /></p>
<p>Hopefully John will bring the arena along to future meetups and we will all get to prove our mettle some more.</p>
<p>On Sunday I got in a short Combat Patrol game of <em>Warhammer 40,000</em> against Krona’s Orks. I was very excited to get my Eldar back on the table.</p>
<p><img src="/images/2023/11/rmro/combat-patrol.jpg" alt="" /></p>
<p>Unfortunately the game was over, quickly. In my first turn I wiped out a unit of Boyz with a round of shooting from my Windriders and Guardians. In his second he deep struck with his Warboss and other unit of Boyz, but failed their charge. His Deff Dread charged the Windriders who were screening my Wraithlord and deleted them, but then consolidated into the Wraithlord, who rolled hot and cut it in half. The remaining Orks, seeing this, conceded.</p>
<p><img src="/images/2023/11/rmro/bonk.jpg" alt="" title="A Deff Dread picks a fight with the wrong wraith construct" />
<em>Bonk!</em></p>
<p>In the afternoon Alex, Kara and I spent some time learning <em>Shatterpoint</em>. It’s a bit too Token Hell for me, and I’m not enough of a Star Wars fan to be enticed by it, but it has some cool ideas.</p>
<p><img src="/images/2023/11/rmro/shatterpoint.jpg" alt="" title="A squad of rogers shoot up some clones and a jedi." />
<em>Roger roger!</em></p>
<p>As always I spent a lot of my time simply watching other games being played, chatting with my friends and generally hanging out. Folks were playing <em>Kill Team</em>, <em>Age of Sigmar</em>, <em>40,000</em> and even <em>Horus Heresy</em>. And a little bit of <em>Magewinds</em> was played, to keep me happy.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>We are very nice. Come join us! <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>We were originally going to visit Asgard Games, also in Walsall, but unfortunately it closed abruptly and we had to change. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p>I must try to get one for myself. <a href="#fnref:3" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Warmaster Wood Elves2023-11-23T00:00:00+00:00http://rachelnertia.github.io/hobby/2023/11/23/warmaster-wood-elves<p><img src="/images/2023/11/warmaster-wood-elves/whole-army.jpg" alt="" title="A fully-painted 1000-point Wood Elf army for *Warmaster Revolution*." />
<em>This project has pushed by miniature photography skills to their limit.</em></p>
<p><a href="https://en.wikipedia.org/wiki/Warmaster"><em>Warmaster</em></a> was one of several short-lived Games Workshop systems released during its late-90s-mid-2000s <em>Lord of the Rings</em>-license boom era. It depicted 10mm-scale armies fighting grand-scale battles in the <em>Warhammer Fantasy</em> Old World setting and, like many of its contemporaries (<a href="https://en.wikipedia.org/wiki/Epic_(game)"><em>Epic</em></a>, <a href="https://en.wikipedia.org/wiki/Mordheim"><em>Mordheim</em></a>…), its appeal has long outlived its official rules and models support, which crawled along for over a decade before rattling its death in the early 2010s. Nowadays the game is kept alive by a devoted community of fans playing and developing the unofficial <a href="https://www.wm-revolution.com/"><em>Warmaster Revolution</em></a> ruleset, buying/selling/trading old official models, and creating new unofficial models and even whole new unofficial armies through the wonders of 3D printing.</p>
<!--more-->
<p><img src="/images/2023/11/warmaster-wood-elves/glade-guard.jpg" alt="" title="A unit (three stands) of basic Wood Elf archers, AKA Glade Guard." />
<em>Glade Guard, the mandatory core of any Wood Elf army. Technically I should have more than one unit.</em></p>
<p>One such whole new army is Wood Elves, who never had rules in the original ruleset or any of its infrequent official expansions. Lore-wise, they don’t really seem suited to the kind of warfare <em>Warmaster</em> aims to represent: they are guerrilla fighters, ferociously defending their woodland enclaves but rarely venturing beyond them in numbers. Nonetheless they are a well-developed and popular force in the Old World setting and embody a classic fantasy trope, so it was inevitable someone would make rules for them in <em>Warmaster Revolution</em>, and even more inevitable that someone would make beautiful STLs (3D printer files) to represent them.</p>
<p><img src="/images/2023/11/warmaster-wood-elves/eternal-guard.jpg" alt="" title="Wood Elf spearmen AKA Eternal Guard" />
<em>Eternal Guard, the Wood Elf melee infantry option. Shiny! The leader of the central unit is a reference to a cool Glade Lord model Citadel used to make.</em></p>
<p>My Wood Elves are prints of the STLs designed by <a href="https://forestdragon.gumroad.com/">Forest Dragon</a>, who are one of many creators and sellers of 3D printer files now operating in the space. You can purchase their STLs directly (or from other vendors, I think?) or become a patron on their <a href="https://www.patreon.com/forestdragon">Patreon</a>. In addition there are various 3D printing shops that are licensed to sell prints of their designs. There are now quite a lot of miniature designers who use this business model, and several who produce designs for <em>Warmaster</em>. It’s a good time to be in the hobby.</p>
<p><img src="/images/2023/11/warmaster-wood-elves/wardancers.jpg" alt="" title="Wardancers" />
<em>Wardancers. These are not technically a unit - instead you attach a stand of them to an elf infantry unit like Eternal Guard or Glade Guard and they boost that unit’s combat prowess.</em></p>
<p>I for one cannot be arsed with 3D printing as it seems like a whole hobby in itself. Even if it would be extremely useful to be able to print models and terrain for myself on demand, all the faffing about it seems to entail makes it not my cup of tea. Fortunately Kara has a resin printer, and she wanted to play <em>Warmaster</em>, so I got to benefit from her hard graft.</p>
<p>The majority of them were printed in April but it took a while for them to make their way onto my painting desk and an equally-long while for them to make their way off it. Nevertheless, finally, they are ready for battle!</p>
<p><img src="/images/2023/11/warmaster-wood-elves/dryads.jpg" alt="" title="Dryads" />
<em>Dryads, the smallest of the Forest Spirit units.</em></p>
<p>Here is my army list:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Wood Elves, 945 points
Warmaster Revolution
--------------------------------
65 - 1 Glade Guard
180 - 3 Eternal Guard
60 - 2 Wardancers
60 - 1 Waywatchers
60 - 1 Dryads
90 - 1 Glade Riders
110 - 1 Wild Riders
85 - 1 Warhawk Riders
155 - 1 General
80 - 1 Spell Weaver
--------------------------------
945 - 9/5
</code></pre></div></div>
<p>I’ve left out upgrades for now to keep things simple while I learn the game. Also, I should probably have an additional unit of Glade Guard but the “2 per 1000 points” rule is a little ambiguous. Anyway, this seemed like a good starting point.</p>
<p><img src="/images/2023/11/warmaster-wood-elves/characters.jpg" alt="" title="Spellsinger and General" />
<em>The Spellsinger and the General.</em></p>
<p>Painting a 10mm army for the first time was an interesting new challenge. I had to learn how to balance detail painting with speed painting at such a small scale. I was glad to have the two character models (the General and the Spellsinger) on which I could focus my desire to paint details. This allowed me the freedom to go quickly on the actual units. I learned that washes and drybrushing are my friends here just as much as they are in the bigger-scale world. I also learned that I could skip some steps and details because they simply don’t show up when looked at from more than a few inches away and are often hidden behind other models in the stand.</p>
<p>Oh, that’s another thing about <em>Warmaster</em> - units are composed of one or more (usually 3) 40x20mm ‘stands’. Infantry are aligned with the long edge of the base and cavalry the short edge. Characters are free-wheelin’ mavericks and can be based more or less however one pleases. I have opted to put my two on 20x20mm bases.</p>
<p><img src="/images/2023/11/warmaster-wood-elves/waywatchers.jpg" alt="" title="Waywatchers, elite archers." />
<em>Waywatchers, elite archers who can ambush. They are unusual in that a unit of them is composed of only two bases. The tree leaves are just clump foliage, superglued to the trees that are part of the print.</em></p>
<p>All I had to pay for this army was a small contribution to the cost of the resin used, the 40x20mm bases from Warbases, and the cost of paints and other materials, which I already owned. Did I mention the rules are free, too? And even if I add another 1000 points to this army, it’ll still fit in a shoebox. So all in all I would consider <em>Warmaster</em> to be quite an accessible wargame, as it is both cost and space efficient.</p>
<p><img src="/images/2023/11/warmaster-wood-elves/glade-riders.jpg" alt="" title="Horse-riding light cavalry AKA Glade Riders" />
<em>Glade Riders, light cavalry with bows and spears.</em></p>
<p>That’s all for now. I shall soon finally find out first-hand how <em>Warmaster</em> plays on the table, and report back!</p>
<p><img src="/images/2023/11/warmaster-wood-elves/wild-riders.jpg" alt="" title="Deer-riding light cavalry AKA Wild Riders" />
<em>Wild Riders, slightly-heavier cavalry with melee weapons mounted on. They are also, I just discovered, also Forest Spirits. I don’t remember the lore, but I guess they’re elves who went hard into the whole tree-hugging thing.</em></p>
<p>If you’re interested in <em>Warmaster Revolution</em>, you may find <a href="https://www.youtube.com/watch?v=3tTTEhRP-q0&list=PLsHhQn7iT5y65Jrk9PerunBIvlHkijAsE">this YouTube playlist</a> useful. And there is a very good online army builder available at <a href="https://wm-selector.github.io/#/">wm-selector.github.io</a>.</p>
<p><img src="/images/2023/11/warmaster-wood-elves/warhawks.jpg" alt="" title="Elves riding Warhawks" />
<em>Warhawk Riders basically sell the whole army. Flying light cavalry, yes please.</em></p>
Ding! 302023-11-19T00:00:00+00:00http://rachelnertia.github.io/personal/2023/11/19/ding-30<p>Today I turned 30. Which feels good, I think?<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>.</p>
<p>A lot of things, good and bad, happened in my 20s. I learned a great deal, but I still seem be growing, developing, changing. Even just in the last year I have experienced so much change! That has been a Lot, sometimes, but it’s all going in a good direction. I’m looking forward to seeing how I continue my little journey for the next decade, figuring out what I like, doing things, making things, learning things…</p>
<p>Mostly I’m excited to see how my friendships continue and how new ones come along. The way my friends grow and change. Yesterday evening I hosted a party at my flat and was overjoyed to have friends arrive, chat, be merry, and eat my delicious cake. I promise myself lots and lots more of that to come.</p>
<p>Anyway. Yes. 30 years, good!</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>Although I think I’m coming down with a cold. The first cold of my 30s, on day one! The humanity! <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Hobby Update - April2023-05-01T00:00:00+00:00http://rachelnertia.github.io/hobby/2023/05/01/hobby-update-april<p>From now on I’m going to try writing monthly summaries of my hobby goings-on. It’s been a slow month, hobby wise, thanks to being in recovery<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>, sick and/or busy, so there shouldn’t be too much to write for this one, I hope.</p>
<!--more-->
<p>I’ll have the following sections:</p>
<ul>
<li><strong>In:</strong> Projects I’ve acquired or started.</li>
<li><strong>Out:</strong> Projects I’ve “finished”.</li>
<li><strong>In and Out:</strong> Projects for which I’ve done both of the above.</li>
<li><strong>In Progress:</strong> Projects that are chugging along.</li>
<li><strong>Games Played</strong></li>
<li><strong>Miscellaneous</strong> loose ends.</li>
</ul>
<h3 id="in">In</h3>
<p><img src="/images/2023/04/black-dragon.jpg" alt="" /></p>
<p><strong>Dreadlord/Sorceress on Black Dragon:</strong> A local was selling one second-hand and I couldn’t resist. I have a lot of <a href="/hobby/2022/04/20/dark-aelves-of-nuloren/">dark aelves</a> and this model will make an excellent leader for them. The dragon is built, but only partially painted. For some reason it’s on a wrongly-sized base. Only the Dreadlord rider option has been assembled, but I have all the bits to make a Sorceress. Looking forward to getting started on this one soon.</p>
<h3 id="out">Out</h3>
<p>Nowt.</p>
<h3 id="in-and-out">In and Out</h3>
<p><img src="/images/2023/04/eldar.jpg" alt="" /></p>
<p><strong>Eldar Guardians:</strong> After much encouragement, I finally caved into my desire to paint some Eldar. And so, in the last days of March, I ordered a box of second-hand (but unbuilt) Guardians from Ebay for somewhat less than RRP. As soon as they arrived, on April 1st, I couldn’t wait to get stuck into them. I built one of them immediately and painted it up in a test of the colour scheme I wanted to try.</p>
<p>You don’t seem to see many metallic Eldar for whatever reason. I thought it might look cool and it very much does.</p>
<p>It took basically the whole month to paint the squad because I didn’t seem to have much hobby time. I hope May is more productive!</p>
<h3 id="in-progress">In Progress</h3>
<p><strong>Squig Herd:</strong> 10 squigs and their two herders. Had to commit <em>hobby crime</em> to put this unit together, but I was aided and abetted by the victim of the crime, so who’s to say if it’s a bad thing or not. I got distracted by the Guardians, and should be able to finish them relatively soon.</p>
<h3 id="games-played">Games Played</h3>
<p><strong>Age of Sigmar:</strong> Two games, both 1000 points, finishing up my participation in the Edinburgh and Lothian Gamers AoS league<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>.</p>
<p><img src="/images/2023/04/battles/cities-vs-kruleboyz/round-3.jpg" alt="" /></p>
<p>The first was against Richard’s Kruleboyz, and did not go my way. The second was against Philippe’s Nighthaunt, and extremely did not go my way.</p>
<p><img src="/images/2023/04/battles/cities-vs-nighthaunt/round-1.jpg" alt="" /></p>
<p><strong>Warcry:</strong> A couple of post-work office games.</p>
<p>The first was a scenario from the matched play <a href="https://www.warhammer-community.com/wp-content/uploads/2022/11/E1PvbyC0742WaOwU.pdf">“Rumble Pack”</a> used at Warhammer World events, which provided a nice symmetrical setup and objectives. I was playing my Horns of Hashut and my opponent was playing Chaos Legionaries, aided by a Slaughterpriest and a Varanguard. Despite being totally outgunned, I was able to win through having more bodies with which to control the board and win VP.</p>
<p>The second game was a narrative play generated leader-assassination scenario against a high-leveled Seraphon warband. Against all odds I managed to maneuver a single Demolisher through the scrum of lizards and, in one activation, deal exactly enough damage to take the leader, a puny Skink Starpriest, out of action. If he had failed my leader would have died in the following turn. A very tense and exciting match, in which I felt like I was on the back foot right up until I (through sheer luck) won.</p>
<p>Unfortunately I can’t provide photos of office games as we have a strict no-photos-in-the-studio policy :cry:</p>
<p><img src="/images/2023/04/battles/kings-of-war/game-2-smash.jpg" alt="" /></p>
<p><strong>Kings of War Ambush:</strong> Jill and I <em>finally</em> got together on Sunday 30th for our first 750-point learning games of Kings of War. Turns out it’s very fun! My <a href="/hobby/2023/01/16/ogres/">Ogres</a> faced off against her Dwarfs and came out on top in both fights. There’s some rules and wrinkles<sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">3</a></sup> we didn’t quite grasp in the two games we played, but on the whole it seems like a super-streamlined, ultra-speedy ruleset which I can’t wait to play more of. We’re planning to play at 1000 points next, so I have ordered a <a href="https://www.manticgames.com/kings-of-war/giant/">Giant</a>, who will take up most of the extra points, and should be a fun hobby project.</p>
<p><img src="/images/2023/04/battles/armada/1st-april.jpg" alt="" /></p>
<p><strong>Armada:</strong> I played a learning game against Kara<sup id="fnref:4" role="doc-noteref"><a href="#fn:4" class="footnote" rel="footnote">4</a></sup> at the beginning of April and another against Jill after our Kings of War session. It’s also a fun game, all about planning ahead and outmaneuvering your opponent. I am tempted to pick up some more boats.</p>
<h3 id="miscellaneous">Miscellaneous</h3>
<p>While I was in Games Hub on Sunday I made the shame-free purchase of <em>Season of War: Thondia</em>, a very pointless supplement for Age of Sigmar. I have enjoyed leafing through it so far.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>I had surgery on my neck. I might write about it if I can be arsed. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>I still need to finish writing my battle report for the 2nd game I played in the 1k league. It’s sitting in my drafts, languishing… <a href="#fnref:2" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p>All the complexity seems to be in how to move units around, which makes sense. That’s probably where it should be, in a game that’s all about moving units around. <a href="#fnref:3" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:4" role="doc-endnote">
<p>Kara didn’t like it because it doesn’t simulate real Age of Sail battle tactics like <a href="https://en.wikipedia.org/wiki/Crossing_the_T">Crossing the T</a>. Fair enough. <a href="#fnref:4" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
ELG Age of Sigmar 1k League: Game 12023-03-19T00:00:00+00:00http://rachelnertia.github.io/gaming/2023/03/19/batrep-elg-aos-1k-league-game-1<p><img src="/images/2023/02/battles/cities-vs-gitz/mangler.jpg" alt="" /></p>
<p>On Tuesday 14th February I fought my first battle in my 1k league group, playing my dark-aelves-themed Cities of Sigmar list against Charlie’s freshly-enbookened and newly-painted squigs!</p>
<p><em>This battle report is much-delayed, so I don’t remember all the details, but it was a good game of Warhammer, and the nice thing about good games of Warhammer is you always remember the important bits.</em></p>
<!--more-->
<h2 id="the-armies">The Armies</h2>
<p>Charlie’s army consisted of:</p>
<ul>
<li>2 Mangler Squigs</li>
<li>A Loonboss on Giant Squig</li>
<li>10 Squig Hoppers</li>
<li>A Squig Herd</li>
<li>A Loonshrine</li>
</ul>
<p>All in the Jaws of Mork subfaction.</p>
<p>My army was a bit different from the Living City lists I’ve played previously when running my Cities of Sigmar models. It’s a Hallowheart list because I wanted to see how far I could push my Sorceresses.</p>
<ul>
<li>Sorceress 1, the General
<ul>
<li>Command Trait: Veteran of the Blazing Crusade (ignore battleshock wholly within 18”)</li>
<li>Artefact: Arcane Tome (+1 spellcast, +1 spell)</li>
<li>Spells: Ignite Weapons (+1 to wound on a friendly target), Warding Brand (when a friendly target is allocated a wound, on a 4+, the attacker takes a mortal wound – so it punishes enemies for hurting you)</li>
<li>Her role is to cast support spells</li>
</ul>
</li>
<li>Sorceress 2, the Adjutant
<ul>
<li>Spells: Elemental Cyclone, Roaming Wildfire (both are just mortal wound dealers)</li>
<li>Her role is to cast offensive spells</li>
</ul>
</li>
<li>Bleakswords x10</li>
<li>Bleakswords x10</li>
<li>Black Guard x20 (the General’s Retinue)</li>
<li>Drakespawn Knights x5</li>
<li>Shadow Warriors x10</li>
<li>Quicksilver Swords</li>
<li>Emerald Lifeswarm</li>
</ul>
<p>950 points, all in a Battle Regiment.</p>
<p>Because of being in Hallowheart, my wizards are dual casters (the general is a dual caster because of the Tome) and can take 2 spells from the Hallowheart spell lore. So basically the plan is for these two wizards to spew out buffs, debuffs and damage as much as possible, while being protected by the Black Guard, who can dish out a lot of hurt to anything that comes their ways.</p>
<h2 id="the-battleplan">The Battleplan</h2>
<p>The battleplan we rolled was Burn and Pillage, which has 4 objectives, two in each player’s territory. You can destroy the objectives in your opponent’s territory for D3 points – something we both forgot to do. It’s nice and simple.</p>
<p>Once again I was playing on the ice table at Red Dice Games. I end up on it so often!</p>
<h2 id="deployment">Deployment</h2>
<p><img src="/images/2023/02/battles/cities-vs-gitz/deployment.jpg" alt="" /></p>
<p>I had a Battle Regiment, and he didn’t, so I had to set up everything without knowing where any of his stuff would be. Sometimes being low-drops is a disadvantage! As a result my deployment was very stupid.</p>
<p>On the left, I set up one unit of Bleakswords, to capture that objective. On the right, I created a sort of bubble around my two Sorceresses on the other objective, with Black Guard at the front and Bleakswords at the back. I did this because I was aware of the Mangler Squigs’ Giant Boing ability, and rightly terrified of it. Then I had no idea what to do with my Drakespawn Knights, so I stuck them in the middle. The Shadow Warriors went in reserve.</p>
<p>Charlie set up his Squig Hoppers on the left, next to the Loonshrine; the Loonboss and one Mangler Squig in the centre; and the Squig Herd and the other Mangler Squig on the right.</p>
<h2 id="round-1">Round 1</h2>
<p>Realising I’d deployed too far forward to be safe from several turn 1 charges, I chose to take the first turn so I could at least move about a bit and get some buffs off.</p>
<p>My general sacrificed one of her lackeys for +2 to cast, then cast Emerald Lifeswarm with +3 to cast (Cities of Sigmar get +1 to cast all Endless Spells). Then she cast Warding Brand on the Bleakswords (an attempt to disincentivise attacking them) and Ignite Weapons (iirc) on the Black Guard.</p>
<p>Her adjutant also sacrificed a Black Guard (it will all make sense in a moment) and cast Quicksilver Swords and Arcane Bolt, which she saved for later.</p>
<p>The Swords made a beeline for Mangler #2, but didn’t reach it this turn (iirc). The Lifeswarm brought the two sacrificed Black Guards back to life.</p>
<p>I shimmied stuff forward, kinda uncertain, preparing to receive a nasty charge.</p>
<p><img src="/images/2023/02/battles/cities-vs-gitz/round-1-turn-2.jpg" alt="" /></p>
<p>In Charlie’s turn, I did not receive a nasty charge, because Mangler Squig #1 failed to charge the Knights. Mangler Squig #2 hid behind a rock. The Herd did not advance. The Hoppers, I think, I managed to Redeploy away from?</p>
<p>I breathed a sigh of relief, and then got double-turned.</p>
<h2 id="round-2">Round 2</h2>
<p><img src="/images/2023/02/battles/cities-vs-gitz/round-2-turn-1-bleakswords.jpg" alt="" /></p>
<p>The face-punching began. Mangler #1 and the Loonboss ganged up on the Knights. They didn’t last long. The Hoppers got to work smashing the shit out of the Bleakswords. Mangler #2 charged the Black Guard, who got an opportunity to attack first, hitting on 2+, wounding on 2+, over 30 attacks… but I rolled about 15 1s :grimacing: So they did not kill the Mangler, and it ate a lot of them.</p>
<p><img src="/images/2023/02/battles/cities-vs-gitz/round-2-turn-1-guard-vs-mangler.jpg" alt="" /></p>
<p>From this point on, my recollection starts getting really fuzzy, and I didn’t take quite enough photos to fill the gaps, alas!</p>
<p>In my turn I deployed my Shadow Warriors on the left side enemy objective. They started shooting at the Hoppers.</p>
<p><img src="/images/2023/02/battles/cities-vs-gitz/round-2-turn-2-shades.jpg" alt="" />
<em>The are Dark Elf Shades, lovingly acquired from my past, other Rollmodels, and eBay. And they are led by a mildly-converted Shadowblade, master assassin sculpt.</em></p>
<p>I think my Guard managed to finish off Mangler #2?</p>
<h2 id="rounds-3--4">Rounds 3 & 4?</h2>
<p>I think I got priority? I was able to charge the Loonboss with my Black Guard and Bleakswords, somehow.</p>
<p><img src="/images/2023/02/battles/cities-vs-gitz/round-3-turn-1-loonboss.jpg" alt="" /></p>
<p>The Loonboss attacked the aelves who were hemming him in but failed to do much damage. He should then have been able to escape but at the time his warscroll had not been errata’d to include Fly, so as he was surrounded he was stuck. He went down in a blur of aelven blades.</p>
<p>Unfortunately charging the Loonboss left my Sorceresses vulnerable to the inevitable Giant Boing of Mangler #1. They had a bad time.</p>
<p><img src="/images/2023/02/battles/cities-vs-gitz/round-3-turn-1-mangler.jpg" alt="" /></p>
<p>The Hoppers made for the Shades. The Shades and the Hoppers wiped each other out, which was hilarious, leaving me in control of that objective.</p>
<p>My Bleakswords made for the left-hand objective while the Guard went to get revenge on Mangler #1.</p>
<p>At this point we figured I’d basically lost unless he somehow failed his rolls on returning some Hoppers from the Loonshrine, so he rolled to see if that would happen and it did and we declared it a win for Charlie!</p>
<h2 id="conclusion">Conclusion</h2>
<p>A very fun game in which I got to pilot this list for the first time, made a lot of mistakes, and learned from them. Charlie’s squigs were beautiful to get chomped to death by. Truly the Age of Squigmar is upon us!</p>
ELG Age of Sigmar 2k League: Game 32023-02-25T00:00:00+00:00http://rachelnertia.github.io/gaming/2023/02/25/batrep-elg-aos-2k-league-game-3<p><img src="/images/2023/02/battles/nighthaunt-vs-s2d/enemy-army.jpg" alt="" /></p>
<p>On February 1st (help, I am very bad at writing these reports in a timely fashion) I played another game of AoS at Red Dice Games in Leith, this time against Sam and his Slaves to Darkness.</p>
<!--more-->
<h2 id="the-armies">The Armies</h2>
<p>This time, the points changes had made it to the app, so I updated my list. Some Nighthaunt units had dropped in points, so I was able to swap out the Shyish Reaper a different endless spell: the Mortalis Terminexus, a big floaty hourglass. This turned out to be a good swap!</p>
<p>My opponent’s army was what I consider to be an archetypical Slaves to Darkness force: ranks of big, bad, heavily armoured dudes.</p>
<ul>
<li>10 Chosen (Mark of Nurgle)</li>
<li>10 Chaos Knights (Mark of Slaanesh)</li>
<li>2x10 Chaos Warriors</li>
<li>3 Ogroid Theridons</li>
<li>Sorceror Lord</li>
<li>Chaos Lord on Foot</li>
<li>Chaos Lord on Horse</li>
</ul>
<p>Everything was in one big Battle Regiment.</p>
<h2 id="round-1">Round 1</h2>
<p>I got to curse a whole 4 units, so I chose his heroes and the Chosen.</p>
<p>Out-dropping me, Sam made me take the first turn. I immediately yeeted the Mortalis Terminexus at him, although the distance was too great for it to do anything this turn. I think it might have been close enough to apply a mortal wound or two to the Chaos Warriors, but they blocked it with their special shields.</p>
<p><img src="/images/2023/02/battles/nighthaunt-vs-s2d/round-1-turn-1-hourglass.jpg" alt="" /></p>
<p>I cast Seal of Shyish (5+ Ward, same as Discorporate) and Shademist (-1 to Wound against) on the right-hand Chainrasps, making them extra tough.</p>
<p>Following that, I advanced my army up into my usual death-star-battleline, ready to weather a charge.</p>
<p><img src="/images/2023/02/battles/nighthaunt-vs-s2d/round-1-turn-1.jpg" alt="" /></p>
<p>Unsure quite what to do with them, I deployed my Grimghast Reapers behind a bit of terrain on the right-hand side of the battlefield. I was still unsure about them in my first turn, so they remained there, safe and ready to charge anything that moved onto the objective.</p>
<p><img src="/images/2023/02/battles/nighthaunt-vs-s2d/round-1-turn-1-reapers.jpg" alt="" /></p>
<p>In Sam’s turn, the Terminexus hopped over the Chaos Warriors and splashed out some mortal wounds onto several units. It’s a good little endless spell.</p>
<p>He was really hindered by the terrain bottlenecking him into his deployment area, but managed to get his Knights out and make a somewhat wonky charge. The closer unit of Chaos Warriors charged in as well, while the other unit took the right-hand objective.</p>
<p><img src="/images/2023/02/battles/nighthaunt-vs-s2d/round-1-turn-2.jpg" alt="" /></p>
<p>The Knights hit hard, but not hard enough, only managing to take out some of the Chainrasps. It was a similar story on the left side with the Chaos Warriors. My units punched back hard…</p>
<h2 id="round-2">Round 2</h2>
<p>And then I got priority, and got to punch back even harder:</p>
<p><img src="/images/2023/02/battles/nighthaunt-vs-s2d/round-2-turn-1.jpg" alt="" /></p>
<p>In my Hero Phase, Sam managed to dispel the Terminexus before it did even more damage.</p>
<p>The Chaos Knights and Warriors were gone.</p>
<p><img src="/images/2023/02/battles/nighthaunt-vs-s2d/round-2-turn-2.jpg" alt="" /></p>
<p>In his turn, Sam threw in his Chosen, who get to fight twice in the Combat Phase once per game. The Ogroids made it in too. A lot of Chainrasps died, and Kurdoss took some punishment, but ultimately I was okay.</p>
<p><img src="/images/2023/02/battles/nighthaunt-vs-s2d/round-2-turn-2-combat.jpg" alt="" /></p>
<h2 id="round-3">Round 3</h2>
<p>I got priority in Round 3 again and proceeded to wipe out the Chosen.</p>
<p><img src="/images/2023/02/battles/nighthaunt-vs-s2d/round-3-turn-1.jpg" alt="" /></p>
<p>On the right, I finally charged in with the Grimghast Reapers, who got stuck into the Chaos Warriors.</p>
<p><img src="/images/2023/02/battles/nighthaunt-vs-s2d/round-3-turn-1-reapers.jpg" alt="" /></p>
<p>At this point, Sam conceded.</p>
<h2 id="denouement">Denouement</h2>
<p>This was another fun game… for me at least? Sam said he had fun, but his units didn’t get to do very much. I think the thing that really screwed him over was the terrain in his deployment zone, which forced him to throw units at me in waves, which is exactly what I want because it plays into my counterpunch strategy.</p>
<p>I didn’t keep track of which Battle Tactics I scored in each of my turns, but I if I remember correctly I managed to score 5 points each turn.</p>
<p>I think my list might just be quite good! I know it has weaknesses (ranged mortal wound spam, deep strikes) but so far I seem to be good at mitigating them? Or at least have not come up against a list that can really exploit these weaknesses.</p>
<p>I enjoyed playing against the Slaves to Darkness, and beating them did nothing to quell my desire for my own army of them.</p>
<p>Up next in the battle report series, I take my dark aelves on their first excursion into the 1k league…</p>
ELG Age of Sigmar 2k League: Game 22023-02-11T00:00:00+00:00http://rachelnertia.github.io/gaming/2023/02/11/batrep-elg-aos-2k-league-game-2<p><img src="/images/2023/02/battles/nighthaunt-vs-kruleboyz/deployment-my-army.jpg" alt="" /></p>
<p>On January 17th I played the 2nd of my 2k league games (the first I wrote about <a href="/gaming/2023/01/16/batrep-elg-aos-2k-league-game-1/">here</a>), this time against Rusty’s Kruleboyz.</p>
<!--more-->
<p>My army was the same as last time, as we agreed not to use the new points because the app hadn’t been updated yet.</p>
<p>His army consisted of:</p>
<ul>
<li>Gobsprakk (a powerful named shaman on a vulture who can hurt casters by unbinding their spells)</li>
<li>A Snatchaboss riding a big sloth</li>
<li>A mounted Killaboss</li>
<li>A Killaboss on foot</li>
<li>A Swampcalla Shaman</li>
<li>3 Boltboyz</li>
<li>10 Gutrippaz</li>
<li>10 Hobgrots</li>
<li>Kragnos, the big scary god of destruction</li>
</ul>
<p>Kind of a Dominion-plus-some-big-toys list, pretty much exactly what I’d do if I expanded my Kruleboyz.</p>
<p>Once again, we played Contest of Generals – the threadbare, but straightforward, Matched Play battlepack from the Core Book. The battleplan was Burn and Pillage,but neither of us remembered to do any burning or pillaging.</p>
<p><img src="/images/2023/02/battles/nighthaunt-vs-kruleboyz/round-1-turn-2.jpg" alt="" /></p>
<p>Round 1 was a timid affair, as neither of us really had the movement or the inclination to engage so quickly. We both did a bit of maneuvering.</p>
<p>I chose the battle tactic where you have to control the centre and snagged it, thinking I would have difficulty scoring it later on and that this might be a good way to lure Kragnos into a position where I could pounce on him with as many units as possible.</p>
<p>I did not cast any spells, fearing Gobsprakk’s horrible unbind ability. Fortunately the spells in my army are nice-to-haves instead of must-haves.</p>
<p><img src="/images/2023/02/battles/nighthaunt-vs-kruleboyz/round-2-turn-1.jpg" alt="" /></p>
<p>He won priority going into round 2. Kragnos charged the Chainrasps in the centre, instantly killing a few with his impact damage.</p>
<p>Meanwhile, his mounted Killaboss charged the Chainrasps on my right flank.</p>
<p><img src="/images/2023/02/battles/nighthaunt-vs-kruleboyz/round-2-turn-1-right.jpg" alt="" /></p>
<p>Kragnos killed a lot of Chainrasps, helped by the fact that Gobsprakk had cast a spell to turn their ward off, but didn’t manage to wipe the unit.</p>
<p>The Killaboss, of course, died in a swarm of Chainrasps.</p>
<p><img src="/images/2023/02/battles/nighthaunt-vs-kruleboyz/round-2-turn-2.jpg" alt="" /></p>
<p>On my turn, I did what I do best with Nighthaunt: charge one thing with the whole army. Turns out if you Stun (-1 to Save) Kragnos like 3 times and Petrify (Strike-last) him, he dies like everything else.</p>
<p>I also moved my Chainrasps up the right side of the battlefield to deal with the Shaman and the Boltboyz, which they summarily did.</p>
<p>I also teleported my Dreadblade Harrow onto the other objective on Rusty’s side of the battlefield, capturing it for a battle tactic and more points.</p>
<p><img src="/images/2023/02/battles/nighthaunt-vs-kruleboyz/round-3-turn-1.jpg" alt="" /></p>
<p>Round 3, Rusy counterpunched with his Snatchaboss and Gutrippaz. They almost wiped the Grimghast Reapers, leaving them on 1 model remaining. The ghosts fought back, with Kurdoss doing a LOT of damage to the Gutrippaz.</p>
<p>Gobsprakk flew back to deal with the Dreadblade, who fought bravely but was pecked to (re-)death by the vulture.</p>
<p><img src="/images/2023/02/battles/nighthaunt-vs-kruleboyz/round-3-turn-1-dreadblade.jpg" alt="" /></p>
<p>At this point, it was pretty clear the battle was mine. All that remained was to clean up.</p>
<p>One very funny thing happened: The Snatchaboss redeployed away from me to stand by the gryph-hound statue, making it harder for me to charge him. Kurdoss made his charge, applying Petrify, but had a nasty surprise when it turned out that the statue was one of the terrain features that Rusty had trapped with his Lethal Surprise Dirty Trick. Rusty rolled a 2+. Then Rusty rolled a 6. Kurdoss took nearly all of the 6 mortal wounds, managing to ward off only 1. Then, at the end of the Charge Phase, the Snatchaboss’ mount performed a Stomp, dealing D6 damage instead of D3 because of his mount trait. Another 6 mortal wounds.</p>
<p>Kurdoss discorporated, having been thoroughly humiliated, before even getting to strike a blow.</p>
<p><img src="/images/2023/02/battles/nighthaunt-vs-kruleboyz/round-4-kurdoss-death.jpg" alt="" /></p>
<p>All in all, a very fun game. The Kruleboyz didn’t seem particularly dangerous, and since I managed to neutralize Kragnos early, I had an easy time from then on.</p>
<p>Rusty’s paint job on the army is fantastic and I hope I get to play against it again someday. He was also a very fun opponent. We laughed a <em>lot</em> at Kurdoss’ inglorious demise together.</p>
<p>I shall write about my third battle soon!</p>
Hobby Lookahead2023-01-31T00:00:00+00:00http://rachelnertia.github.io/hobby/2023/01/31/hobby-lookahead<p>2023 has arrived and… oh, it’s already starting to pull away from the platform. Here’s a (slightly late) vague set of things I’m looking forward to in the hobby this year.</p>
<!--more-->
<h2 id="goals-and-resolutions">Goals and Resolutions</h2>
<p>Things I wanna do!</p>
<h3 id="game-a-week">Game a Week</h3>
<p>I want to play one game per week – on average. It can be a game of anything, as long as it meets the incredibly vague definition of “miniature wargame”.</p>
<p>I’m at 5 already! Two games of Age of Sigmar, two of Frostgrave and one of Warcry. Let’s go!</p>
<h3 id="kings-of-war">Kings of War</h3>
<p>I’ve been wanting to try Kings of War for years and with the mustering of my small force of <a href="/hobby/2023/01/16/ogres/">Ogres</a> I am almost ready to play. I guess my aim is to play a few games, end up with about 1000 points of the big red folk and, if I enjoy the game, maybe end up with more.</p>
<p>Or start a second Ambush-sized army, perhaps?</p>
<h3 id="terrain">Terrain</h3>
<p>I have a big backlog of terrain projects that I’d like to focus on for a bit, starting with some classic Citadel terrain pieces like the Eternity Stair that I snagged off Ebay. Then I want to make a forest, so I’ll have to acquire lots of trees…</p>
<h2 id="eventsleagues">Events/Leagues</h2>
<p>Along with hoping to play a lot more games I am also hoping to take part in a lot more meetups, tournaments, and that general sort of thing.</p>
<ul>
<li>For the first few months of the year I’ll be participating in the Edinburgh and Lothian Gamers <em>Age of Sigmar</em> league, getting lots of games in.</li>
<li>Hopefully the trend of playing Warcry in the office after-hours will continue.</li>
<li>At the end of February we’re having a mini-RMRO at Knightly Games in Bathgate, a whole two days of gaming.</li>
<li>In the summer we are vaguely planning to have a big proper RMRO also in Bathgate. Hell yeah!</li>
</ul>
<h2 id="upcoming-releases">Upcoming Releases</h2>
<p>There is so much cool stuff coming down the pipe this year, like:</p>
<h3 id="gloomspite-gitz">Gloomspite Gitz</h3>
<p><img src="/images/2023/01/spiderfang.jpg" alt="" /></p>
<p>I love goblins, but their rules in AoS have always been pretty bad – a dreadful combination of weak and unfun – which has meant I’ve hardly ever played with my Gloomspite Gitz, nor had much impetus to expand my collection. There’s a new battletome for the army dropping very soon, and hopefully it turns the corner and I get to enjoy playing with my grots.</p>
<p>Expanding the army should be made slightly easier by the next item:</p>
<h3 id="stormbringer">Stormbringer</h3>
<p><img src="https://www.fauxhammer.com/wp-content/uploads/2022/02/Warhammer-Stormbringer-Magazine-Full-Collection-1024x576.jpg" alt="" /></p>
<p>Oh no. Another Warhammer partworks magazine. I am so fucked.</p>
<p>The previous one, “Mortal Realms”, which ran from late 2019 through 2020, was stuffed full of Stormcast and Nighthaunt. It was also possible to pick up single issues via Forbidden Planet. This made for the most affordable way to collect Age of Sigmar models probably ever. I would not have a Nighthaunt army without it!</p>
<p>Stormbringer contains a mixture of new Stormcast, old Stormcast, Sylvaneth, Kruleboyz and, most importantly, Gloomspite Gitz. It’ll be hard not to pick up a smattering of issues.</p>
<h3 id="cities-of-sigmar">Cities of Sigmar</h3>
<p><img src="https://ageofsigmar.lexicanum.com/mediawiki/images/3/35/Dawnbringer_Crusade.jpg" alt="" /></p>
<p>At some point this year we’re getting a new Cities of Sigmar battletome. Whether or not this will include the prophesied Dawnbringer Crusades (whatever those are) remains to be seen. Whether or not they will squat another swathe of old kits (like my beloved dark elves and the wicked Collegiate Arcane models I keep meaning to pick up) also remains to be seen.</p>
<p>I think Cities is one of the most important factions in Age of Sigmar, presenting the most recognisable and relatable mortals in the setting: just brave humans, aelves and duardin, struggling against the forces of Chaos, Death and Destruction. Getting them right is important. I love the faction’s current iteration as a haven for Old World leftovers, but I admit that it’s not the best it could be. Modern, exciting model kits for Cities of Sigmar, that really belong in the new setting, would be a huge win for the game as a whole.</p>
<p>At the same time, however, there’s a risk that some of the delightful cosmopolitan-melting-pot feel of the faction’s current unit selection could be lost. I want to continue to tell the story of Nuloren, my own homebrew Free City, for as long as Age of Sigmar continues. I’ll be very sad if I’m no longer able to tell that story through playing with my current army on the tabletop.</p>
<p>There’s a lot to be fearful about, but also a lot to be excited about. I’ll just have to wait and see.</p>
<h3 id="twilight-kin">Twilight Kin</h3>
<p>Mantic have been <a href="https://www.manticgames.com/news/what-fantastic-things-are-in-store-for-the-world-of-pannithor/">teasing</a> their own twisted dark elves, saying they’ll release them near the end of this year. The aesthetic is a cross between classic dark elf and the excellent Nightstalker range. If the Armada ships are anything to go by, we’re in for a treat. We’ll see how things shake out, but if they shake out well, perhaps we could be looking at my second Kings of War army after Ogres.</p>
<h2 id="magewinds">Magewinds</h2>
<p>I have big hopes for my <a href="www.magewinds.com">little game</a> this year. I sketched these out over on the Magewinds <a href="https://www.magewinds.com/blog/2022/10/22/roadmap/">blog</a>, so I won’t repeat them here.</p>
Ogres2023-01-16T00:00:00+00:00http://rachelnertia.github.io/hobby/2023/01/16/ogres<p><img src="/images/2023/01/ogres/wip1.jpg" alt="" />
<em>Three Warriors, primed, drybrushed and ready to go.</em></p>
<p>I’ve been wanting to try Mantic Games’ flagship rank-and-flank wargame <a href="https://www.manticgames.com/games/kings-of-war/featured-products/">Kings of War</a> for several years, and the tail months of 2022 presented the best opportunity to do so I’d had so far.</p>
<!--more-->
<p>This was thanks to a convergence of factors:</p>
<ul>
<li>Ambush: a set of rules for playing Kings of War with smaller armies on smaller battlefields, good for beginners as well as experienced players who have limited time.</li>
<li>I asked around on local channels and found someone willing to try the game with me. She’s been busily building and painting up some Dwarfs in preparation for our first battle, which will hopefully take place later in the month.</li>
<li>New hard plastic ogres, appearing in the <a href="https://www.manticgames.com/games/kings-of-war/kings-of-war-factions/ogres/kings-of-war-sands-of-ahmun-2-player-set/">Sands of Ahmun starter set</a>, which I split with a friend<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>. They’re great models, and a low model count army, so ideal for a first foray into the system.</li>
</ul>
<p><img src="/images/2023/01/ogres/wip2.jpg" alt="" /></p>
<p>The starter set split left me with 4 sprues of hard plastic Ogres (technically 2 each of 2 sprues – one has male bodies and one has female bodies) and a resin Warlord.</p>
<p>I built the plastic ogres as regiments, 3 models each: 1 of Warriors with hand weapons and shields, 1 of Warriors with two-handed weapons and 2 of Boomers (oversized blunderbuss wielders). They went together well, but not all the arms/arm pairs are compatible with all the bodies – they’re labelled so you can tell how to build the ‘expected’ combinations but in a rather confusing fashion.</p>
<p>The resin Warlord went together easily with the help of some Zip Kicker (superglue accelerant). Mantic resin seems to generally be pretty good and I’ve never had any issues with it.</p>
<p><img src="/images/2023/01/ogres/wip3.jpg" alt="" />
<em>The “It’s all getting a bit out of hand” stage of any hobby project.</em></p>
<p>I painted them all up in a simple scheme, giving the Ogres bold red skin – this is how they’re depicted in artwork but, for some reason, not in the studio models – steel armour and green cloth accents. The Warlord got some gold trim and decorations to denote his status. I painted all their hair black, with dark grey highlights, except for the Warlord, whose beard is white because he’s old and grizzled. His name, I think, is Baz.</p>
<p><img src="/images/2023/01/ogres/warlord.jpg" alt="" />
<em>The Warlord, first to pass muster.</em></p>
<p>I multi-based the regiments. Multibasing is something mostly unique to Kings of War. Because you don’t remove models when a unit takes damage, you can put all the models on one big base. This is convenient and also gives you an opportunity to do some cool group posing, decorations, scenery and so on. I kept it simple, with mostly flat bases without much extra detail.</p>
<p><img src="/images/2023/01/ogres/warriors.jpg" alt="" />
<em>Warriors</em></p>
<p>I painted the bases a nice dusty yellow to contrast well with the models and added the occasional dry grass tuft.</p>
<p>These 5 units/13 models come to a total of 675 points.</p>
<p>We decided to aim for 750 points for our first battle, so I had 75 points to play with. There are only 4 options in the Ogre list that fit in that little space:</p>
<ol>
<li>An Army Standard, which sounds cool but I’d have to do some kitbashing and possibly even sculpting :grimacing: (70 points)</li>
<li>A Red Goblin Biggit, a goblin hero (55 points)</li>
<li>A Red Goblin Blaster, a cart full of explosives (65 points)</li>
<li>A regiment of Red Goblin Rabble (75 points exactly)</li>
</ol>
<p>Number 4 was my choice – I’ve wanted to paint some of Mantic’s (relatively new) hard plastic goblins since they were released, and this gave me an opportunity to paint a whole unit of them. While it would have been nice to paint another character or a cool weird thing like the Blaster, the army really needs more units than it needs toys.</p>
<p>I haven’t started the goblins yet, apart from having built one of them. I’ll get to them very soon though, so stay tuned!</p>
<p><img src="/images/2023/01/ogres/done.jpg" alt="" />
<em>675 points of Ogres, badly lit.</em></p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>I have to say I don’t find the new Empire of Dust models particularly impressive, and nor did my friend. They needed to be at least as good as the old Tomb King models, and they just aren’t! It’s a shame, the new Ogres had me believing that Mantic had broken out of their mediocre model phase, but it seems not to be the case. This makes me worried about some of the cool stuff they’re planning to reveal later in the year :fearful: <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
ELG Age of Sigmar 2k League: Game 12023-01-16T00:00:00+00:00http://rachelnertia.github.io/gaming/2023/01/16/batrep-elg-aos-2k-league-game-1<p><img src="/images/2023/01/battles/nighthaunt-vs-kharadron/my-army.jpg" alt="" /></p>
<p>I bit the bullet and entered this year’s <a href="https://www.edinburghandlothiangamers.co.uk/">Edinburgh and Lothian Gamers</a> Age of Sigmar league – twice, in fact, because there are two leagues, one for full-fat 2000-point armies and one for 1000-point armies.</p>
<!--more-->
<p>I entered the 2k league with my Nighthaunt and the 1k league with my Cities of Sigmar<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>. Both leagues are intended as fairly casual affairs, aimed more at getting some games in than determining who is the best Sigmar in Edinburgh.</p>
<p>The leagues are divided up into groups, and each person in a group has to play every other person in that group by the end (of April, I think?). There are 4 other people in both my groups, so I have to play 8 games total. Which is quite a lot, given how I normally only play about one game of AoS a month!</p>
<p>With a sense of urgency I got my first game arranged as soon as I could.</p>
<p>2k, Contest of Generals (the Matched Play battlepack found in the Core Book), at Red Dice Games against Salvatore. The battleplan we rolled was Rising Power, in which the three centre-line objectives take turns being worth two.</p>
<h2 id="kharadron-overlords">Kharadron Overlords</h2>
<p>Salvatore’s Kharadron Overlords army consisted of two <a href="https://www.games-workshop.com/en-GB/Kharadron-Overlords-Arkanaut-Ironclad-2017">Ironclads</a>, a unit of 10 <a href="https://www.games-workshop.com/en-GB/Kharadron-Overlords-Grundstok-Thunderers-2017">Grundstok Thunderers</a>, an <a href="https://www.games-workshop.com/en-GB/Kharadron-Overlords-Arkanaut-admiral-2017">Admiral</a> and three <a href="https://www.games-workshop.com/en-GB/Kharadron-Overlords-Aether-Khemist-2017">Aether-Khemists</a> (all riding in the Ironclads), and 3 units of 10 <a href="https://www.games-workshop.com/en-GB/Kharadron-Overlords-Arkanaut-company-2017">Arkanauts</a> (all walking on the ground). It has a lot of scary tech, a lot of scary shooting, and One Weird Trick:tm: (Spell in a Bottle – <a href="https://wahapedia.ru/aos3/factions/endless-spells/Purple-Sun-of-Shyish">Purple Sun</a>).</p>
<p>He had his whole list in two Battle Regiment battalions, so was able to deploy in two drops.</p>
<h2 id="nighthaunt">Nighthaunt</h2>
<p>My army contained two units of twenty <a href="https://www.games-workshop.com/en-GB/Etb-Chainrasp-Hordes-2018">Chainrasps</a>, ten scythe-wielding <a href="https://www.games-workshop.com/en-GB/Nighthaunt-Grimghast-Reapers-2018">Grimghast Reapers</a>, a unit of 3 <a href="https://www.games-workshop.com/en-GB/Nighthaunt-Spirit-Hosts">Spirit Hosts</a>, and a shitload of heroes. Seriously, nearly all the remaining points were spent on heroes. These heroes:</p>
<ul>
<li><a href="https://www.games-workshop.com/en-GB/Nighthaunt-Lady-Olynder-2018">Lady Olynder</a></li>
<li><a href="https://www.games-workshop.com/en-GB/Kurdoss-Valentian-The-Craven-King-2018">Kurdoss Valentian</a></li>
<li><a href="https://www.games-workshop.com/en-GB/Etb-Nighthaunt-Dreadblade-Harrows-2018">Dreadblade Harrow</a> (with Lightshard of the Harvest Moon, an artifact granting once-per-game +1 attacks wholly within 12”)</li>
<li><a href="https://www.games-workshop.com/en-GB/nighthaunt-ethereal-court-2022">Spirit Torment</a> (general)</li>
<li><a href="https://www.games-workshop.com/en-GB/nighthaunt-ethereal-court-2022">Guardian of Souls</a></li>
<li>Another Guardian of Souls</li>
</ul>
<p>I rounded off the list with a unit of 2 <a href="https://www.games-workshop.com/en-GB/Crawlocke-The-Jailor-And-Chainghasts-2018">Chainghasts</a> (who grant +1 to hit while the Spirit Torment is alive) and the <a href="https://www.games-workshop.com/en-GB/Battlemagic-Nighthaunt-2018">Shyish Reaper</a>, a cool-looking Endless Spell.</p>
<p>Like Salvatore, I had my army in two Battle Regiments.</p>
<p>Luckily, I won the roll-off to start deploying first, so I was able to finish deploying first and win priority in the first battle round.</p>
<h2 id="round-1">Round 1</h2>
<p>I had priority from finishing deployment first. Fearing being double-turned by a shooting army, and feeling reasonably confident about my deployment, I gave the first turn to the duardin.</p>
<p><img src="/images/2023/01/battles/nighthaunt-vs-kharadron/sund.jpg" alt="" /></p>
<p>I still think it was the right decision, but boy did I pay for it. Using a once-per-game hero phase Fly High, he was able to sneak the Purple Sun right into my heroes, instantly killing my general, the Spirit Torment. Then, even though I’d done my best to keep him from getting close enough to shoot Olynder with all his nastiest weapons, he still managed to blast her to smithereens. She took the whole unit of Spirit Hosts with her. Finally, he took out most of the Grimghast Reapers on my right flank.</p>
<p><img src="/images/2023/01/battles/nighthaunt-vs-kharadron/blasting.jpg" alt="" /></p>
<p>While he was blasting, his Arkanauts ran up onto the objectives, making use of their subfaction bonus to always run 6”. Quite speedy, for duardin!</p>
<p>He scored 5 points - 3 for objectives and 2 for his battle tactic.</p>
<p>Although I’d lost three key pieces in the first turn, my army was still in functional shape – and it was thirsty for revenge. I pushed everything forward towards his line and charged, taking care not to engage both Ironclads at once.</p>
<p><img src="/images/2023/01/battles/nighthaunt-vs-kharadron/my-turn.jpg" alt="" /></p>
<p>My Chainrasps obliterated the unit of Arkanauts on the left, rolling 61 attacks thanks to Lightshard of the Harvest Moon. Unfortunately he managed to kill the Dreadblade Harrow, so the buff didn’t apply to anything else. The other units that I managed to get into the Ironclad took a good chunk out of it. The Grimghast Reapers scythed through the central unit of Arkanauts.</p>
<p>Kurdoss failed his (admittedly quite difficult) charge, which was a shame as I’d probably have destroyed the Ironclad this turn if he’d made it.</p>
<p>I scored 5 points, 3 for objectives and 2 for my battle tactic (the one where you take an objective).</p>
<h2 id="round-2">Round 2</h2>
<p><img src="/images/2023/01/battles/nighthaunt-vs-kharadron/swarm.jpg" alt="" /></p>
<p>I got lucky on priority and took the double turn, pressing my advantage. He’d have been able to Fly High with the Ironclad and escape otherwise.</p>
<p>I completely swarmed the Ironclad. (I love retreat and charge.) (I also love Wave of Terror.) (I just love Nighthaunt, okay?) Kurdoss made it in and smashed it to smithereens. The Aether-Khemists riding in it had nowhere to land 3” away from all enemies, being completely surrounded, and were eliminated.</p>
<p>I scored 5 points, 3 for objectives and 2 for my battle tactic (have the most models near the centre).</p>
<p>On his turn, Salvatore pulled back to the right hand side of the board. He fired a lot of guns at Kurdoss, dealing <em>exactly</em> enough damage to hill him. Revenge!</p>
<h2 id="rounds-3-4-and-5">Rounds 3, 4 and 5</h2>
<p><img src="/images/2023/01/battles/nighthaunt-vs-kharadron/my-turn-3.jpg" alt="" /></p>
<p>I won priority again and took the turn, sweeping across the field towards Salvatore’s Ironclad, the 10 Thunderers and Admiral inside it, and the final unit of Arkanauts. My Grimghast Reapers, fully replenished after a successful Guardian of Souls spellcast, charged the Arkanauts and wiped them out. One of my Chainrasp units attempted to engage the Ironclad, doing a bit of chip damage and getting shot a lot.</p>
<p>I scored another 5 points.</p>
<p>With no Arkanauts left, the duardin weren’t really able to take objectives any more. I think his Ironclad escaped and the rest of the game was me chasing it, it Redeploying or Flying High.</p>
<p>The only thing that really happened was the Kharadron Admiral finally dying from being Cursed at the beginning of the game.</p>
<p>I was able to consistently score 3 points on my remaining turns, but not kill anything. So I finished on 21 points. Adding in my grand strategy (have battleline alive at the end) put me on 24 – squarely ahead.</p>
<h2 id="conclusions">Conclusions</h2>
<p>This was a fun game. I hadn’t played against Kharadron Overlords before and despite a bit of confusion and rules uncertainty they weren’t quite as destructive or unpleasant as I’d been led to believe. I hope they get a good new book though, it’s clear a lot of things could be done better.</p>
<p>Perhaps I should have put Olynder in reserve after deployment? Maybe? It’s possible I could have screened against all the shooting a bit better as well. And I definitely could have screened better against the Purple Sun! Fortunately the painful first turn wasn’t enough to lose the game for me, even if it was a shame to see my general <em>and</em> Olynder go down instantly.</p>
<p>I am bringing a battle round counter to the next game because we had a little bit of uncertainty at the end as to whether we were, in fact, at the end. Luckily we were able to figure it out – there was no way I could have scored 21 points in only 4 battle rounds (the maximum I could have scored was 20). I think I shall look for one of those very big D6s…</p>
<p>Salvatore was a great opponent and his army looked fantastic. I wish him all the best in his future aether-endeavours.</p>
<p>I’m feeling much better than I did after my first game in last year’s league. It’s nice to play an army that isn’t horribly feeble.</p>
<p>One game down, seven to go!</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>Perhaps this will be the last hurrah for my current Cities collection, before the new book (slated to come out some time this year), comes along and – presumably – completely reworks the faction. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Meet the Fighters2023-01-09T00:00:00+00:00http://rachelnertia.github.io/tabletop%20game%20dev/2023/01/09/meet-the-fighters<p>Over on the <a href="https://www.magewinds.com/blog">Magewinds blog</a>, I’ve been writing about all the different fighter types in the game, covering one (almost) every week. With today’s entry about the <a href="https://www.magewinds.com/blog/2023/01/09/meet-the-enchanter/">Enchanter</a>, I’ve finished the series, so why not go back through the <a href="https://www.magewinds.com/blog/tag_index#Meet%20the%20Fighters">archive</a> and catch up?</p>
Hobby Lookback 20222022-12-29T00:00:00+00:00http://rachelnertia.github.io/hobby/2022/12/29/hobby-lookback<p>2022 was a good hobby year. Let’s attempt to piece it together.</p>
<!--more-->
<h2 id="january">January</h2>
<p><img src="/images/2022/01/hobby/balins-tomb/game.jpg" alt="" />
<em>Battle in Balin’s Tomb. Not, it turned out, a very good game, but fun for a half hour of nostalgic action.</em></p>
<p>I began the year painting some Middle-Earth miniatures from the Battle in Balin’s Tomb box. Read all about it <a href="/hobby/2022/01/09/balins-tomb/">here</a>.</p>
<p>Then I <a href="/hobby/2022/01/17/elfs/">painted some elves</a>.</p>
<p>Then, at long last, I painted the <a href="/hobby/2022/01/18/hills-and-fort/">mighty Warhammer Fortress</a>. Has it seen the table yet? No. I also scratch-built a few bits of terrain, including some steps to go with the Fortress.</p>
<p>I painted up my glorious Secret Santa gift – a <a href="/hobby/2022/02/16/the-gate-and-the-giftbringer/">squig sleigh</a>!</p>
<h2 id="february">February</h2>
<p><img src="/images/2022/04/hobby/olynder_multiple.jpg" alt="" />
<em>Lady Olynder, ghost mum</em></p>
<p>Into February I continued my scratch-building kick with more rocks and hills and basic stuff like that.</p>
<p>I also had a go at making ladders, platforms and walkways out of bits of sprue. This was quite successful really, although I didn’t finish and paint any of the results. It would be a good way to add to a Warcry board.</p>
<p>I painted up an Ophidian Archway, which I am now giving a base, because I think it’ll look better.</p>
<p>Back on the <a href="/hobby/2022/04/20/nighthaunt/">Nighthaunt</a> after a year, I built and painted up 5 Hexwraiths, 5 more Hexwraiths (actually Black Knights painted to look ghostly because I couldn’t handle the thought of building any more Hexwraiths), Kurdoss Valentian and Lady Olynder. It felt good to return to the army and the colour scheme I love so much.</p>
<p>Later in the year Nighthaunt got a (mostly) good new book. I’ve enjoyed my games with the ghosts since it came out.</p>
<h2 id="march">March</h2>
<p><img src="/images/2022/04/hobby/dark_elf_warriors.jpg" alt="" />
<em>1990s-era Dark Elf Warriors. Some of these models may be older than myself.</em></p>
<p>I worked on some more <a href="/hobby/2022/04/20/dark-aelves-of-nuloren/">Darkling Covens</a> (Dark Elf) models for my Cities of Sigmar army, including 5 old metal Black Guard. I love these guys.</p>
<p>Around this time I tried playing in the Edinburgh and Lothian Gamers (ELG)’s AoS league down at Red Dice Games. I brought my fluffy Cities army (3 Steam Tanks and a shitload of aelves) to three General’s Handbook 2021 Pitched Battles and got completely stomped in all of them. I knew what I was getting into, but still… not the best time I’ve had playing the game.</p>
<p>I’m currently swithering on joining 2023’s first-quarter AoS league, which is at least pitched as a somewhat more casual affair, with Contest of Generals (the Matched Play battlepack from the Core Book) as the default game type. I should do it, right?</p>
<h2 id="april">April</h2>
<p><img src="/images/2022/04/hobby/kainans_reapers_front.jpg" alt="" />
<em>Kainan’s Reapers, sans Kainan himself</em></p>
<p>I painted a couple of Underworlds warbands: <a href="/hobby/2022/04/20/kainans-reapers/">Kainan’s Reapers</a>, the Ossiarch Bonereapers warband; and <a href="/hobby/2022/05/03/hedkrakkas-madmob/">Hedkrakka’s Madmob</a>, the Bonesplitterz (Savage Orruks) warband. I’m not sure I like how the Bonesplitterz turned out, might be worth revisiting the capes and cloaks at least.</p>
<p>I made a couple of rubble sections to go with my Warhammer Fortress. In the unlikely event that I actually ever play a game with it, these will replace the wall sections when they get destroyed by siege weapons.</p>
<p>I painted up a bunch more Garden of Morr terrain, and even scratch-built a bunch of cute little flat pieces of graveyard terrain, using up some Renedra gravestones and plastic flagstones I had lying around. Some of them warped a bit, unfortunately, but are perfectly useable.</p>
<h2 id="may">May</h2>
<p><img src="/images/2022/12/wight-king.jpg" alt="" />
<em>Wight King</em></p>
<p>I painted a Wight King and a Necromancer. These were perfect low-cost impulse purchases. They make a cute couple. I continued the dark-blue and purple theme I set upon with my Cursed City miniatures, but this time with snow to match some Skeleton Warriors (and the Sepulchral Guard) I painted a while before.</p>
<p>Continuing the undead theme, I painted up the Crimson Court, a Underwords warband consisting of 4 cool-as-hell vampires. I started with the same blue-shadows basecoat as with the other undead but painted their armour red because, well, “crimson” is right there in the name. Think it turned out ok, although I think there could be stronger highlights across all the non-metallic parts of the models.</p>
<h2 id="june">June</h2>
<p><img src="/images/2022/12/stardrake.jpg" alt="" />
<em>Firchlis, the Boreal Tempest</em></p>
<p>I received a Stardrake cheap and pre-built (including magnetized rider options!) from a fellow Rollmodel, and painted that up. This was one of the biggest models I’ve ever painted, and quite a big project. Very pleased with it. One day she might even get to play.</p>
<p>I also painted a Frostgrave Lich and Apprentice, and a Thaumaturge Apprentice.</p>
<h2 id="july">July</h2>
<p><img src="/images/2022/12/ttcombat-ruins.jpg" alt="" />
<em>TTCombat Ruins, nicely based</em></p>
<p>I made some upgrades to some old terrain. I added some nice pennants to my watchtower and an optional base. (I think I might give it a non-optional base, because it looks inseparable from it now.)</p>
<p>I stuck my old TTCombat ruins on bases, which makes them look <em>so</em> much better.</p>
<p>And I made some optional bases for my Azyrite Ruins. I ended up not liking these, and intend to try again someday.</p>
<p>I painted a Frostgrave Thaumaturge and 15 assorted Frostgrave soldiers, cultists and barbarians. These are intended for use in Frostgrave, Magewinds and general purpose fantasy gaming.</p>
<h2 id="august">August</h2>
<p><img src="/images/2022/12/horns-of-hashut.jpg" alt="" />
<em>Horns of Hashut</em></p>
<p>I painted the Spire Tyrants, a Warcry warband, in a Heresy-era World Eaters-inspired colour scheme. I’d like to paint more AoS Chaos things in this scheme.</p>
<p>Then Warcry 2nd Edition dropped, with the <em>Heart of Ghur</em> boxset. I sold the Rotmire Creed warband to Kara and painted up the Horns of Hashut myself.</p>
<p>Warcry was already Games Workshop’s best game, but 2nd Edition was a great update. They made some welcome tweaks to the existing rules, added Reactions (which definitely change the game in an interesting and mostly-better way), and updated the rules for all pre-existing models useable in the game and stuck them all in one big book. Most of the old content is compatible, or at least adaptable. I’ve played lots of games of Warcry in the latter half of this year and enjoyed all of them.</p>
<p>With the boxset came a lot of “Gnarlwood” terrain. I had fun painting these, and I think they look great (I painted the trees red, as if they are made from flesh), but frankly I can’t give the terrain a good review. It’s hard to assemble and crap for actually playing the game, in two ways:</p>
<ol>
<li>Verticality is fun in Warcry, and this terrain doesn’t provide enough of it. The old terrain had big flat rooftop areas for models to climb up onto and spread out on, which was great. With this stuff, you’re constantly struggling to fit things on the tiny platforms and rope bridges. Also climbing models up onto the platforms feels a lot stranger than climbing up a vertical wall.</li>
<li>Good luck trying to move your models without accidentally snagging a tree branch. (I actually sawed the treetops off and magnetized the trunks so they’re removable, but this isn’t possible with all the trees they’re releasing as part of this “season”.)</li>
</ol>
<p>It quite put me off the idea of buying the 2nd boxset, even though I adore both warbands. It looks cool, though.</p>
<h2 id="september">September</h2>
<p><img src="/images/2022/12/orc-fleet.jpg" alt="" />
<em>Orc fleet</em></p>
<p>I did my damnedest to spruce up some old Saurus Warriors so I’d be happy putting them on the table in games of Warcry. I think I’ve had these guys since I was like 14? They were one of the first things I painted when getting into the hobby finally <a href="/personal/2017/11/21/the-hobby/">back in 2017</a>, and it showed.</p>
<p>At a meetup in the summer my friend Luke very kindly dumped his built-but-unpainted Kings of War Armada starter set on me, because he didn’t think he’d ever want to paint it. So I painted up the Orc half and made inroads into the Basilean (read: goody-two-shoes humans) half.</p>
<h2 id="october">October</h2>
<p><img src="/images/2022/12/basilean-fleet.jpg" alt="" />
<em>Basilean fleet</em></p>
<p>I finished off the Basilean fleet. I have yet to play a game of Armada…</p>
<p>I “shipped” Magewinds, my own skirmish game, by setting up the <a href="www.magewinds.com">website</a>. After a year plus of serious development – design, testing, iteration – it felt <em>glorious</em> to see it out the door. There is, however, <a href="https://www.magewinds.com/blog/2022/10/22/roadmap/">much more</a> to be done.</p>
<p>I bought some <a href="https://www.renedra.co.uk/product-category/terrain/ruins/">Renedra ruins</a>, identifying that they’d be perfect for a Magewinds-sized battlefield, and painted them up quickly.</p>
<p>I also painted up a <a href="https://www.games-workshop.com/en-GB/age-of-sigmar-megadroth-remains-2022">Megadroth Remains</a>, to go with my Gnarlwood terrain.</p>
<h2 id="november">November</h2>
<p><img src="/images/2022/12/freelance.jpg" alt="" />
<em>Mordheim Freelance Knight</em></p>
<p>I got a cheap (£10!) <a href="https://www.games-workshop.com/en-GB/age-of-sigmar-krondspine-incarnate-of-ghur-2022">Krondspine Incarnate of Ghur</a> from a friend and built and painted it up. Building it was kind of a nightmare – I had to magnetize the base and place it vertically on a radiator so it would set without having a permanent forward lean. Even aiming for a very simple paint job it was a challenge, with <em>too many</em> difficult crevices to get into with the brush.</p>
<p>The rules for actually using “Incarnates” are only available in the Thondia book, which I haven’t picked up yet. I don’t know if it would fit into any of my armies anyway.</p>
<p>I painted up a Mordheim freelance knight model, for use in Magewinds, and a Reaper dark elf priest too. And also a cute little fox Kara got me!</p>
<p>I built and painted a Chimera, going for a fancy purple and blue scheme.</p>
<p>And I finally painted Elathain’s Soulraid, completing my collection of Underworlds warbands up to the end of the Direchasm season. I completed them in time to take them to the <a href="/gaming/2022/12/17/rmro-ix/">RMRO</a> in December, where I played a couple of games with them which really rekindled my interest in Underworlds.</p>
<p>I painted some Moria Goblins I had lying around. I kinda want to try out the Middle-Earth Strategy Battle Game with a Moria army in 2023.</p>
<h2 id="december">December</h2>
<p><img src="/images/2022/12/fungoid.jpg" alt="" />
<em>Fungoid Cave-Shaman</em></p>
<p>I painted a nice wee Gitmob Grot Shaman I picked up at Knightly Games earlier in the year. He’s been out of production since 2019, so it felt like finding a rare gem amongst the shelves. He can join my already-great number of Madcap Shamans in my Gloomspite Gitz collection.</p>
<p>I also painted a Fungoid Cave-Shaman, probably one of the best grot models GW have put out since AoS started, and a squad of Sneaky Snufflers, adorable mushroom-finding squigs and their handlers.</p>
<p>I finished up the year making inroads into <a href="https://www.manticgames.com/games/kings-of-war/">Kings of War</a> with a small Ogre army. The addition of “Ambush” – a low-points game mode intended for quick and/or introductory battles – in the <a href="https://www.manticgames.com/games/kings-of-war/books-kings-of-war/kings-of-war-2022/">latest book</a> made me feel like now was a good time to jump in, so I found someone to play with locally, chose an army (the brand-new <a href="https://www.manticgames.com/games/kings-of-war/kings-of-war-factions/ogres/ogre-warriors-horde-2/">plastic ogre kit</a> made that easy) and got to work. We’re hoping to have our first 750-point game early in the new year.</p>
<p>At this point all I need to do is multi-base the 4 ogre regiments I’ve just finished painting (I’m waiting for the bases to arrive); acquire, build and paint a regiment of goblins (they fit perfectly in the remaining 80 points, and I could not resist an opportunity to try painting some of <a href="https://www.manticgames.com/games/kings-of-war/goblins/goblin-regiment-2020/">Mantic’s goblins</a>); then I’ll be ready to play!</p>
<p>All in all, a good hobby year. I even accomplished some of <a href="/hobby/2022/01/01/hobby-goals-and-resolutions/">my goals</a> and stuck to some of my resolutions. I’m not sure what I’ll spend the remaining days of it doing. Perhaps even… not hobbying? – but I’m not sure I know how to do that anymore…</p>
RMRO IX2022-12-17T00:00:00+00:00http://rachelnertia.github.io/gaming/2022/12/17/rmro-ix<p>Last weekend I travelled down to Stockport (near Manchester) for a Rollmodels meetup (a “Rollmodels Roll Out”) at <a href="https://elementgames.co.uk/north-west-gaming-centre">Element Games North West</a>. It was an excellent time!</p>
<p><img src="/images/2022/12/aos-game.jpg" alt="" /></p>
<!--more-->
<p>On Saturday morning I played most of an Open War game of Age of Sigmar against
LeSwordfish’s pretty Seraphon army.</p>
<p>My Nighthaunt stood up well, managing to take out the enemy general Saurus on Carnosaur when it charged into the right flank (he disappeared in a swarm of chainrasps), but ultimately couldn’t handle the magical onslaught coming from the Slann Mage-Priest<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup> and all the Skink shooting.</p>
<p>Kurdoss managed to break through and take out the Razordons (a terrifying shooting unit), but they promptly respawned behind my line because my opponent had the Reinforcements ruse.</p>
<p><img src="/images/2022/12/kurdoss-vs-slann.jpg" alt="" /></p>
<p>He then made a Hail Mary charge through the enemy line and squished the accursed Slann (shown above - photo credit: LeSwordfish), before being speared by many, many Saurus Warriors. As it was now midday we decided to call it there. I think my opponent would have won, but there was a chance of victory for me if I got lucky with priority and moved well.</p>
<p>I concluded I didn’t have the stamina for more AoS, and made the switch to skirmish games for the rest of the weekend.</p>
<p>That afternoon I played two games of Warhammer Underworlds with my newly-painted Elathain’s Soulraid.</p>
<p><img src="/images/2022/12/underworlds.jpg" alt="" /></p>
<p>Photo credit: WhamBadger.</p>
<p>It was fun! Thanks to Cronch and Scops for the games.</p>
<p>I feel like Rivals format is about the level of engagement I want to have with the game, and the Soulraid have a pretty good warband deck that provides plenty of flexibility and interesting gameplay to explore. I want to play more…</p>
<p>Others at the event were playing AoS, 40k, Kill Team, Warcry, Necromunda, <a href="https://www.grippingbeast.co.uk/SAGA.html">Saga</a>, <a href="https://greyfornow.com/pages/02-hundred-hours">0200 Hours</a>, Underworlds, Blood Bowl, and probably others I didn’t notice or have forgotten. It was lovely to see people, catch up, and watch so many games being enjoyed.</p>
<p>In the evening I unwrapped my Secret Santa gift, that had mysteriously appeared under the Christmas tree next to Michael’s 0200 Hours table:</p>
<p><img src="/images/2022/12/secret-santa-gift.jpg" alt="" /></p>
<p>HELL yeah. Thanks Santa! Will be painting them up soon.</p>
<p>On Sunday, I taught <a href="www.magewinds.com">Magewinds</a> to two brave volunteers. They seemed to have a good time, and I noticed a mistake in the rules on the website (fixed now!), so all in all it was time well spent. I would have liked to have played more!</p>
<p><img src="/images/2022/12/magewinds-game.jpg" alt="" /></p>
<p>Me and Kara played a fun game of Warcry, in which I managed to eke out a victory right at the end. And then, after a quick raid of the extremely well-stocked Element Games shop, it was time to travel back.</p>
<p>I definitely wasn’t 100% recovered from covid at the weekend, as I re-irritated my throat with all the talking and kept having nasty sinus headaches. This put a damper on things but I’m just glad I was able to come at all.</p>
<p>Many thanks to Axolotlquestions for driving us there and back, to Peter for organising the meetup, and to Element Games for hosting and for being such an impressive venue!</p>
<p>Now the long wait until the next RMRO I can attend begins…</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>It didn’t help that I forgot to use my Spirit Hosts’ bodyguard rule until it was far too late to help! <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Magewinds2022-10-12T00:00:00+00:00http://rachelnertia.github.io/tabletop%20game%20dev/2022/10/12/magewinds<p>I released a game today! It’s called <em>Magewinds</em>, and it’s a tabletop miniature skirmish wargame in which everyone is a wizard.</p>
<p>The game has a <a href="http://www.magewinds.com/">website</a> where you can find <em>all</em> the rules, completely free, presented in <a href="http://www.magewinds.com/rules">web-browsable format</a>.</p>
<p><em>Magewinds</em> is the culmination of far too many years of daydreaming, experimenting, prototyping, playtesting and polishing, with the <a href="http://www.magewinds.com/thanks/">help</a> of so many lovely people.</p>
<p>And it’s not even really <em>done</em> yet! We’re only just beginning our adventures in Tempestia…</p>
<p><img src="/images/guardian.png" alt="" /></p>
Tiny Plastic People2022-05-03T00:00:00+00:00http://rachelnertia.github.io/hobby/2022/05/03/tiny-plastic-people<p><img src="/images/2022/05/tpp.png" alt="TPP Logo" /></p>
<p>Have you heard of <a href="https://tinyplasticpeople.com/">Tiny Plastic People</a>? It’s a website and podcast run by some pals of mine and if you haven’t checked it out yet, you really should!</p>
<p>I’ve even contributed an article myself and been on a couple of podcasts, but I’ll leave you to explore the site and its content for yourself.</p>
Hedkrakka's Madmob2022-05-03T00:00:00+00:00http://rachelnertia.github.io/hobby/2022/05/03/hedkrakkas-madmob<p><img src="/images/2022/05/hobby/kedkakka.jpg" alt="Hedkrakka, the Wurrgog Prophet" /></p>
<p>Orcs are bullies. We all know this, and yet, it is sometimes nice to paint the bullies, and play as them. Recently I painted up <a href="https://www.games-workshop.com/en-GB/WHU-Hedkrakkas-Madmob-EN-2021">Hedkrakka’s Madmob</a>, the Bonesplitterz warband for <em>Warhammer Underworlds: Direchasm</em>.</p>
<!--more-->
<p>The <a href="https://ageofsigmar.lexicanum.com/wiki/Bonesplitterz">Bonesplitterz</a> are a super fun faction in Age of Sigmar: orruks who prefer a simpler way of life. They swear off metal armour and weaponry, putting their trust instead in primal magical force to protect them and making weapons from the bones, teeth, horns and claws of the monsters they like to hunt.</p>
<p>Above is Hedkrakka, a Wurrgog Prophet. That means a guy who boogies to make magic happen by pumping up his fellow orcs.</p>
<p>I think I kinda messed up the cloth. I wish it were just orange, rather than such a dark purple in the recesses, but it’s ok.</p>
<p>The vibrant green is FW Ink Emerald Green, allowed to run into the grooves around his mask, hand, and staff-head to give the impression of a magical glow.</p>
<p>Here are Hedkrakka’s crew:</p>
<p><img src="/images/2022/05/hobby/madmob_front.jpg" alt="The Madmob, front view" /></p>
<p>A characterful bunch. I’m much more satisfied with the colours on these, which is easier to say because they’re much simpler models.</p>
<p>Apparently the guy with claws would make a good alternative sculpt for a <a href="https://www.games-workshop.com/en-GB/Savage-Orruk-Warboss">Savage Big Boss</a>, although he’s on a bigger base. (That’s not a deal-breaker in my opinion.)</p>
<p><img src="/images/2022/05/hobby/madmob_back.jpg" alt="The Madmob, rear view" /></p>
<p>Maybe I’ll do a Bonesplitterz Warcry warband at some point… maybe even a small AoS force… In the short term, I have only two more warbands to go until I’ve painted all of Direchasm. Onwards and upwards.</p>
Nighthaunt2022-04-20T00:00:00+00:00http://rachelnertia.github.io/hobby/2022/04/20/nighthaunt<p>Last year, mostly in March and April, I painted a <a href="https://twitter.com/nershly/status/1391401181319204865"><em>lot</em></a> of Nighthaunt. I was still waiting on a few more models to appear in <a href="https://hachettepartworks.com/en-en/warhammer-age-of-sigmar-mortal-realms/">Mortal Realms magazine</a> so I could round out my collection - <a href="https://www.games-workshop.com/en-WW/Nighthaunt-Lady-Olynder-2018">Olynder</a>, <a href="https://www.games-workshop.com/en-WW/Kurdoss-Valentian-The-Craven-King-2018">Kurdoss</a>, and some <a href="https://www.games-workshop.com/en-WW/Nighthaunt-Hexwraiths-2018">Hexwraiths</a>. Finally, this February, I got around to building and painting them.</p>
<!--more-->
<p>I started off by putting together the first five of ten Hexwraiths. This kit sucks so much to build, man. Just awful. And I can imagine how bad it’s gonna be to push around the table, too.</p>
<p><img src="/images/2022/04/hobby/hexwraiths.jpg" alt="Five Hexwraiths" /></p>
<p>My Nighthaunt paint scheme is very simple – turquoise/blue cloth, rusty metal, and green accents, with dark blue bases – but I’d forgotten how to paint it. It took me a little while to get it back. For future reference, here it is:</p>
<ul>
<li>Preparation: Airbrush white, airbrush turquoise, drybrush white.</li>
<li>Dark blue cloth: Shyish Purple, drybrush white, Talassar Blue. I can avoid repetition by doing the purple before the all-over drybrush step from the preparation phase.</li>
<li>Use Aethermatic Blue and Nihilakh Oxide to add some depth to skulls, arms, etcetera.</li>
<li>When painting the hafts/handles of weapons, leave a bit of blue-green around the hands of the wielder, to show that the weapon itself is also kind of ethereal.</li>
<li>Metal: Gryph-Hound Orange, then use a grey metallic paint to pick out edges and areas where the rust has been scraped away.</li>
<li>Green: Scorpion Green (sadly out of production, but it has a contemporary equivalent - a very saturated green). Sometimes, if feeling special, work a bit of yellow into the absolute brightest bit, and darken down the extremities of the flame/light with a dark turquoise.</li>
<li>Bases: Drakenhof Nightshade, selective shading with a runny dark blue (I water down Necron Abyss (also OOP, sorry)). Leave a bit of white/turquoise around where the ghost is touching the base, to give the impression of a glow.</li>
</ul>
<p>I hated building the Hexwraiths so much I couldn’t face the thought of doing another five, so I decided I’d build the next unit as Black Knights, but paint them ghostly. I think this turned out rather well.</p>
<p><img src="/images/2022/04/hobby/black_knight_hexwraiths.jpg" alt="Hexknights" /></p>
<p>They were still quite bad to build, though. I did a long building session putting these and the two heroes together one Sunday and woke up the next morning with a repetitive strain injury in my right wrist that has yet to fully heal. Coincidence? I think not.</p>
<p><img src="/images/2022/04/hobby/black_knight_hexwraiths_2.jpg" alt="Hexknights" /></p>
<p>After I’d painted my horses, I moved onto the heroes. Here is Olynder, in all her glory:</p>
<p><img src="/images/2022/04/hobby/olynder_multiple.jpg" alt="Olynder" /></p>
<p>Perhaps one of my favourite Citadel models.</p>
<p>There are some <a href="https://www.reapermini.com/search/tomb/latest/77534">Reaper tombstones</a> on her base, which I picked up at <a href="https://www.facebook.com/blacklionedinburgh">Black Lion Games on Buccleuch Street</a>. On top of being a great board game shop, they now have a good stock of Reaper miniatures. It’s hard to resist the temptation to pick something up whenever I’m walking by. Anyway, these lovely graves provide a bit of visual interest as well as some much-needed support - Olynder was <em>very</em> wobbly when she wasn’t attached to one of them.</p>
<p>Finally, in his rightful place at the end of the procession, floats the Craven King, Kurdoss Valentian:</p>
<p><img src="/images/2022/04/hobby/kurdoss.jpg" alt="Kurdoss" /></p>
<p>I look forward to using all these shiny new spectres in battle, probably after the new Battletome is released. I’m sure, down the line, I’ll pick up some more Nighthaunt. Those new Cross-boos look fun, and the boat guy is also pretty sweet. In the meantime I’m content to feel like the collection is ‘finished’.</p>
Kainan's Reapers2022-04-20T00:00:00+00:00http://rachelnertia.github.io/hobby/2022/04/20/kainans-reapers<p><img src="/images/2022/04/hobby/kainans_reapers_front.jpg" alt="Kainan's Reapers, front view" /></p>
<p><a href="https://www.games-workshop.com/en-GB/WH-Underworlds-Kainans-Reapers-EN-2021">Kainan’s Reapers</a> are the Ossiarch Bonereapers warband for <em>Warhammer Underworlds: Direchasm</em>. I’ve kind of fallen off <em>Underworlds</em>, but I plan on collecting all the warbands from <em>Direchasm</em> anyway, because they’re all just such cool models<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>.</p>
<!--more-->
<p><img src="/images/2022/04/hobby/kainans_reapers_back.jpg" alt="Kainan's Reapers, rear view" /></p>
<p>When I sat down to paint these I didn’t really know what kind of colour scheme I wanted to go for. Something simple, I thought, with only a few colours. Something death-themed, with the blues, purples and greens that have made their way onto other undead models I’ve painted.</p>
<p>In the end, I settled on this purple scheme, with a grey exoskeleton and boney endoskeleton. I like it a lot!</p>
<p>The exoskeleton is Space Wolves Grey, the endoskeleton is Skeleton Horde, and the purple is FW Ink ‘Purple Lake’. I wish there was a Citadel purple that was as saturated and juicy.</p>
<p>Here is the big bone boy Kainan himself:</p>
<p><img src="/images/2022/04/hobby/kainan.jpg" alt="Kainan" /></p>
<p>Ossiarch Bonereapers are pretty neat. I knew that already, but now I think it so much I could totally see myself painting more of them. Maybe little a <em>Warcry</em> warband, as a treat…</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>I’ll probably pick up warbands from subsequent seasons like <em>Harrowdeep</em> for the same reason. Additionally, the warbands from <em>Direchasm</em> and previous seasons all have rules for use in <em>Warcry</em> now, which makes them even more tempting. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Dark Aelves of Nuloren2022-04-20T00:00:00+00:00http://rachelnertia.github.io/hobby/2022/04/20/dark-aelves-of-nuloren<p><img src="/images/2022/04/hobby/dark_elf_command.jpg" alt="Dark Elf Command" /></p>
<p><em>Of the many factions and cultures that dwell in the great tree-city of Nuloren, few are as sinister as the denizens of the Darkling Covens. Fewer still have sacrificed as much in defence of the realm. Often have these shadowy aelves given their lives in droves, shining ranks of ensorcelled warriors bearing the brunt of enemy charges while their commanding sorceresses hurl evil magicks overhead. It doesn’t help that said sorceresses have no qualms about using the life-force of their underlings to empower themselves…</em></p>
<p>I figured it was time this branch of the Nuloren armed forces got some reinforcements.</p>
<!--more-->
<p>First, we have the Dark Elf Warriors I left unpainted in November when I was churning out models for the army I took to the Rollmodels meetup in Bathgate. 14 models, some of whom have a thick layer of seemingly-unstrippable ancient paint underneath their fresh coat, giving them a slightly lumpy appearance that is fortunately only noticeable up close.</p>
<p>Serendipitously I found the command models, pictured above, going at an affordable price on eBay. Here they are in formation with the 14 rank-and-file, plus a reference model from the previous batch:</p>
<p><img src="/images/2022/04/hobby/dark_elf_warriors.jpg" alt="Warriors" /></p>
<p>I run them as <a href="https://www.games-workshop.com/en-GB/Dark-Elves-Bleakswords">Bleakswords</a>, which they’re a perfect fit for, being simply older versions of the same model. With this group done I now have enough models to run two units of 20, or a big unit of 30 and a unit of 10.</p>
<p>Meanwhile I had 5 Black Guard left over. The person I bought them from must have used the other 5 for a conversion, perhaps? Or maybe they used to come in boxes of 15?</p>
<p><img src="/images/2022/04/hobby/black_guard.jpg" alt="Black Guard" /></p>
<p>Five Black Guard is not enough for a whole unit, but fortunately I had one very old metal Black Guard sitting in a box<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>. This gave me the idea of picking up four more Black Guard of the same time period on eBay.</p>
<p><img src="/images/2022/04/hobby/old_black_guard.jpg" alt="Black Guard" /></p>
<p>A unit of 20 Black Guard is quite a fun thing in the game, too, at least against things that aren’t mega heavily-armoured, because they put out a <em>lot</em> of attacks, most of which land.</p>
<p><em>Thus reinforced, the Darkling Covens of Nuloren are eager for opponents to test their increased strength against…</em></p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>Courtesy of fellow Rollmodeller Chimp, via other fellow Rollmodeller Cronch. The great cycle of unwanted models is real. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
The Gate and the Giftbringer2022-02-16T00:00:00+00:00http://rachelnertia.github.io/hobby/2022/02/16/the-gate-and-the-giftbringer<p>Hobby update!</p>
<p>Despite pissing about with some other things<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>, I have managed to finish a couple of projects.</p>
<p>Firstly, the Ophidian Archway. This recently-out-of-production kit has been catching my eye for years, so when I spotted a built one going for a reasonable price (a bit less than the original RRP, actually) I had to grab it.</p>
<p><img src="/images/2022/02/hobby/archway.jpg" alt="Ophidian Archway" /></p>
<!--more-->
<p>It arrived partially broken and primed black. I reattached the broken part with some glue and milliput (there was a big gap) and put a little bit of extra primer over the top with the airbrush. Then to paint it I did a lot of drybrushing grey colours, made use of my barely-used-these-days Citadel metallic paints for the metal parts, and made light use of some washes (Seraphim Sepia, Agrax Earthshade) to add a bit of colour variation.</p>
<p>It’ll make a great addition to my terrain collection. For future work I might mount it on a base. If I get a chance to get another cheaply I’ll probably take it – it was a lot of fun to paint this one and I had <em>many</em> ideas for other ways I could have approached it.</p>
<p>After that, I painted up the gift I got from my community Secret Santa:</p>
<p><img src="/images/2022/02/hobby/santa-01.jpg" alt="Squig sleigh - front view" title="Truly a horrible git" /></p>
<p>Yep, that’s a night goblin Santa impersonator, riding a sleigh pulled by a gang of squigs. A truly incredible kitbash. I am in <em>awe</em> of my Secret Santa’s skills.</p>
<p><img src="/images/2022/02/hobby/santa-02.jpg" alt="Squig sleigh - left view" /></p>
<p>I’m pleased with how the paint job came out. After priming black, I covered everything in a dark blue before coming in from above with off-white paint and a drybrush of white to pick out the raised areas. After that it was mostly a Contrast job, highlighting details with normal paint.</p>
<p>Finally, I went back to scratch-builing terrain, using up the last of my XPS foam to construct 1-inch-tall flat-topped hills:</p>
<p><img src="/images/2022/02/hobby/terrain/cliffs.jpg" alt="Cliffs" /></p>
<p>As well as a couple of spires:</p>
<p><img src="/images/2022/02/hobby/terrain/spires.jpg" alt="Spires" /></p>
<p>And some weird rocks:</p>
<p><img src="/images/2022/02/hobby/terrain/rocks.jpg" alt="Rocks" /></p>
<p>I discovered a trick when painting these. Finding the grey I’d painted them to be a bit cold and flat, I decided to try a careful drybrush of Ushabti Bone - a light khaki - on the edges of things. This really, really worked to add definition and contrast to them, even making the darker grey in the recesses appear almost blue to the eye. Very neat. It worked so well I’m tempted to try it on some of the other terrain I’ve built and painted…</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>I spent a lot of time breaking down my entire collection of empty sprues into parts that can be used for scratch-building things. Don’t do this - your hands will hurt. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Hills and Fort2022-01-18T00:00:00+00:00http://rachelnertia.github.io/hobby/2022/01/18/hills-and-fort<p>I’m on a terrain kick! The best kind of kick.</p>
<p>First of all, I finally painted the rest of the Warhammer Fortress:</p>
<p><img src="/images/2022/01/hobby/terrain/fortress.jpg" alt="" /></p>
<!--more-->
<p>While I was working my way through that I cut up some foam to make some nice flat-topped, steep-sloped hills:</p>
<p><img src="/images/2022/01/hobby/terrain/hills.jpg" alt="" /></p>
<p>These should be much easier to play with than the previous hills I made, which have much longer, 45-degree angle slopes that are kind of awkward to measure distances around.</p>
<p><img src="/images/2022/01/hobby/terrain/steps-wip.jpg" alt="" /></p>
<p>I then made some foam steps to accompany the Fortress so I can configure it in more ways without having first-floor doors that open onto nothing.</p>
<p><img src="/images/2022/01/hobby/terrain/steps.jpg" alt="" /></p>
<p>Neat, huh?</p>
<p>And now I’m finally doing something useful with my boxes full of empty sprues:</p>
<p><img src="/images/2022/01/hobby/terrain/ladder.jpg" alt="" /></p>
Elfs2022-01-17T00:00:00+00:00http://rachelnertia.github.io/hobby/2022/01/17/elfs<p>Lately I’ve been painting up some classic Middle-Earth elves, starting with some archers:</p>
<p><img src="/images/2022/01/hobby/elves/archers.jpg" alt="" /></p>
<p>And some blade-wielding warriors:</p>
<p><img src="/images/2022/01/hobby/elves/swordsmen.jpg" alt="" /></p>
<!--more-->
<p>These models are like ur-Warhammer, to me, being among the first Games Workshop kits I ever saw and laid hands on. These particular models may in fact be the very same ones I got in that <a href="https://www.games-workshop.com/en-GB/Warriors-Of-The-Last-Alliance-2018">Warriors of the Last Alliance</a> box, sometime back in 2001 or whenever. Some of them, at least - I think a good few of them were Katamari’d up from other places, such as Nat’s parents’ attic.</p>
<p>I admire their simple elegance.</p>
<p>I went for a greeny-blue colour scheme. The gold armour is Vallejo Metal Color Gold washed with Coelia Greenshade, while the capes are a dark grey-blue in the recesses and green on the edges and creases. Terradon Turquoise, a personal favourite, also made an appearance. I like it, and it’s pretty fast!</p>
<p><img src="/images/2022/01/hobby/elves/spearmen.jpg" alt="" /></p>
<p>I also managed to acquire some of the ones with spears and shields second-hand. I even purchased a blister of 4 of the current finecast versions available for sale <a href="https://www.games-workshop.com/en-GB/High-Elf-Warriors">on the GW website</a>. I don’t completely regret that purchasing decision, but <em>oh lord</em> were the metal ones better to work with.</p>
<p>I also bought the <a href="https://www.games-workshop.com/en-GB/Elf-Command">Elf Command</a> blister. Thankfully these two guys are still made in metal.</p>
<p><img src="/images/2022/01/hobby/elves/command.jpg" alt="" />
<img src="/images/2022/01/hobby/elves/command-rear.jpg" alt="" /></p>
<p>I suppose I should paint something on the banner, but I don’t know what. Also freehand is hard and slow.</p>
<p>Finally I painted up the mounted Glorfindel I’ve had for many years. I painted the on-foot version that came in the same blister a couple of years ago, but in a different colour scheme. Maybe I’ll go back and repaint him to match?</p>
<p><img src="/images/2022/01/hobby/elves/glorfindel.jpg" alt="" /></p>
<p>He’s on a rectangular base instead of the circular one he’s meant to go on because, ultimately, I’m planning to use these models to play <a href="https://ospreypublishing.com/oathmark">Oathmark</a>. And even if I do somehow end up playing Middle-Earth with Glorfindel, it shouldn’t matter much if he’s on the wrong base.</p>
Battle in Balin's Tomb2022-01-09T00:00:00+00:00http://rachelnertia.github.io/hobby/2022/01/09/balins-tomb<p><img src="/images/2022/01/hobby/balins-tomb/box.jpg" alt="" /></p>
<p>My final hobby project in 2021 was <em>Battle in Balin’s Tomb</em>, a self-contained boardgame that uses miniatures from Games Workshop’s Middle-Earth range, which Nat got me for Christmas. Thanks Nat!</p>
<!--more-->
<p>It’s a small affair, containing the Fellowship, 12 Moria Goblins and a Cave Troll, all plastic. There’s a little booklet showing how to assemble the miniatures, a short rulebook and a one-sided game board, and that’s it!</p>
<p>All these models have existed since at least 2005, presumably created for a starter set for the LotR Strategy Battle Game, and they all look fantastic - simple and small but full of character. Some of the Fellowship even bear a striking resemblance to the actors, which is impressive given the scale.</p>
<h2 id="assembly">Assembly</h2>
<p>Assembling the miniatures was a breeze as most of them are one piece. You just clip them off the sprue, take a partially-successful stab at removing any mould lines, and then stick them to their bases. Those with more than one piece are also easy to assemble as all the models are OG examples of GW’s push-fit design, where one part has a peg and the other part has a slot for it to push into. You’ll probably want to use poly cement anyway but it’s nice that this set can be put together without the need for potentially-messy solvents.</p>
<p>The most complicated assembly was the Cave Troll, who you even get a choice of weapon with. I ended up with a few gaps on the model and if I had gotten around to making some <a href="https://www.youtube.com/watch?v=BH8xp0BJwQo">sprue goo</a>, I’d have filled these gaps properly, but instead I just did my best to push the parts together tightly while the poly cement set and hoped that paint would make the gaps less noticeable.</p>
<p>Once stuck to their bases - again, these are all slottas or, in the case of the Troll, peg-attached (peggas?) - I filled any gaps in the slots with milliput and then put down a light layer of my trusty custom basing mix<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>. Then they were ready to paint.</p>
<h2 id="painting">Painting</h2>
<p>I followed the old tried-and-tested speed-painting method of pre-shading, first priming black:</p>
<p><img src="/images/2022/01/hobby/balins-tomb/wip00.jpg" alt="" /></p>
<p>Then airbrushing with lighter greys from higher angles and eventually white from above. With a little finesse you can make the brightest point on the model be the face, which really helps make the colours pop there and make it a focal point on the mini.</p>
<p><img src="/images/2022/01/hobby/balins-tomb/wip01.jpg" alt="" /></p>
<p>Next I gave all the minis a wash of <a href="https://www.games-workshop.com/en-FI/Basilicanum-Grey-2019">Basilicanum Grey</a>, avoiding areas I wanted to keep bright, followed by an all-over white drybrush. This drybrush step adds definition to all the edges on the model. Here is a goblin who’s finally ready for some colour:</p>
<p><img src="/images/2022/01/hobby/balins-tomb/wip02.jpg" alt="" /></p>
<p>If you’re not familiar with this approach to painting, you might be thinking: <em>Gosh, this seems like a lot of steps before actually doing anything!</em> And you’d be partially right. I find it really does help a lot later on to have a good pre-shade, even if you’re not going to paint with Contrast paints or use a similar tinting-based approach. It doesn’t even really take that long to do - it took me maybe an hour and thirty minutes total to get everything in the box from ‘built’ to ‘ready for colouring’. And you don’t need an airbrush (though it helps) - you can do all this with rattlecans.</p>
<p>I will admit, however, that part of the reason I spend time pre-shading is because it delays having to make any actual tricky decisions about colouring for as long as possible! I am just indecisive like that.</p>
<p>Here is a goblin after being coloured in with Contrast paints:</p>
<p><img src="/images/2022/01/hobby/balins-tomb/wip04.jpg" alt="" /></p>
<p>The metals have been painted with Vallejo Metal Color Steel, avoiding the recesses, which I wanted to keep dark and non-reflective. The eyes were painted with yellow, orange in the corners, and a cat-like slit of black for the pupil. After this photo I came back and highlighted all the red cloth on my goblins with orange to really make it pop.</p>
<p>The rest of the set were all painted in the same way: slapping on Contrast and washes and picking out highlights and metallics or special areas as necessary.</p>
<p><img src="/images/2022/01/hobby/balins-tomb/goblins0.jpg" alt="" /></p>
<p>I’m particularly pleased with the all the eyes I managed to paint despite how tiny they are on these models. Sadly it’s hard to get a photo that shows the eyes well on anything other than the big-eyed goblins.</p>
<p>You may have noticed the One Ring model in the photos above. This comes on the Fellowship sprue, for some reason, and is used in the game as a turn tracker. I covered this in Vallejo Metal Color Gold and gloss varnish and called it done:</p>
<p><img src="/images/2022/01/hobby/balins-tomb/ring.jpg" alt="" title="As Gandalf said, it's quite cool." /></p>
<p>You can see some more photos on my Instagram of the <a href="https://www.instagram.com/p/CYEnPF_NYZM/">Fellowship</a> and the <a href="https://www.instagram.com/p/CYEnTA-N85d/">Goblins</a>.</p>
<h2 id="playing">Playing</h2>
<p><img src="/images/2022/01/hobby/balins-tomb/game.jpg" alt="" /></p>
<p>Not long after I’d finished painting the set, Nat and I set up the game to give it a go. She played the Fellowship and I played the Goblins. It’s a very simple ruleset, probably very kid-friendly, and definitely very fast, but not especially deep or tactically rewarding (this is a good thing!).</p>
<p>It seems to me that things don’t get interesting for the first 5 or so turns, as the Goblins really can’t get much work done when they’re only trickling into the Tomb in ones and twos and the Cave Troll hasn’t shown up yet.</p>
<p>Despite this it’s a pleasant way to spend the better part of an hour, humming the battle themes from the movies and quoting the various members of the Fellowship.</p>
<p>I lost, of course, but had fun doing so. I’d like to give it another go sometime, maybe having a go at playing the Fellowship or seeing what I could do differently as the Goblin player to make victory more likely.</p>
<p><img src="/images/2022/01/hobby/balins-tomb/legolas-v-troll.jpg" alt="" /></p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>PVA, paint, sand of various sizes, and talcum powder to bulk it up. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Pfeffernüsse2022-01-03T00:00:00+00:00http://rachelnertia.github.io/food/2022/01/03/pfeffernusse<p><img src="/images/2022/01/pfeffernusse.jpg" alt="" title="It's them!" /></p>
<p>I went on a Pfeffernüsse baking spree over the holidays. Pfeffernüsse are German spiced cookies made using the same spice mix as Lebkuchen (i.e. Lebkuchengewürz), with a dollop of icing sugar on top.</p>
<p>To me, these dumpy wee guys are inseperable from the winter holidays. I gotta have some, or it just ain’t really the Season. Therefore I was pretty miffed when I couldn’t find any in the shops - even in Lidl!</p>
<p>I was so miffed, in fact, that I decided to try making my own. Here is my own recipe, adapted from <a href="https://www.daringgourmet.com/pfeffernuesse-german-iced-gingerbread-cookies/#recipe">another</a> to be dairy- and nut-free, but not completely vegan (sorry!). The ingredients are pretty easy to find in the supermarket, too <sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>.</p>
<!--more-->
<h1 id="the-lebkuchengewürz">The Lebkuchengewürz</h1>
<p>Ingredients:</p>
<ul>
<li>2 1/2 tablespoons ground cinnamon.</li>
<li>2 teaspoons ground cloves.</li>
<li>1/2 teaspoon ground allspice.</li>
<li>1/2 teaspoon ground coriander.</li>
<li>1/2 teaspoon ground cardamom.</li>
<li>1/2 teaspoon ground ginger.</li>
<li>1/2 teaspoon ground star anise.</li>
<li>1/4 teaspoon ground mace.</li>
<li>1/4 teaspoon ground nutmeg.</li>
</ul>
<p>Grind up the spices what need grinding and mix everything together. There: you have your spice mix. Enough for two batches of cookies.</p>
<h1 id="the-dough">The Dough</h1>
<p>Ingredients:</p>
<ul>
<li>110g molasses sugar.</li>
<li>110g pure honey.</li>
<li>5 tablespoons Trex (vegetable fat).</li>
<li>1 tablespoon margarine.</li>
<li>280g all-purpose flour.</li>
<li>1/2 teaspoon baking soda.</li>
<li>1/4 teaspoon salt.</li>
<li>4 teaspoons Lebkuchengewürz.</li>
<li>1/4 teaspoon ground white pepper.</li>
<li>1 large egg.</li>
</ul>
<p>In a small saucepan, gently melt together the <strong>molasses, honey, Trex and margarine</strong>. Once it’s all one sweet goopy liquid, kill the heat and let it cool for <strong>5 minutes</strong>.</p>
<p>Meanwhile, mix together the <strong>flour, baking soda, salt, Lebkuchengewürz and white pepper</strong>.</p>
<p>Once it’s cooled, add the <strong>sweet goop</strong> from the saucepan and mix.</p>
<p>Once that’s well mixed, mix in the <strong>egg</strong>. The dough should be nice and sticky but not too wet. It should want to stick to itself more than it wants to stick to other things.</p>
<p>Wrap your dough up in some plastic, nice and tight so it can’t breathe, and bung it in the fridge overnight.</p>
<h1 id="the-cookies">The Cookies</h1>
<p>In the morning, stick the oven on. <strong>180 degrees Celsius</strong> (for a fan-assisted oven). Line a baking tray or two.</p>
<p>Take your dough out of the fridge. Roll it into sausages less than an inch wide, then chop up the sausages into segments less than an inch long. (The exact size is up to you really, just bear in mind that an inch-cubed sausage segment will make quite a large pfeffernüsse.)</p>
<p>Roll each segment into a ball and pop it on your baking tray.</p>
<p>Once the oven’s warmed up, stick the baking tray(s) in. <strong>Bake for 15 mins</strong>, then remove them and let them cool for at least 10 minutes.</p>
<h1 id="the-icing">The Icing</h1>
<p>Ingredients:</p>
<ul>
<li>300g icing sugar.</li>
<li>Hot water.</li>
</ul>
<p>To make the icing, mix the <strong>icing sugar</strong> with <strong>hot water</strong>: add one tablespoon of hot water at a time until the right consistency is reached. (The ‘right consistency’ is your preference, and something you’ll need to explore).</p>
<p>Dip each cookie in the icing so the top of it is well-covered and place it on a rack (so that runny icing can drip off and through). I use one of the metal racks from my oven, placed above some baking paper for easy cleanup.</p>
<p>After an hour or so, the icing should have hardened. Congratulations! You have made pfeffernüsse. Store them in an airtight container. They should keep for two weeks - I don’t really know, they don’t stick around for very long.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>With one exception: I couldn’t find any star anise in Sainsburys. Luckily I found plenty in one of the local Chinese supermarkets. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
2022 Hobby Goals and Resolutions2022-01-01T00:00:00+00:00http://rachelnertia.github.io/hobby/2022/01/01/hobby-goals-and-resolutions<p>Happy New Year! I’m thinking about what I want to achieve hobby-wise in 2022, so I’m making some goals and resolutions for the new year. I have three big goals, two resolutions, and some lesser goals.</p>
<!--more-->
<h2 id="goals">Goals</h2>
<p>Goals must have reasonably well-defined completion parameters: goal posts, if you will.</p>
<p><em>Note: I’m using checkboxes here to indicate if I’ve achieved something. As the year goes on, I’ll come back and edit this post to mark off the goals and sub-goals I’ve accomplished.</em></p>
<h3 id="1-release-a-game">1. Release a Game</h3>
<p><em>Magewinds</em> is the working title for a super-small, super-tight skirmish ruleset I’ve been working on in the latter half of 2021 - although really it’s the culmination of ideas I’ve been prototyping and playing with for several years.</p>
<p>It’s sort of like a cheapskate version of <em>Warhammer Underworlds</em>. Each player has 4 or 5 miniatures of their own choosing, representing very distinct fighter classes, and they duke it out on a tiny battlefield. Combat is speedy, punchy and interactive. There’s also nifty magic system. It may not be the perfect game, but I’m increasingly pleased with it.</p>
<p>I need to get back on the development horse after I fell off it when life got busy in the Autumn. In some form or another, I <em>will</em> ship this game in 2022!</p>
<ul class="task-list">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Complete the Mechanical Draft.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Complete the Full Draft.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />The Other 90% of Development…</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Release the game!</li>
</ul>
<p>I will kick my ass into gear and get it out the door! And while I’m doing that, I’ll build and paint a bunch of warbands for it…</p>
<h3 id="2-try-some-new-tech">2. Try Some New Tech</h3>
<p>I should push myself to use materials and techniques that I haven’t before. I reckon I stagnated a bit in 2021, learning-wise, but I want to always be expanding my horizons and trying new things. Before the year is out I will try:</p>
<ul class="task-list">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Painting with oils.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Painting with heavy-body acrylics.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Something ambitious with the airbrush - ambitious enough to require masking.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Superglue accelerant. Is it really any good?</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Sprue goo!</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Resin water/goo effects.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Foamex sheets, for basing terrain on.</li>
</ul>
<p>That last one ties nicely into…</p>
<h3 id="3-terrain">3. Terrain</h3>
<p>There are several projects, some of which are quite big, that I’m considering all to be part of the same goal: to make more terrain!</p>
<ul class="task-list">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" /><strong>Finish the Warhammer Fortress</strong>: I <em>started</em> painting my Warhammer Fortress (which I got second-hand from a very generous friend) in 2021 but only finished two pieces of it because I couldn’t be bothered going outside to spray sections of it. I hope to construct some supporting pieces of scratch-built scenery to go with it once it’s done: things like steps, ladders, maybe even rubble and whole collapsed sections.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Large LOS-blocking rocks</strong>, a little bit grassy and foresty to go with my grasslands gaming mat.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Large LOS-blocking snowy rocks</strong> and ice blocks to go with my frosty gaming mat.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" /><strong>More playable hills</strong>: I made some <a href="/hobby/2020/04/01/terrain/">hills</a> before but I think they should have shorter, steeper, more cliff-like slopes to be easy to play with, particularly for <em>Age of Sigmar</em> but for other games too. These could be grassy <em>or</em> frosty, whatever I have time for.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Modular stone platforms</strong>, appropriate for Frostgrave, that can be used to raise bits of the ruined city above the rest. Stairs to go with them.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" /><strong>Things made from leftover sprue</strong>: barricades, ladders, walkways… Very excited to try <a href="https://www.youtube.com/watch?v=EOSjjKkCxvk">this</a>.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" /><strong>Ruins</strong>: I have some of the defiled Azyrite Ruins released with <em>Warcry</em> that I acquired via Mortal Realms magazine and <em>Catacombs</em>. My plan for these is to build some taller buildings out of them than what I currently have.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" /><strong>Frosty graveyard</strong>: I have a <em>lot</em> of Garden of Morr bits (courtesy of the same generous benefactor as the Fortress) to do something with, as well as some miscellaneous tombstones. Might be cool to try to build some large LOS-blocking or stand-on-able pieces with tombs integrated into them…</li>
</ul>
<h2 id="resolutions">Resolutions</h2>
<p>Resolutions are more nebulous than goals. They cannot be completed, only committed to.</p>
<h3 id="1-less-in-more-out">1. Less In, More Out</h3>
<p>“Reduce my backlog before I get anything new”: Everyone says they’re going to do this, and then fails spectacularly. It might be a bit easier for me this year coming I’ll be buying the flat, and then doing improvements to said flat, and <em>then</em> trying to put any remaining savings towards some other stuff I need. Therefore it’ll be harder to make purchasing decisions based solely on wants.</p>
<p>I do tend to end up acquiring quite a lot of free (or very cheap) shit every year from friends who’re clearing old stuff out. Being more reluctant to buy things won’t save me from that - I’ll just have to get better at saying “<em>Don’t tempt me Frodo!</em>”, or words to that effect.</p>
<p>At the end of the year, I’ll only feel bad if I’ve acquired more than I finished. No sweat.</p>
<h3 id="2-document-more">2: Document More</h3>
<p>Some of my recent projects haven’t even made it to Twitter or Instagram, let alone this blog, and I feel bad about that. It’s time to up my game! I’ll take better work-in-progress pics, better finished pics, and better notes as I go so that at the end it’s easy to do a quick write up for my website or <em>at least</em> a tweet or Instagram post.</p>
<h2 id="lesser-goals">Lesser Goals</h2>
<p>These are goals I’ll prioritise less, but I might as well list them here.</p>
<h3 id="finish-my-nighthaunt">‘Finish’ my Nighthaunt</h3>
<p>In April-ish 2021 I built and painted a <a href="https://twitter.com/nershly/status/1391401181319204865"><em>lot</em></a> of <a href="https://ageofsigmar.lexicanum.com/wiki/Nighthaunt">Nighthaunt</a> and I had lots of fun playing with the army in the late Spring before Third Edition came out. Haven’t played with it since, for various reasons, one of them being that I’d like to build and paint a few extraneous but very cool units:</p>
<ul class="task-list">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" /><a href="https://www.games-workshop.com/en-GB/Nighthaunt-Lady-Olynder-2018">Lady Olynder</a>.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" /><a href="https://www.games-workshop.com/en-GB/Kurdoss-Valentian-The-Craven-King-2018">Kurdoss Valentian, the Craven King</a>.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />10 <a href="https://www.games-workshop.com/en-GB/Nighthaunt-Hexwraiths-2018">Hexwraiths</a>.</li>
</ul>
<p>All of these are sitting wrapped up in their respective issues of Mortal Realms magazine, ready to go. There may be some other less important models kicking about, too.</p>
<h3 id="play-oathmark">Play <em>Oathmark</em></h3>
<p>I have a yearning in my soul for a rank-and-flank game, though I couldn’t tell you why. It’s just… emotionally appealing to me: big blocks of infantry, marching, wheeling, flanking, charging. That kind of thing.</p>
<p>While I’m deeply curious about several games in this subgenre, like <a href="https://www.manticgames.com/games/kings-of-war/"><em>Kings of War</em></a> or <a href="https://www.warhammer-community.com/2019/11/15/old-world-new-warhammer/"><em>The Old World</em></a> (whenever it arrives), it looks like Osprey Games’ <a href="https://ospreypublishing.com/oathmark"><em>Oathmark</em></a> is the best fit for me right now. It’s miniatures-agnostic, lets you get creative with mixed-species kingdoms, all the (relatively simple) rules come in one thin and aesthetically-pleasing book, and it’s designed by good old Joseph McCullough of <a href="/gaming/2018/05/14/frostgrave/"><em>Frostgrave</em></a> fame. Most importantly of all, a friend of mine has already painted up part of an army for it, so there’s a chance I might actually get to play it some day.</p>
<p>Anyway, to play <em>Oathmark</em> I’ll need an army, which in my case will be a big mixture of various models I’ve acquired cheaply over the years: <em>Lord of the Rings</em> elves and men, old <em>Warhammer Fantasy Battles</em> dwarves, elves, goblins… a whole bunch of random crap, some of which can do double-duty in my Cities of Sigmar army. I’ll also need to pick up some new things for this project, like maybe a <a href="https://www.games-workshop.com/en-GB/Cave-Drake-2019">dragon</a>? I’ve got to have a dragon, right?</p>
<ul class="task-list">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Put together an army.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Play a test game.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Play a proper game.</li>
</ul>
<h3 id="play-cursed-city">Play <em>Cursed City</em></h3>
<p>Expansions for the latest <em>Warhammer Quest</em> are definitely on the way now that the core box is <a href="https://www.warhammer-community.com/2021/12/20/cursed-city-resurrected/">getting a reprint</a>. That means I should get it out on the table again! Me and Nat only played a couple of games of it so far. I’ll aim to play three more, hopefully with a full four players.</p>
<ul class="task-list">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />One game.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Two game!</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />Three game!!</li>
</ul>
<h3 id="collect-and-paint-the-rest-of-direchasm">Collect and Paint the Rest of <em>Direchasm</em></h3>
<p>I’ve resigned myself to the fact I’m probably not going to keep up with <em>Warhammer Underworlds</em> from now on, but I still want to finish painting up all the warbands from Season 4, <em>Direchasm</em>.</p>
<ul class="task-list">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Build and paint <a href="https://www.games-workshop.com/en-GB/WH-Underworlds-Kainans-Reapers-EN-2021">Kainan’s Reapers</a>.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Build and paint <a href="https://www.games-workshop.com/en-GB/WHU-Hedkrakkas-Madmob-EN-2021">Hedkrakka’s Madmob</a>.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Get, build and paint <a href="https://www.games-workshop.com/en-GB/WHU-Hedkrakkas-Madmob-EN-2021">Elathain’s Soulraid</a>.</li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Get, build and paint the <a href="https://www.games-workshop.com/en-GB/WHU-The-Crimson-Court-EN-2021">Crimson Court</a>.</li>
</ul>
<p>\</p>
<p>Okay, let’s see how that all goes. I wish you all the best in your own hobby (and non-hobby) endeavours in 2022!</p>
Happy New Year!2022-01-01T00:00:00+00:00http://rachelnertia.github.io/2022/01/01/happy-new-year<p>Happy New Year! Here’s wishing you all the best for 2022 - may it be the start of something better for all of us. <3</p>
<iframe width="100%" height="315" src="https://www.youtube.com/embed/kjOCY1NX_B8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
Update (October/November 2021)2021-11-07T00:00:00+00:00http://rachelnertia.github.io/2021/11/07/update<p>It’s been a while and I fancied writing a little blog post, so here we are.</p>
<h2 id="personal--work">Personal & Work</h2>
<p><img src="/images/2021/11/lookout.jpg" alt="" /></p>
<p>This weekend me and Nat are staying at a little holiday house in Dunkeld, the first time we’ve managed to escape Edinburgh all year. It’s good! (Unfortunately the internet connection is very bad.) We went for a long walk today in the Tay Forest Park and got very lucky with the weather.</p>
<p>It’s a welcome break from work, which at the moment is a bad combination of difficult and slow.</p>
<p>It’s been kind of a weird year, to say the least, and it has made me tired. I’m always mega tired around October due to the changing season, but this time it’s been particularly crushing. Hopefully I’ll finish adjusting soon and be able to do useful things like get out of bed on time and stay awake past 6pm.</p>
<h2 id="tabletop-games">Tabletop Games</h2>
<p><img src="/images/2021/11/oath.jpg" alt="" /></p>
<p>Board gaming has resumed a bit. Me and some friends have been playing Oath, a big fat political intrigue game with absolutely gorgeous art. It seems really complicated, but is actually quite simple, and works as a very effective storytelling engine, albeit not a particularly strategic one.</p>
<p>Over the past few months I’ve managed to play Age of Sigmar a few times at home. 3rd edition is… okay. Is it better? Maybe? It’s probably not worse, at least.</p>
<p>Hobby-wise I’m desperately trying to finish painting a whole new army for the Rollmodels meetup next weekend, which I’m very excited about. It’s got 3 Steam Tanks, lots of Drakespawn Knights, a big block of dark elves, and two ballistas. (I’m excited about the meetup, too, of course!)</p>
<p>For the past few months I’ve been working on a game of my own, a simple small-scale skirmish affair with a cool (perhaps unique?) magic system. It’s been a slow process of playtesting, iterating, playtesting, iterating… I wish I could speed it up but it’s quite hard to find the time and energy for it, especially right now. It’s definitely the furthest I’ve got with one of my miniature game design projects, however, so I can at least be pleased with that.</p>
<p>I do playtests using Tabletop Simulator with a small cult of folks who are willing to sacrifice a bit of their free time on the altar of game design. If you’re interested in joining said cult, please get in touch!</p>
<h2 id="video-games">Video Games</h2>
<p><img src="/images/2021/11/enderal.jpg" alt="" /></p>
<p>I’ve been playing Enderal, a total conversion mod for Skyrim. It really is very impressive, managing to usurp Skyrim itself in terms of quality despite its sometimes amateurish trappings and zero-budget constraints. I’m not far in, having only just arrived in the big city (and been bombarded with a million sidequests), and it’s doubtful I’ll make it all the way to the end of the game’s presumably-epic runtime, but in the meantime I’m itching to get back to this weird German alt-Skyrim every minute I’m away from it.</p>
<p>I <em>was</em> playing Psychonauts 2, and loving it - it’s <em>more</em> Psychonauts, after 15 years, incredible - but haven’t found the time to continue.</p>
<h2 id="reading--listening">Reading & Listening</h2>
<p>I am reading Earthsea for the first time since childhood, remembering very little about it so that it is almost all fresh. Finding myself swept away, as I always am, by the understated beauty of Ursula Le Guin’s writing.</p>
<p>Meanwhile, I have run out of Genevieve stories to listen to. Maybe I should try Kim Newman’s Anno Dracula series, which allegedly contains a character who is basically just Genevieve, and has a similar storytelling and worldbuilding vibe which I can only describe as ‘dark Pratchett’. I’m worried it won’t be quite as good without the silly Warhammer backdrop, though.</p>
<h2 id="until-next-time">Until Next Time</h2>
<p>That’s all I can think to write for now. I hope I can get back into regular blogging, I do rather like it.</p>
Two Warbands2021-07-22T00:00:00+00:00http://rachelnertia.github.io/hobby/2021/07/22/two-warbands<p>Did you know this blog exists? I didn’t! Yet for some reason I have the keys…</p>
<p>Here’s a couple of Warhammer Underworlds warbands I’ve painted recently.</p>
<p><img src="/images/hobby/2021/07/fight.jpg" alt="" /></p>
<p>First, Khagra’s Ravagers. These are Slaves to Darkness - warriors and wizards sworn to Chaos.</p>
<p><img src="/images/hobby/2021/07/chaos-warrior-1-front.jpg" width="49%" style="display:inline;" />
<img src="/images/hobby/2021/07/chaos-warrior-1-back.jpg" width="49%" style="display:inline;" /></p>
<p>I love painting gold. I’m always eagre to paint some, to try a slightly different recipe - in this case I wanted to try to replicate the gold armour of my Iron Golems but using Vallejo Metal Color paints instead of Citadel ones.</p>
<p><img src="/images/hobby/2021/07/chaos-warrior-2.jpg" alt="" /></p>
<p>I’m fairly happy with the result. It’s not a perfect match, but I wasn’t expecting it to be.</p>
<p><img src="/images/hobby/2021/07/sorceress.jpg" alt="" /></p>
<p>As for the blue-into-orange fabrics… I kinda wish I’d just kept it simple and gone with purple.</p>
<p><img src="/images/hobby/2021/07/skinks-left.jpg" alt="" />
<img src="/images/hobby/2021/07/skinks-right.jpg" alt="" /></p>
<p>Secondly, the Starblood Stalkers, who are Seraphon (AKA Lizardmen). A bunch of cute little skinks and one gnarly old saurus.</p>
<p>Lizardmen were one of my first Warhammer loves, having been gifted a moderately-sized box of them and the army book as a tween. I barely painted any of them, and I lost interest in the hobby shortly afterwards, but they made a lasting impression. One day I’ll do an Age of Sigmar Seraphon army, but not until they update some of the old sculpts. If the models in this warband are anything to go by they’ll do a stellar job. I mean, look at this Saurus:</p>
<p><img src="/images/hobby/2021/07/oldblood.jpg" alt="" /></p>
<p>He’s <em>so</em> much better than the old ones (but notably he has no golden angle for photographs).</p>
<p>Once again I had fun painting the gold on these, this time going for a more aged, but not weathered, style.</p>
<p><img src="/images/hobby/2021/07/skinks-leaders.jpg" alt="" /></p>
<p>It’s been a while since I painted any Seraphon. I might make room in my schedule for more soon…</p>
<p>Since these two warbands, I took a brief trip into Reaper-land to paint up an Ogre and a Basilisk (which were both a lot of fun) and am now making inroads into the Stormcast half of the Dominion boxset.</p>
January Hobby Roundup2021-02-02T00:00:00+00:00http://rachelnertia.github.io/hobby/2021/02/02/january-hobby-roundup<p>Phew! January has been a productive month, hobby-wise. After painting a worm, some netters and some spider riders (detailed <a href="/hobby/2021/01/08/goblins-and-creepy-crawlies/">here</a>), I painted a big ol’ spider:</p>
<p><img src="/images/hobby/2021/01/arachnarok.jpg" alt="" /></p>
<p>This is my 3rd Arachnarok, and first with a howdah (cool word!) on the back. The howdah, by the way, is detachable - my debut magnetization attempt - so that I can run the spider as another Skitterstrand if I want to. I’m pretty certain I built the whole thing correctly, but I can’t get the howdah to sit straight, so it looks a little wonky. Oh well!</p>
<p>I’m now up to about 1300 points of just Spiderfang goblins.</p>
<h2 id="khorne-dogs">Khorne Dogs</h2>
<p>Following that, I did some Flesh Hounds:</p>
<p><img src="/images/hobby/2021/01/flesh-hounds.jpg" alt="" /></p>
<p>Aren’t they cute? I’m not doing a Blades of Khorne army (although I do have a handful of them from the old starter set) - I’m not even planning a Warcry warband - but I just had to have some Hounds. Iconic and quick to paint.</p>
<h2 id="gitmob-grots">Gitmob Grots</h2>
<p><img src="/images/hobby/2021/01/grots.jpg" alt="" /></p>
<p>I painted 30 very old goblins from the 1992 Warhammer Fantasy Battles starter box. They don’t look like Moonclan Grots, so I needed to come up with a lore reason why they fit into my Gloomspite Gitz army:</p>
<p><em>The sun-scoured steppes that border the Gloomwood are populated by a multitude of Gitmob Grot tribes. Though they are numerous enough to be a constant menace to the Plainstrider peoples who share the region, they are too disunited to stand up to the might of the Moonclan and Spiderfang grots who dwell in the Gloomwood. As a result, they often find themselves drafted into their armies as auxiliaries whenever the Dankroot Dastards march to war - be it against their external enemies or, more commonly, against themselves. Here they fulfil a useful role to their overlords, either as mere extra bodies to bulk out the teeming hordes, or as scouts and advance guard, roving ahead of the main force while the Moonclan gits cower away from the daylight in hidden caves and grottos.</em></p>
<p>I’m very pleased with how they came out. Some of the shields are from North Star kits, but the rest were designed and 3D-printed by a friend. Thanks, friend!</p>
<p>Sneaking in behind them came 10 last-gen Night Goblins. These models are SO different from the current equivalent, with their huge heads and enormous hands. The ‘Kev Adams’ look. As with the other grots, I discovered that highlighting with yellow is a pretty neat trick.</p>
<p><img src="/images/hobby/2021/01/old-night-gobs.jpg" alt="" /></p>
<p>Finally, I painted the rather problematic old Forest Goblin Standard Bearer model:</p>
<p><img src="/images/hobby/2021/01/forest-goblin.jpg" alt="" /></p>
<p>He will be joining my Spiderfang as a Webspinner Shaman. He didn’t get the yellow skin highlights - I like my Spiderfang Grots to be pale and pasty.</p>
<h2 id="next-steps">Next Steps</h2>
<p>I’m planning to spend most of February just getting models ready to paint. All sorts of different models are gonna be stripped, built or fixed, based, and primed by the end of February. This means I probably won’t be showing off a lot of painted models for next month, but it will be a productive one nonetheless. The payoff will be huge: when it’s time for me to paint a particular project, all I will have to do is grab it off the backlog shelf.</p>
<p>I’ve already begun this process and it’s <em>very</em> satisfying to finally give these miniatures a bit of the attention they deserve.</p>
Hobby Update: Goblins and Creepy Crawlies2021-01-08T00:00:00+00:00http://rachelnertia.github.io/hobby/2021/01/08/goblins-and-creepy-crawlies<p>So far 2021 has been a goblins-and-bugs year. I’m okay with that. I like both goblins <em>and</em> bugs.</p>
<h2 id="netters">Netters</h2>
<p><img src="/images/hobby/2021/01/netters.jpg" alt="" /></p>
<p>First up are 10 Moonclan Grot<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup> Netters. These are old metal ones, I’m not sure quite when they were sculpted, but they must be out-of-production for at least 15 years? I picked ‘em up on Ebay, scouring the listings for good deals over several months. I didn’t particularly <em>want</em> to have metal Netters, but alas: I have no way to get enough of them without picking up multiple boxes of <a href="https://www.games-workshop.com/en-GB/Gloomspite-Gitz-Grots-2019">Stabbas/Shootas</a> (from which you can build 3 with nets) or converting/kitbashing my own. This is the problem with starting a Gitz army using old <a href="https://boardgamegeek.com/boardgame/27658/warhammer-battle-skull-pass">Battle for Skull Pass</a> miniatures, sadly. I look forward to watching all the paint chip off over time.</p>
<p>To tell the truth, I started painting these a few days before the end of 2020, but only finished them on New Year’s Day, so I’m not sure which year’s count I should include them in.</p>
<h2 id="great-worm">Great Worm</h2>
<p>Up next, I done a <a href="https://www.reapermini.com/search/worm/latest/77006">worm</a>:</p>
<p><img src="/images/hobby/2021/01/worm-left.jpg" width="49%" style="display:inline;" />
<img src="/images/hobby/2021/01/worm-right.jpg" width="49%" style="display:inline;" /></p>
<p>This hateful creature is the first <a href="https://www.reapermini.com/miniatures/bones">Reaper Bones</a> miniature I’ve ever painted. I was a bit apprehensive when I ordered it, worried that the quality would be low, but my fear was unfounded - the plastic is great for chunky medium-sized creatures like this one. The Bones miniatures come pre-primed but I just primed straight over the top of it and it was fine.</p>
<p>It was mostly painted using washes and drybrushing. I picked out the nasty nodules and cracks in the skin using Volupus Pink Contrast paint.</p>
<p>I ordered a handful of other beasties along with it - a tiny <a href="https://www.reapermini.com/search/basilisk/latest/77371">Basilisk</a>, a bigger <a href="https://www.reapermini.com/search/dracolisk/latest/77379">Dracolisk</a>, an <a href="https://www.reapermini.com/search/ogre%20guard/latest/77456">Ogre</a>, a <a href="https://www.reapermini.com/search/yeti/latest/77436">Yeti</a> and a <a href="https://www.reapermini.com/search/werewolf/latest/77009">Werewolf</a>. Hopefully I’ll paint them soon, as I’m quite excited to see how they turn out.</p>
<h2 id="spider-riders">Spider Riders</h2>
<p>Following the worm, I did 10 more Spider Riders for my Spiderfang Grots contingent. These came from a friend for cheaps (thanks, friend!) and are from the old Skull Pass starter box, like my other Spider Riders.</p>
<p><img src="/images/hobby/2021/01/spider-riders.jpg" alt="" /></p>
<p>Quite pleased with how these turned out. They look like sour gummy sweets, and contrast nicely with my other spiders. The recipe is, more or less: Terradon Turquoise, drybrush Scorpion Green, drybrush Flash Gitz Yellow.</p>
<p>Currently on the hobby desk is a BIG spider (an <a href="https://www.games-workshop.com/en-GB/Arachnarok-Spider-2017">Arachnarok</a>) - this time one I’ve had to build myself instead of being pre-built. Stay tuned for buggy updates!</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>Formerly ‘Night Goblins’ <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Hell Year in Review2021-01-04T00:00:00+00:00http://rachelnertia.github.io/personal/2021/01/04/hell-year-in-review<p>2020 is not a year I will look back on fondly. I doubt many of us will! It started off so positive and energetic, but over the hill came a big bad pandemic. The time since has felt simultaneously short and long - a year that would never end, and yet also a year of which I have very few memories.</p>
<p>Nonetheless, I should write down some of the things I did and thought.</p>
<h2 id="working-from-home">Working from Home</h2>
<p>In March we all got kicked out of our office, about a week before the whole UK went into full lockdown. It was the right decision, even if it was a bit late. Thanks to a massive effort by the IT team we have all been able to work remotely ever since. Sure, there’s a bit more friction, but the technical side of remote working has been alright.</p>
<p>The personal side of remote working, however… I hate it!</p>
<p>It’s really hard to concentrate. I feel lonely. Isolated. Desperate for attention and stimulation, I distract easily. Home is where I do fun things and chill out, not get exasperated at work problems. By this point I’ve gotten <em>okay</em> (ish) at managing my issues but it sure has been a slog to get here, and there isn’t really an end in sight until perhaps the late Summer? (Please?)</p>
<p>On balance, however, working from home has kept us safe from COVID. It’s also meant a bit more time for hobby, gaming, and generally-not-paying-close-attention-to-work (one of my greatest talents). I’ve really appreciated having the whole flat to me and Natalie - it’s been a good time to live in a spacious abode. There are worse things to be in a pandemic than a comfortably middle-class programmer.</p>
<p><img src="/images/back_garden.jpg" alt="" title="I had to spend a lot of time looking at the shared back garden. Not so bad." /></p>
<h2 id="love-and-friendship">Love and Friendship</h2>
<p>Me and Nat are doing well. She is so, so great, and we make an increasingly great team. I am intensely grateful for our relationship. Certain parts of 2020 would have been unbearably lonely without it.</p>
<p>Not being able to see much of my family has been a major bummer, especially as my brother and his wife had a baby this year. My first non-step- nibling, living in the same city as me - and I haven’t been able to spend any time with him yet. Meanwhile I haven’t seen any of my grandparents since February, and I miss them a lot.</p>
<p>Someone I like a lot moved to Edinburgh in the Summer and we’ve been going on nice, but distanced dates together. I want to kiss her! But alas.</p>
<p>I’ve appreciated my friends a great deal in 2020. Meeting up for walks, catching up over voicechat or IM, having quizzes and playing games over the internet - these moments have been beacons of light for me this year.</p>
<p>I feel like when things are better I’m gonna spend a <em>lot</em> more time with family and friends and going on dates. I’ve a major soul-deficit by this point.</p>
<p><img src="/images/beach.jpg" alt="" title="BUT I did get to go to the West Coast for a week, thankfully - check the archive for Dunbeg" /></p>
<h2 id="i-live-in-a-failed-state">I Live in a Failed State</h2>
<p>I really don’t like the government of the UK! (Or even the Scottish government that much really!) It has handled the pandemic almost the worst in the world, making all the wrong decisions and fucking up the right ones at every opportunity. On top of this, nobody powerful is holding them to account - certainly not our weak-piss opposition and definitely not our sycophantic journalist class. We are in an incredibly awful situation.</p>
<p>It’s now very clear we should have pursued an elimination strategy, seeking to reduce cases to zero. Then we could have had slightly restricted, but otherwise normal lives until the vaccine arrived. Now even with the vaccine being rolled out, it’s going to be a long time before we can live normally again. Man, I just want to play Warhammer and hug my friends and drink a beer in a pub, you know? And not be afraid my country’s health service will collapse.</p>
<p>Meanwhile Britain’s anti-trans bullshit has really ramped up this year. Along with the rest of the bigotry. Do I really want to live here my whole life? Is living here worth dying for? I’m asking myself these questions a lot.</p>
<p><img src="/images/graveyard.jpg" alt="" title="Across the road is a lovely cemetery, good for quick walks" /></p>
<h2 id="hair">Hair</h2>
<p>I have short hair again for the first time in like… 10 years? Feels good! And it makes me realise I was perhaps not a very convincing man back in the day, in spite of what I might have believed.</p>
<p>In January I had a fairly drastic cut to about neck length. Then it grew until, at some point in the summer, too wary to return to a hairdresser, I snipped it myself. At first I just made a ponytail and cut it off. Then I had to fix the mess that was left. Over the weeks and months I kept coming back to it, trimming a bit here and there until I had a properly short haircut. While I am proud of my personal haircutting efforts, I’d still like to see what a professional could achieve.</p>
<p><img src="/images/me.jpg" alt="" title="I think I look pretty cool nowadays ya know? B)" /></p>
<p>Anyway, thanks for reading! I hope 2021 is okay for you. No, scratch that - I hope 2021 is fucking great for all of us.</p>
Warcry: Dodge and Defend (An Unofficial Supplement)2020-10-14T00:00:00+00:00http://rachelnertia.github.io/gaming/2020/10/14/warcry-dodge-and-defend<p>I’ve written a one-page mod for <em>Warcry</em>! Check it out:</p>
<ul>
<li><a href="https://docs.google.com/document/d/1FsgmEm9Y7GBI_2gLMRIZgL3SsyC-In4YJsURw73nx2c/edit?usp=sharing">Google Doc</a></li>
<li><a href="/files/Warcry_%20Dodge%20and%20Defend.pdf">PDF</a></li>
</ul>
<p>The supplement tries to address a particular criticism of <em>Warcry</em> I keep seeing. On the one hand, the way attacking works is one of the game’s best features: it’s simple and fast, with just enough variables to create some verisimilitude. On the other hand, without a save roll you don’t get the chance to do anything to mitigate incoming damage. That can feel bad.</p>
<p>To fix this, my supplement gives all fighters the ability to react to attacks by attempting to dodge them or deflect them, reducing the amount of damage done. Neither reaction is free - a fighter spends one of their actions when it reacts, and can only react once per round.</p>
<p><strong>Dodge</strong> halves the number of attack dice and, if all damage is successfully avoided, lets the dodger make a short move away from the attacker. But you can’t dodge if you don’t have enough space.</p>
<p><strong>Defend</strong> reduces the attacker’s damage characteristic by 1. So maybe less good, but you don’t need space to do it.</p>
<p>I haven’t had a chance to thoroughly playtest these rules, I’m afraid. COVID is kicking our butts here in Scotland, so regular gaming is still a thing of the past. But probably I can persuade Nat to play a few games with me, and we’ll see if the mod really does what it should.</p>
<p><img src="/images/warcry.png" alt="" /></p>
Dunbeg (18th-26th September 2020)2020-09-27T00:00:00+00:00http://rachelnertia.github.io/travel/2020/09/27/dunbeg<p>Yesterday we got back to Edinburgh after a week away in a self-catering holiday house in Dunbeg, near Oban. We walked about, we cycled, we ate well and in the time in between I played a lot of Morrowind on my laptop. A cracking week off. Let me tell you about it.</p>
<h2 id="getting-there">Getting There</h2>
<p>Having given a suitcase full of our things to my mum on Thursday evening, Friday morning saw Natalie and I cycling to Waverley, taking our bikes with us to Queen Street.</p>
<p>This was the first train either of us had been in since February, so a pretty weird experience, and a nervewracking one. In all 4 of the trains we were on this holiday it didn’t feel like people were able to sit far enough apart the whole time to be properly safe, and there were too many people not wearing their masks<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>, or not wearing them properly<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>. So I doubt I’ll be risking a train journey again until it’s <em>much</em> safer, but it was the only way we could bring our bikes.</p>
<p><img src="/images/dunbeg/kelvingrove.jpg" width="49%" style="display:inline;" />
<img src="/images/dunbeg/kelvingrove-museum-orrery.jpg" width="49%" style="display:inline;" /></p>
<p>At GQS we discovered that our bike reservation was invalid for the train we were planning to get, so we had to make a new reservation for the next train and wait four hours for it. This wasn’t so bad - it was a perfectly sunny day, so we walked across town to Kelvingrove, sat in the sunshine, and had a wee tour of the museum.</p>
<p>Returning to GQS we boarded the train to Oban without a hitch and enjoyed glorious scenery for the duration of the ride, the late-afternoon early-evening sun lighting the highlands.</p>
<h2 id="hotel">Hotel</h2>
<p>Arriving in Connell (the last stop before Oban), we checked into our hotel for a one-night stay. We wouldn’t have been able to take our bikes on the day after due to the train being replaced by a bus, so we had to go a day early and stay overnight in a hotel before our main accommodation.</p>
<p>That evening we attempted to enjoy our first meal in a restaurant (the hotel’s) since March. We were partly successful. I just don’t see how indoor dining can really work without good ventilation, which this place didn’t have. It’s an airborne virus, it doesn’t matter how many metres away from the nearest table you are if you’re all breathing the same air.</p>
<p>The next day we biked around the area for a while before we were able to get into the holiday home. We cycled into Oban, where lots of people (so many!) were enjoying the sunshine. We got lunch from a coffee shop and ate by the quayside, watching ferries come and go.</p>
<h2 id="staying-in-dunbeg">Staying in Dunbeg</h2>
<p><img src="/images/dunbeg/rocky-beach-near-dunbeg.jpg" alt="" /></p>
<p>In the mid-afternoon we were allowed into the holiday home so we headed there and waited for my mum and stepdad to arrive in their car.</p>
<p>Dunbeg is a small village just along the road from Oban, next to Dunstaffnage, where there is a marina with pontoons and moorings for yachts. My dad shares a boat with some friends and it tends to live in Dunstaffnage, so I’m quite familiar with the harbour from years of ‘fun’ sailing holidays<sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">3</a></sup>.</p>
<p>On the peninsula there is Dunstaffnage Castle, a ruined chapel, and a Marine Biology Centre (for some reason). There is a really smooth cycle path from Dunbeg to Ganaven Beach, which allows you to get to Oban without going on the hellish main road.</p>
<p><img src="/images/dunbeg/ganaven.jpg" alt="" /></p>
<p>We spent the following week exploring the area on foot and by bike. My parents went on quite ambitious bike rides, but myself and Natalie didn’t join them, being a bit intimidated by the amount of time we’d have to spend sharing roads with feral car drivers. In fact, when we attempted a longer ride, I hit a nasty rock and knackered my front tyre within about 30 minutes and had to push home to Dunbeg. I think I’ll invest in some tougher, wider tyres, as the current ones on my 2nd-hand bicycle are only good for roads and are a bit worn down anyway. I did learn how to fit a new inner tube though – turns out it’s not too difficult.</p>
<p>I also took a bit of a break from being vegetarian. I’m not a particularly pure one anyway, and the local shop had a very paltry offering of vegetables that would have made cooking veggie dinners all week super inconvenient for us all.</p>
<p>In the time indoors I did a bit of writing, mostly working on the rules for a little wargame/RPG thing I’m cooking up, and played a lot of Morrowind. I fucking love Morrowind. Extremely good game. Every time I come back to it I appreciate it more and more. Being away from the painting desk gave me a lot of time to dedicate to my current play-through.</p>
<h2 id="kerrera">Kerrera</h2>
<p><img src="/images/dunbeg/kerrera-castle.jpg" alt="" /></p>
<p>The highlight of the holiday for me was definitely taking the ferry across to Kerrera, a small island that encloses part of the bay of Oban. You can walk around most of it in 4 hours or so, which is what we did, paying a visit to the small but dramatic Gylen Castle (above) and enjoying some perfect weather (no rain, no wind, lots of sun) as we walked.</p>
<p>Near the ferry port one of the island farms has set up a little honesty-policy-shop where you can buy ice cream and other local produce. My mum bought some nice burgers which we ate the following evening.</p>
<p>I definitely recommend visiting Kerrera if you can.</p>
<h2 id="homeward">Homeward</h2>
<p>The inbound journey went a lot smoother than the outbound one. Once again I didn’t feel particularly confident about being on a train, especially when a lot of non-mask-wearers boarded on the way into Glasgow, and the Glasgow-Edinburgh train had many more people on it than it should have. Sigh.</p>
<p>But we made it home alright. Time will tell if we got away with taking the risk of travelling by train.</p>
<h2 id="parting-thoughts">Parting Thoughts</h2>
<p><img src="/images/dunbeg/beach.jpg" alt="" /></p>
<p>I can’t emphasise enough how good it was to get out of town, away from the flat, for 10 glorious days. To just totally break the routine I’ve been in all year. I also can’t overstate how lucky I feel to have spent some time with my mum and stepdad again, holidaying together (almost) like in the Before Times. It was a risk but after going nearly a year without leaving Edinburgh, and six months with only very timid contact with family members, it was a risk I was willing to take!</p>
<p>Restrictions have tightened up here in Scotland in the last week due to rapidly-increasing case numbers. I don’t think we’d have been able to do what we did if we were just a week later. Summer is coming to an end, Autumn has arrived and is taking its boots off. I’m glad we got away when we did before what is likely to be a long, uncomfortable winter.</p>
<p>If you, like me, have been cooped up in your inner city flat for the past six months, now is probably the time to see if you can grab a few days in a self-catering home somewhere. (Hopefully somewhere that’s easier and safer to get to than Dunbeg.) It will help.</p>
<p>Now then. I’ve not painted any minis for 10 days. It’s time to do something about that!</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>Any more than zero is too many in my opinion, in a confined space like a train carriage. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>I don’t wanna see your nose, pal. And no, you can’t just take it off for half an hour so you can eat an entire meal. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p>In fact, him and a friend returned from a boat-trip to Gigha on Monday, so we met them at the marina for a wee catch-up. <a href="#fnref:3" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Lumineth2020-09-08T00:00:00+00:00http://rachelnertia.github.io/hobby/2020/09/08/lumineth<p><img src="/images/hobby/2020/07/eltharion.jpg" alt="" /></p>
<p>I have a lot of hobby blogging to catch up on. I’m not going to do it all, but I’ll cover some of the big things.</p>
<p>In July, fancying a big treat, I picked up the Lumineth Realm-Lords limited edition launch box. It contained 10 Wardens (spearmen), 5 Dawnriders (cavalry), the Light of Eltharion (a named hero), the battletome and some assorted special tokens and wotsits.</p>
<p><img src="/images/hobby/2020/07/wardens.jpg" alt="" /></p>
<p>Despite my glowing weak spot for elves of all sorts, I really wasn’t sure I liked the Lumineth model range until a particular colour scheme popped into my head and I <em>needed</em> to try it out. It took a bit of experimentation, but fortunately it turned out quite well! I’m excited to see how it will look on other models and how I can improve it over time.</p>
<p><img src="/images/hobby/2020/07/dawnriders.jpg" alt="" title="Hopefully nobody will notice that the banner is held in place by some badly-painted milliput..." /></p>
<p>I’m really excited to see Lumineth on the tabletop and what they bring to the Age of Sigmar setting. I want to see the other elemental warriors and spirits, the remaining 4 Great Nations, the other kinds of Scinari.</p>
<p>Having said all that, I’m not in a hurry to pick up any new models. They’re rather pricey and I have too many other things to buy, build and paint already. I can see myself building up this force slowly over time. In the meantime, I might come back to these models and make a few small adjustments. On inspection, there’s some things I missed that I’d like to tidy up.</p>
Zombies!2020-08-24T00:00:00+00:00http://rachelnertia.github.io/hobby/2020/08/24/zombies<p>Recently I painted up 9 of Fireforge Games’ <a href="https://fireforge-games.com/living-dead/364-living-dead-peasants.html">Living Dead Peasants</a>. Me and a friend went half-and-half a box of these that was being sold cheaply by North Star because the packaging was messed up, or something. All I know is I got to build and paint some very high-quality medieval zombies for a very low price. Here they are:</p>
<p><img src="/images/hobby/2020/08/zombies.jpg" alt="" /></p>
<p>Building them was totally painless. There were no spindly connections or snappable bits, just good solid plastic that takes plastic glue well. They painted up easily with a quick messy zenithal undercoat followed by some splodges of Contrast paint and a wash of Agrax Earthshade over the tattered clothing.</p>
<p>This is a great wee kit and I’m sure they’ll see use in a variety of games. I hope I get to sample some more of Fireforge’s offerings in the future. Perhaps some more of their <a href="https://fireforge-games.com/living-dead-48">Living Dead</a>? Or maybe something from the <a href="https://fireforge-games.com/northern-kingdom-47">Northern Kingdom</a> range?</p>
<p>(Man, it feels good to be writing a little hobby update again.)</p>
Shattered Dominion Objectives and Walls and Fences2020-04-29T00:00:00+00:00http://rachelnertia.github.io/hobby/2020/04/29/shattered-dominion<p><img src="/images/hobby/2020/04/shattered-dominion-objectives.jpg" alt="" /></p>
<p>A couple weeks ago I finished painting this lovely little set of <a href="https://www.games-workshop.com/en-GB/Age-Of-Sigmar-Objective-Markers-2018">objective markers</a> from Games Workshop. They’re all very extra, absolutely bursting with character. Can’t wait to use them in games, even just as bits of scenery.</p>
<p>Also:</p>
<p><img src="/images/hobby/2020/04/walls-and-fences.jpg" alt="" /></p>
<p>A little further back I painted up a set of the old Walls and Fences kit from back in the Warhammer Fantasy Battles days. I always thought these pieces were friggin adorable and wanted to paint them up. I was lucky to get these free from a friend! I think I’ve done them justice.</p>
Vanguard Objectives2020-04-10T00:00:00+00:00http://rachelnertia.github.io/hobby/2020/04/10/vanguard-objectives<p>Recently I painted up the <a href="https://www.manticgames.com/games/vanguard/battlefield-objectives/">Battlefield Objectives</a> set from Mantic’s <a href="https://www.manticgames.com/games/vanguard/">Kings of War: Vanguard</a> range. I think these are the first Mantic minis I’ve painted.</p>
<p>There’s a stash of food and drink, a cannonball pile, an abandoned satchel, a box of blades, a treasure chest, a dragon egg, a dead horse-rider… and the cringe-worthy damsel-in-distress. (Perhaps I’ll create a story for her in which she goes on a rampage once free.)</p>
<p><img src="/images/hobby/2020/04/objectives.jpg" alt="" /></p>
<p>My favourite parts are these nice standing stones, perfect for any battlefield:</p>
<p><img src="/images/hobby/2020/04/standing-stones.jpg" alt="" /></p>
<p>There’s also a beacon…</p>
<p><img src="/images/hobby/2020/04/beacon.jpg" alt="" /></p>
<p>… with detachable fire!</p>
<p><img src="/images/hobby/2020/04/beacon-on-fire.jpg" alt="" /></p>
<p>Lots of fun to paint, of course. Washes, drybrushing, all easy. Looking forward to painting more Mantic models.</p>
Newington Cemetery2020-04-07T00:00:00+00:00http://rachelnertia.github.io/2020/04/07/newington-cemetery<p><img src="/images/cemetery/5.jpg" alt="" /></p>
<p>I’m lucky to live in a place I love. Part of its appeal is the leafy graveyard across the road, perfect for quick paces or leasurely strolls when I need to get out of the flat.</p>
<p><img src="/images/cemetery/2.jpg" alt="" /></p>
<p>It’s especially beautiful right now, with the trees budding and bursting out in leaves of fresh green. The ground has a thick, shiny carpet of wild garlic. Amongst this verdance are the stones. Some are toppled, others still stand proud. There are obelisks, angels, urns and celtic knots.</p>
<p><img src="/images/cemetery/3.jpg" alt="" /></p>
<p>Nobody has been buried here for decades, and nature has been set free to riot. Encouraged, even. The result is something special – if you’re ever on Dalkeith Road, you really should pop in.</p>
<p><img src="/images/cemetery/4.jpg" alt="" /></p>
<p>The light does wonderful things with the ivy at dusk and dawn.</p>
<p><img src="/images/cemetery/1.jpg" alt="" /></p>
<p>I hope you are doing well. <3</p>
Terrain2020-04-01T00:00:00+00:00http://rachelnertia.github.io/hobby/2020/04/01/terrain<p>I made more terrain. Some of it is just more CD-based scatter pieces like <a href="/hobby/2020/02/16/grassy-scatter-terrain/">last time</a>. Other bits are on cardboard and foamboard bases.</p>
<p><img src="/images/hobby/2020/04/terrain-2.jpg" alt="" /></p>
<p>The main event is the three hills I made. The bulk of these is extruded polystyrene, cut and sanded into shape, based on a sheet of foamboard, then textured with <a href="https://www.geekgaming.co.uk/products/lukes-aps-modelling-compound-1-litre">Luke’s APS sculptamold-alternative</a>.</p>
<p>I learned a lot from making these. I think my main takeaway with the hills is to be more aware of what makes for a good hill gameplay-wise as I cut them into shape. These ones are okay but not ideal: measurements between figures at the bottom and the top of the slope are a little awkward and the surface is a bit too bumpy. Next time I’ll try to make some hills that have steeper slopes (easier to measure) and some that are short and gently-sloped, so they can mostly be ignored for gameplay purposes.</p>
<p><img src="/images/hobby/2020/04/terrain.jpg" alt="" /></p>
Scuttleboss2020-04-01T00:00:00+00:00http://rachelnertia.github.io/hobby/2020/04/01/scuttleboss<p><img src="/images/hobby/2020/04/scuttleboss.jpg" alt="" /></p>
<p>GoblinWatch 2020 continues with a small goblin on a big spider.</p>
<p>I’m not a big fan of the model, to be honest, and I kinda rushed to get it done. I hope they do a new version of it someday, like they did with the Loonboss on Giant Squig. In fact I hope they revamp the whole Spiderfang side of the Gloomspite Gitz range, I love spiders and want more of them.</p>
<p>Despite not really digging the model I’m looking forward to playing with him, either when The Ongoing Situation comes to an end or I crack and start trying to play Warhammer alone.</p>
Goblin Watch Part 12020-03-14T00:00:00+00:00http://rachelnertia.github.io/hobby/2020/03/14/goblinwatch-part-1<p><img src="/images/hobby/2020/03/loonboss.jpg" alt="" /></p>
<p>Late in 2019 I bought a large batch of Gloomspite Gitz from a friend, at a bargain price. I didn’t know exactly what was in this batch, other than a couple of Arachnarok Spiders. When the first batch arrived in the post, I was alarmed to discover that it contained more than 100 Shootas and Stabbas from the old Battle for Skull Pass starter set. Then a second batch arrived, containing <em>even more</em> of them. Somewhat intimidated by the thought of painting so many models, I stored them away and focused on other projects.</p>
<p>Then, a month ago, an Age of Sigmar escalation league started up in Edinburgh. What better motivator for getting through all my unpainted Gitz?</p>
<p>Last week on Wednesday I took stock of my horde of Stabbas and Shootas and decided how many I was going to paint. I painted 2 units of 20 Stabbas and 1 unit of 20 Shootas last year, so I thought it would make sense to aim for being able to field 2 units of 40 Stabbas, or a large block of 60, plus a unit of 40 Shootas. So I needed to paint 40 Stabbas and 20 Shootas.</p>
<p>That Thursday I got out my airbrush and engaged in a marathon priming session, getting some 80 models ready to be painted. As well as the infantry, this included 10 Spider Riders and a Scuttleboss. When I was done I began painting the first batch of 10 Stabbas.</p>
<p>Then, on Friday evening I came down with a cold, but managed to finish the first batch of Stabbas. In total I had spent perhaps a little over 3 hours on them. That’s amazing! I am really astonished by how better tech and more experience have combined to enable me to blast through projects like these.</p>
<p>Last weekend, with all my social commitments cancelled thanks to my cold, I finished all 40, getting through each batch of 10 in about 3 hours. Here they are:</p>
<p><img src="/images/hobby/2020/03/stabbas.jpg" alt="" /></p>
<p>On Monday I was feeling a little better, but decided not to go to work. I hate catching illnesses from my coworkers, but I hate transmitting them even more. With not much else to do, I painted the old Night Goblin Big Boss you can see at the top of this article, who I’ll be using as a Loonboss.</p>
<p>Over the course of this week I painted these 20 Shootas. Again, I don’t think I spent much more than 6 hours on them altogether.</p>
<p><img src="/images/hobby/2020/03/shootas.jpg" alt="" /></p>
<p>With everything that’s going on I anticipate a lot less socialising and a lot more being stuck at home. Being a productive hobbyist will be a good anchor, I think. Hopefully can have small amounts of friends over for games, but I don’t know how smart it is to play at the game shop or that sort of thing.</p>
<p>Shrug. Look out for each other, okay? Just like these gobbos do.</p>
Squig Herd2020-03-05T00:00:00+00:00http://rachelnertia.github.io/hobby/2020/03/05/squig-herd<p><img src="/images/hobby/2020/03/squig-herd.jpg" alt="" title="One of the squigs is missing from this photo. Oops!" /></p>
<p>I’ve never painted squigs before, so this is somewhat of a milestone. I think they came out really well.</p>
<p>You can run these in units of 5 (plus a herder) or multiples of 5. I think when I paint more squigs, or if I come back to these, I’ll do something to make half of them a bit distinct from the others. I’d like each group of 5 to look a little bit different. Not wildly so; just some variation in patterns, highlight tones, whatever.</p>
<p>Here are the handlers!</p>
<p><img src="/images/hobby/2020/03/squig-handlers.jpg" alt="" /></p>
<p>I friggin love them, gang. Kinda bummed I couldn’t build the alternate versions of them where the musician is holding a pair of cymbals and the prodder has a mushroom-on-a-stick instead. I guess that means I have an excuse to acquire a second box, or perhaps pick up the new <a href="https://www.warhammer-community.com/2020/03/01/sunday-preview-star-lizards-and-start-collecting-boxes/">Start Collecting</a>?</p>
<p>What’s next? Well, I was going to paint <a href="https://www.games-workshop.com/en-GB/WHU-Hrothgorns-Mantrappers-EN-2020">Hrothgorn’s Mantrappers</a> because I want to start playing them in Underworlds. Then the local Age of Sigmar escalation league started up and gave me a big incentive to crack on with my Gloomspite Gitz. All my hobby plans were thrown into disarray, but now they’ve coalesced again and I have a detailed plan for how I’m going to get the Gitz done. So that’s what the next couple/few months will be filled with: more goblins, spiders, and squigs.</p>
Grymwatch2020-02-26T00:00:00+00:00http://rachelnertia.github.io/hobby/2020/02/26/grymwatch<p><img src="/images/hobby/2020/02/grymwatch-2.jpg" alt="" /></p>
<p>I am not ashamed to say these were a rush job. The painting time was quick - I estimate about 5 hours - and consisted of little more than a zenithal basecoat followed by a few splashes of Citadel Contrast paint.</p>
<p>Despite the low time investment, I’m really pleased with the results. There’s lots of contrast between colours, light and shadow. The colour scheme is unusual without being garish or too unnatural, and all the details are crisp and clean. Most importantly, the recipe is easily scalable for when I get around to painting more Flesh-Eater Courts models.</p>
<p>Here’s the whole gang:</p>
<p><img src="/images/hobby/2020/02/grymwatch.jpg" alt="" /></p>
<p>Up next: a Squig Herd!</p>
Dog-Goblins Triumphant!2020-02-26T00:00:00+00:00http://rachelnertia.github.io/gaming/2020/02/26/doggoblins-triumphant<p><img src="/images/hobby/2020/02/rippa.jpg" alt="" /></p>
<p>I had a busy weekend, taking part in two Warhammer Underworlds tournaments.</p>
<h2 id="dundee">Dundee</h2>
<p>The first was on Saturday in Dundee at <a href="https://www.facebook.com/HighlanderGamesDundee/">Highlander Games</a>. It’s about a 20 minute walk from the train station (nearly everything in Dundee is), but in this case I was walking into the wind, being pelted by sleet, hail and snow most of the way. But it was worth it. The tournament was in best-of-three format, and 8 people showed up.</p>
<p>I took Rippa’s Snarlfangs because I’ve been focusing on them recently and didn’t feel like running Skaeth’s Wild Hunt again. To build my deck I consulted a couple of tournament decks and <a href="https://canyourollacrit.com/2020/02/17/tournament-round-up-37-roving-rippas/">Can You Roll A Crit’s recent article</a> about the dog-goblins. I ended up taking all the flex out of the deck I’d been iterating on for the past few weeks, putting all the focus on aggro. I removed objectives that were pulling in different directions. I also removed all my extra mobility power cards. This was a mistake.</p>
<h3 id="match-1">Match 1</h3>
<p>My first match was a goblin-off against Zarbag’s Gitz. This was a good matchup for me because my warband and deck is all about killing things, and the Gitz have plenty of easy-to-kill, non-threatening fighters.</p>
<p>My dog-goblins got to work, hacking and pillaging, with Rippa quickly becoming a 7-wound beast thanks to Sudden Growth and another +1 Wounds upgrade. I underestimated Snirk the fanatic, however, who eventually managed to kill Rippa. Way ahead on glory, I still took the win.</p>
<p>Game 2 was more one-sided as I managed to kill Snirk early. Moonclan grots and squigs were deleted left and right, and I pulled into a strong lead.</p>
<h3 id="match-2">Match 2</h3>
<p><img src="/images/hobby/2020/02/rippa-v-rippa-dundee.jpg" alt="" /></p>
<p>There were 2 other Rippa’s Snarlfangs players at the event. For my next two matches, I had to play both of them. In a aggro-off, when you probably both have very similar decks, it really comes down to the subtle differences in those decks, card draw, and luck of the dice. Fortunately in match 2 I managed to pull ahead in both games thanks to the power of crits, plus some lucky card draw.</p>
<h3 id="match-3">Match 3</h3>
<p>Going into match 3 I was pretty exhausted after the tension-filled rollercoaster of the previous Rippa-off. My opponent had chosen to add a little extra mobility to his deck rather than get rid of it all, like me, plus a lot more plink damage. This meant he could out-position, out-maneuver and out-damage me. When the dice didn’t go my way, I was defeated roundly.</p>
<h3 id="dundee-denouement">Dundee Denouement</h3>
<p>In the end I took 3rd place. In fact, all 3 of the Rippa players were in the top 3, with my opponent in the 3rd match taking 1st. A good day for dog-goblins.</p>
<p>Thanks again to Highlander Games for putting on a great event!</p>
<p>While I was at Highlander a trio of Dundee friends popped in and said hello, which absolutely made my week. I miss living in Dundee a lot and being able to see these folks more often.</p>
<p>Also, on the way back to the train station I met up with another friend who gifted me a bunch of unpainted terrain she wasn’t using anymore. I am lucky to have such incredibly generous people in my life. More on that soon!</p>
<h2 id="glasgow">Glasgow</h2>
<p>On Sunday I travelled through to Glasgow for a tournament at the Drury Street Bar & Kitchen. This time it was a best-of-one format. I don’t think I’d have gone if it was best-of-three - two of those in one weekend would definitely have been too much.</p>
<p>I swapped out Pit Trap (1 damage when an enemy is driven back) for Tracking (+2 move), learning a lesson from being outmaneuvered the day before. It also makes scoring Gathered Momentum easier because I don’t have to rely on Inspiration to get up to 5 move. You can see the final decklist <a href="https://www.underworldsdb.com/shared.php?deck=0,N338,N319,B100,N326,B104,N368,B281,B304,B103,B106,B270,N373,B109,G18,B112,G14,B118,B110,B368,B116,N420,B122,B382,B119,B398,N550,N529,B434,B431,N543,B373,B384">here</a>.</p>
<p>14 people attended the tournament, which is an excellent turnout for Scotland. It feels like the scene up here is growing!</p>
<h3 id="match-1-1">Match 1</h3>
<p>My first game was against Paul, the tournament organiser, and his Zarbag’s Gitz. Once again I went into this matchup feeling confident, but I was schooled on a few rules and subtleties of how the Gitz work. They’re very complicated! I would not recommend them to people starting the game. For example, Snirk’s inspire reaction shares the same reaction window as the Snarlfang’s extra attack, so can be used to block it once per game. I’m glad he didn’t gotcha me with that!</p>
<p>Despite managing to keep the pressure on him with my wolves I wasn’t able to stop him from scoring most of his objective-grabbing objectives and get glory from keys (and key-like things), so we ended up with a quite close 23-19 finish to me.</p>
<h3 id="match-2-1">Match 2</h3>
<p>Grymwatch. Finally time to let rip. The deck excelled against them, able to turn all those little 2-wound fighters into glory bombs. At one point I got 5 glory from a kill: Amberbone weapon, Trophy Belt, Tome of Offerings, plus a surge. It really is a very fun deck to play when these big swings happen.</p>
<p>Meanwhile my opponent had a very disappointing opening hand and was never able to get his machine started. I hope it wasn’t too bad of a game for him :s</p>
<h3 id="match-3-1">Match 3</h3>
<p>The nasty nasty Wurmspat. I was a little bit worried going into this - when your deck is built around turning enemy fighters into exploding glory bags, a warband with only a few very tough fighters is hard to profit from.</p>
<p>My opponent deployed very defensively, I deployed aggressively. It was clear very quickly that he was going for a Temporary Victory or Supremacy, so I attacked and put the pressure on, managing to deal 3 wounds to each of the 2 Blightkings by the end of the first round. I was also able to get Stabbit onto one of the 3 objectives in his territory, locking him out of his early glory swing.</p>
<p>At the start of round 2 stabbit killed both the blightkings with a spinny attack and a wolf chomp. What a hero! The rest of the game consisted of Fecula sitting in the corner, becoming impossible to kill with a few upgrades. We finished 10-4 to me.</p>
<h3 id="awoo">Awoo!</h3>
<p>Somehow this meant I won the tournament, taking home my first trophy. I don’t really go into these things expecting to do well, let alone win - I mostly just try to have fun games for me and my opponent - so I was very surprised!</p>
<p>Thanks again to Paul for running a great tournament. I’m already excited for the next one.</p>
<p><img src="/images/hobby/2020/02/snarlfangs-win.jpg" alt="" /></p>
<p>I was pretty worn out after such a busy weekend. Thankfully I had this Monday off work, and got some rest.</p>
Rippa's Snarlfangs2020-02-16T00:00:00+00:00http://rachelnertia.github.io/hobby/2020/02/16/rippas-snarlfangs<p><img src="/images/hobby/2020/02/rippa-front.jpg" alt="" /></p>
<p>I want a whole army of wolf riders but I cannot have one! These are the only 3 wolf riders currently available in AoS! It’s Kurnothi all over again! A terrible shame.</p>
<p><img src="/images/hobby/2020/02/rippa.jpg" alt="" /></p>
<p>These came together really well. I started off with a zenithal basecoat, but hadn’t made up my mind about what colours to use until I grabbed a pot of yellow Contrast paint and tried it on the plume. That bright yellow dictated the rest of the scheme and it all fell into place. Blue, green, yellow.</p>
<p>They were quick, too. Contrast and washes allowed me to get good results on the fur, leather, plumes and wrappings really quickly, with just a little drybrushing and layering at the end to add highlights.</p>
<p>I’m particularly pleased with the metal, another successful test ride for Vallejo Metal Colors. Look at Stabbit’s shield:</p>
<p><img src="/images/hobby/2020/02/stabbit-rear.jpg" alt="" /></p>
<p>In one smooth coat of Copper I was able to lay down the base. Next, I worked a bit of Aethermatic Blue into the grooves (looks cool as heck). Then a little bit of Nihilakh Oxide in places where I thought there should be stronger oxidization like around the bolts. Then I just highlighted up a bit with Gold and, finally, edge-highlighted with Silver right on the top of the shield. Very fast, very simple, very fun.</p>
<p>For the blades (e.g. Rippa’s sword) I used Burnt Iron followed by a dark green-blue wash, then highlighted up to Silver.</p>
<p><img src="/images/hobby/2020/02/snarlfangs.jpg" alt="" /></p>
<p>A note about the rims of the bases: Some people don’t like base rims to be anything other than black or dark brown. Now, my opinion is that the rim is as much part of the model as everything else, and it can be used to contribute to the overall effect. In this instance, the sky blue on the rims contrasts with the yellow ground and suggests the desert sky under which the Snarlfangs ride. To choose black instead would be a shrug. In fact, I think it might <em>detract</em> from the final result, because nothing else on the model is black enough for it to match with, or white enough for it to pop against. I’m not saying you should never paint rims black, just that you should probably be able to justify it artistically.</p>
Grassy Scatter Terrain2020-02-16T00:00:00+00:00http://rachelnertia.github.io/hobby/2020/02/16/grassy-scatter-terrain<p><img src="/images/hobby/2020/02/cd-based-scatter-terrain.jpg" alt="" /></p>
<p>I made these by roughly following <a href="https://www.youtube.com/watch?v=uqmYWesal9w">this tutorial</a> by Terrain Tutor. Instead of spackle I used <a href="https://www.geekgaming.co.uk/products/lukes-aps-modelling-compound-1-litre">modelling compound</a> and instead of slate I used bits of foam for the rocks. The trees are from Woodland Scenics, and while they’re a bit diminuitive, they’re not so small that they look entirely out of place next to 28mm-scale minis.</p>
<p>This was a great way to start making terrain and I gained a lot of confidence. I’ll make a few more, with bases of different sizes and shapes, to scatter about the battlefield.</p>
MORE Sacrosanct2020-02-05T00:00:00+00:00http://rachelnertia.github.io/hobby/2020/02/05/MORE-sacrosanct<p><img src="/images/hobby/2020/02/castigators.jpg" alt="" /></p>
<p>3 more Stormcast on the Stormcast pile! These are the Castigators from <a href="https://www.games-workshop.com/en-GB/Age-Of-Sigmar-Storm-Strike-2018-eng">Storm Strike</a>.</p>
<p><img src="/images/hobby/2020/02/castigators-rear.jpg" alt="" /></p>
<p>I adore these models. Turns out they actually come in units of 3 after all, so this is a minimum-size unit. If I get a couple more I can run a unit of 9. I’m sure I’ll get at least 6 of them on the table at some point, just to see if they can do any work.</p>
<p>This was my first proper project using Vallejo Metal Colors paints. I was trying to match the look of my usual Retributor Armour recipe. The end result is a little less yellow, but plenty shiny and rich, and it took less than half the time to do. Going forward I think I’ll be doing as much as possible using Metal Colors - they really are amazing.</p>
<p>Also in the box you get a lovely little bird-dog companion!</p>
<p><img src="/images/hobby/2020/02/gryph-hound.jpg" alt="" /></p>
<p>I want more gryph-hounds to go with her!</p>
<p>In the background you can see my new Army Painter wet palette. I’ve been using a homebrew tupperware-and-baking-paper solution since I started in the hobby 2 years or so ago and after Christmas I felt like spending some money and making the leap to a “proper” wet palette. I feel like a bit of a mark every time I notice the Army Painter logo on the case, but otherwise I am very pleased with my purchase - the special paper and foam perform much better than anything I could have homebrewed.</p>
<p>Finally, I have painted the Knight-Incantor from Soul Wars. I’m not super pleased with her face but I did my best. Apart from that I think she looks great.</p>
<p><img src="/images/hobby/2020/02/incantor.jpg" alt="" /></p>
<p>With that, I’ve finished all the Stormcast from Soul Wars and Storm Strike. Looking forward to running a mostly-Sacrosanct army sometime soon.</p>
<p>I still have that one remaining Sequitor to paint who I got for free in the Warhammer shop on the Royal Mile, but I think I’ll chip away at him as I proceed with other projects. I am done with painting Stormcast Eternals for the moment.</p>
They're Not Resolutions - They're Aspirations2020-01-25T00:00:00+00:00http://rachelnertia.github.io/personal/2020/01/25/not-resolutions-but-aspirations<p>Many keyboards are worn down by the annual flurry of conversation about New Year’s Resolutions - whether they work, how to do them properly, and so on. It’s tiresome. I’ve always seen the beginning of a year as a good opportunity for a kind of reset, some time for reflection on and reappraisal of priorities. Following that, a sense of optimism and excitement about what is to come.</p>
<p>Over my winter Holiday, which was especially long, I made the vague decision to stay in Edinburgh, or at least stay with Rockstar Games, for the next few years. I’ve been here 3.5 years and the whole time I’ve viewed my presence as kinda temporary. 2019 was especially indecisive should-I-stay-or-should-I-go at some points, so it’s nice to now have a sense of certainty about what I want to do with the future.</p>
<p>Here’s some resolution-type things. They start off as vague ideals, then I force myself to refine them into clear specifications for achievable goals.</p>
<ol>
<li>Write more. Write a bit every day. Therefore, write 100 words a day. (These are my 100 words for today!) I manage to achieve this on days when I write blog posts, which the 100-word-target has motivated me to do more of, but otherwise I keep missing it. So I might downgrade it to a 50-word target, because the original intent was to motivate me to literally just open up a document and add a little bit more to it every day.</li>
<li>Hobby every day. Just do the smallest measurable amount every day. I’ve already written about my lofty hobby goals for 2020.</li>
<li>Learn Scottish Gaelic. Do <a href="https://www.duolingo.com/">Duolingo</a> every day. I rather like Duolingo, but I’d be kidding myself if I thought it was enough to pick up enough Gaelic to speak it fluently. I will look into more hardcore learning methods.</li>
<li>Finish the <a href="https://rachelnertia.github.io/warcry-card-creator">Warcry Card Creator</a>. To this end, plunk 5 minutes of work into it every day.</li>
<li>Keep up my very basic exercise regime. To get started, I do 20 squats every day. On lazy days I can just leave it there, but on energetic days once I get started I will work through the whole suite. It’s definitely paying off, getting easier to do and improving my body shape, so it might be time to find some more exercises to add to the routine.</li>
<li>Play videogames more. Last year I barely played videogames at all because I just hobbied a whole bunch. Play a videogame for 15 minutes per day. (I suck at this one. Why is it so hard?)</li>
<li>Read more books. Read 5 pages every day.</li>
<li>Go swimming. Once. This is a matter of overcoming a fear of being publicly mostly-naked that has prevented me from enjoying swimming, one of my favourite forms of exercise, for like 10 years. I want to punt that fear right into the bin where it belongs.</li>
</ol>
<p>Hitting all these targets in a day isn’t easy, even though they’re all quite small. I suspect I need to build a daily routine that gets me through them all.</p>
<p>What are your ‘New Year’s Incredibly Specific Targets’?</p>
Castigators2020-01-23T00:00:00+00:00http://rachelnertia.github.io/hobby/2020/01/23/castigators<p><img src="/images/hobby/2020/01/castigators.jpg" alt="" /></p>
<p><em>Finally</em> got these done. This squad of 5 is from Soul Wars.</p>
<p>I adore these models. Excellent crossbow grenade launcher things. The Prime’s pose is cool but I’m not sure why she is wearing such generous high heels.</p>
<p>Like a lot of Stormcast units, they have somewhat questionable rules. You’d expect grenade launchers to have a bit more punch to them, but without increasing the unit size and buffing them up a bit (there’s a few ways) their output looks marginal. That said, they are only 80 points, which I think makes them the cheapest Stormcast. I don’t know. Also I haven’t put them on the table yet. Maybe they’re useful in their own special way.</p>
<p>Up next: 3 more Castigators, the ones from Soul Strike. I’d like to be able to field a unit of 10, but I’ll need to find a way to get another 3 non-Primes from somewhere to do that.</p>
<h3 id="secret-bonus-content">Secret Bonus Content!</h3>
<p>I am lucky to be part of a truly excellent online hobby community. For the 2nd year in a row an outstanding member of said community arranged a Secret Santa gift exchange in which people make special conversions and all kinds of cute stuff to send to their Santa-ee. I received some adorable Ghyran-themed objective markers along with a short story about them. I love them!</p>
<p><img src="/images/hobby/2020/01/secret-santa.jpg" alt="" /></p>
<p>(I added a bit of green flock to them today. Perhaps it’s a bit sacrilegious to modify a gift someone made for you.)</p>
<p>As for which delightful community member made these for me, I do not know. The game is afoot!</p>
Hobby Goals 20202020-01-12T00:00:00+00:00http://rachelnertia.github.io/hobby/2020/01/12/annual-hobby-goals<p>In 2019 I <a href="/hobby/2019/12/23/hobby-lookback-2019/">hobbied</a> more than I ever had before. In 2020 I want to keep up the pace, so I can:</p>
<h3 id="clear-the-backlog">Clear the Backlog</h3>
<p>Ever since getting into the hobby I’ve fallen into the trap every hobbyist seems to fall into: I acquire more stuff than I am able to paint in the immediate term. I like to think that I’ve been better at avoiding the worst of it than some others, as most of the stuff I’ve added to the pile has been <em>given</em> to me for free (or very cheaply), like when Nat’s parents foisted all of her and her brother’s old minis on me.</p>
<p>Note: I don’t think this is a bad situation to be in. If I’m ever stumped for what to paint next, chances are I can find something in my collection that will scratch the right itch. It’s really nice to have a large pool of possible ‘next projects’, even if it does feel rather overwhelming! And there’s nothing wrong with getting stuff you want; there are absolutely worse consumerist vices than miniatures!</p>
<p>I want to finish the year as close as possible to the ideal state where the next thing I buy will be the next thing I paint and nothing is hanging over me.</p>
<h3 id="avoid-adding-to-the-backlog">Avoid Adding to the Backlog</h3>
<p>I’ll never accomplish the above if I keep acquiring more stuff to paint. I’m generally quite good at turning my nose up at the latest expensive battle box Games Workshop are putting out. It’s the too-good-to-refuse offers from friends that catch me out. For example: Almost immediately after announcing I was in “acquisition lockdown” and wouldn’t be getting any more minis until I’d painted what I had, I went to a meetup where one of my friends said he was trying to get rid of the Gloomspite Gitz he thought he was never going to get around to. A horde of goblins. More Spider Riders. 2 Arachnarok Spiders. All looking sad in his never-to-be-finished pile. All for £30. I was slain.</p>
<p>But I have a promise I make to every single one of the previously-unloved little soldiers I took into my possession that day: You will be painted. You will get the care and attention you deserve.</p>
<p>So apart from Warhammer Underworlds warbands I will try very hard not to acquire any more stuff this year.</p>
<h3 id="have-a-good-looking-gaming-table">Have a Good-looking Gaming Table</h3>
<p>Mostly for playing Age of Sigmar on, although there’s plenty other games that I’d like to be able to play at home on a big beautiful battlefield.</p>
<p>I’m halfway there already. I have some boards I can put over our dining table to make it 4’ by 6’. A 6’ by 4’ gaming mat from Gamemat.eu is coming my way in the post. I have a fair amount of painted terrain:</p>
<ul>
<li>The ruins from the <a href="https://ttcombat.com/collections/fantasy-realms/products/guardian-watchtower">Warcry starter box</a>.</li>
<li>The graveyard terrain from the <a href="https://www.games-workshop.com/en-GB/Warcry-Corpsewrack-Mausoleum-2019">Corpsewrack Mausoleum set</a>.</li>
<li>MDF (wooden) buildings from TTCombat like these <a href="https://ttcombat.com/collections/sci-fi-gothic/products/corner-ruins-a">ruined sci-fi-gothic structures</a>, this <a href="https://ttcombat.com/collections/fantasy-realms/products/guardian-watchtower">watchtower</a>, plus some other bits and pieces that might be from other manufacturers. I spent some time over the holiday making these look much nicer.</li>
</ul>
<p>It’s quite a good collection, but what I want to add to this is some grassy hills, trees, little wooded copses, that sort of thing. So at some point I’ll be trying to craft some of that stuff myself. Just like with mini painting, there’s never been an easier time to learn how to build your own terrain, thanks to all the fantastic video tutorials produced by the likes of <a href="https://www.youtube.com/channel/UCx_aro8CTHw7ZD5H661hC6Q">Terrain Tutor</a>, <a href="https://www.youtube.com/channel/UCsmD5774MOQhjYBkXqu3Jdw">Luke</a> and <a href="https://www.youtube.com/channel/UCu5Pmz1wY-NWCYy21vikKAg">Sorastro</a>.</p>
<h3 id="play-more">Play More</h3>
<p>Of course, there’s no reason to do all this painting and terrain-building if the end result is never gonna be used. So this year I want to play even more Warcry, Age of Sigmar, Underworlds, Frostgrave, etc. I just really like it, you know?</p>
<h3 id="throwing-down-the-gauntlet">Throwing Down the Gauntlet</h3>
<p>I keep track of all my hobby projects on <a href="https://trello.com/b/uXGR1auS/hobby">Trello</a>. It’s a complete mess, but it keeps it all out of my head and I can use the <a href="https://www.plusfortrello.com/p/about.html">Trello Plus</a> plugin to track how much time I spend on projects, which is important for estimating how much I can get done.</p>
<p>Off the top of my head, the main things to get done in order to clear the bulk of my backlog are:</p>
<ul>
<li>Finish all my Stormcast Eternals. Once I’m done with Soul Wars I have some Liberators to build. Some bits and bobs I got for free from an acquaintance who was having a clearout. Some of that might need stripping. Ew.</li>
<li>Gloomspite Gitz. This is the big one, I think. I need to figure out how to paint nearly a hundred Stabbas and Shootas quickly. A terrifying thought. But I did it before with a smaller number back in February, and I came out of that twilight feeling like a hobby god, so it’ll be worth it. My goblins shall block out the sun.</li>
<li>Paint the Dwarf half of the old Battle for Skull Pass boxset. I’m not really sure what I’ll do with these minis, though. Only a few of them have a home in Age of Sigmar anymore. Perhaps they could be the beginning of a <a href="https://www.manticgames.com/games/kings-of-war/">Kings of War</a> army or a <a href="https://ospreypublishing.com/oathmark">Oathmark</a> force? (In which case, should I base them on squares?)</li>
<li>Kings of War Vanguard. The <a href="https://www.manticgames.com/games/vanguard/basilean-vanguard/basilean-warband-set/">Basilean</a> and <a href="https://www.manticgames.com/games/vanguard/northern-alliance/northern-alliance-faction-starter/">Northern Alliance</a> boxes. These were <em>very</em> annoying to assemble. Hopefully they will be easier to paint.</li>
</ul>
<p>Everything else is kinda small bits-and-pieces. Underworlds warbands. North Star minis for Frostgrave. Old Middle-Earth things. Old Warhammer stuff.</p>
<p>I’ll be recording my progress on here if time will allow it. I hope you’ll wish me luck, and I wish you all the best for your own hobby journey this year. Godspeed!</p>
More Sequitors2020-01-11T00:00:00+00:00http://rachelnertia.github.io/hobby/2020/01/11/more-sequitors<p><img src="/images/hobby/2020/january-sequitors-3.jpg" alt="" /></p>
<p>These guys are from <a href="https://www.games-workshop.com/en-GB/Age-Of-Sigmar-Storm-Strike-2018-eng">Soul Strike</a>, but they are also available in <a href="https://www.games-workshop.com/en-GB/Scast-Paint-Set-Eng-spa-port-latv-rom-2018">a paint set</a>, <a href="https://www.games-workshop.com/en-GB/WHU-Champions-Of-Dreadfane-EN-2019">Champions of Dreadfane</a>, individually in Warhammer shops for painting lessons, and now in the first issue of the <a href="https://www.warhammermortalrealms.com/">Mortal Realms part-works magazine</a>. So it’s safe to conclude Games Workshop made a <em>lot</em> of them.</p>
<p>Tried a slightly simpler recipe for the green this time. Previously I would:</p>
<ol>
<li>Basecoat Waagh Flesh</li>
<li>Recess shade with Drakenhof Nightshade</li>
<li>Tidy up any tidemarks with more Waagh Flesh</li>
<li>Highlight Warboss Green</li>
<li>Highlight Skarsnik Green</li>
<li>Highlight Skarsnik Green / Ulthuan Grey</li>
<li>Highlight Ulthuan Grey</li>
</ol>
<p>Now, going forwards, I skip the shading step and instead of basecoating with Waagh Flesh I use the darker, more blueish Caliban Green (an old paint that I need to find a modern equivalent of). This way’s a bit quicker and looks almost the same, if not better.</p>
<p>I’m still not satisfied with how I paint the beige tabard-things. They don’t quite have enough contrast.</p>
<p>Once again, the most time-consuming part was putting down basecoats, particularly gold. Retributor Armour is a decent enough gold, I suppose, but no gold paint has great coverage. Some other Stormcast models (like Liberators) are mostly armour so I can be more efficient by using Retributor Gold spray, but Sequitors (and Sacrosanct in general) are 50% robes. Something some painters do to help it cover is put a layer of brown underneath. Maybe I’ll give that a go, even if, intuitively, it just adds another time-consuming step.</p>
<p>I have one more Sequitor to go, but he’s just a duplicate of the guy with the greatmace. If I paint him up I can field a unit of 10!</p>
Sequitors2020-01-05T00:00:00+00:00http://rachelnertia.github.io/hobby/2020/01/05/soul-wars-sequitors<p><img src="/images/hobby/2020/january-sequitors-2.jpg" alt="" title="The first 4" /></p>
<p>I began the year by finishing up my first batch of Sequitors.</p>
<p>These are from <a href="https://www.games-workshop.com/en-GB/Age-Of-Sigmar-Soul-Wars-2018-eng">Soul Wars</a>, the current main Age of Sigmar starter box, which I bought the Stormcast Eternal half of from a friend. There are 8 of them, with 5 different sculpts: 2 different Sequitor-Primes, and 2 each of a guy with mace-and-shield, a lady with mace-and-shield, and a guy with a big mace. These are push-fit mono-pose and mono-build figures, so unless you start chopping them up you can only build them one way.</p>
<p>8 is a bit of an awkward number because in the game they are supposed to come in multiples of 5, so until I paint a few more (which is exactly what I’m doing next) I can only field one unit of 5 instead of 2 units of 5 or a big unit of 10. I’m not sure when I’ll get them on the table anyway.</p>
<p><img src="/images/hobby/2020/january-sequitors.jpg" alt="" title="The whole gang!" /></p>
<p>There are some things about them I could have done better.</p>
<p>The green cloth looks great but my method for painting them doesn’t scale well to batch-painting, so I ended up being a little messier with them than I would have liked. I should figure out a more efficient way to paint these that looks similar.</p>
<p>The gold lacks contrast, a problem I’ve noted about a lot my Stormcast. I need to investigate ways to make it richer, shinier, etc.</p>
<p>On the beige cloth I was experimenting a little, so these look a bit inconsistent across the unit. I did find a simple way to do them that I’m pleased with, though, so I’ll be using that method going forward. The beige is still a little too similar to the yellow-white of the parchment some of them have.</p>
<p>I’m quite happy with the red bits but I’d like to find a way to make them punchier and do them faster.</p>
<p>The early stages of painting these models, just getting the base coats down, was a slog. They have so much extra detail and different materials compared to Liberators or Judicators. I’m looking forward to painting the remaining 4 I have to do, a more manageable batch.</p>
<p><img src="/images/hobby/2020/january-sequitor.jpg" alt="" /></p>
Hobby Lookback 20192019-12-23T00:00:00+00:00http://rachelnertia.github.io/hobby/2019/12/23/hobby-lookback-2019<p>Oh, but I did paint a lot this year. 2019 prove me wrong about the extent to which hobby could take over my life and, coming to the end of it, I regret not having managed to do <em>more</em>. How is this possible? I should have blogged about it as I went, but I didn’t because apparently blogging is too much effort for me now? Fortunately I mostly did a decent job of documenting my progress on Twitter and on my portal-to-hell <a href="https://trello.com/b/uXGR1auS/hobby">personal Trello board</a>. So this post will mostly consist of links to those, otherwise it would have about 50 photos in it.</p>
<p>I began the year by working on some of North Star’s recent additions to their Frostgrave range, like this <a href="https://twitter.com/nershly/status/1091121383319449600">Barbarian</a>, <a href="https://twitter.com/nershly/status/1091121560356864001">Templar</a>, <a href="https://trello.com/c/yFer2qLc/123-frostgrave-apothecary-ii">Apothecary</a> and <a href="https://twitter.com/nershly/status/1084490341275877376">others</a>.</p>
<p>I also made a <a href="https://twitter.com/nershly/status/1091121301320810496">boar</a>! This lil’ guy is a spare who comes with the old Orc Chariot kit. There are two more piggies I could make out of that old kit, but they require a bit more work (their lower jaw pieces are attached to the chariot).</p>
<p>I based some old Warhammer models. I painted these in 2018, I think, but didn’t base them. They look great with decorated bases, each brimming with their own character. There are <a href="https://trello.com/c/RHSY123I/135-oldhammer-bats-basing">bats</a> and <a href="https://trello.com/c/x4T9ZXeB/134-oldhammer-snotlings-goblins-basing">snotlings</a>. These were some of the first models I ever acquired, and it fills me with satisfaction every time I see them in their current well-painted, well-based state. I think I will make some Warcry rules for them.</p>
<p>February/March/stretching into April was goblin season. When Natalie’s parents discovered I was getting into the hobby, they were more than happy to foist her and her brother’s old collections upon me. This inundation of old, mostly-unpainted models included all the models from a copy of Battle for Skull Pass, the starter box for Warhammer Fantasy Battles 7th Edition. The Dwarf side of that box is still waiting for my attention, but I managed to paint my way through the whole Night Goblin half. This included:</p>
<ul>
<li>40 spear-wielding gobbos and 20 bow-wielding gobbos. <a href="https://twitter.com/nershly/status/1104156973753344000">The biggest bunch of models I ever done</a>.</li>
<li>A boss goblin with a pet squig</li>
<li>A shaman with a cauldron of mushrooms</li>
<li>10 <a href="https://trello.com/c/30xhkcxx/52-aos-grot-spider-riders-battle-for-skull-pass">Spider Riders</a></li>
<li>A <a href="https://trello.com/c/splzGydq/21-aos-troll-battle-for-skull-pass">troll</a>. Sadly for this guy, there’s no analogous model in AoS for him anymore since Sourbreath Troggoths were discontinued.</li>
<li>Some small scenery pieces.</li>
</ul>
<p>With these came a couple of metal goblin shamans. Lovely sculpts, painted them up later in the year after the goblinmania had passed. Here’s <a href="https://twitter.com/nershly/status/1155511331363131394">one of them</a>.</p>
<p>Late March: I painted the <a href="https://twitter.com/nershly/status/1111947712847638528">Chosen Axes</a> from Shadespire.</p>
<p>Needed some more Skinks as allies for my Stormcast Eternal army, so I did <a href="https://twitter.com/nershly/status/1113478041810944000">5 of ‘em</a>. I know how to paint these in my simple scheme very quickly. Personally, I think these models hold up a lot better than most of the Seraphon/Lizardmen range, and I hope they keep this kit when they do a refresh. (Saurus Warriors, on the other hand, could desperately do with a new kit in my opinion!)</p>
<p>April/May: With a £40 gift voucher to spend, and needing some more terrain for games of Frostgrave, I picked up the <a href="https://www.games-workshop.com/en-GB/Osgiliath-Ruins-Box-3-Set">3-box of Osgiliath Ruins</a> and bashed them out, unlocking a newfound love of terrain painting. It’s so fast and simple!</p>
<p>May: <a href="https://twitter.com/nershly/status/1125476230755696640">Magore’s Fiends</a>, <a href="https://twitter.com/nershly/status/1127990313153454081">Spiteclaw’s Swarm</a>, <a href="https://twitter.com/nershly/status/1129867108513394688">Thorns of the Briar Queen</a>.</p>
<p>May: <a href="https://twitter.com/nershly/status/1129891190495764480">Oldhammer Chaos Warrior</a>. This guy was encased in about a centimetre of enamel paint, and it took a lot of time to strip it off him. <a href="https://twitter.com/nershly/status/1133108222225780739">Dark Elf Sorceress</a>, acquired from a friend’s clearout. I think this model came free with a White Dwarf? <a href="https://twitter.com/nershly/status/1135660906040504322">Dark Elf Assassin</a>, acquired from same friend. Probably contains lead, it’s that old.</p>
<p>June: <a href="https://twitter.com/nershly/status/1139662358844968961">Stormsire’s Cursebreakers</a>. <a href="https://twitter.com/nershly/status/1144119534368055296">Judicators, and an Angharad</a> I rescued by giving her a head and a shield, who I am very proud of.</p>
<p>July: Khorne. I painted the whole of the <a href="https://twitter.com/nershly/status/1152986125964914688">Khorne half</a> of the OG AoS starter box. Contrast did a lot of heavy lifting here, letting me do the skin, the vibrant red and the bone-coloured trim on all of the mooks super quickly. Here is the <a href="https://twitter.com/nershly/status/1152863476341231617">Lord</a>.</p>
<p>July: More Judicators, this time with <a href="https://twitter.com/nershly/status/1155400548444790784">big fat crossbows</a>.</p>
<p>August, September, onwards: Warcry. The big box. Excellent game. Excellent big box. The <a href="https://twitter.com/nershly/status/1159560161834541057">terrain</a>. Took until November to finish painting all the remaining Iron Golems, but here’s <a href="https://twitter.com/nershly/status/1191087882452295682">the whole gang</a>. <a href="https://twitter.com/nershly/status/1165707031380201472">Furies</a>, more <a href="https://twitter.com/nershly/status/1170064874405289984">Furies</a> and <a href="https://twitter.com/nershly/status/1165330960927330304">chickens</a>. <a href="https://twitter.com/nershly/status/1177475966488104961">Untamed Beasts</a> in September.</p>
<p>October: Beastgrave! <a href="https://twitter.com/nershly/status/1180887338618105856">Grashrak’s Despoilers</a>.</p>
<p>October: Corpsewrack Mausoleum. Spooky!</p>
<p><img src="https://lh3.googleusercontent.com/mUTofEc3kEfHp5KckNZWYLv5ZQmjcQqp2Kn2jGey1CnBRJQCURtRl0gNIgBMD9mEPjdBzXP-cLz1eg-xWiKu52XHVixbuVieucOA38db3a_e2RHRbg4uYpB1CMXG6l5DvIc2Ru-NxXD-Llv1mrxt2K9ilSi8PQPENZit6YLUHV5xRZubjWVbfEz9R5YFwhFzcTldjqQv-bp4uWLTe5HN0irhBz3RHwrTzv5nfEAdl4YqEwJLOdkdQV9d7dKse5Ffth99jk1Vq9EgLrPxACrW5LzQMKMcQbD-_2qQLzHmR05B29Gh7ELAtpL3IULmeyKGJTLQcTMgjFQ59373OU2mLSZJTfuLyAZpVU1Bc8Z19n5ITFlYEDaJ7LZiGS3aaIBVa03FTxw8Xi4213C_6co2I2xNcAVDvHmQWZAohQV1z8I0E29SVcuBTeamPiu5IXn9JYhFmOOA-nbf7iBLQmS9apUQOLqvm9w5ib1snEBqvFgX0DmsiSi6IAFLSk6tVMZwWdDF4jSSQj0AkZEqe6gx97tovURWZuZzqC_CDWwIMWfDqSCkLbyrgyXZbec8q-ozcA_OGqHr6iCV7jRWdurC8Is3rP3A5fRiMRXVhdRpvTwfKxHH0h1L7aaHC7uQ1Bc30Yv5e2QZLX4y5tYzH0cP9d9MkVD25c2R9xU8kGtjPviHW_g3-7OIsZI=w698-h929-no" width="49%" style="display:inline;" /></p>
<p>November: <a href="https://twitter.com/nershly/status/1195829647214366721">Skaeth’s Wild Hunt</a> from Beastgrave.</p>
<p>November: <a href="https://twitter.com/nershly/status/1196174985666220033">Eowyn</a> plus some <a href="https://twitter.com/nershly/status/1198020531284512771">Warriors of Rohan</a>.</p>
<p>July-December: Lord-Arcanum on Gryph-Charger. This model took ages because I started it and then left it unfinished for months. Don’t do this!</p>
<p><img src="https://lh3.googleusercontent.com/1I6QhwePSeInpdIWGnC_TYtOJ2l4ltsr-_ibWCn6teOMyKzQhPcWZy4jTAh5NsVbljm6Fx2GS7-OgsZoj8TWOQlsOuL8egLKPOTkxbE3ZRgYn-jpju4sOMeb8-zDNHuHoJLWsvTk_s10HCumdKI3f7a4mHxN4fbXrqbXd0eD6V_2doVaUp7im5ubBHkjB7UZPpHaN_ZYqRs6GbWKN8T9zbgDIC74uRLplNnrtP-CVTsZpExJvVBpSRfgkqLq4VoDwoWVt2f10vpJbItpKUhAJxaxJ5DbtT6iqVCkR3v3Ru1UecJnzvHDuIJgaZva8D-0ozWB6EQJ4jAoEcqvIQoTR_dkamquL4JTYF5_ULGq6jGOlHHeOyRLf34n1hoLUqlMWKKX-cbGR05DQ7YB2GsTId2YMi1rkJ2-HPsRp4H-7gfGCUdTel-dlSVSYbZZtTgHad92ddSsBQX7pnZLSaqLXJVttxCn8UprcSDul_VVnGxOP2kO0fiw0I53itLh_soD2Fd6o6l6Cw7mjHU7udloKhdtJHbC96v7HAjeg3VqpQmWiS5trPfWn229tyiSCz4NStynKIkgwBXGIZxK1QlCriOkLxUxd_RgpPT4kW-e92h7q6kT86nrh7PPlXUZPKDiNQ_pkjFBmIdqydxXGR6ShRenZQjsgffb8q_uZockMII-YoAOQksbm9I=w1239-h929-no" width="100%" style="display:inline;" /></p>
<p>December: <a href="https://twitter.com/nershly/status/1203095171447037952">Celestar Ballista</a>, <a href="https://twitter.com/nershly/status/1207443772080054272">Evocators</a>.</p>
<p><a href="https://twitter.com/nershly/status/1205926826071203840">Built some zombies</a> from Fireforge games. I’ll paint these eventually. Good for when I finally get around to Rangers of Shadow Deep, or something else requiring zombie villagers.</p>
<p>I spent the last couple of days sprucing up some MDF buildings I inherited when my Frostgrave-playing friend moved away. It looks much nicer now, although I feel like it could still do with a bit more attention. They’re excellent kits, but I don’t know if I’ll get more MDF stuff in the future unless I have a clear idea of how to make it look less flat, thin and textureless. Mind you, <a href="https://ttcombat.com/collections/fantasy-realms/savage-domain_all">TTCombat’s new Savage Domain</a> kits look really nice…</p>
<p><img src="https://lh3.googleusercontent.com/OE1mMIGkY4rZTIvav31IXjvjZTUA1pWLLqvFLqKaLA10XW5siw-kuV7SINs95BahbDkiajjJs4fAaTdqniTPbpDzJ_t3hnJlw_aegdQKqdckQdDmQ6lxGQ4IHBcd6mHNYVOXPdS7qb0Nj9a0yqIUc0bZdynfq7qZBGrHj9BESuT6XphFNVSXFhJfmTIBepA3MOYzkfw66omMgJ1zhUb7DFb5oShYuqnVrHZcz_YUnOHQVdw2v_usg_q_hZSeVLBFKO21SUgOsDaMXSXkK21RM-azN_KrYcKZidDD0I4jabeb88H0oNrmeUE8kcsHBG6yjIHhB8Kec5Oipo81zgkeaz6dvNTJ4ElFacYJqN-7hGt13MqqsZ6Aged4X_F1G62dCq9siRu7oTZGUayIRgYVfo24VFSfbH0XkNxu1VR2ccryOxlarlMVVXkJ9KWd9hgAdEOCFanWC3fI5JQ569rshMN6gcDtu4CSdsf6II-5iKXJU43W_V-qCh2laHaAgZwsJ3mlatR2m5Gi2EhhfiQf6LpU4TIt4x9yowvDwrqd5byaRt-RWXeKxkQmvjLdt90cont23QzQitfQxMNJS3bjpsV5hnBN5xsSpFO0PSgNtddzGr7etAy02Rxg9_55zJKrkO2-WFS-ACOSqnUtoLxH_kEXf64zRclsAyfhoKcJvutT2Pt0e36ZBxs=w1239-h929-no" width="49%" style="display:inline;" />
<img src="https://lh3.googleusercontent.com/23XX-NLiz1xMXM8ITwooCzBoUVXKD8dpvBMSYtnhMsKRq2UxZjAI5kkEH5ufp8RrbrpVJAMfz9H1zED-JmPBUkqK5USYXDxYTAtXJKE5KeIWVyohraBUdknYfKcAWWfBz-M42CzxnoSgW3QKLGJrITWAqnRqF0b2O1ewKXYBLfJfJ7xo9_0Xqv5tK5J-R-2hyGQNN52pyythug2bUGEtghSl8KVf3O71rbhgGJFEj-ZS4X5skZRndPE4P2H4Bua5sJqz9QCqEJPCNPN_skXMtHb7Rqwkw8ubCzGWDryIUmcQo_KIMdZB7zrTTAKEazpg8mgKJFysblHQouZaksTXoA_b7qLV46rmIoehOPUCBCdqXgsFlA_sFQ20qXTm9oqDCiUvhuflkTvH8GFytEKIis385G1IZMwPaRs9Yf6E9iMJBZpOfUAE75xzQmtYNkjVA7AzX3G3XDkQBqLc_8L0NdI77urZbuN6Wpm6tuh3wzuGogLVHWQ3lGOf6JJ1GWLpYAqAOLQr8WLMGhUJhCHRBMmEyqnAXTkMExokYoc1QrMPku_OATqKaJeF4iRFJdkAYDouK_BP6Xjs1Qz4Fp16cvq5KNyGVr7b1K1-2ai7S1KoE4EW_L8rm9bzvjZtyJJFTDRmzUu51t53OEbEpjnRXqxTO5STnAVyuLtKmt1iWrQixolipvvZA9w=w698-h929-no" width="49%" style="display:inline;" /></p>
<p>And that wraps things up for 2019. Phew! I am extremely proud of how much I’ve painted and how much I’ve improved, tried new things and honed in on how to paint better and faster.</p>
<p>In 2020, I will try to document my progress on here, because in 2020: <strong>I’m going to clear my backlog</strong>.</p>
Warcry Card Creator2019-12-01T00:00:00+00:00http://rachelnertia.github.io/programming/2019/12/01/warcry-card-creator<p>I have been working on a little tool for making fighter cards for Warcry, GW’s new skirmish game (wot is very good). Using a template, you can set how many wounds your fighter has, how far they can move, the stats of their weapons, etc.</p>
<p><a href="http://rachelnertia.github.io/warcry-card-creator">Check it out!</a></p>
<p>Here is an example card I made for Grashrak:</p>
<p><img src="images/warcry-card-creator-example.png" alt="" /></p>
<p>There’s still a bit of work to do.</p>
<ol>
<li>The page saves its state after every change so it can restore it if you close the page and come back, but this functionality is incomplete. For one thing, it doesn’t restore user-provided images. For a second, it would be good to have save slots the user can name.</li>
<li>The page is <em>ugly</em>. Even if I don’t manage to make a pretty background or find a better typeface or whatever, I’d like the interface to be clearly broken up into sections.</li>
<li>Pageview tracking? I think I should already have this but I’m not sure.</li>
</ol>
<p>Working on this I’ve learned a fair bit about front-end web programming. I grew my familiarity with JavaScript, picked up some JQuery, touched a little Bootstrap. Hosting is handled by GitHub Pages the same way this website is, using Jekyll to build the final HTML from templates.</p>
<p>It was pretty well received <a href="https://twitter.com/nershly/status/1194248277807566848">on Twitter</a>. Once it’s a bit prettier I’ll find other places to share it.</p>
<p>I hope to round out the feature set by the end of the year and start working on other tools and neat things. Now that I know how to make little web applications, my head is full of ideas for things to try.</p>
Warhammer Underworlds: Edinburgh2019-10-06T00:00:00+00:00http://rachelnertia.github.io/gaming/2019/10/06/warhammer-underworlds-edinburgh<p><img src="https://warhammerunderworlds.com/wp-content/uploads/sites/6/2019/09/useful-1.png" alt="" title="Deer aelves! Deelves?" /></p>
<p>I <a href="/gaming/2017/12/31/2017-in-gaming/">noted</a> back at the end of 2017 that one of my favourite tabletop games I’d played that year was <em>Warhammer Underworlds: Shadespire</em>. That was the first edition, or season of content, or whatever you want to call it, of <em>Warhammer Underworlds</em>, and since then we’ve been through 2018’s <em>Nightvault</em> and now here we are with season/edition 3: <em>Beastgrave</em>.</p>
<p>I’ve been playing the game fairly regularly since 2017 and mostly loving it - I think it’s a very robust system which persistently provides players with perplexing puzzles to parse. While I have some reservations about how certain powerful cards have affected the game (mostly solved by the <a href="https://www.warhammer-community.com/2019/09/08/warhammer-underworlds-the-future-of-competitive-playgw-homepage-post-1/">rotation</a> introduced with <em>Beastgrave</em>), my main complaint has really been simply not having enough people to play with. To address this I’ve helped to set up <a href="https://www.facebook.com/groups/WarhammerUnderworldsEdinburgh">Warhammer Underworlds: Edinburgh</a>.</p>
<p><img src="/images/WUEdinburgh.png" alt="" title="Liene made this sick logo for us. Thanks Liene!" /></p>
<p>Our goals:</p>
<p>1) Weekly meetups.
2) Regular tournaments.
3) Ladder league that resets quarterly.
4) Inclusive and lovely. Towards all kinds of play and all kinds of players.
5) To raise awareness about the game and teach it to people who’re curious about it.</p>
<p>At the moments our weekly meetup is on Tuesday evenings in <a href="https://www.facebook.com/GamesHubEdinburgh/">Edinburgh Games Hub</a> on Lauriston Place. I have a few reservations about this arrangement (Tuesday night is super busy at Games Hub and tbh Games Hub is a little shabby!) but it worked pretty well last Tuesday so we’ll stick with it for now at least.</p>
<p>The next thing is to organise a tournament. This’ll probably be in late November at <a href="https://www.facebook.com/reddicegames">Red Dice Games</a> in Leith. (Trying to spread the love a bit.)</p>
<p>Anyway. I’ve never organised anything like this before, but I’m mostly following the advice and examples of other gaming communities that I’ve observed both locally and from across the internet. Hopefully it’ll go well and if I do screw up a bit it won’t be too bad!</p>
<p>If you wanna learn <em>Underworlds</em> then get in touch with me or come along to the weekly meetup on Tuesday at Games Hub, I am more than happy to provide a demo game or two.</p>
Whatever Happened to Quiver?2019-07-28T00:00:00+00:00http://rachelnertia.github.io/game%20dev/2019/07/28/what-happened-to-quiver<p>You know how I was working on that pseudo-3d game engine, <a href="https://github.com/rachelnertia/Quiver">Quiver</a>? That I was so well stuck into that I even did a <a href="/programming/2018/01/10/quiver-presentation/">presentation</a> about it? A whole year and a half ago? Well, it may be no surprise… but it ain’t really happening any more.</p>
<p>Making stuff in your personal time is a big challenge. You’re at the mercy of:</p>
<ul>
<li>Your dwindling energy levels when working in the margins of a day’s work or a busy weekend day.</li>
<li>The cruel march of time. It can be so hard to find enough, and even if you can, can you find the long, unbroken stretches of time you need to really get things done?</li>
<li>Your own whims. As your enthusiasm for an existing project dwindles, new interests take flight. And you’d be a fool not to pursue them, really. Life is short.</li>
</ul>
<p>The last thing I did on Quiver was very satisfying, however. All I did was break apart the game, Quarrel, from the engine, so that it now lives in its <a href="https://github.com/rachelnertia/Quarrel">own repository</a>. While I’m not sure I’ll ever return to Quarrel, I’m still attached to the idea of returning to the engine and seeing what else I can do with it, or expanding it a little<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>. This separation will make that return easier.</p>
<p>It’s past time for me to finally say farewell, then, at least for now. Bye-bye little project!</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>The outstanding major features I wanted to implement were textured walls, ceilings and floors, a scripting system, and a pathfinding and navigation-graph-generation system. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Grief2019-06-24T00:00:00+00:00http://rachelnertia.github.io/personal/2019/06/24/grief<p>I’ve been meaning to write this for a long time.</p>
<p>It has never really gone away and I don’t expect it ever will. I didn’t move past or through the pain of loss so much as accept it into myself and change around it. I didn’t heal; I became a different person.</p>
<p>We’re always changing, from year to year, month to month, day to day, down to the nanosecond. We’re never who we used to be. Sometimes the sadness, the resistance, is just that last remaining part of our old selves, clinging on, fighting for the world to stay the same. Fighting, without success and without hope, to go back.</p>
<p>As time has stretched away from the event (at the end of July it will have been four years) it has become easier. My mind has become less and less occupied with the how and the why, less aware of the missing pieces, less conscious of the parts of me that are different now. Most days are just normal days: I get up, I am grateful, I do what I can and I keep moving. Then there are the days like today.</p>
<p>I’m not sure why I am like I am today. Perhaps it’s just the weather. Thick fog, unrelenting rain and distant thunder, finally unleashed after gathering ominously for the past few days. Maybe being at Edinburgh Pride on Saturday, meeting old friends in the sunlight, stirred the pot of memories and emotions and let grief come bubbling to the surface. It could be a subtler mix of things, built up over the weeks and months since my last low point, carefully suppressed, dodged and hurdled until it became unavoidable.</p>
<p>When Danielle died my mother looked after me in the immediate aftermath, making sure I ate, slept, bathed. She watched me and held me. She’d just returned from a trip to China and had brought a gift for me with her: a small metal necklace-watch. It wasn’t well made but I wore it every day until the clasp broke and the lid wouldn’t close any more. I wore it until the lid fell off. I even wore it for a while after it stopped telling the time accurately. Around my neck, close to my heart, held tightly as I took deep breaths, it reminded me simply that time was passing. While the seconds crawled by, it ticked. While I couldn’t move, it turned. It showed me that the world was changing around me, that <em>I</em> was changing, even though I felt trapped in one long, eclipsing moment of stasis. I could look at it and feel hope that the day would come when this dark period would be behind me, that the tunnel had an end.</p>
<p>It wasn’t just the passage of time that let me change. It took work. It took counselling. It took the support of strong friends and caring family. I am so, so grateful for it all. When I look at my life I don’t hesitate to think of it as blessed, lucky, so goddamn fortunate I struggle to put it into words or know what to do with it.</p>
<p>I didn’t sleep much last night, and when finally it was time to get up and go to work, I couldn’t. I cried. Natalie held me and we cried together. A dam had burst. After the first rush of tears, the rest will trickle out over the coming hours. I will rebuild the dam. I will build it stronger. I will build a better spillway. I will tend to the refilling lake and the rivers that feed it. Again, and again. It will be a reservoir of life, of good things, both happy and sad. As it fills with droplets of sorrow, it will ripple with the echoes of her laugh.</p>
<p>Each wave will be her smile.</p>
Feral Vector2019-05-30T00:00:00+00:00http://rachelnertia.github.io/travel/2019/05/30/feral-vector<p>Last weekend I was lucky enough to attend <a href="https://feral-vector.com/">Feral Vector</a> with Natalie. Feral is a 3-day event about games and game-adjacent things, taking place in the leafy valley village of Hebden Bridge (in Yorkshire, I think?). Over the course of the days a variety of talks and presentations are given, videogames are demoed, creative workshops are run, role-playing sessions are held, and the evenings are given over to socialising with your fellow attendees – who are, to a fault, nice as heck.</p>
<p>Highlights were:</p>
<ul>
<li>A professional wrestling match between Videogames and Art. Really.</li>
<li>A game of <a href="https://bullypulpitgames.com/games/ghost-court/">Ghost Court</a> lasting the whole afternoon, with six or so different judges cycling in and out as cases came and went. Oh, and it took place in the town’s actual courtroom. Me and Natalie played a couple of living divorcees disputing who should take custody of our pet ghost dog.</li>
<li>Making new friends and catching up with old ones!</li>
</ul>
<p>If you get the chance to go to this thing next year or another, <em>please do</em>. Highly recommended.</p>
<p>(There should be a photo here, but I did a terrible job of taking any.)</p>
C++ On Sea2019-02-06T00:00:00+00:00http://rachelnertia.github.io/programming/2019/02/06/cpp-on-sea<p>I was very lucky to be able to attend <a href="https://cpponsea.uk/">C++ On Sea</a> this week. It’s been an absolute blast. Let’s see:</p>
<ul>
<li>Everyone I interacted with was so interesting and pleasant.</li>
<li>The talks I attended were engaging and thought-provoking.</li>
<li>I got to meet a whole bunch of new people I’d never met before and people I’d only ever met or followed online and discover what a nice lot they all are in real life.</li>
<li>It wasn’t too big! (Although the venue was definitely at capacity.)</li>
<li>There were at least 10 other game developers there (of different stripes). I expected fewer, so I was very glad to not be alone. Fun to talk about our silly jobs.</li>
<li>Travel was nice and straightforward.</li>
<li>I ate a lot of good food.</li>
<li>I felt very safe and… #included… there was a strong emphasis on the Code of Conduct and being nice and inclusive and all that good stuff, and there were discussions and talks that weren’t just about purely technical issues.</li>
</ul>
<p>I’ve never been to any other C++ conferences, but I still think I can safely say this was a very good one.</p>
<h3 id="talks">Talks</h3>
<p>I found it very difficult to choose which talks to go to, so I ended up making snap decisions. Thankfully all the ones I didn’t go to should be up on YouTube in a few weeks. Here are some quick things about the ones I did attend:</p>
<p><code class="language-plaintext highlighter-rouge">TODO: Update these summaries with YouTube links/embeds</code></p>
<h4 id="kate-gregory-keynote-oh-the-humanity">Kate Gregory: Keynote: Oh! The Humanity!</h4>
<p>Kate spoke about how to recognise the different emotions we can feel in codebases, like fear in commented-out sections, or happiness in well-maintained, readable code. Well worth a watch, and not just because of what a great speaker Kate is.</p>
<h4 id="juanpe-bolivar-postmodern-immutable-data-structures">Juanpe Bolivar: Postmodern Immutable Data Structures</h4>
<p>You like to work with values. You like to write pure functions. But how do you reconcile this with a world in which copying big blocks of data around is expensive and wasteful? Well, you figure out a way for mutations of an array to share data with the original copy of the array, like a god damn wizard.</p>
<p>I need to re-watch this and read through the library to understand it better. I could totally use it, or at least apply the ideas, in a little personal project I was working on recently. I think it’s really cool.</p>
<h4 id="adi-shavit-what-i-talk-about-when-i-talk-about-cross-platform-development">Adi Shavit: What I Talk About When I Talk About Cross-Platform Development</h4>
<p>Stuff to think about when writing libraries. I think I read a blog post about the approach outlined in this talk a while ago.</p>
<h4 id="jason-turner-practical-performance-practices-revisited">Jason Turner: Practical Performance Practices Revisited</h4>
<p>Compilers are cool. And Jason is a very good speaker. Lots of good insights into performance pitfalls.</p>
<h4 id="patricia-aas-deconstructing-privilege">Patricia Aas: Deconstructing Privilege</h4>
<p>It bums me out that some people still need to hear about the idea that everyone is coming to the table from different situations, and that some of those situations come with disadvantages, and that’s all that the idea of ‘privilege’ means!</p>
<p>Good talk though.</p>
<h4 id="lightning-talks">Lightning Talks</h4>
<p>I enjoyed Patricia’s ‘C++ is like JavaScript’ the most. She’s right about the JS community having better beards.</p>
<h4 id="simon-brand-how-to-write-well-behaved-value-wrappers">Simon Brand: How to Write Well-Behaved Value Wrappers</h4>
<p>Rainclouds interspersed with rays of hope. The language is very complicated.</p>
<p>I think we probably want things like optional and variant to be in the language rather than in the standard library. They’re that fundamental. And then nobody would have to fight all the battles Simon outlines when they try to implement them as library components.</p>
<h4 id="viktor-kirilov-the-hitchhikers-guide-to-faster-builds">Viktor Kirilov: The Hitchhiker’s Guide to Faster Builds</h4>
<p>Really thorough overview of different ways builds can be slowed down and, happily, how they can be sped back up. Also a brief and inconclusive talk about modules at the end.</p>
<h4 id="guy-davidson-a-linear-algebra-library-for-c23">Guy Davidson: A linear algebra library for C++23</h4>
<p>Guy is doing great work. I hope more games people become as engaged with the standardisation process as he is. C++ could really do with an out-the-box way to talk about vectors, matrices, and the library he’s working on seems like a really good approach.</p>
<h4 id="clare-macrae-quickly-testing-legacy-code">Clare Macrae: Quickly Testing Legacy Code</h4>
<p>I found the insights in this talk very interesting but I’ve been struggling to think about how to apply them to my world. What hope is there for we whose applications are totally non-deterministic in so many ways? Woe is us.</p>
<h4 id="matt-godbolt-keynote-what-everyone-should-know-about-how-amazing-compilers-are">Matt Godbolt: Keynote: What Everyone Should Know About How Amazing Compilers Are</h4>
<p>Wow. Compilers are COOL.</p>
<p>I learned so much assembly in this talk. Admittedly I know very little assembly and keep forgetting what I learn, but Matt’s enthusiasm for investigating the low-level stuff is infectious. And he’s excellent at explaining.</p>
<h3 id="conclusion">Conclusion</h3>
<p>I am extremely grateful to those who made it possible for me to come, especially Simon, and Philip for organising such a great event. I really hope I get to see the people I met again sometime soon.</p>
<p>I come away feeling refreshed, energised, inspired about the language, the community, and where we’re headed. A much-needed morale boost.</p>
Report from the Hobby Front Line2019-01-15T00:00:00+00:00http://rachelnertia.github.io/hobby/2019/01/15/hobby-frontline<p>This year’s war against the grey is well underway.</p>
<p><img src="/images/minis/frostgrave-thief-and-marksman.jpg" alt="Fun fact: the thief has *already* had paint chipped off it. On its *armpit*, no less. Metal is terrifiying." /></p>
<p>This pair are <a href="http://northstarfigures.com/prod.php?prod=12693">recent</a> <a href="http://northstarfigures.com/prod.php?prod=12691">additions</a> to <a href="http://northstarfigures.com/">North Star</a>’s official <a href="http://northstarfigures.com/list.php?man=195&page=1">Frostgrave</a> range, who I picked up along with a copy of their new female soldiers <a href="http://northstarfigures.com/prod.php?prod=12717">plastic kit</a> late last year. I love them!</p>
<p>They represent my second, much more successful attempt at the technique I said I wanted to get the hang of in my <a href="/hobby/2019/01/05/hobby-goals-aspirations/">hobby goals post</a>.</p>
<p>First, I primed them black using my airbrush. Then I airbrushed a very light grey from above. Then I left them in a drawer for a month or so. When I was finally ready to paint them, I started by completing the ‘value sketch’. This just meant going in with black paint in recesses the airbrush had missed, while bringing up the brightness on areas like the face with white paint. I also did all my edge highlighting in white at this stage – it’s really nice to be able to do this step earlier on, when the cost of mistakes is much lower. At the end of all this I had a greyscale representation of the final result.</p>
<p>Then I began glazing, that is, applying paint that has been thinned down to the extent that it only tints the layer beneath. In my previous attempts at glazing I used Citadel Lahmia Medium, but this time I tried out Vallejo Glaze Medium. I was able to do this for most of the models apart from the skin and metal parts. Both required a thicker application, and I had trouble mixing the medium with these paints without them getting runny. Finally I needed to apply washes and highlights to these areas the old-fashioned way for them to look right.</p>
<p>Having done these I strongly want to do more minis this way. It’s so fast and freeing. No painstaking application of basecoats, no time-consuming layering process. I estimate each model took little more than an hour of painting by hand. Amazing.</p>
<p><img src="/images/minis/frostgrave-tracker-and-warhound.jpg" alt="" /></p>
<p>Also painted this weekend: a <a href="http://northstarfigures.com/prod.php?prod=12695">tracker and her dog</a>! I’d zenithal primed the dog and it’s quite small and simple, so it went quickly, but the tracker longer. I’m really pleased with how my colour choices turned out, especially the lovely warm crimson-shaded leather parts. (Skrag Brown, shaded with Carroburg Crimson.)</p>
<p>The North Star Frostgrave range is fantastic. Diverse and characterful, even the wonkier sculpts have a certain charm. And it keeps getting better - there’s a plastic Wizards kit on the way :D</p>
<p>Other than these I’ve painted a few scraps of terrain, made a start on the <a href="https://www.games-workshop.com/en-GB/Wh-Underworlds-The-Chosen-Axes-2018-ENG">Chosen Axes</a>, magnetized some bases, organised my bits and pieces, and invested in a spraying booth for my airbrush. 2019 is off to a flying start.</p>
Hobby Goals and Aspirations2019-01-05T00:00:00+00:00http://rachelnertia.github.io/hobby/2019/01/05/hobby-goals-aspirations<p>Last year I went hard into miniatures; the hobby grabbed me and just would not let go. I <a href="/hobby/2019/01/04/hobby-lookback/">painted</a> a tonne of stuff! And this year I’m going to try to paint just as much, if not more. Yet, my actual goals for the year aren’t to paint X amount of minis or a list of certain things<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>, they’re all about gaining confidence with techniques I haven’t gotten the handle of.</p>
<p><strong>My main aspiration</strong> is to get to grips with the process of painting minis by first doing a zenithal highlight, and then using glazes and washes to paint stuff fast. Vince has a good tutorial on this system:</p>
<iframe width="100%" height="415" src="https://www.youtube.com/embed/J-dQU-dSNa8" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
<p>The zenithal highlighting stage consists of painting the model black (or the shadow colour of your choice), then applying a mid-tone grey from about 45 degrees, then the lightest colour (white) from directly above. You can do this with rattlecans, or airbrush, or even by drybrushing.
See also: <a href="https://www.youtube.com/watch?v=n0CFC2soR18">value sketching</a>. I’m confident enough with my airbrush now to use it for this kind of thing. It’s glazing that I’m still figuring out.</p>
<p>The idea with glazing is to apply a layer of paint that is so thin as to be partially/mostly transparent<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>. In the video he uses an airbrush to apply the glaze, but it can be done with a normcore brush.</p>
<p><strong>My next goal</strong> is to up my airbrush skills. At the moment I can just about get a miniature primed and zenithal highlighted, but I want to be able to actually get some of the base colours down on larger areas to avoid needing to do painstaking multi-coat brush application.</p>
<p><strong>Other than that</strong>, I’d like to be able to <a href="https://www.youtube.com/watch?v=ERX3ghWvMDw">wet blend</a>, magnetize parts of miniatures for easy weapon-swapping<sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">3</a></sup>, and take better photos of my minis. And spread my disease around by trying to get more of my friends into the hobby.</p>
<p>What I’m <strong>not</strong> going to do is devote much time to learning how to make terrain, much as it fascinates me. I’ll leave that for 2020.</p>
<p>Oh, and, final resolution: <em>No buying new stuff until I’ve cleared most of my backlog!</em></p>
<p>What are your hobby goals for this year?</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>God knows I have an <em>enormous</em> amount of stuff to paint, though. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>But the paint isn’t runny like in a wash. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p>I did this for a Saurus Knight’s arm yesterday! I did a terrible job but now I understand how to do it at least. <a href="#fnref:3" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Hobby Lookback2019-01-04T00:00:00+00:00http://rachelnertia.github.io/hobby/2019/01/04/hobby-lookback<p>A partial list of every figure I built and painted last year, in vaguely chronological order:</p>
<p>‘Olden Times’ refers to the mystical way-back-when in which I was given/bought miniatures and barely painted them, because I was a CONFOUNDING WASTREL of a child.</p>
<table>
<tbody>
<tr>
<td><strong>What</strong></td>
<td><strong>From</strong></td>
<td><strong>Did What</strong></td>
</tr>
<tr>
<td>Skink Chief</td>
<td>Olden Times</td>
<td>Painted. Came back and based it nicely later in the year.</td>
</tr>
<tr>
<td>Snotlings? I think? x5</td>
<td>Olden Times</td>
<td>Painted.</td>
</tr>
<tr>
<td>Night Goblin</td>
<td>Free with a White Dwarf ages ago</td>
<td>Painted.</td>
</tr>
<tr>
<td>Dwarf Warrior</td>
<td>Free with a White Dwarf ages ago</td>
<td>Painted.</td>
</tr>
<tr>
<td>Skink Starpriest</td>
<td>2017, birthday or Xmas present</td>
<td>Painted, based. Later rebased to a round.</td>
</tr>
<tr>
<td>Steelhearts Champions</td>
<td>2017, <em>Shadespire</em></td>
<td>Painted, including base.</td>
</tr>
<tr>
<td>Saurus Knight</td>
<td>Olden Times</td>
<td>Painted</td>
</tr>
<tr>
<td>Skink Chief 2</td>
<td>Olden Times</td>
<td>Painted. Came back and based it nicely later in the year.</td>
</tr>
<tr>
<td>Saurus Oldblood</td>
<td>Olden Times</td>
<td>Painted.</td>
</tr>
<tr>
<td>Bats! x5</td>
<td>Olden Times</td>
<td>Painted.</td>
</tr>
<tr>
<td>Rats! x5</td>
<td>Olden Times</td>
<td>Painted.</td>
</tr>
<tr>
<td>Spiders! x5</td>
<td>Olden Times</td>
<td>Painted.</td>
</tr>
<tr>
<td>Liberators x3</td>
<td>2018, <em>Storm of Sigmar</em></td>
<td>Painted, based.</td>
</tr>
<tr>
<td>Garrek’s Reavers</td>
<td>2017, <em>Shadespire</em></td>
<td>Painted, including base.</td>
</tr>
<tr>
<td>Retributors x2</td>
<td>2018, <em>Storm of Sigmar</em></td>
<td>Painted, based.</td>
</tr>
<tr>
<td>The Farstriders</td>
<td>2018</td>
<td>Painted, including base.</td>
</tr>
<tr>
<td><a href="/hobby/2018/07/11/blood-warriors/">Blood Warriors x3</a></td>
<td>2018, <em>Storm of Sigmar</em></td>
<td>Painted, based, the lot.</td>
</tr>
<tr>
<td><a href="/hobby/2018/07/24/bloodreavers/">Blood Reavers x5</a></td>
<td>2018, <em>Storm of Sigmar</em></td>
<td>Painted, based.</td>
</tr>
<tr>
<td>Lord-Relictor</td>
<td>2018, AoS Starter Set</td>
<td>Painted, based.</td>
</tr>
<tr>
<td>Lord-Castellant</td>
<td>2018, eBay</td>
<td>Painted, based.</td>
</tr>
<tr>
<td>Liberators x10</td>
<td>2018, AoS Starter Set</td>
<td>Painted, based.</td>
</tr>
<tr>
<td>Retributors x3</td>
<td>2018, AoS Starter Set</td>
<td>Painted, based.</td>
</tr>
<tr>
<td>Prosecutors x3</td>
<td>2018, AoS Starter Set</td>
<td>Painted, based.</td>
</tr>
<tr>
<td>Lord-Castellant on Dracoth/Vandus Hammerhand</td>
<td>2018, AoS Starter Set</td>
<td>Painted, based.</td>
</tr>
<tr>
<td><a href="http://www.northstarfigures.com/prod.php?prod=9163">Sigilist & Apprentice II</a></td>
<td>2018</td>
<td>Painted, based.</td>
</tr>
<tr>
<td><a href="http://www.northstarfigures.com/prod.php?prod=8390">Captains III</a></td>
<td>2018?</td>
<td>Painted earlier in the year, I think. Based towards the end.</td>
</tr>
<tr>
<td><a href="http://www.northstarfigures.com/prod.php?prod=8856">Barbarian Tracker and Warhound</a></td>
<td>2018</td>
<td>Painted, based.</td>
</tr>
<tr>
<td>Frostgrave <a href="http://www.northstarfigures.com/prod.php?prod=7467">Soldiers</a> x10</td>
<td>2018</td>
<td>Assembled, painted, based.</td>
</tr>
<tr>
<td>Frostgrave <a href="http://www.northstarfigures.com/prod.php?prod=8756">Barbarians</a> x10</td>
<td>2018</td>
<td>Assembled, painted, based.</td>
</tr>
<tr>
<td>Bladegheist Revenant</td>
<td>500th GW Store Celebration</td>
<td>Assembled, painted, based.</td>
</tr>
<tr>
<td>Glorfindel (on foot)</td>
<td>Olden Times</td>
<td>Painted.</td>
</tr>
<tr>
<td>Dark Elf Assassin</td>
<td>Olden Times</td>
<td>Painted, based.</td>
</tr>
<tr>
<td>Skink Priest</td>
<td>Olden Times</td>
<td>Painted, based.</td>
</tr>
<tr>
<td>Dark Elf Shades x2</td>
<td>Olden Times</td>
<td>Based.</td>
</tr>
<tr>
<td>Saurus Warriors</td>
<td>Olden Times</td>
<td>Painted in 2017. Based.</td>
</tr>
<tr>
<td>Skinks</td>
<td>Olden Times</td>
<td>Painted in 2017. Based.</td>
</tr>
<tr>
<td>The Sepulchral Guard</td>
<td>2018</td>
<td>Painted.</td>
</tr>
<tr>
<td>Knight-Incantor</td>
<td>2018, birthday present</td>
<td>Painted, based.</td>
</tr>
<tr>
<td>Frostgrave Soldiers II (single)</td>
<td>2018</td>
<td>Painted, based. Given to Mum as a Xmas present.</td>
</tr>
<tr>
<td>Ironskull’s Boyz</td>
<td>2018</td>
<td>Painted.</td>
</tr>
</tbody>
</table>
<p>Phew! I think that’s all of them. I could only be bothered to add links for some of them, and there are only photos of some of them on this website and on Twitter. Too bad, for you.</p>
Update2018-10-03T00:00:00+00:00http://rachelnertia.github.io/personal/2018/10/03/update<p>Things are a bit subdued in my life at the moment. I had major surgery less than 3 weeks ago and am very much just beginning my recovery. While I feel better nearly every day (in more ways than one), it’ll be a good few weeks before my life is back to something resembling normal.</p>
<p>In the meantime I’ve been reading plenty, watching lots of YouTube, and <a href="https://twitter.com/nershly/status/1046713230649937922">getting some hobby done</a> when I’m feeling good enough to sit at a table.</p>
<p>I haven’t really had much of the right kind of energy for programming or writing, which seems like a shame because of all the free time, ideas and motivation I have bursting from my seams, but that’s okay. I suppose it’s best to save my thinky-energy for dealing with real problems should they arise and keeping myself comfortable.</p>
<p>Natalie is being a great help, getting shopping, cooking and generally providing morale support. I feel incredibly grateful to have such a good companion around. My mum has also been excellent, helping us return to Edinburgh from the hospital and doing some shopping for us when she can. I’ve also received a lot of nice messages and visits from friends and family members that have really helped to keep me happy and comfy.</p>
<p>If this upward trend continues my time in the recovery doldrums will pass by like nothing.</p>
<p><3</p>
Stormcast Lords and Liberators2018-09-02T00:00:00+00:00http://rachelnertia.github.io/hobby/2018/09/02/stormcast-lords-and-liberators<p><img src="/images/minis/lord-relictor.jpg" alt="" /></p>
<p>My army of <a href="https://www.warhammer-community.com/2018/05/15/15th-may-faction-focus-stormcast-eternalsgw-homepage-post-3/">Stormcast Eternals</a> is growing. The chap above is a <a href="http://ageofsigmar.wikia.com/wiki/Lord-Relictors">Lord-Relictor</a>, a very gothic sort of priest who can heal friends or zap enemies. He’s from the original Age of Sigmar starter set which I bought pre-assembled and half-painted from a friend, so I had to struggle through painting not-in-subassemblies. Which turned out fine in the end. There’s only a few places I couldn’t really get the brush into, but they’re not visible on the final product unless you go looking for them.</p>
<p>I’m particularly pleased with the candles and hourglass, which are coloured purple to connect him to the <a href="http://ageofsigmar.wikia.com/wiki/Realm_of_Shyish">Realm of Death</a>.</p>
<p>It’s such a characterful model and I feel very happy to have painted it!</p>
<p><img src="/images/minis/lord-celestant.jpg" alt="" /></p>
<p>Where the Relictor is more of a support character, the <a href="https://www.games-workshop.com/en-GB/Stormcast-Eternals-Lord-Celestant">Lord-Celestant</a> is more of a leader. I bought him off eBay quite cheaply because I thought he’d be fun to paint and add to my Skirmish warband. (He was!) He’s got a sword, a hammer and a ridiculous hammer-cape, so he can dish out quite a lot of damage while also buffing the soldiers following him. I experimented with using a dark blue wash (Drakenhof Nightshade) to shade the sword and hammer instead of a black one (Nuln Oil) and the result is nice, I think. It’s subtle, but it makes the metal look colder and somehow more solid.</p>
<p><img src="/images/minis/liberators.jpg" alt="" /></p>
<p>Finally, I got through all these guys from the starter set. Like the Relictor, the <a href="https://www.games-workshop.com/en-GB/Stormcast-Eternals-Liberators-2017">Liberators</a> were already assembled and partially painted. The process was a bit of a slog in places – when you’re putting the base colours down on 10 models at the same time, it takes a <em>long</em> time before you start to see the models looking anything like they will in the end, so it’s easy to lost momentum. But I got them done, and now I have a solid battleline of chunky golden boys.</p>
<p>I now have only to paint the 3 <a href="https://www.games-workshop.com/en-GB/Prosecutors-with-Celestial-Hammers-2017">Prosecutors</a>, the 3 <a href="https://www.games-workshop.com/en-GB/Stormcast-Eternals-Paladins-Retributors">Retributors</a> and the <a href="https://www.games-workshop.com/en-GB/Stormcast-Eternals-Vandus-Hammerhand">mounted Lord-Celestant</a> and I will have finished the Stormcast side of the starter box. And I’ll have enough of an army to play actual non-Skirmish games of Age of Sigmar. Exciting!</p>
Bloodreavers2018-07-24T00:00:00+00:00http://rachelnertia.github.io/hobby/2018/07/24/bloodreavers<p><img src="/images/minis/bloodreavers.jpg" alt="" /></p>
<p>Following on from the three <a href="/hobby/2018/07/11/blood-warriors/">Blood Warriors</a>, I’ve painted up five of the Khorne Bloodbound’s speedy, scrappy horde unit. (Everything in this army is called a blood-something.) They’re a huge step up in quality from <a href="https://twitter.com/nershly/status/1000402076055293953">Garrek’s Reavers</a>, the first Khorne models I painted, both in terms of quality and in terms of how happy I am with the colour scheme.</p>
<p>I went through them one at a time, giving myself space to practice painting skin in three different colours. Painting the muscles, scars and such on these guys was an absolute blast and I’m much more confident about painting skin now. I chose the vibrant red and bone trim scheme I debuted on the Blood Warriors and I’m mostly pleased with how it turned out, but I need to improve how I paint the bone sections, which can be quite unsatisfying. After painting the first model (second on the left) I added two new paints to my collection: Screaming Bell and Gehenna’s Gold. Together these create a beautiful, vibrant brass I decided to use for the bronze sections of the weapons and armour. My taste is very much about saturated colours and high contrast, so the Balthasar Gold/Sycorax Bronze combo I was using previously just doesn’t cut it for me. For the bases, I really wanted to put some skulls down – perhaps I should create a little box of pre-painted skulls ready to add to bases.</p>
<p>These are horde units, so I’m going to have to learn to paint them faster and smarter if I’m ever going to get through the big group of them that are in the main AoS starter box.</p>
<p>Now that I’ve finished all the models from the Storm of Sigmar starter set, it’s time to move on. I’m not sure what’s next. I’m gonna paint a quick and easy <a href="http://www.northstarfigures.com/prod.php?prod=8856">Frostgrave dog</a> while I make up my mind.</p>
Blood Warriors2018-07-11T00:00:00+00:00http://rachelnertia.github.io/hobby/2018/07/11/blood-warriors<p><img src="/images/minis/blood-warriors.jpg" alt="" /></p>
<p>These three fellows have been my most recent hobby project. I really like how they’ve come out.</p>
<p>I decided to paint their armour in strong red after painting <a href="https://twitter.com/nershly/status/1000402076055293953">Garrek’s Reavers</a>, my first Khorne models, which I feel came out way too dark and desaturated. After swithering for a bit I went with the bone-coloured trim for the same reason – I didn’t think I’d be able to produce a bronze that contrasted enough with the red. As a painter I definitely prefer my colours to be bright and bold, and for there to be plenty of contrast on a miniature, so I’m glad that my chosen colour scheme satisfies both of my itches. They have a tonne of little details to pick out and sections that are difficult to paint quickly. Getting the base coats down took a long time, but it paid off the moment I finished basing and began shading.</p>
<p>This was also my first time using Daler Rowney’s <a href="https://www.cassart.co.uk/sale_1/painting_sale/product_type_brushes/daler_rowney_simply_acrylic_oil_gold_taklon_short_handled_brush_set_of.htm?nosto=productpage-nosto-1">Simply Gold Taklon Brushes</a>, which I can recommend.</p>
<p>I have a soft spot for Khorne mortal models<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>, which are always suitably threatening, rabid-looking and have plenty of interesting shapes, as well as lots of nice little details to find. Despite all that stuff being present, my favourite part of these models is probably just the chainmail, parts of which hang down in messy strips. It’s easy to paint, and once finished adds a bit of flash and bulks out gaps in the shape of the mini.</p>
<p>This trio are from the Storm of Sigmar mini-starter set, which contains a small subset of the models from the big old Age of Sigmar starter set. I picked up Storm of Sigmar in a local shop because I fancied painting a handful of Stormcast and Khorne models, and shortly afterward got a good deal on the big set from a friend who was having a clear-out. Once I’ve finished all the models from Storm of Sigmar<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup> I’ll begin working my way through the big box. In other words: I’ll be painting Blood Warriors and sculpts like them for a few months yet. It’s a good thing I like painting them! (Although I really do need to figure out a way to make putting the base colours down faster.)</p>
<p>Hobbying is taking up quite a lot (read: most) of my free time these days and as a result I haven’t had much time to write about all the things I want to write about on here. Little hobby progress updates like this one feel like low-hanging blog fruit, so I might do a few more.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>The soft spot is hardened by the absolute absence of any women in the army. Probably my number one thing I wish GW would do is release female versions of Blood Warriors, Bloodreavers, etc. I have my fingers crossed for the rumoured Darkoath army, if it ever exists, containing some cool barbarian ladies after the style of the <a href="https://www.games-workshop.com/en-GB/Darkoath-Warqueen-Marakarr-Blood-Sky-2018">Warqueen</a>. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>I’ve done all the Stormcast, you can see them <a href="https://twitter.com/nershly/status/1008815818891776001">here</a>. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Emperor of the Eight Islands2018-05-29T00:00:00+00:00http://rachelnertia.github.io/reading/2018/05/29/emperor-of-the-eight-islands<p>Imagine a more magical <em>Game of Thrones</em> set in a kind of medieval faux-Japan: you’ve got your <a href="https://en.wikipedia.org/wiki/Tengu">tengu</a>, your fickle forest spirits, your sorcerors and witches, but that stuff is just supersition and faith to the noble families who vie for power and the samurai who protect and serve them. This is the world of <em>Emperor of the Eight Islands</em>, which is the first book in a series I’m itching to continue with. It’s pleasantly compact and quick-to-read, at about 250 pages of flowing prose. I’m not looking for volume in my reading diet these days, so more bite-size books are much more preferable to 600-page endurance-fests.</p>
<p>I won’t go into specifics about the story other than to say that while it certainly sets up its sequel, there’s enough meat on the bones to be worth reading on its own. The book just presented me with a very engaging place to be and characters to be with, so I thought I’d give it a recommendation. It’s succeeded in making me interested in checking out some of its source material – Japanese folk tales and old novels – where games and anime and that sort of thing haven’t quite. So who knows – maybe I’ll be reading <em>The Tale of the Heike</em> at some point down the line. If you happen to know of similar novels/comics/whatevers that might scratch the same itch, please let me know!</p>
<p><img src="https://images-na.ssl-images-amazon.com/images/I/51uk1jFqimL._SX331_BO1,204,203,200_.jpg" alt="" /></p>
Depak Ine2018-05-26T00:00:00+00:00http://rachelnertia.github.io/music/2018/05/26/depak-ine<p>There’s something really special about John Talabot’s 2012 debut album, <em>Fin</em>. Could it be the dreamlike vocals? Could it be the feeling of being transported into a different world through its dark melodies and beats? Could it be how the intoxicating density of each track forms a juicy new layer of flavour, as if it were part of a rich musical chocolate gateau?</p>
<p>Maybe it’s just that it begins like this:</p>
<iframe width="100%" height="415" src="https://www.youtube.com/embed/HI5wcQN9AZ8?rel=0" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen=""></iframe>
<p>You’re in the jungle. Not <em>a</em> jungle. <em>The</em> jungle. It is a place of immense sacred significance. Fingers of mist curl themselves around enormous tree trunks. The canopy above buzzes with a symphony of life. You brush through the shady undergrowth, stepping softly in sodden leaf litter and murky pools. You are searching for something here, something lost and ruined. You have been trekking for days. It is never light here. Each day begins and ends warm, wet and dark. Finally you catch your first glimpse of it through the trees, its lithic bulk almost obscured by verdant vines, leaves of gold and calm green grass: the ancient temple.</p>
<p>I’ll see you there.</p>
Frostgrave2018-05-14T00:00:00+00:00http://rachelnertia.github.io/gaming/2018/05/14/frostgrave<p>Tabletop wargaming can be a lot of fun, but it’s a different kind of fun from what you’ll usually find in a videogame. It’s <em>fuzzy</em>. While in a videogame nearly every move you make, every interaction with the other players, can be unambiguous and clear-cut, the same just isn’t true when you’re measuring inches and moving oddly-shaped minis over the surface of a table. The minis fall over, and when they get back up they’ve slid an extra few millimetres. Even the buildings your soldiers weave between and climb on top of aren’t very solid - they jitter slightly from turn to turn as they are accidentally nudged by the players.</p>
<p>Some designers attempt to tame the madness. To create viable competitive games, they must stamp out any ambiguity about rules. The fuzz must be shaved away to leave a wargame that is slick and streamlined, or so fractally complex that it requires computer-like memory and processing power to execute the rules, and a puritanical attitude between players who police each other’s play and punish every infraction.</p>
<p>Other designers aren’t trying to make a competitive game. Players who are more interested in the simpler pleasures of miniature wargaming – the storytelling, the social contact, the consensual back-and-forth, the <em>trust</em> – will be best served by games that embrace fuzz. Games like <em>Frostgrave</em>.</p>
<p><img src="/images/frostgrave/book-cover.jpg" alt="" /></p>
<!--more-->
<p>Over the last year or so I’ve been getting into <a href="/personal/2017/11/21/the-hobby/">the hobby</a> of miniatures painting and gaming as a kind of escape (perhaps even an exodus) from videogames. It’s been quite a journey, and now it’s led me and a friend into the icy ruins of <em>Frostgrave</em>.</p>
<p><a href="https://ospreypublishing.com/frostgrave"><em>Frostgrave</em></a> is a gaming system published in 2015 by Osprey Publishing and authored by <a href="http://therenaissancetroll.blogspot.co.uk/">Joseph McCullough</a>. It’s done pretty well for itself in the harsh world of miniature wargaming, awarded with an ever-expanding range of <a href="http://www.northstarfigures.com/list.php?man=195&page=1">official miniatures</a> and numerous <a href="https://ospreypublishing.com/frostgrave-ulterior-motives">expansions</a> and even <a href="https://ospreypublishing.com/frostgrave-second-chances">tie-in novels</a>. Having bought some, I can confirm that the miniatures are just as charming as they look, but I’ve yet to read any of the tie-in novels. Tie-in novels can be rubbish, after all, and still mean that your setting has ‘made it’.</p>
<p>The basic idea is that each player controls a wizard who is trying to get rich and/or powerful by looting the remnants of an ancient city. The wizards are not alone, as each brings a warband of hired mercenaries with them and possibly also an apprentice, who functions as a sort of less-good version of the wizard. Each game of <em>Frostgrave</em> involves competing over some treasure scattered across the gaming table while neutral monsters close in and mess stuff up.</p>
<p>It took us a few games to really get going. Partly because we’re idiots who will always stumble slowly over systems that are new to us, but also because the rules for certain spells or situations could be more clearly worded, and we had to resort to searching forums for answers or coming up with little house-rules. Which is fine! As I mentioned, <em>Frostgrave</em> is a fuzzy game, and that means coming up your own solutions to edge cases. It’s like performing a little bit of live-action game design each time you do it.</p>
<p><img src="/images/frostgrave/soldiers.jpg" alt="" /></p>
<p>Now that we’re over the hump the game plays quickly and dynamically. The small model count helps, but more importantly neither player is kept waiting for long before they get to make a move (or at least roll a die) because each round of play has control switching back and forth between players. It’s smarter than a simple I-go-you-go system, consisting of three phases: Wizard Phase, in which the players take turns to activate their wizards. Apprentice Phase, in which the same happens but for apprentices (a good reason to take one with you). Lastly, Soldier Phase, in which they take turns to activate all their remaining soldiers. Wizards and apprentices may activate soldiers near them too, allowing you to do more and act faster in their phases, rather than having to wait until the Soldier Phase. Unit activations are short and sweet, too: you move and/or do an action like attack or cast a spell, and that’s it.</p>
<p>Of note is the ‘swingy-ness’ of the combat system. <em>Frostgrave</em> is played with twenty-sided dice, and the way damage is calculated means it’s possible to get really badly hurt in one hit. For example, if I fail combat against you because you rolled a 19 + your Fight stat of 2 = 21 and I only rolled a 8 + my Fight stat of 1 = 9, the amount of damage I take is 21 - my Armour of 10 = 11 points of damage! Which is often enough to put a soldier out of action<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>.</p>
<p>This isn’t a bug, it’s a feature. Entering combat puts your own combatant at risk as they may lose the combat and take damage. Ranged attacks are terrifying – being out in the open where an enemy archer has line-of-sight to you is hugely risky. We learned pretty quickly that the game map should never have long firing lines. Factors like these make <em>Frostgrave</em> a game about trying to avoid danger as much as possible while adapting to sudden dramatic changes in circumstance. The icy ruins are a scary place to be! Don’t go in expecting to do well by executing a perfectly-laid plan. It may go very much awry.</p>
<p><img src="/images/frostgrave/fight.jpg" alt="" /></p>
<p>I haven’t even talked about spellcasting yet! When you create your wizard you pick out a set of spells for them to start with, pulling from a large and varied collection. Some are simple buffs or attacks while others allow you to modify the state of the table in more interesting ways. I like Push because I can use it to get enemies away from me, or kill them by pushing them off of ledges, or even push my own soldiers off the board if they’re carrying treasure. My friend likes to summon Imps near my warband at every opportunity, bogging me down with a never-ending tide of pesky demons. Wizards must be of a particular ‘school’ (e.g. Necromancer) and this makes spells from their school, and aligned schools, easier to cast. Your apprentice has the same selection of spells as your wizard, but worse stats. When your wizard levels up you can pick a spell to make slightly easier to cast.</p>
<p>Yes, leveling up is a thing, as <em>Frostgrave</em> has rules for playing campaigns in which carry your wizard and warband through multiple games. Only your wizard levels up, while your apprentice shadows your wizard’s stats, and the soldiers in your warband can only be improved with shinier equipment or by dismissing them and replacing them with more expensive soldiers. Meanwhile, soldiers taken out of action during a game have the post-game possibility of surviving, while wizards and apprentices may accrue permanent injuries that affect their stats – and yes, there is a spell that can heal them back to normal!</p>
<p>It’s all a very good package, but the basic rules for how experience points should be awarded needed a bit of an overhaul before we felt comfortable committing to a whole campaign with them. The ground rules encourage you to create wizards who are good at killing things and highly reward wiping out the opposing warband. The author seems to understand these criticisms well and has <a href="http://therenaissancetroll.blogspot.co.uk/2018/05/maze-of-malcor-experience-points-table.html">addressed</a> some of them in an upcoming expansion, but for now we’re using some of <a href="https://drive.google.com/file/d/0B_VXGwQiKFTKdUhXNHY0V3dyMXc/view">Geek Ken’s tweaks</a> (<a href="https://geekken.wordpress.com/2015/11/23/tweaking-frostgrave-campaign-rules/">explained here</a>).</p>
<p>It’s going well. Tomorrow we play the fourth game in our campaign, and as ever I am itching to get started.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>There’s an optional critical hit rule where rolling a 20 results in double damage, but I’m not sure why you’d ever need to play using it – getting hit on a 20 already hurts like hell. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Economics: The User's Guide2018-04-21T00:00:00+00:00http://rachelnertia.github.io/reading/2018/04/21/economics-the-users-guide<p>Recently I read <a href="https://www.bloomsbury.com/us/economics-the-users-guide-9781620408148/"><em>Economics: The User’s Guide</em></a> by <a href="http://hajoonchang.net/">Ha-Joon Chang</a>. As the title implies, it’s a kind of top-down beginner-friendly introduction and glossary that can be dipped into at random or read from beginning to end like I did. It talks about the history of economics, the many different things economists study and theorize about, and the multitude of different theories they come up with. It’s well-written, being concise, engaging and humorous throughout. It’s also carefully and considerately opinionated – which is a good thing!</p>
<p>Chang’s main thrust is that there are various economic schools of thought, and that it’s much less of a ‘hard science’ than many economists like to believe. Instead, it’s mushy, fuzzy, and <em>political</em> – it cannot be untangled from politics like mathematics and physics can. How we study, teach and research ‘hard’ sciences can be heavily political, but at the end of the day they bring us objective truths about reality that fields like economics simply can’t offer. Economics used to be known as ‘political economy’, which was much more accurate name. After all, its ultimate goal is to shape governmental (and non-governmental) policy and change the world. That’s a much more political thing to do than investigating quarks and leptons<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>. The forward-thinking student should analyse and learn from every school, because each has its blind spots and dead ends along with all the valuable insights into how the world works.</p>
<p>He also gives the one of the best one-page overview of the many different meanings of the word ‘liberal’, and why ‘neoliberal’ means more or less the same thing as ‘neoclassical’, and why you should probably use the much less confusing word.</p>
<p>If you’re looking for a nice friendly ‘way in’ to economics, I can recommend <em>The User’s Guide</em> without reservation. I look forward to checking out Chang’s other books.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>We can circle the drain on this a bit, I suppose: Physicists may study because they want to enable the creation of new technologies or improvement of existing ones, which will of course affect the world. For example they might make a discovery that may improve the efficiency of wind turbine technology, an act that has implications for the energy industry and everyone who ever uses a lightbulb. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Quiver Overview: Entity Components2018-04-08T00:00:00+00:00http://rachelnertia.github.io/game%20dev/2018/04/08/quiver-overview-p1<p>This post is the first in a series (hopefully) about the way Quiver, my homebrew game engine, currently works. Today I’ll be talking about the different kinds of components an entity (game object) can be made up of. Note that I’ll also be referring to something called ‘Quarrel’, which is a game I’m developing using the engine. All the code and assets for both Quiver and Quarrel are up on GitHub, so please feel free to <a href="https://github.com/rachelnertia/Quiver">nose around</a>.</p>
<p>Quiver makes use of the <strong>Component</strong> pattern, which is described well in <a href="http://gameprogrammingpatterns.com/component.html"><em>Game Programming Patterns</em></a>. A quick summary would be: <em>instead of having a monolithic entity class, the entity class is just a container for instances of different ‘component’ classes</em>. The component classes implement the logic and store state for different domains, like graphics and physics. If you proceed down the Entity-Component path you might end up in the territory of what’s known as the Entity-Component-System paradigm, in which Entities are made up of Components which interface with/are controlled by Systems. Eventually, the Entity <a href="http://www.dataorienteddesign.com/dodmain/node5.html#SECTION00540000000000000000">doesn’t exist at all</a> – you just have IDs. However far you go, the motivation is the same: to use composition over inheritance, and design in a more data-oriented and multithreading-friendly way.</p>
<p>Quiver exists somewhere on the spectrum between the monolithic entity paradigm and the full-blown ECS paradigm. The Entity class owns a handful of instances of different Component classes, which are each responsible for representing the Entity in different domains, communicating with different game subsystems, and giving the Entity some state or behaviour.</p>
<p>Here is Quiver’s Entity class, with everything but the member variables trimmed out:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Entity</span> <span class="k">final</span> <span class="p">{</span>
<span class="n">World</span><span class="o">&</span> <span class="n">mWorld</span><span class="p">;</span>
<span class="n">EntityId</span> <span class="n">mId</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o"><</span><span class="n">PhysicsComponent</span><span class="o">></span> <span class="n">mPhysicsComponent</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o"><</span><span class="n">RenderComponent</span><span class="o">></span> <span class="n">mRenderComponent</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o"><</span><span class="n">AudioComponent</span><span class="o">></span> <span class="n">mAudioComponent</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o"><</span><span class="n">CustomComponent</span><span class="o">></span> <span class="n">mCustomComponent</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>
<p>It stores a reference to the World it is a part of. The World class represents a ‘room’ or ‘level’. It owns all the Entities, who are addressable using an EntityId. The Entity also knows its own ID. Then it has owning pointers to its components, accessible to others in raw pointer form through getter methods. None of the Components are mandatory apart from the PhysicsComponent (which I am planning to make optional). All of them inherit from the Component class, which looks like this:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Component</span> <span class="p">{</span>
<span class="nl">public:</span>
<span class="k">explicit</span> <span class="n">Component</span><span class="p">(</span><span class="n">Entity</span><span class="o">&</span> <span class="n">entity</span><span class="p">)</span> <span class="o">:</span> <span class="n">mEntity</span><span class="p">(</span><span class="n">entity</span><span class="p">)</span> <span class="p">{}</span>
<span class="k">virtual</span> <span class="o">~</span><span class="n">Component</span><span class="p">()</span> <span class="p">{}</span>
<span class="n">Entity</span><span class="o">&</span> <span class="n">GetEntity</span><span class="p">()</span> <span class="k">const</span> <span class="p">{</span> <span class="k">return</span> <span class="n">mEntity</span><span class="p">;</span> <span class="p">}</span>
<span class="nl">private:</span>
<span class="n">Entity</span><span class="o">&</span> <span class="n">mEntity</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>
<p>So all Components store a reference to the Entity they’re a part of. If a RenderComponent wants to talk to the PhysicsComponent it does so like this:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">PhysicsComponent</span><span class="o">*</span> <span class="n">physics</span> <span class="o">=</span> <span class="n">GetEntity</span><span class="p">().</span><span class="n">GetPhysics</span><span class="p">();</span>
</code></pre></div></div>
<p>The <em>Game Programming Patterns</em> chapter describes a bunch of other ways that entity components can communicate with each other, but simply allowing them to call methods on each other is good enough for now, and far, far easier than implementing e.g. some kind of event system.</p>
<h3 id="physics-component">Physics Component</h3>
<p>This one owns and manages the Entity’s physical body. If you want to push the Entity around, or change what things it collides with, you talk to its PhysicsComponent.</p>
<h3 id="render-component">Render Component</h3>
<p>This one is responsible for updating the Entity’s visual representation. Its API contains methods for changing the Entity’s colour, texture, and talking to the animation system. I might rename it to ‘GraphicsComponent’.</p>
<h3 id="audio-component">Audio Component</h3>
<p>This one is a bit of a stub at the moment as I haven’t had a reason to develop it much, but as you’d expect it manages any sounds the Entity might be making. For example: enemies in Quarrel make a noise when they shoot, so the AudioComponent does that.</p>
<h3 id="custom-component">Custom Component</h3>
<p>This is where the engine code allows game programmers to inject behaviour into Entities. Want an Entity to move around on its own? Write a class that inherits from CustomComponent, override the OnStep method to make it do what you want, then attach an instance of your new class to the Entity as its CustomComponent. I want to make it possible to have more than one CustomComponent on an Entity at once, but I’m managing to work around the restriction at the moment in Quarrel so there’s no rush.</p>
<p>And that’s it for this quick introduction. I’ll probably go into more detail on each Component type in future blog posts, but for now you at least have a basic understanding of what a game object looks like in Quiver.</p>
2018 Goals2018-03-05T00:00:00+00:00http://rachelnertia.github.io/personal/2018/03/05/year-goals<p>I set myself some goals at the beginning of this year. Now seems like a reasonably good time to reflect on why I’ve chosen them and how well I’m progressing with them. I want to figure out if they’re realistic and if they’re worthwhile. If they’re not, I want to figure out what I should change.</p>
<p>Let’s get down to it.</p>
<h3 id="read-20-books">Read 20 Books</h3>
<p>I’m not reading as voraciously as I once did, and I’d like to fix that by building my habit back up. Technical stuff (e.g. a book on how to approach certain programming problems) not included in the count as I don’t read those linearly.</p>
<p>Not including short stories and comics, I’ve read 3 novels so far, but I need to read 2 books per month to be on-track. I need to catch up!</p>
<p>My current book is Ursula Le Guin’s <em>The Disposessed</em> and am itching to read some of it whenever I get the chance, so it’s not that I lack motivation. The thing I lack is time.</p>
<h3 id="go-vegetarian">Go Vegetarian</h3>
<p>I’ve been sort-of vegetarian for a few years, avoiding meat and eating it as an occasional treat or when it’s the only option (e.g. at family meals). I’m curious to see what happens when I push the boat out.</p>
<p>I haven’t noticed the switch, to be quite honest. Life has continued much as before. I’ve eaten meat once because my brother invited me around for dinner and I forgot to tell him I’d gone fully veggie.</p>
<h3 id="learning-swedish">Learning Swedish</h3>
<p>I’ve been learning Swedish using <a href="https://www.duolingo.com/">Duolingo</a> for a couple of years now, and I’m still not a confident speaker or reader. Clearly, work is to be done.</p>
<ul>
<li>Reach 100% fluency on Duolingo</li>
<li>Read some Swedish books</li>
<li>Hold conversations in Swedish without running away</li>
</ul>
<p>I’ll manage this one.</p>
<h3 id="do-some-short-courses">Do Some Short Courses</h3>
<p>Last year I enjoyed attending a couple of short courses run by Edinburgh University, and would quite like to do some more this year. I’m not sure if this will happen, but I’m okay to let it slide.</p>
<h3 id="post-on-here-every-week">Post On Here Every Week</h3>
<p>Posting makes me feel good, but I suck at getting on with it. This is another case where I just need to manage my time and focus much better. You know, it’s that simple…</p>
<h3 id="release-quarrel-on-itchio">Release Quarrel on itch.io</h3>
<p>This is a big one, I hope not too big. There will be some small variety of enemies to shoot, some small number of levels, and some sort of story for people to complete.</p>
<h3 id="release-quiver-10">Release Quiver 1.0</h3>
<p>Another big one. Hopefully once I’ve released Quarrel I will be able to say ‘this is version 1 of Quiver’ and feel comfortable packaging a release up and inviting others to make games with it. If not, the release of Quarrel will still be a big milestone and a good point at which to start using some kind of versioning system (I guess <a href="https://semver.org/">SemVer</a>?).</p>
<h3 id="make-a-podcast">Make a Podcast</h3>
<p>Me and Natalie have had this idea for a podcast in which we sort-of ‘Let’s Play’ our way through various Choose-Your-Own-Adventure books such as <em>Fighting Fantasy</em> classics like <em>Deathtrap Dungeon</em> and <em>Citadel of Chaos</em>. To make this achievable, I minimized the requirements:</p>
<ul>
<li>5 episodes</li>
<li>Each about 30 minutes long</li>
<li>Released when we get them done rather than on a schedule</li>
</ul>
<p>Natalie, we need to work on this!</p>
<h3 id="miniatures">Miniatures!</h3>
<p>Finish assembling and painting my miniatures pile o’ shame. Then I can get new ones! And paint those! I have no worries about this one. If there’s something I reliably find myself wanting to be doing, it’s hobbying.</p>
<p>This year’s going to be a very busy one professionally and personally, so I fully expect a few of these to slip (even more, in some cases). We’ll check back in June.</p>
ChillJam2018-02-13T00:00:00+00:00http://rachelnertia.github.io/game%20dev/2018/02/13/chilljam<p>On Saturday I attended <a href="http://gamedevsoc.com/">Edinburgh Uni Game Dev Society</a>’s ChillJam, a one-day game jam with a relaxed atmosphere. I teamed up with <a href="https://twitter.com/norgg">Norgg</a> to make a little game about making a cup of tea.</p>
<p>You can play it <a href="https://norgg.itch.io/cuppa">here</a>.</p>
<p>It’s very broken, as you’d expect for something made in about 9 hours, but I’m quite pleased with how it turned out. I really like the idea, too – I think it would be lovely to someday make a webpage people can visit and simulate making a cup of tea (or some other kind of beverage!), filled with all kinds of nice, rich interactions. A warm, comforting place on the web.</p>
<p>If you’re curious, you can check out the Unity project source <a href="https://github.com/Norgg/cuppa">on GitHub</a>. My favourite commit message is <a href="https://github.com/Norgg/cuppa/commit/a4051f41356416c7bdf99e2d3ca5e0c9f3e657c9">“Added steam integration”</a>.</p>
<p>Also, Norgg’s daughter helped by drawing the pictures you can see on the mug and kettle, which was the sweetest thing ever.</p>
<p>Enormous thanks to the organizers of the jam for creating such a fantastic event and to all the other participants for sharing their amazing creativity. I am already looking forward to the next one!</p>
<p>Finally, you cannot drink the tea. Don’t worry about it.</p>
Tutorial: Maya 2015 Plugin Development with Visual Studio2018-02-04T00:00:00+00:00http://rachelnertia.github.io/programming/2018/02/04/maya-plugin-tutorial<p><em>Another resurrected old post, I’m afraid. Hopefully it is still useful to somebody.</em></p>
<!--more-->
<h2 id="the-simplest-possible-plugin">The Simplest Possible Plugin</h2>
<ul>
<li>Open Visual Studio. I’m using 2013, but this stuff ought to be transferable to other versions. With a bit of tweaking, anyway.</li>
<li>Make a new empty project. Give it a nice, descriptive name.</li>
<li>Add a new C++ source file called ‘hello_maya.cpp’</li>
<li>Copy and paste this code into it:</li>
</ul>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf"><maya\MSimple.h></span><span class="cp">
#include</span> <span class="cpf"><maya\MGlobal.h></span><span class="cp">
</span>
<span class="n">DeclareSimpleCommand</span><span class="p">(</span><span class="n">HelloMaya</span><span class="p">,</span> <span class="s">"Rachel Crawford"</span><span class="p">,</span> <span class="s">"1.0"</span><span class="p">;);</span>
<span class="n">MStatus</span> <span class="n">HelloMaya</span><span class="o">::</span><span class="n">doIt</span><span class="p">(</span><span class="k">const</span> <span class="n">MArgList</span><span class="o">&</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
<span class="n">MGlobal</span><span class="o">::</span><span class="n">displayInfo</span><span class="p">(</span><span class="s">"Hello Maya!"</span><span class="p">);</span>
<span class="k">return</span> <span class="n">MS</span><span class="o">::</span><span class="n">kSuccess</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<ul>
<li>Open the project’s properties.</li>
<li>Open <strong>Configuration Manager</strong>, and set the active solution platform to <strong>x64</strong>.</li>
<li>Under <strong>General</strong>:
<ul>
<li>Set <strong>Target Extension</strong> to <strong>.mll</strong></li>
<li>Set <strong>Configuration Type</strong> to <strong>‘Dynamic Library (.dll)’</strong></li>
</ul>
</li>
<li>Under C/C++:
<ul>
<li>Under <strong>General</strong>, in <strong>Additional Include Directories</strong>, put <code class="language-plaintext highlighter-rouge">Path\to\Maya2015\include</code></li>
<li>Under <strong>Preprocessor</strong>, in <strong>Preprocessor Definitions</strong>, add <code class="language-plaintext highlighter-rouge">WIN32; NDEBUG; _DEBUG; _WINDOWS; NT_PLUGIN; REQUIRE_IOSTREAM; _USRDLL; MAYAPLUGIN1_EXPORTS;</code></li>
<li>Under <strong>Code Generation</strong>, set <strong>Runtime Library</strong> to <strong>‘Multi-threaded Debug DLL’</strong></li>
</ul>
</li>
<li>Under <strong>Linker</strong>:
<ul>
<li>Under <strong>General</strong>:
<ul>
<li>Set <strong>Output File</strong> to <code class="language-plaintext highlighter-rouge">$(OutDir)$(ProjectName).mll</code></li>
<li>Set <strong>Additional Library Directories</strong> to <code class="language-plaintext highlighter-rouge">Path\to\Maya2015\lib</code></li>
</ul>
</li>
<li>Under <strong>Input</strong>, add these to <strong>Additional Dependencies</strong>: <code class="language-plaintext highlighter-rouge">Foundation.lib; OpenMaya.lib; OpenMayaUI.lib; OpenMayaAnim.lib; OpenMayaFX.lib; OpenMayaRender.lib; Image.lib; opengl32.lib;</code></li>
<li>Under <strong>Command Line</strong>, in <strong>Additional Options</strong>, add <code class="language-plaintext highlighter-rouge">/export:initializePlugin /export:uninitializePlugin</code></li>
</ul>
</li>
</ul>
<p><em>Phew!</em> The hard part is over. Build your project and you should get a file called <code class="language-plaintext highlighter-rouge">‘$your_plugin_name.mll’</code>.</p>
<p>Now open Maya 2015. Navigate to <strong>Window > Settings/Preferences > Plug-in Manager</strong>. Scroll down the window to the bottom. Click <strong>Browse</strong> and navigate to and select your .mll file. Provided it loads correctly, it should appear in the Plug-in Manager window beneath “Other Registered Plugins”. <strong>Check the ‘Loaded’ checkbox next to it.</strong></p>
<p>Now you should be able to just type <code class="language-plaintext highlighter-rouge">“HelloMaya”</code> into a MEL script or <code class="language-plaintext highlighter-rouge">maya.cmds.HelloMaya()</code> into a Python script and Maya will print <code class="language-plaintext highlighter-rouge">// Hello Maya! //</code> to the console.</p>
<p>So what does the code do? In Maya plugins, you create new commands as classes which inherit from the <code class="language-plaintext highlighter-rouge">MPxCommand</code> class. You create your class and give it a <code class="language-plaintext highlighter-rouge">creator</code> method and a <code class="language-plaintext highlighter-rouge">doIt</code> method. Then you write two functions, <code class="language-plaintext highlighter-rouge">initializePlugin</code> and <code class="language-plaintext highlighter-rouge">uninitializePlugin</code>, in which you register and unregister the new class with the Maya API. That’s a lot of busywork for a simple plugin which only adds a single custom command, though, which is why the <code class="language-plaintext highlighter-rouge">DeclareSimpleCommand</code> macro exists. It does everything except define the command’s <code class="language-plaintext highlighter-rouge">doIt</code> method, which is left up to you. The disadvantage is that it locks you in to having only one custom command in your plugin.</p>
<p>When you’re ready to move on, unload the plugin by un-checking ‘Load’ in the Plugin Manager. While the .mll is being used by Maya, we won’t be able to overwrite it with new versions of the plugin built by Visual Studio.</p>
<h2 id="next-steps">Next Steps</h2>
<p>Now we’ll expand on our work so far to create a good starting point for a plugin project.</p>
<p>Scrap the current version of <code class="language-plaintext highlighter-rouge">hello_maya.cpp</code> and bring in 3 new files: plugin_main.cpp, hello_maya.h, hello_maya.cpp. You can get the source code for these <a href="https://bitbucket.org/snippets/r_crawford/b6nn">here</a>. This time, instead of using the <code class="language-plaintext highlighter-rouge">DeclareSimpleCommand</code> macro we go the long way around and do all the things it does by hand.</p>
<p>If it builds and works, you can take a look at the code yourself and see how a budding plugin developer goes about making new commands to use in Maya. Good luck!</p>
<h2 id="links">Links:</h2>
<ul>
<li><a href="">http://www.chadvernon.com/blog/resources/maya-api-programming/your-first-plug-in/</a></li>
<li><a href="">http://www.chadvernon.com/blog/resources/maya-api-programming/introduction-to-the-maya-api/</a></li>
<li><a href="">http://www.chadvernon.com/blog/resources/maya-api-programming/introduction-to-dependency-graph-plug-ins/</a></li>
<li><a href="">http://www.chadvernon.com/blog/resources/maya-api-programming/</a></li>
</ul>
Pitch to BPM2018-02-02T00:00:00+00:00http://rachelnertia.github.io/programming/2018/02/02/pitch-to-bpm<p><em>Before this blog, I had another blog, and another blog before that blog, and so on until the beginning of time. At the moment I’m trying to dig up the best stuff I put on those old sites and re-post it here. This serves two purposes:</em></p>
<ul>
<li><em>Maybe some of this stuff is actually worth preserving.</em></li>
<li><em>I get to put off writing actual new posts for a bit longer.</em></li>
</ul>
<p><em>So here is a post I wrote in university, re-hashed a bit but otherwise unchanged.</em></p>
<h2 id="preamble">Preamble</h2>
<p>When we were making the musical platformer <a href="https://pack-of-wolves.itch.io/amps"><em>AMPS</em></a>, I had a problem to solve.</p>
<p>Objects in the game world use a song’s beat like a clock. The song is a group of <a href="https://www.fmod.com/">FMOD</a> Events which function as layers, all playing at once. We wanted to speed up the song and thus speed up the clock. The problem is that the <code class="language-plaintext highlighter-rouge">FMOD::Event</code> class<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup> doesn’t provide a method for changing the speed of playback. It does, however, provide <code class="language-plaintext highlighter-rouge">SetPitch</code> and <code class="language-plaintext highlighter-rouge">GetPitch</code> functions.</p>
<p>FMOD increases the pitch of audio tracks without worrying about smart pitch-shifting (no, I don’t know what the technique to increase pitch independently of tempo is actually called), so that increasing the pitch doesn’t just make the song sound higher, it makes it sound like it’s being played faster. Imagine making a record play faster than the RPM it’s meant to be played at.</p>
<p>So we can just modify the pitch to make it play faster or slower, but how do we keep our game objects in time with the beat of the song?</p>
<p><code class="language-plaintext highlighter-rouge">Event::SetPitch</code> and <code class="language-plaintext highlighter-rouge">Event::GetPitch</code> measure pitch as follows: a pitch of <strong>0.0</strong> is the base pitch of the audio sample. Nothing has been altered about it. A pitch of <strong>1.0</strong> means the pitch has been shifted up by one pitch unit, and <strong>-1.0</strong> means it’s been shifted down by one pitch unit. Obviously.</p>
<p>What are “pitch units”? <strong>Semitones, tones or octaves</strong>. It depends what you pass to <code class="language-plaintext highlighter-rouge">Event::SetPitch</code> or <code class="language-plaintext highlighter-rouge">Event::GetPitch</code> as the second parameter. The options are <code class="language-plaintext highlighter-rouge">FMOD_EVENT_PITCHUNITS_SEMITONES</code>, <code class="language-plaintext highlighter-rouge">FMOD_EVENT_PITCHUNITS_TONES</code>, <code class="language-plaintext highlighter-rouge">FMOD_EVENT_PITCHUNITS_OCTAVES</code>. e.g.</p>
<p><code class="language-plaintext highlighter-rouge">event->setPitch(new_pitch, FMOD_EVENT_PITCHUNITS_SEMITONES);</code></p>
<p>I use semitones. There are 12 semitones in an octave, so the stuff below should be adaptable to not-using-semitones.</p>
<p>You need to know the base BPM (beats-per-minute) of the track you are pitch-shifting.</p>
<p><strong>Here’s the general formula to pitch up from 0.0 semitones to n semitones:</strong></p>
<p><code class="language-plaintext highlighter-rouge">new BPM = base BPM * (2 ^ (n / 12))</code></p>
<p>e.g. pitching up by a semitone…</p>
<p><code class="language-plaintext highlighter-rouge">105 bpm * (2 ^ (1 semitone / 12)) = 111.24 bpm.</code></p>
<p>…pitching down by a semitone:</p>
<p><code class="language-plaintext highlighter-rouge">105bpm * (2 ^ (-1 semitone / 12)) = 99.11 bpm.</code></p>
<p>Pitching up increases BPM more than pitching down decreases it, because pitch scales logarithmically.</p>
<h2 id="additionally">Additionally…</h2>
<p>We’re using a ‘song-based delta-time’ for updating game objects. Normally the delta-time would be the time since the last frame, but in this case it’s the amount of time the song has progressed since the last frame, so basically the same thing. To account for music going faster or slower, we make world go faster or slower by multiplying this delta-time by a variable equal to <code class="language-plaintext highlighter-rouge">(new bpm / base bpm)</code>.</p>
<h2 id="bpm-to-pitch">BPM to Pitch</h2>
<p>Where <em>m</em> is the number you’re multiplying the base BPM by to get the new BPM:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>new pitch-shift amount (in semitones) = 12 * (ln(m) / ln(2))
new pitch-shift amount (in octaves) = (ln(m) / ln(2))
</code></pre></div></div>
<h2 id="link-dump">Link dump:</h2>
<ul>
<li><a href="">http://www.fmod.org/questions/question/forum-17081</a></li>
<li>THIS IS WRONG: <a href="">http://www.dummies.com/how-to/content/how-to-calculate-a-tunes-beats-per-minute-and-adju.html</a></li>
<li><a href="">http://www.thewhippinpost.co.uk/tools/tempo-pitch-calculator.htm</a></li>
</ul>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>We were using the FMOD Ex API, I think (?), but I can’t find a reference online to link to. There is, however, <a href="https://www.fmod.com/resources/documentation-api?page=content/generated/overview/transitioning.html#/">this article</a> about the differences between that API and more recent versions of FMOD. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Urban Wildlife2018-01-21T00:00:00+00:00http://rachelnertia.github.io/fiction/2018/01/21/urban-wildlife<p><em>Here is a sub-500-word story that I wrote for the <a href="http://forum.escapeartists.net/index.php?board=271.0">4th PodCastle flash fiction contest</a> that ran through July and August 2017, with the three winning stories aired on <a href="http://podcastle.org/2017/12/06/podcastle-499-flash-fiction-extravaganza-flash-fiction-contest-iv/">episode 499</a> of the podcast in December. Telling any story in less than 500 words is an interesting challenge, and what I ended up producing trades more in tone and tension than in plot or payoffs. It was received fairly well and made it into the semifinals, but there were many stories that were better-written, more interesting and much more deserving of the prize. A lot of fun was had in the process, anyhow, and I’m proud of this little story and myself for finally getting some fiction out into the world, however short it may be.</em></p>
<p><em>I’m hugely thankful to David Ferguson who provided feedback and editing on the story. Without his great input it would be utter rubbish.</em></p>
<p><em>I hope you enjoy it! Let me know what you think in the comments below or on <a href="www.twitter.com/nershly">Twitter</a>.</em></p>
<p><img src="/images/lizard-lamp.jpg" alt="" /></p>
<p>They came into the cities like countless other wild creatures had before them. At first they were cautious, caught by humans only in brief glimpses when they darted through the glow beneath lampposts and windows. On the walk home a person might see a pair of reflective eyes watching from the bushes, cold and wary, before they disappeared in a blink. They were mostly silent, which helped them go unnoticed, and when one did make sounds it was easy to mistake its yowling for a cat’s or even a baby’s. They ran from adults but did not mind children. In fact when a child was alone they would observe it closely, curiously, almost as if trying to remember something.</p>
<p>As their numbers grew so did their confidence. They rummaged in bins and fouled on lawns. They stole food and trinkets through open windows. They were seen breaking into containers, smashing them with rocks or prying them open with sticks. They would peer in the windows of family homes, hiding the moment an adult turned to look. Sometimes a ground floor window would have a new crack in it in the morning. People would wonder.</p>
<p>Their nests became larger and easier to find. The media buzzed for a morning about the novelty of an abandoned nest found on the twenty-first floor of a construction site. Perhaps its inhabitants had lived off builders’ unfinished lunches, or the rich pickings that could be raided from the alleyways behind nearby restaurants. Footage surfaced online of one appearing to beckon to a toddler who was alone in a garden, and a clip showing a group catching pigeons went viral.</p>
<p>People got wiser about living in their presence. The popular advice went like so: don’t leave doors or easy-to-reach windows open, don’t encourage them by leaving food out, and put locks on bins. The less-given, less-taken advice was to nail a horseshoe above the door, but it sounded far too superstitious for most. Regardless of the precautions people took, they got smarter in response. It turned out they could open doors, teaching each other the technique. It was rumoured they could even pick locks.</p>
<p>In the countryside they had merely survived. In the city, they thrived. Newspapers and politicians began to talk about “pest control” as they went from curiosity, to nuisance, to threat.</p>
<p>It was near midsummer when a baby girl went missing from her ground-floor bedroom. At first it was a routine investigation, given little more than a paragraph buried near the middle of the national papers, but it quickly became clear something was different. Something the police were avoiding questions about.</p>
<p>The questions stopped when the girl was found.</p>
<p>Then the struggle began.</p>
2017 in Reading2018-01-14T00:00:00+00:00http://rachelnertia.github.io/reading/2018/01/14/2017-in-reading<p>One of my goals for 2018 is to ready 20 books. That’s about 2 books per month! So far I’m enjoying doing more reading, because over the last few years the amount of books I’ve managed to get through has really dropped off.</p>
<p>Time to reflect on some of what I read last year.</p>
<h2 id="the-economics-of-enough"><a href="https://press.princeton.edu/titles/9402.html">The Economics of Enough</a></h2>
<p>A book by <a href="http://enlightenmenteconomics.com/">Diane Coyle</a> (who incidentally was on <a href="https://www.npr.org/sections/money/2018/01/12/577710151/the-recession-predictor">Planet Money’s The Indicator podcast this week</a>). I read this towards the end of 2016 and finished it in January 2017, so I don’t remember the details very well, but I do remember finding it interesting. Being a book about the future of civilisation, it has its share of gloomy forecasts, but it has a positive message, too. We can, in fact, solve (or at least handle) these problems that face us in the 21st century: climate change, the financial meltdown cycles of capitalism, overcompetition for natural resources, economic inequality, the crisis in democracy…</p>
<p>There’s a lot of them. Diane’s presents some of her solutions as almost inevitable, sooner or later, and that the longer they are delayed the more damage will fill the gap until their implementation becomes unavoidable. Her main suggestions are, in brief and broadly:</p>
<ul>
<li>Improve how progress and production is measured and statistically analysed. How are we to address any issues if we cannot fully understand their scale and their causes?</li>
<li>Encourage saving of money and discourage spending, in particular on high-carbon consumption. She advocates taxation on consumption. Promote investment in projects with long-term benefits, rather than short-term returns.</li>
<li>Austerity is okay if you convince the public that it’s for a good reason.Cuts in public expenditure are “inevitable” as is “reforming the provision of services”. Yeah, uh.</li>
<li>Reduce income inequality.</li>
<li>Experiment in how to re-engage disengaged citizens with public policy-making processes. With the Internet?</li>
<li>The Office for Budget Responsibility is a good thing, in principle, because it has “an explicit duty to take account of the long-term and future generations”.</li>
<li>Countries should just go ahead and address the issues of climate change as best they can, with or without international agreement. They certainly shouldn’t wait around for that to happen, anyway.</li>
</ul>
<h2 id="the-mythology-of-work"><a href="https://www.redpepper.org.uk/the-mythology-of-work/">The Mythology of Work</a></h2>
<p>I don’t remember much about this. It comes from the right place, one of deep skepticism about the mores that bind us to the millstone, but it is not written well or accessibly. I found it a little masturbatory, to put it bluntly. And not in the good way.</p>
<p>Which made me sad. I would like to be able to recommend a book on this subject to people.</p>
<h2 id="the-goblin-emperor"><a href="https://www.indiebound.org/book/9780765326997">The Goblin Emperor</a></h2>
<p>I enjoyed this! It’s about a guy who gets catapulted overnight from royal family reject to improvisational imperial majesty. The reader shares his POV as he navigates his way through the tumultuous waters of his first year of emperor-hood, dodging schemes and plots galore. The setting is kinda cool, with baroque, almost steampunky elements, and some excellent made-up names, like <em>Varenechibel</em> and <em>Edonomee</em>.</p>
<p>Take my review with a pinch of salt. I read the book on the flights to and from San Francisco, and I appreciated perhaps more than I would have otherwise because it allowed me to escape into a fantastical world in which people have leg room.</p>
<p>The story has progressive leanings, but I find myself agreeing with <a href="https://www.currentaffairs.org/2017/10/sci-fi-fantasy-and-the-status-quo">Lyta Gold’s opinion</a> that</p>
<blockquote>
<p>Novels like The Goblin Emperor are especially disappointing because they’ll go out of their way to include genuinely progressive elements – acknowledgement of inequality, protagonists of color, gay characters, heroines who persist – but consistently stop short of portraying anything resembling large-scale political or societal change.</p>
</blockquote>
<p>Hmm!</p>
<h2 id="scotland-the-brave"><a href="http://www.gerryhassan.com/blog/scotland-the-bold-making-the-case-for-a-radical-scotland/">Scotland the Brave</a></h2>
<p>Something about the past and future of Scotland as a place in the world. Positive!</p>
<h2 id="the-knowledge-corrupters"><a href="https://www.wiley.com/en-gb/The+Knowledge+Corrupters:+Hidden+Consequences+of+the+Financial+Takeover+of+Public+Life-p-9780745669854">The Knowledge Corrupters</a></h2>
<p>Isn’t it great how much effort some factions put into undermining the ability of people to reach political consensus, or indeed any kind of agreement at all, by sowing distrust in scientific sources and demolishing the integrity of the journalistic profession? All so they can make more money?</p>
<h2 id="thunderbird"><a href="http://www.simonandschuster.co.uk/books/Thunderbird/Chuck-Wendig/Miriam-Black/9781481448710">Thunderbird</a></h2>
<p><a href="http://terribleminds.com/ramble/">Chuck Wendig</a> continues his flawless streak as the writer of Miriam Black, hardcore detective extraordinaire who can see how you die. This is pure edge-of-your-seat excellence, like the preceding three novels in the series. Not much more to say about it than that. It’s just <em>good</em>.</p>
<h2 id="the-shepherds-crown"><a href="https://www.terrypratchettbooks.com/book/the-shepherds-crown/">The Shepherd’s Crown</a></h2>
<p>It took me a long time to get around to reading this one because it felt like finally saying goodbye to an author whose books played a massive part in raising me from childhood to young adulthood, laughing, crying and thinking all the way. He’ll never really be gone, though. Not while his characters are still taking readers like me on adventures they’ll never forget.</p>
<h2 id="the-gates-of-azyr"><a href="https://www.blacklibrary.com/warhammer-age-of-sigmar/novels/gates-of-azyr.html">The Gates of Azyr</a></h2>
<p>A horror story. I am not referring to the novel, but to the following sentence: I read a Warhammer novel. My first. And the really scary part? It’s not my last.</p>
<h2 id="the-joy-of-tax"><a href="https://www.penguin.co.uk/books/1108553/the-joy-of-tax/">The Joy of Tax</a></h2>
<p><a href="http://www.taxresearch.org.uk/Blog/richard-murphy/">Richard Murphy</a> on what exactly tax is, and how it’s an indispensible tool for shaping the economy and addressing social ills like economic inequality and excessive carbon consumption. We should all care about it a lot more, and put to flight the school of thought that says that tax is inherently evil. He proposes a lot of ways to improve the United Kingdom’s tax system, as well as providing some useful lessons on how money works.</p>
<p><a href="https://www.theguardian.com/commentisfree/2015/oct/07/joy-of-tax-david-cameron-joke-conservative-conference">Here is Richard Murphy defending his book against David Cameron</a>, who made a joke of it at the Conservative Party conference. That will probably make you want to read it more.</p>
<h2 id="rethinking-the-economics-of-land-and-housing"><a href="https://www.zedbooks.net/shop/book/rethinking-the-economics-of-land-and-housing/">Rethinking the Economics of Land and Housing</a></h2>
<p>More economics. A guided tour of how badly messed up the market for land in the United Kingdom and a number of other Western economies is, and how it messes up other areas of those economies. The book is in agreement with The Joy of Tax about a number of things, like how bad council tax is, and how we should probably tax land ownership. I found it quite interesting, but a little dry and technical in places, like its title. I might re-read it to see if I understand some more of it.</p>
Quiver Presentation at C++ Edinburgh2018-01-10T00:00:00+00:00http://rachelnertia.github.io/programming/2018/01/10/quiver-presentation<p>On December 11th I gave a talk at <a href="http://cppedinburgh.uk/">C++ Edinburgh</a> about my hobby project game engine, <a href="https://github.com/rachelnertia/Quiver">Quiver</a>. I was barely prepared and kind of blundered my way through it, but the audience seemed to enjoy themselves, and I certainly had fun. Somehow I ran to over 30 minutes, when I thought I had only been going for 10. Time flies! The recording is below.</p>
<iframe width="100%" height="380" src="https://www.youtube.com/embed/Bsq3aL9g7Xg?rel=0" frameborder="0" gesture="media" allow="encrypted-media" allowfullscreen=""></iframe>
<p>I made the presentation slides using <a href="https://remarkjs.com/#1">React.js</a> because I wanted to try using something that’s not PowerPoint or Google Slides. It worked, but there’s something odd about needing to run a web server in order to present some slides.</p>
<p>You can view the slides <a href="/presentations/c++-edinburgh-quiver">here</a>.</p>
Introduction to std::chrono2018-01-07T00:00:00+00:00http://rachelnertia.github.io/programming/2018/01/07/intro-to-std-chrono<p>How many times have you tried to call a function that alleges to return a time value only to realise you don’t know what units the value is in? Or that takes a time value as a parameter, but doesn’t specify whether the value is expected to be in milliseconds, seconds, or hours?</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// What is it? I guess milliseconds? Could be microseconds!</span>
<span class="kt">int</span> <span class="nf">GetGameTime</span><span class="p">();</span>
<span class="c1">// deltaTime is probably in seconds?</span>
<span class="kt">void</span> <span class="nf">TakeStep</span><span class="p">(</span><span class="k">const</span> <span class="kt">float</span> <span class="n">deltaTime</span><span class="p">);</span>
</code></pre></div></div>
<p>Hopefully there are comments somewhere near the declaration of the function that can help straighten things out, but you may not be so lucky. You may have to read through lines and lines of code to see how these functions are used before you understand what units they use.</p>
<p>APIs like this are hard to understand at a glance and can cause a lot of bother. Consider the potential cost of a bug that occurs when an API expects milliseconds, but is passed seconds. Here’s a slide from <a href="https://youtu.be/fX2W3nNjJIo?t=3173">Bjarne Stroustrup’s CppCon 2017 keynote</a>:</p>
<p><img src="/images/bjarne.png" alt="" /></p>
<p>…in which he pointed out that the failure of the <a href="https://en.wikipedia.org/wiki/Mars_Climate_Orbiter">Mars Climate Orbiter</a> was due to a software bug that would have been completely avoidable had a particular API encoded the units of measurement it used (in this case, imperial instead of metric).</p>
<p><strong>UPDATE:</strong> STL pointed out in a <a href="https://www.reddit.com/r/cpp/comments/7otsjh/introduction_to_stdchrono/dscd79y/">Reddit comment</a> that Stroustrup’s slide is wrong! But the sentiment is correct, anyway.</p>
<p>And so we have strongly-typed time values like C#’s <a href="https://msdn.microsoft.com/en-us/library/system.timespan">System.TimeSpan</a> provides. In the world of C++, many libraries and frameworks have their own time type. For example, <a href="https://www.sfml-dev.org/index.php">SFML</a> has <a href="https://www.sfml-dev.org/documentation/2.4.2/classsf_1_1Time.php">sf::Time</a> and <a href="https://www.sfml-dev.org/documentation/2.4.2/classsf_1_1Clock.php">sf::Clock</a>. <code class="language-plaintext highlighter-rouge">sf::Clock::getElapsedTime</code> returns a <code class="language-plaintext highlighter-rouge">sf::Time</code>, which can be compared to, added to and subtracted from other instances of <code class="language-plaintext highlighter-rouge">sf::Time</code>. Then it can provide its value as seconds (float), milliseconds (int32) or microseconds (int64).</p>
<p>Until C++11, the language didn’t have a standard way to represent times. Then <a href="http://en.cppreference.com/w/cpp/chrono">chrono</a> was added to the standard library.</p>
<p>chrono exists at a higher level of abstraction than <code class="language-plaintext highlighter-rouge">sf::Time</code>/<code class="language-plaintext highlighter-rouge">sf::Clock</code>. The library consists of three concepts: clocks, time points and durations.</p>
<h3 id="clocks">Clocks</h3>
<p><a href="http://en.cppreference.com/w/cpp/concept/Clock"><strong>Clocks</strong></a> are time providers, consisting of a starting point (“epoch”) and a tick rate. A clock has a <code class="language-plaintext highlighter-rouge">now()</code> member function that returns how much time has passed since the starting point. The standard library provides three clocks for your basic out-the-box time-getting functionality, the main one being <a href="http://en.cppreference.com/w/cpp/chrono/system_clock"><code class="language-plaintext highlighter-rouge">system_clock</code></a>. If you need to, you can create your own class or bundle that satisfies the Clock concept.</p>
<h3 id="time-points">Time Points</h3>
<p><a href="http://en.cppreference.com/w/cpp/chrono/time_point">time_point</a> represents how much time has passed since the start of the clock it is defined in terms of. For example, a <code class="language-plaintext highlighter-rouge">time_point<system_clock></code> would record how long since the <code class="language-plaintext highlighter-rouge">system_clock</code> started. You’d initialise it like so:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">time_point</span><span class="o"><</span><span class="n">system_clock</span><span class="o">></span> <span class="n">t</span> <span class="o">=</span> <span class="n">system_clock</span><span class="o">::</span><span class="n">now</span><span class="p">();</span>
</code></pre></div></div>
<p>You won’t be able to initialise it with the <code class="language-plaintext highlighter-rouge">now()</code> of a different clock because its <code class="language-plaintext highlighter-rouge">time_point</code> type isn’t convertible to that of the original clock.</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">time_point</span><span class="o"><</span><span class="n">system_clock</span><span class="o">></span> <span class="n">u</span> <span class="o">=</span> <span class="n">steady_clock</span><span class="o">::</span><span class="n">now</span><span class="p">();</span> <span class="c1">// Error!</span>
</code></pre></div></div>
<p>(Note: because <a href="http://en.cppreference.com/w/cpp/chrono/high_resolution_clock">high_resolution_clock</a> may be an alias to <code class="language-plaintext highlighter-rouge">system_clock</code>, it may be possible to convert between their <code class="language-plaintext highlighter-rouge">time_point</code> types. Don’t count on it, because your code may not be portable if you do.)</p>
<p>At runtime a <code class="language-plaintext highlighter-rouge">time_point</code> is a simple arithmetic type like an int or a float, and it can be added to and subtracted from other <code class="language-plaintext highlighter-rouge">time_point</code> instances, as long as they all come from the same clock.</p>
<h3 id="durations">Durations</h3>
<p>A <a href="http://en.cppreference.com/w/cpp/chrono/duration">duration</a> is, like a <code class="language-plaintext highlighter-rouge">time_point</code>, just a puffed-up arithmetic type. Unlike <code class="language-plaintext highlighter-rouge">time_point</code>, it’s not coupled to a specific clock type at compile time.</p>
<p>Along with its runtime value the duration contains a compile-time <em>ratio</em> specifying the units of time that value represents. A ratio of 1:1000 means milliseconds, a ratio of 1:1,000,000 means microseconds. The default ratio is 1:1 – that is, the default units for durations is seconds. The standard library defines some ratios for us in the <code class="language-plaintext highlighter-rouge"><ratio></code> <a href="http://en.cppreference.com/w/cpp/numeric/ratio/ratio">header</a>.</p>
<p>You declare and set durations like so:</p>
<p>(<code class="language-plaintext highlighter-rouge">duration::count</code> returns the value of the underlying arithmetic type.)</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// integral representation of 10 milliseconds</span>
<span class="n">std</span><span class="o">::</span><span class="n">chrono</span><span class="o">::</span><span class="n">duration</span><span class="o"><</span><span class="kt">int</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">milli</span><span class="o">></span> <span class="n">d</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>
<span class="c1">// d.count() == 10</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">chrono</span><span class="o">::</span><span class="n">milliseconds</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span>
<span class="c1">// d.count() == 5</span>
<span class="n">d</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">chrono</span><span class="o">::</span><span class="n">seconds</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>
<span class="c1">// d.count() == 10,000</span>
</code></pre></div></div>
<p>Casting from seconds to milliseconds can happen implicitly, but in other cases it is necessary to use <a href="http://en.cppreference.com/w/cpp/chrono/duration/duration_cast">duration_cast</a>.</p>
<h3 id="user-defined-literals">User-defined Literals</h3>
<p>These are wonderful little things of which chrono provides a handful. The <a href="http://en.cppreference.com/w/cpp/chrono/operator%22%22s">s</a> literal, for example, turns its operand into a <code class="language-plaintext highlighter-rouge">duration<unsigned long long></code> or <code class="language-plaintext highlighter-rouge">duration<long double></code>.</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="o">::</span><span class="n">chrono_literals</span><span class="p">;</span>
<span class="c1">// integral rep of 1 second</span>
<span class="n">std</span><span class="o">::</span><span class="n">chrono</span><span class="o">::</span><span class="n">duration</span><span class="o"><</span><span class="kt">int</span><span class="o">></span> <span class="n">t1</span> <span class="o">=</span> <span class="mx">1s</span><span class="p">;</span>
<span class="c1">// floating-point rep of 1 second</span>
<span class="n">std</span><span class="o">::</span><span class="n">chrono</span><span class="o">::</span><span class="n">duration</span><span class="o"><</span><span class="kt">float</span><span class="o">></span> <span class="n">t2</span> <span class="o">=</span> <span class="mx">1s</span><span class="p">;</span>
<span class="c1">// floating-point rep of a fraction of a second</span>
<span class="n">std</span><span class="o">::</span><span class="n">chrono</span><span class="o">::</span><span class="n">duration</span><span class="o"><</span><span class="kt">float</span><span class="o">></span> <span class="n">t2</span> <span class="o">=</span> <span class="mx">1ms</span><span class="p">;</span>
</code></pre></div></div>
<h3 id="conclusion">Conclusion</h3>
<p>Finally, here is the API from the beginning of this article, rewritten to use chrono:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf"><chrono></span><span class="cp">
</span>
<span class="n">std</span><span class="o">::</span><span class="n">chrono</span><span class="o">::</span><span class="n">duration</span><span class="o"><</span><span class="kt">int</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">milli</span><span class="o">></span> <span class="n">GetGameTime</span><span class="p">();</span>
<span class="kt">void</span> <span class="nf">TakeStep</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">chrono</span><span class="o">::</span><span class="n">duration</span><span class="o"><</span><span class="kt">float</span><span class="o">></span> <span class="n">deltaTime</span><span class="p">);</span>
</code></pre></div></div>
<p>And we can all sleep a little better at night.</p>
<p><strong>UPDATE:</strong> Reddit user kalmoc <a href="https://www.reddit.com/r/cpp/comments/7otsjh/introduction_to_stdchrono/dscvhtl/">mentioned</a> Howard Hinnant’s date <a href="https://github.com/HowardHinnant/date">time library</a>. I haven’t used it yet but it looks like a useful extension of chrono.</p>
My 20172017-12-31T00:00:00+00:00http://rachelnertia.github.io/personal/2017/12/31/my-2017<p><img src="/images/calton-hill-sunset.jpg" alt="" title="Sunset over Calton Hill, taken 2017/7/17 on my walk home from work over Salisbury Crags." /></p>
<p>I did a some really cool things this year.</p>
<p>For one thing, I settled into my job. I have a long way to go and so much more to learn, but I feel like I’m in the swing of things now. I still find it amazing that people are willing to pay me to write code for games, surrounded by awesome people in a lovely office. I’m very excited about what I’ll get to work on in 2018.</p>
<p>In February I visited San Francisco to attend Game Developers Conference (GDC), an amazing opportunity to rub shoulders with people from all across the industry. I wouldn’t have gone if <a href="https://twitter.com/rhythm_lynx">Connor</a> hadn’t invited me along with him, so I’m very thankful to him for that. You can read all about my GDC experience <a href="/game%20dev/2017/03/14/my-first-gdc/">here</a> and my time in San Francisco <a href="/travel/2017/03/21/san-francisco/">here</a>.</p>
<p><img src="/images/midsummer-fire.jpg" alt="" title="For Midsummer I went to Dundee for a night of Latvian food and drinking in the park. We went home to bed before sunrise but it was a great time all the same." /></p>
<p>In the summer I took a few days off work to attend two short courses at Edinburgh University. The first was “Scottish Politics in Context”, which was a whirlwind tour of Scottish politics from the early modern period to the recent upheavals. The second was “Introduction to Solar Power”, a one-day course that explained the many ways we can use solar power, from heating water to the various kinds of photovoltaic cells. We also got to make our own PV cells using blackberry juice as a dye, which I didn’t know was even possible. I’d recommend both courses. I’m definitely going to do some more short courses this year coming.</p>
<p>In October me and Natalie went on holiday to the South of France, my first actual holiday out of the country for years. It was <a href="/travel/2017/10/25/la-garde-freinet/">excellent</a>.</p>
<p>My Mum moved house, so I had to say goodbye to the house I grew up in. I felt sad, but the process made me realise that I’ve well and truly moved out – her house hadn’t felt like <em>my home</em> for several years. Her new place is great, anyway, so it’s all worthwhile. (It also made me think about the Edinburgh housing market (Holy shit! (What the fuck?)))</p>
<p><img src="/images/balgay-graveyard-shadows.jpg" alt="" title="Natalie moved out of Dundee in the summer, but I used to go visit her there most weekends. One of our favourite walks was around Balgay Hill and the graveyard there, which was especially beautiful in the Spring. I hope I get to live in Dundee again sometime." /></p>
<p>In the latter half of the year I reached out and became an attendee of <a href="http://cppedinburgh.uk/">C++ Edinburgh</a>, the local C++ usergroup. Everyone who attends is nice, works on cool stuff and has a lot of knowledge to share. In December I gave a short presentation at the meetup about my game engine, Quiver, which was quite good fun. I hope I can fit in some other meetups in 2018.</p>
<p>Speaking of Quiver, that project chugged along a fair bit, although I struggled to commit enough time to it. I finally came up with a good name, so it’s no longer just “the Quarrel engine”, and I made it open-source. You can check it out on <a href="https://github.com/rachelnertia/Quiver">GitHub</a>. I look forward to continuing to tinker with it next year – there’s a lot of work to do! Maybe I’ll actually make Quarrel into a playable game! (Ha ha!)</p>
<p>In short, my 2017 was a blast. Just about everything that could have gone well went well. I have a lot to be thankful for. I live in a lovely flat with a lovely flatmate, I have excellent friends and a wonderful girlfriend, I love my job and it seems to like me. I know that 2018’s going to be a tough one (both professionally and personally), so I’m glad I get to begin it on the best possible footing.</p>
<p>Thanks for reading. I hope your 2018 is productive and peaceful.</p>
<p><img src="/images/kidshielhaugh-driveway-august-17.jpg" alt="" title="Lush countryside! This is where my Dad lives" /></p>
2017 in Gaming2017-12-31T00:00:00+00:00http://rachelnertia.github.io/gaming/2017/12/31/2017-in-gaming<p>The annual roundup of games I played this year, both physical and digital, and gaming-related things I did, most of which I didn’t get around to writing about. Let’s get started.</p>
<h3 id="tolva">Tolva</h3>
<p><img src="/images/the-signal-from-tolva/tolva_01.jpg" alt="" /></p>
<p>A standout for the year for me was Big Robot’s lonely, exploration-driven first-person shooter <a href="http://store.steampowered.com/app/457760/The_Signal_From_Tlva/"><em>The Signal from Tolva</em></a>. Part <a href=""><em>Stalker</em></a>, part <a href="">Ian McQue</a> painting, it struck such a chord with me that I took the time to write a <a href="/gaming/2017/07/15/the-signal-from-tolva/">review</a> of it. I’ll let you go and read that instead of nattering on about it here.</p>
<h3 id="blood-and-wine">Blood and Wine</h3>
<p>I completed <a href="www.thewitcher.com/"><em>The Witcher 3</em></a>’s second expansion, <em>Blood and Wine</em>. Its writing isn’t quite as impressive or thought-provoking as <em>Hearts of Stone</em>, but it provides an exciting adventure and fitting farewell to the franchise and its characters. It also contains a whole new region to explore, which I did at length simply to bask in how gorgeously colourful and sun-drenched it all was. Quite a change from the main game’s grim and stormy lands. I hope Geralt enjoys his retirement in Toussaint.</p>
<h3 id="a-return-to-tyria">A Return to Tyria</h3>
<p>The announcement of <a href="https://www.guildwars2.com/"><em>Guild Wars 2</em></a>’s <a href="https://www.guildwars2.com/path-of-fire/">second expansion</a> prompted me to revisit that game and finally level my character to 80. On paper, <em>Guild Wars 2</em> is an iteration of the MMORPG formula ideally suited to me. It’s super easy to drop in and out of, welcomes solo players, has actually entertaining combat (a real rarity in MMOs), and above all has no subscription fee. But there’s something missing, something that I don’t think is the game’s fault. It’s me – I just don’t have a network of other people who play the game who can motivate me to play the high-level content and get the most out of the game, and I don’t have the time to build one. I dunno, maybe I’ll pick up the expansions at some point just to play through the content I can do on my own. I sure do like the look of those <a href="https://www.youtube.com/watch?v=0zoDp6rK9V0">mounts</a>.</p>
<h3 id="warcraft-iii">Warcraft III</h3>
<p>I reinstalled <em>Warcraft III</em> recently. It’s still awesome. Blizzard have released a patch that makes it play nicely with widescreen monitors and removed the requirement to insert the disc to play, as well as make it possible to switch between the base game and the expansion from the main menu, so now is a great time to revisit this classic. I’ve been stomping my way through the campaign, which is still probably the best example of linear storytelling in a strategy game.</p>
<p>The editor is also the best thing ever. I used it to make a map for Natalie as a birthday treat and rediscovered what an awesome tool it is. It’s super easy just to make something that looks cool, and the scripting system is very accessible and friendly. It’s no wonder that this is the editor that spawned <em>Defense of the Ancients</em>, a custom map that spawned the ultra-successful genre of games like <em>League of Legends</em> and <em>Dota 2</em> (for which there still isn’t a good name). I was never into <em>DotA</em>, preferring to explore the vast sea of other amazing things people had created using the editor.</p>
<h3 id="total-warhammer">Total Warhammer</h3>
<p>I’ve been a fan of Creative Assembly’s <em>Total War</em> series ever since its first outing, <em>Shogun: Total War</em>, set in feudal Japan. I’ve also always had a thing for Warhammer. So picking up <em>Total War: Warhammer</em> was a bit of a no-brainer. Steam says I’ve played it for 20 hours, so how come I feel like I’ve hardly touched it?</p>
<p>Well, it’s a bit of a slog. I enjoy it, but it’s incredible how long it takes to make progress in a modern <em>Total War</em> game. And not just because of the long loading times – these games are timesinks by design. That would be okay if I didn’t have a million other games to distract me away from it.</p>
<p>I hope I can get to a point where I feel like I’ve got my money’s worth out of <em>Total Warhammer</em> so I can buy myself the sequel, which by all accounts is a bit more rewarding.</p>
<h3 id="miniature-matters">Miniature Matters</h3>
<p>In the latter half of the year I <a href="/personal/2017/11/21/the-hobby/">discovered (or maybe re-discovered) the joy of painting miniatures</a>. And while I’ve certainly thought a lot about actually playing a miniatures wargame like Games Workshop’s <a href="https://www.games-workshop.com/en-NO/Warhammer"><em>Warhammer: Age of Sigmar</em></a> or <a href="http://therenaissancetroll.blogspot.co.uk/">Joseph McCullough</a>’s <a href="https://ospreypublishing.com/frostgrave"><em>Frostgrave</em></a>, I haven’t actually. Yet.</p>
<p>The closest I’ve come is Games Workshop’s fantastic new release <a href="https://warhammerunderworlds.com/"><em>Warhammer Underworlds: Shadespire</em></a>. It has miniatures in it, but it certainly isn’t a wargame. In fact it’s a board game, and a very elegant one at that. For a few weeks after it came out me and a friend from work were playing it multiple times per week, discovering and mastering its systems. No two of our games were alike. I’m not totally sure about the longevity of it, but I have high hopes that I’ll still be playing it years from now, and that it will have evolved into something even more engrossing.</p>
<p><img src="/images/shadespire/01.jpg" alt="" title="A *Shadespire* game in progress. My Reavers square off against Fred's Sepulchral Guard." /></p>
<p>So what did you play in 2017?</p>
The Hobby2017-11-21T00:00:00+00:00http://rachelnertia.github.io/personal/2017/11/21/the-hobby<p><img src="/images/minis/saurus-01.jpg" alt="Saurus warrior" title="I'm not a huge fan of the Saurus Warrior models, but they are fun to paint." /></p>
<p>Reader, I paint lizards.</p>
<p>I paint them at the weekend. I paint them on weekday evenings. Sometimes I even paint them before going to work. Painting lizards is my new, engrossing pastime.</p>
<p>Part of that was a lie: it’s not really a new interest, but a revived one. The world of miniatures has drawn my attention since I was little, but I drifted away from it in my mid-teens. In the last few years I’ve experienced a growing desire to get back in, spurred on by the enthusiastic evangelism of podcasts like <a href="http://crateandcrowbar.com/category/minis/">Miniatures Monthly</a> and websites like <a href="http://hipsterhammer.tumblr.com/">Hipsterhammer</a>.</p>
<p>Feeling inspired, I dug my old Warhammer models out of the eaves in my mum’s house, dusted them off, and surveyed what I found. It was a wasteland. Many were unpainted and others were painted so poorly that it almost seemed cruel not to repaint them. Which was perfect. It means I have a treasure trove of miniatures to practice on before I need to get new models.</p>
<p><img src="/images/minis/skink-01.jpg" alt="Skink skirmisher with blowpipe" title="This Skink is my best work so far." /></p>
<p>Ever since then I’ve been steadily working my way through them, painting or re-painting a few every week. The majority are Lizardmen (now dubbed <a href="http://ageofsigmar.wikia.com/wiki/Seraphon">Seraphon</a> in the <a href="https://www.games-workshop.com/en-NO/Warhammer">Age of Sigmar</a> system that replaced the crotchety <a href="https://en.wikipedia.org/wiki/Warhammer_Fantasy_Battle">Warhammer Fantasy Battle</a> a few years ago), but there are some <a href="http://warhammer40k.wikia.com/wiki/Eldar">Eldar</a>, <a href="https://en.wikipedia.org/wiki/The_Lord_of_the_Rings_Strategy_Battle_Game"><em>Lord of the Rings</em></a> minis, and a mixed bag of others. There’s even an unassembled Space Marine tank which I have no recollection of acquiring.</p>
<p>I find painting highly rewarding. It’s as if the activity is opens my head up and fixes all the faulty wires. When I emerge from a session, I feel calm and energised. Since starting I’ve improved measurably and am already a better painter than child-me ever was. It’s been a joy to watch my skills sharpening as I practice and my knowledge growing as I experiment, consume tutorials, get tips and ask questions.</p>
<p>When I need advice, there’s a <a href="https://discordapp.com/channels/89468138059481088/106564798480678912">channel</a> on The Crate and Crowbar’s <a href="https://discordapp.com/channels/89468138059481088/106564798480678912">Discord server</a> which I’ve found to be a great place to hang out and share my progress. The level of skill on display in there can be astonishingly high – a little intimidating, even – but the welcoming attitude of all the patrons means my questions are always answered helpfully and considerately. I also enjoy the painting tutorials on <a href="https://www.youtube.com/user/GamesWorkshopWNT">Warhammer TV</a>.</p>
<p><img src="/images/minis/bretonnian-archers.jpg" alt="Old-school Bretonnian archers" title="Freshly-(re-)painted classic Bretonnian archers, which I think are some of the first models I ever got." /></p>
<p>Things are different now. The hobby itself is in flux, riding the wake of the recent tabletop games renaissance. Games Workshop are smarter about technology and community-building than I remember they used to be, and it seems to be paying off. They’re also experimenting with more board-gamey designs like <a href="https://warhammerunderworlds.com/">Shadespire</a><sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>, while Fantasy Flight are making inroads into the miniatures wargaming space with their own recent titles. Elsewhere on the landscape, neat-looking games like <a href="https://ospreypublishing.com/frostgrave">Frostgrave</a> are making me want to grab some dice and dive in.</p>
<p>I also feel like the hobby is becoming a better place for women. I hope I don’t have to eat those words.</p>
<p>Climate change aside, the biggest difference between then and now is that I have an adult’s patience and a full-time employee’s disposable income. This thing demands a lot of time, dedication, and money. I’m glad I have them.</p>
<p>Thanks for reading! Have you had experiences with the hobby? Tell me about them on <a href="www.twitter.com/nershly">Twitter</a> or in the comments below.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>I’m <em>really</em> enthusiastic about Shadespire and have been playing about 4 games of it per week since it came out. It’s excellent. If I’m lucky I’ll get post about it written sometime. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Ding! 242017-11-19T00:00:00+00:00http://rachelnertia.github.io/personal/2017/11/19/ding-24<p>I turned 24 today. This weekend has been a bit busy and overwhelming – but perfect.</p>
<p>On Friday I went to Dundee for some <a href="https://twitter.com/nershly/status/931789423062212608">Marioke</a>, which was fantastic. The event itself was amazing, but it was also nice to see some Dundee friends I hadn’t met for a while. Hopefully we’ll have another Marioke in Scotland some time.</p>
<p>Last night we had some friends over for a flat party. My flatmate had decorated the whole place in birthday stuff while I was out during the day (at <a href="http://edindi.es/">edindies</a>, in fact). That was a lot of effort I didn’t expect anyone to take, but really appreciated. She also got me a cake!</p>
<p>Natalie made me a birthday card in short game form, which was incredibly sweet. I’m really grateful for her.</p>
<p>Today I had lunch with my mum and I’m meeting my dad for dinner. It’s nice to see them both, as usual.</p>
<p>I’ve been barrelled over by all the folks who have checked in and said happy birthday, over the internet or otherwise. It’s not that there’s been more than usual, it’s that I seem to be paying attention to it more. I think for a number of years I haven’t really noticed birthdays – in fact last year I thought I was turning 22, not 23 – but this year has been different for some reason. Maybe it’s just that some things kind of settled into place this year? Who knows.</p>
<p>Anyway, thankyou for being along for the ride. Here’s to another year of us.</p>
<p><img src="/images/john-duncan.jpg" alt="" /></p>
New Page: Podcast Recommendations2017-11-09T00:00:00+00:00http://rachelnertia.github.io/2017/11/09/new-page-podcast-recs<p>I’ve added a new page to the website containing a few podcasts I regularly listen to, or have listened to in the past, that I think are good and want to share with people. At the moment there’s only a handful. I’ll update it with new ones occasionally.</p>
<p><a href="/podcast-recommendations">Check it out</a>.</p>
Custom Deleters: A Real Example2017-10-30T00:00:00+00:00http://rachelnertia.github.io/programming/2017/10/30/custom-deleters<p>I’ve <a href="/programming/2016/11/12/intro-to-smart-ptrs/">written in the past</a> about standard-library smart pointers and how they can make management of memory allocated from the heap much easier. How useful are they when working with objects allocated from elsewhere, such as objects created by a library we use?</p>
<p><a href="http://box2d.org/">Box2D</a> is a popular 2D rigid-body physics engine in which the <a href="http://www.learn-cocos2d.com/api-ref/1.0/Box2D/html/classb2_world.html"><code class="language-plaintext highlighter-rouge">b2World</code></a> is the top-level object that represents the physics ‘world’. Rigid bodies are represented by instances of <a href="http://www.learn-cocos2d.com/api-ref/1.0/Box2D/html/classb2_body.html"><code class="language-plaintext highlighter-rouge">b2Body</code></a> and are created like so:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// world is a b2World*</span>
<span class="c1">// bodyDef is a b2BodyDef that describes the properties of the new body</span>
<span class="n">b2Body</span><span class="o">*</span> <span class="n">body</span> <span class="o">=</span> <span class="n">world</span><span class="o">-></span><span class="n">CreateBody</span><span class="p">(</span><span class="o">&</span><span class="n">bodyDef</span><span class="p">);</span>
</code></pre></div></div>
<p>The <code class="language-plaintext highlighter-rouge">b2World</code> owns the <code class="language-plaintext highlighter-rouge">b2Body</code> and the memory it is created from, and when the world is destroyed it destroys all the bodies it contains. To remove an individual body and free its memory we call <code class="language-plaintext highlighter-rouge">b2World::DestroyBody(b2Body*)</code>.</p>
<p>This creates a small challenge for us when we build our game code on top. Let’s say we have an <code class="language-plaintext highlighter-rouge">Entity</code> class, which has a <code class="language-plaintext highlighter-rouge">b2Body*</code> member.</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">Entity</span> <span class="p">{</span>
<span class="n">b2Body</span><span class="o">*</span> <span class="n">body</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>
<p>In <code class="language-plaintext highlighter-rouge">Entity</code>’s destructor we may want to call <code class="language-plaintext highlighter-rouge">DestroyBody</code>, so that when an <code class="language-plaintext highlighter-rouge">Entity</code> goes out of scope, it tells the <code class="language-plaintext highlighter-rouge">b2World</code> to remove its body from the world:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Entity</span><span class="o">::~</span><span class="n">Entity</span><span class="p">()</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">body</span><span class="p">)</span> <span class="n">body</span><span class="o">-></span><span class="n">GetWorld</span><span class="p">()</span><span class="o">-></span><span class="n">DestroyBody</span><span class="p">(</span><span class="n">body</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>These are unique ownership semantics (just about), so we could make <code class="language-plaintext highlighter-rouge">body</code> a <code class="language-plaintext highlighter-rouge">std::unique_ptr</code> rather than a raw pointer. Let’s try it!</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o"><</span><span class="n">b2Body</span><span class="o">></span> <span class="n">bodyPtr</span> <span class="o">=</span> <span class="n">world</span><span class="o">-></span><span class="n">CreateBody</span><span class="p">(</span><span class="o">&</span><span class="n">bodyDef</span><span class="p">);</span>
</code></pre></div></div>
<p>Unfortunately, this is no good. By default, <code class="language-plaintext highlighter-rouge">std::unique_ptr</code>’s destructor calls <code class="language-plaintext highlighter-rouge">delete</code> on its internal pointer, which isn’t what we want. The <code class="language-plaintext highlighter-rouge">b2World</code> is who really owns the memory, so deleting it out from underneath it would probably cause undefined behaviour down the line, if not immediately. The memory which the <code class="language-plaintext highlighter-rouge">b2World</code> allocates bodies etc. from may be a <a href="https://en.wikipedia.org/wiki/Memory_pool">pool</a> block-allocated from the heap. It might not even come from the heap, it may be on the stack. Either way, calling <code class="language-plaintext highlighter-rouge">delete</code> on a bit of it would not go down well.</p>
<p>So we need to call <code class="language-plaintext highlighter-rouge">b2World::DestroyBody</code> instead of <code class="language-plaintext highlighter-rouge">delete</code>.</p>
<h3 id="custom-deleters">Custom Deleters</h3>
<p>We’re in luck: <a href="http://en.cppreference.com/w/cpp/memory/unique_ptr"><code class="language-plaintext highlighter-rouge">std::unique_ptr</code></a> has more than one template parameter.</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span><span class="o"><</span><span class="k">class</span> <span class="nc">T</span><span class="p">,</span> <span class="k">class</span> <span class="nc">Deleter</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">default_delete</span><span class="o"><</span><span class="n">T</span><span class="p">></span><span class="o">></span>
<span class="k">class</span> <span class="nc">unique_ptr</span><span class="p">;</span>
</code></pre></div></div>
<p>The first is the type to which it points, and the second allows the user to define a <em>custom deleter</em>. A custom deleter must be a type with an operator that takes a pointer to <code class="language-plaintext highlighter-rouge">T</code>. The custom deleter lets us define what <code class="language-plaintext highlighter-rouge">unique_ptr</code>’s destructor does if its internal pointer is non-null.</p>
<p>Here is a pointless example of one that just does the same as <code class="language-plaintext highlighter-rouge">std::default_delete<b2Body></code>:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">struct</span> <span class="nc">b2BodyDeleter</span> <span class="p">{</span>
<span class="kt">void</span> <span class="k">operator</span><span class="p">()(</span><span class="n">b2Body</span><span class="o">*</span> <span class="n">body</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
<span class="k">delete</span> <span class="n">body</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="k">using</span> <span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o"><</span><span class="n">b2Body</span><span class="p">,</span> <span class="n">b2BodyDeleter</span><span class="o">></span> <span class="n">BodyPtr</span><span class="p">;</span>
<span class="n">BodyPtr</span> <span class="o">=</span> <span class="n">world</span><span class="o">-></span><span class="n">CreateBody</span><span class="p">(</span><span class="o">&</span><span class="n">bodyDef</span><span class="p">);</span>
</code></pre></div></div>
<p>Obviously this isn’t what we need because we need to call <code class="language-plaintext highlighter-rouge">b2World::DestroyBody</code>.</p>
<h3 id="gotcha">Gotcha</h3>
<p>A quick aside, and a warning – you might be wondering why we can’t just use a regular ol’ free function for this. Here’s why.</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">b2BodyDeleter</span><span class="p">(</span><span class="n">b2Body</span><span class="o">*</span> <span class="n">body</span><span class="p">)</span> <span class="p">{</span>
<span class="k">delete</span> <span class="n">body</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">using</span> <span class="n">BodyPtr</span> <span class="n">bp</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o"><</span><span class="n">b2Body</span><span class="p">,</span> <span class="n">b2BodyDeleter</span><span class="o">></span><span class="p">;</span>
</code></pre></div></div>
<p><code class="language-plaintext highlighter-rouge">BodyPtr</code> doesn’t compile because <code class="language-plaintext highlighter-rouge">b2BodyDeleter</code> isn’t a type - it’s a function. Using <a href="http://en.cppreference.com/w/cpp/language/decltype">decltype</a> and an ampersand, we can proceed:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="n">BodyPtr</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o"><</span><span class="kt">int</span><span class="p">,</span> <span class="k">decltype</span><span class="p">(</span><span class="o">&</span><span class="n">b2BodyDeleter</span><span class="p">)</span><span class="o">></span><span class="p">;</span>
</code></pre></div></div>
<p><code class="language-plaintext highlighter-rouge">decltype(&b2BodyDeleter)</code> gives us the type of a pointer to the <code class="language-plaintext highlighter-rouge">b2BodyDeleter</code> function (which I’m not going to write, because <em>ugh</em>). However, when we try to instantiate <code class="language-plaintext highlighter-rouge">BodyPtr</code> we hit a snag – the class doesn’t have a default constructor anymore, and must be constructed with a pointer to <code class="language-plaintext highlighter-rouge">b2BodyDeleter</code> (or any function with a matching signature, actually – so much for safety!).</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">BodyPtr</span> <span class="n">body</span><span class="p">;</span> <span class="c1">// Doesn't compile!</span>
<span class="n">BodyPtr</span> <span class="nf">body</span><span class="p">(</span><span class="nb">nullptr</span><span class="p">,</span> <span class="o">&</span><span class="n">b2BodyDeleter</span><span class="p">);</span> <span class="c1">// Does compile!</span>
<span class="n">BodyPtr</span> <span class="nf">body</span><span class="p">(</span><span class="n">world</span><span class="o">-></span><span class="n">CreateBody</span><span class="p">(</span><span class="o">&</span><span class="n">bodyDef</span><span class="p">),</span> <span class="o">&</span><span class="n">b2BodyDeleter</span><span class="p">);</span> <span class="c1">// Does compile!</span>
</code></pre></div></div>
<p>Unfortunately, <code class="language-plaintext highlighter-rouge">BodyPtr</code> is no longer a zero-cost abstraction as it now consists of both a pointer to a <code class="language-plaintext highlighter-rouge">b2Body</code> and a function pointer.</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">static_assert</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">BodyPtr</span><span class="p">)</span> <span class="o">==</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">b2Body</span><span class="o">*</span><span class="p">));</span> <span class="c1">// Fails!</span>
</code></pre></div></div>
<p>If we instead use a functor like our original <code class="language-plaintext highlighter-rouge">b2BodyDeleter</code> then the <a href="http://en.cppreference.com/w/cpp/language/ebo">empty base class optimization</a> allows <code class="language-plaintext highlighter-rouge">unique_ptr</code>’s size to equal the size of a raw pointer. When using a function pointer our smart pointer becomes <em>stateful</em>, meaning it carries additional stuff along with its underlying raw pointer. This is a bit of a <a href="https://en.wikipedia.org/wiki/Gotcha_(programming)">gotcha</a>, and arguably things shouldn’t have to be this way (i.e. functions in C++ should be <a href="https://en.wikipedia.org/wiki/First-class_function">first-class types</a>), but writing a functor or a lambda to avoid this isn’t too much bother.</p>
<h3 id="b2bodydeleter">b2BodyDeleter</h3>
<p>So finally here’s our real <code class="language-plaintext highlighter-rouge">b2BodyDeleter</code>:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">struct</span> <span class="nc">b2BodyDeleter</span> <span class="p">{</span>
<span class="kt">void</span> <span class="k">operator</span><span class="p">()(</span><span class="n">b2Body</span><span class="o">*</span> <span class="n">body</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
<span class="n">body</span><span class="o">-></span><span class="n">GetWorld</span><span class="p">()</span><span class="o">-></span><span class="n">DestroyBody</span><span class="p">(</span><span class="n">body</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="k">using</span> <span class="n">BodyPtr</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o"><</span><span class="n">b2Body</span><span class="p">,</span> <span class="n">b2BodyDeleter</span><span class="o">></span><span class="p">;</span>
<span class="k">static_assert</span><span class="p">(</span><span class="k">sizeof</span><span class="p">(</span><span class="n">BodyPtr</span><span class="p">)</span> <span class="o">==</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">b2Body</span><span class="o">*</span><span class="p">));</span>
<span class="n">BodyPtr</span> <span class="n">body</span> <span class="o">=</span> <span class="n">world</span><span class="o">-></span><span class="n">CreateBody</span><span class="p">(</span><span class="o">&</span><span class="n">bodyDef</span><span class="p">);</span>
</code></pre></div></div>
<p>We had a choice here. Instead of accessing the <code class="language-plaintext highlighter-rouge">b2World</code> using <code class="language-plaintext highlighter-rouge">b2Body::GetWorld</code> we could store a <code class="language-plaintext highlighter-rouge">World*</code> (or <code class="language-plaintext highlighter-rouge">World&</code>) in <code class="language-plaintext highlighter-rouge">b2BodyDeleter</code>, setting it in the constructor. That doesn’t really bring any advantages that I can think of, and I can think of two disadvantages. For one, it would force us to specify an extra argument every time we instantiate a <code class="language-plaintext highlighter-rouge">BodyPtr</code>. For another, it’d make the deleter <em>stateful</em> and increase its size. No good!</p>
<p>Now we can swap <code class="language-plaintext highlighter-rouge">Entity</code>’s raw <code class="language-plaintext highlighter-rouge">b2Body</code> pointer for a <code class="language-plaintext highlighter-rouge">BodyPtr</code>, and we never have to worry about manually calling <code class="language-plaintext highlighter-rouge">b2World::DestroyBody</code> for the Entity’s body again. The body will be removed from the world when the <code class="language-plaintext highlighter-rouge">Entity</code> goes out of scope. We get all the other benefits of <code class="language-plaintext highlighter-rouge">unique_ptr</code>, too.</p>
<p>There are limitations to doing things this way: an <code class="language-plaintext highlighter-rouge">Entity</code> now <em>must</em> go out of scope before the b2World does, otherwise <code class="language-plaintext highlighter-rouge">b2Body->GetWorld</code> will return a dangling pointer. We can no longer destroy the <code class="language-plaintext highlighter-rouge">b2World</code> before all the <code class="language-plaintext highlighter-rouge">Entity</code> instances who are using it unless we call <a href="http://en.cppreference.com/w/cpp/memory/unique_ptr/release"><code class="language-plaintext highlighter-rouge">release</code></a> on each <code class="language-plaintext highlighter-rouge">Entity</code>’s <code class="language-plaintext highlighter-rouge">BodyPtr</code> before its destructor is called.</p>
<p>This example may seem like a bit of a strawman to you, but in my <a href="https://github.com/rachelnertia/Quiver">homebrew game engine</a> switching from using raw <code class="language-plaintext highlighter-rouge">b2Body</code> pointers to smart ones has been a pleasant improvement. It fits into my <a href="http://en.cppreference.com/w/cpp/language/raii">RAII</a>-based approach to just about everything.</p>
<h3 id="further-reading">Further Reading</h3>
<p><a href="https://www.fluentcpp.com">Fluent C++</a> did a series about smart pointers recently, with a few posts dedicated to custom deleters:</p>
<ul>
<li><a href="https://www.fluentcpp.com/2017/08/29/custom-deleters/">Custom deleters</a></li>
<li><a href="https://www.fluentcpp.com/2017/09/01/make-custom-deleters-expressive/">How to Make Custom Deleters More Expressive</a></li>
<li><a href="https://www.fluentcpp.com/2017/09/05/changing-deleters-during-the-life-of-a-unique_ptr/">Changing deleters during the life of a unique_ptr</a></li>
</ul>
La Garde-Freinet (30th September - 8th October)2017-10-25T00:00:00+00:00http://rachelnertia.github.io/travel/2017/10/25/la-garde-freinet<p>Recently me and <a href="https://twitter.com/ScarletCatalie">Natalie</a> went on holiday for a week in the south of France. We stayed in an old townhouse in <a href="https://en.wikipedia.org/wiki/La_Garde-Freinet">La Garde-Freinet</a>, a village nestled in the hills above <a href="https://en.wikipedia.org/wiki/Saint-Tropez">Saint-Tropez</a>, with my mum and her partner.</p>
<p><img src="/images/france/nicedog.jpg" alt="" title="All the village pets are very friendly, especially this goldie" /></p>
<p>I’ve been there a few times before but not for about five years. It was good to be back. It’s a lovely, pleasant and peaceful place; the perfect retreat. In many ways it’s just as I remember, but in October it has a rather different feel than it does in summer, during which I’d previously visited. Many of the shops and restaurants are beginning to close down for the winter when there is too little business for it to be worth opening, and generally it is a bit quieter in the absence of high-summer holiday traffic.</p>
<p>The surrounding countryside is densely forested and the hills are low enough to be covered all the way to their peaks in a foliage, giving them an almost fuzzy appearance. Autumn hasn’t quite arrived yet and everything is lush and verdant, if a little dry. On the plains to the north and south the forest sprawls, giving way only to roads, groves, villages and vineyards. Big umbrella pines tower over smaller deciduous trees, bushes and shrubs. The earth is the colour of rust, visible between blades of dry, brittle grass.</p>
<p>The region is a historic producer of silk, chestnuts and cork, and it still exports the latter two. Along the edges of paths one can find trees that have been stripped naked of all their bark up to about head height, and chestnut trees are abundant.</p>
<p>We spent the week going for walks in the village and the area, relaxing, eating and sleeping. It was great to spend so much time with Natalie.</p>
<p><img src="/images/france/gorges-du-verdon-00.jpg" alt="" /></p>
<p>We made a day trip to the <a href="https://en.wikipedia.org/wiki/Verdon_Gorge">Gorges du Verdon</a>, a truly awe-inspiring landscape. <a href="https://en.wikipedia.org/wiki/Bearded_vulture">Vultures</a> circle above brilliant white crags between which, hundreds of metres below, flows a sliver of pure turquoise. Every bit of land that isn’t vertical is blanketed in foliage, now breaking out into autumn colours. We drove along the top of the gorge, taking in the vistas, then followed the road down into it, clinging to the sides.</p>
<p>After emerging from the gorge’s mouth, which opens onto a long ice-blue lake, we visited the village of <a href="https://goo.gl/maps/zFa2L9QDsRr">Moustiers-Sainte-Marie</a>. It too is a stunningly beautiful place, old and quaint and majestic all at once. Above of the village, atop a long flight of steps, perches an old chapel, which we made the climb to visit.</p>
<p><img src="/images/france/moustiers-sainte-marie.jpg" alt="" /></p>
<p>Then, leaving the village, we rented a pedalo and took it back into the gorge, gaping at the scale of the thing, peddling past weird rock formations and strange caves. If you ever find yourself in the region, I highly recommend checking it out.</p>
<p>Also, I drank multiple cups of wine every evening. It was great.</p>
The Signal from Tölva2017-07-15T00:00:00+00:00http://rachelnertia.github.io/gaming/2017/07/15/the-signal-from-tolva<p><img src="/images/the-signal-from-tolva/tolva_01.jpg" alt="" /></p>
<p><a href="http://www.thesignalfrom.com/"><em>The Signal from Tölva</em></a> is a game about robots, remnants and ruins.</p>
<p>It has a lot in common with developer <a href="http://www.big-robot.com/">Big Robot</a>’s previous game, <a href="http://store.steampowered.com/app/242880/Sir_You_Are_Being_Hunted/"><em>Sir, You Are Being Hunted</em></a>, a first-person stealth-em-up set in a procedurally-generated pastiche of the English countryside in which humans are pursued across bleak rural and post-industrial landscapes by aristocratic robots and their mechanical hounds. It’s like Tory Britain, but with the possibility of escape.</p>
<p>The planet Tölva is less <em>Doctor Who</em> and more <a href="https://en.wikipedia.org/wiki/Roadside_Picnic"><em>Roadside Picnic</em></a>. It’s had a rough time. At some point in its past debris from countless wars crashed onto its surface, leaving only traces of what was there before, and now the drones of three warring factions fight over the remaining spoils in a remote-controlled conflict, searching for something. That’s where you come in.</p>
<p><img src="/images/the-signal-from-tolva/tolva_03.jpg" alt="" /></p>
<p>You’re hacking into the drone network of one of the factions, hijacking their automata so you can explore the planet and discover more about the titular Signal. That’s where the mandatory story stops and your freedom to get on with the business of playing the game begins.</p>
<p>Most of what you do is walk and look at things. The experience of simply traversing Tölva’s scarred hills and rubble-strewn valleys is remarkably intense. There are moments of stillness during which you warily scan the distance for threats or watch some of the planet’s wildlife sail serenely across the sky. Then a distant battle breaks the silence, as shockwaves from explosions echo off the stones, and the austere synths of the game’s <a href="https://forcesofgood.bandcamp.com/album/music-from-the-signal-from-t-lva">soundtrack</a> give momentum to your hike. Entering one of the map’s numerous strange places, your vision and hearing become warped and glitchy, sometimes fantastically so, and you feel a bit like the pilot of a <a href="https://www.youtube.com/watch?v=kSfESqX-E84&ab_channel=JasonTaylor">deep sea exploration drone</a>. It’s very reminiscent of some of the best times I had with the <a href="http://store.steampowered.com/app/4500/STALKER_Shadow_of_Chernobyl/"><em>Stalker</em></a> games.</p>
<p><img src="/images/the-signal-from-tolva/tolva_02.jpg" alt="" /></p>
<p>Everything is styled after the magnificent concept art of <a href="https://twitter.com/ianmcque">Ian McQue</a>, giving the feeling that you’re walking through a painting that’s been masterfully brought to life. It’s so eminently screenshot-able that I amassed a hundred or so screenshots in my playthrough. Picking out the ones to use for this post was quite a challenge.</p>
<p>Big Robot’s approach to bringing the McQue’s art to life is worth noting. In one <a href="https://www.youtube.com/watch?v=E3L6Ml-BUUY&ab_channel=JimRossignol">video</a> and <a href="http://www.big-robot.com/2017/01/24/art-signal-from-tolva-ian-mcque/">accompanying blog post</a> the developers discussed how they deconstructed McQue’s style, identifying the components of his ‘visual vocabulary’ from which create the modular art assets used to construct a game world. That kind of craftsmanship, attention to detail and creative pragmatism is on display all over <em>The Signal from Tölva</em>. It’s a fine example of how a small team of savvy and skilled-up individuals can come together to create impressive work, and absolutely worth reading about in their blog posts and various interviews.</p>
<p><img src="/images/the-signal-from-tolva/tolva_09.jpg" alt="" /></p>
<h3 id="bots-behaving-badly">Bots Behaving Badly</h3>
<p>Eventually you will have to fight. In <em>Sir</em> combat was something to be avoided, a frantic and unfair last resort that usually ended with your death. Here combat is inevitable, necessary, and you’re much better equipped to take part in it. Your hitpoints regenerate and the price of death is low – when your current host is destroyed you just hijack a new robot body to inhabit at any strategic point controlled by your faction.</p>
<p>That doesn’t mean charging headlong into the fray is a valid strategy. Battles you don’t plan are usually battles you don’t win. Combat is methodical, with a high time-to-kill and tension loaded into long reload and cool-down times. Enemy and allied robots all use the same set of weapons and tools as you, so you’ll never be confronted with something you yourself can’t bring into battle.</p>
<p><img src="/images/the-signal-from-tolva/tolva_07.jpg" alt="" /></p>
<p>Progression mechanics are of the sort people are probably used to from mainstream open world games, albeit limited in scope. Completing missions unlocks new weapons and powers, while the resources needed to purchase them must be salvaged from wreckages and by killing enemies. There’s not a lot of variety in <a href="/images/the-signal-from-tolva/tolva_arsenal.jpg">the range of weapons</a> on offer – there are five main archetypes and the arsenal is padded out with slight variations of them at different levels of effectiveness – but it’s enough to scrape by.</p>
<p>One of your options is the fantastically named ‘SQ-UID Phreaker’, a tool that gives you command of robots from your own faction. You have limited control here: you can tell them to follow you or move to a particular location, but not as individuals. You can’t customize the loadout of your squad members, so if you want to build the perfect team, you’ll have to assemble it by luck. Nonetheless having a squad of robo-buddies at your back as you march across the map is a comforting thing to have in what would otherwise be a very lonely, isolating game.</p>
<p><img src="/images/the-signal-from-tolva/tolva_15.jpg" alt="" /></p>
<p>It’s very easy to digest. Playable in small chunks, it’s always possible to make some measurable form of progress in 15 minutes, or at least to go on a pleasant hike. Hoovering up some resources from a salvage site, searching for rarities and nuggets of story in nooks and crannies, even striking out at an enemy bunker in an attempt to capture it: all possible within a short time-frame, each its own mini-adventure with potential for surprising encounters. Dynamic, un-scripted stuff just happens without any player input: squads of robots get into scraps with one another, capturing and re-capturing territory from each others’ factions, including your own.</p>
<p><img src="/images/the-signal-from-tolva/tolva_08.jpg" alt="" /></p>
<p>The planet seems to be waking up, or perhaps just turning over in its sleep. Like the irradiated and alien Zone of the <em>Stalker</em> games, when it is not actively hostile to your presence, it is at best merely indifferent. It appears to be a graveyard for much older things than the crashed war machines that litter its surface. It’s difficult to figure out what’s going on and why because the scraps of information you find about the world you’re in are brief and sparse. What you do uncover as the game goes on is eldritch and unsettling. Cosmic horror for the information age. If I ever do understand quite what <em>The Signal from Tölva</em> is about, even just on the surface, it will have taken me a while to reach those conclusions. I welcome that mystery.</p>
<p><em>Sir, You Are Being Hunted</em> never grabbed me like this, never left such a dent. Not many games do. Actually, honestly, I think that what Big Robot have created with <em>Tölva</em> deserves to be celebrated as a classic in its genre. It’s smartly made and smart to play, beautiful to look at and haunting to listen to. I hope you give it a go.</p>
<p>As for me? Well, there’s a <a href="https://www.rockpapershotgun.com/2017/05/25/the-signal-from-tolva-free-expansion-announced/">free expansion</a> on the horizon and I fully expect I’ll be sucked right back into <em>Tölva</em> the moment it arrives.</p>
<p>I can’t wait.</p>
<p><img src="/images/the-signal-from-tolva/tolva_18.jpg" alt="" /></p>
We can Premake it if we try2017-05-26T00:00:00+00:00http://rachelnertia.github.io/programming/2017/05/26/moving-to-premake<p><img src="/images/premake-logo.png" width="50%" /></p>
<p><a href="https://premake.github.io/">Premake</a> is a tool that generates build configuration files for different build systems, such as <a href="https://www.visualstudio.com/">Visual Studio</a> and <a href="https://www.gnu.org/software/make/">gmake</a>. It comes in the form of a <a href="https://premake.github.io/download.html#v5">command-line tool</a> and some <a href="https://github.com/premake/premake-core/wiki/your-first-script">okay</a> <a href="https://github.com/premake/premake-core/wiki/Tutorial:-Premake-example-with-GLFW-and-OpenGL">tutorials</a> and <a href="https://github.com/premake/premake-core/wiki">documentation</a> are available. I’ve started using it in my spare-time game engine project.</p>
<p>I chose to try Premake instead of a similar tool called <a href="https://cmake.org/">CMake</a> because while CMake looks like it has more features and is more stable than Premake, using it requires learning a custom scripting language<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>. In Premake you write your build instructions in <a href="https://www.lua.org/">Lua</a>. I’m not some kind of Lua expert – in fact, when I started on writing my Premake script I found I’d forgotten quite a lot about the language – but I have enough experience with it that I can <a href="/programming/2015/10/05/calculus-in-lua/">get things done</a>.</p>
<p>The Premake workflow is pretty simple: you write a Lua script which specifies what files are part of your project, the include directories, library directories and linker inputs, and so on. Premake imbibes your script and spits out .vsxproj files, <a href="https://en.wikipedia.org/wiki/Makefile">makefiles</a> or whatever your target build system uses.</p>
<p>For example, I have a file named ‘premake5.lua’ in the root directory of my project. It looks a bit like <a href="/extra_stuff/example_premake_script.lua">this</a>. When I run Premake like so:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>C:\Made\Up\Path> premake5 vs2017
</code></pre></div></div>
<p>It automatically finds the Lua file (because of its special name) and generates a .sln file and a bunch of .vcxproj files for my target build system (vs2017 – Visual Studio 2017). The solution is set up the way I specified, with different configurations (Debug/Release), platforms (x86/x86-64), compiler switches and so on.</p>
<p>Premake solves a number of problems I have:</p>
<ul>
<li>Visual Studio’s GUI for modifying build settings is impressively bad, and the format for .sln and .vcxproj files is eye-destroying XML, so if you want to change something there’s a lot that can go wrong. With Premake, I make changes to one easy-to-read Lua script, run the tool, and can get straight back to the real work.</li>
<li>As a result of the above problem, changing the way my solution/project is set up is a massive pain in the butt. With Premake it’s so much easier to move files around in folders, split things apart into sub-projects, etc.</li>
<li>Eventually I will be going cross-platform with this project. With Premake I don’t have to set up ten different kinds of build configurations for every different build system or IDE and I don’t have to remember all the differences between the compiler and linker options on each toolchain. People working on the project on different systems can just run Premake and get going. At the moment I’m only using one build system and not taking advantage of the cross-platform capabilities of Premake, but I still make gains in that I no longer have to think about the settings of my various projects because Premake abstracts all that away.</li>
</ul>
<p>Using Premake it was pretty easy to do the long-overdue work of reorganizing files in my mess of a project. I wish I’d known enough about Premake to use it from the beginning and in past projects. Oh well<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>!</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p><a href="http://preshing.com">Jeff Preshing</a> has written a couple of good-looking articles on getting started with CMake: <a href="http://preshing.com/20170511/how-to-build-a-cmake-based-project/">How to Build a CMake-Based Project</a> and <a href="http://preshing.com/20170522/learn-cmakes-scripting-language-in-15-minutes/">Learn CMake’s Scripting Language in 15 Minutes</a>. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>The list of ‘Tools I Wish I’d Picked Up Years Ago’ is getting pretty long. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Collections of References2017-04-23T00:00:00+00:00http://rachelnertia.github.io/programming/2017/04/23/collections-of-references<p>What does this code do?</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">const</span> <span class="k">auto</span> <span class="n">it</span> <span class="o">=</span> <span class="n">FindByAddress</span><span class="p">(</span><span class="n">specialEntities</span><span class="p">,</span> <span class="n">specialEntity</span><span class="p">);</span>
</code></pre></div></div>
<p>In the game engine I’m working on, an Entity (or one of an Entity’s components) can sometimes be in a state where it needs to have some extra processing done. Rather than having a branch in <code class="language-plaintext highlighter-rouge">Entity::Update</code>, we can just store a pointer to the Entity/Component in a container along with all the others that meet the same criteria. This is <a href="http://www.dataorienteddesign.com/dodmain/node4.html">existence-based processing</a>.</p>
<p>For example, RenderComponents can be in a state where they own a fixture (shape) in the physics world which needs to be rotated to face the camera before rendering happens (don’t ask me why at the moment; it’s complicated). We refer to these special RenderComponents as ‘Flat Sprites’, and keep track of all of them in a <a href="http://en.cppreference.com/w/cpp/container/vector"><code class="language-plaintext highlighter-rouge">std::vector</code></a> of pointers:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">RenderComponent</span><span class="o">*></span> <span class="n">mFlatSprites</span><span class="p">;</span>
</code></pre></div></div>
<p>It’s safe to do this because RenderComponent instances are dynamically allocated and do not move around in memory.</p>
<p>Just before rendering, we call <code class="language-plaintext highlighter-rouge">RenderComponent::UpdateFlatSprite</code> on each of the instances pointed to by the pointers in the container, rotating their fixture to face the camera. When adding or removing a RenderComponent from the set of Flat Sprites, we can use <a href="http://en.cppreference.com/w/cpp/algorithm/find"><code class="language-plaintext highlighter-rouge">std::find</code></a> to check for whether the pointer we’re trying to add or remove is already in the array:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// flatSprite is of type RenderComponent*</span>
<span class="k">const</span> <span class="k">auto</span> <span class="n">it</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">find</span><span class="p">(</span><span class="n">mFlatSprites</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">mFlatSprites</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">flatSprite</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">it</span> <span class="o">!=</span> <span class="n">mFlatSprites</span><span class="p">.</span><span class="n">end</span><span class="p">())</span>
<span class="c1">// the pointer was found in mFlatSprites</span>
</code></pre></div></div>
<p>Easy! Yet, there’s something a little bit smelly about all this: we’re using pointers instead of references.</p>
<p>(In case you’re unaware, <a href="https://www.tutorialspoint.com/cplusplus/cpp_references.htm">references in C++</a> are just pointers with special semantics: they cannot (without coercion) point to null – they must always point to an actual instance. They also behave syntactically like values, so you can act upon them as you would a normal instance using the <code class="language-plaintext highlighter-rouge">.</code> operator instead of the <code class="language-plaintext highlighter-rouge">-></code> operator (and dereference operator <code class="language-plaintext highlighter-rouge">*</code>) that you have to use with normal pointers.)</p>
<p>The problem with references is that this doesn’t compile:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">RenderComponent</span><span class="o">&></span> <span class="n">mFlatSprites</span><span class="p">;</span>
</code></pre></div></div>
<p>This is <a href="http://stackoverflow.com/questions/1164266/why-are-arrays-of-references-illegal">(partly)</a> because references <strong>cannot be default-initialised</strong>. That is, a reference must always be assigned a value in the place where it is initialised.</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// invalid:</span>
<span class="n">SomeType</span><span class="o">&</span> <span class="n">someTypeRef</span><span class="p">;</span>
<span class="c1">// valid:</span>
<span class="n">SomeType</span> <span class="n">someTypeInst</span><span class="p">;</span>
<span class="n">SomeType</span><span class="o">&</span> <span class="n">someTypeRef</span> <span class="o">=</span> <span class="n">someTypeInst</span><span class="p">;</span>
</code></pre></div></div>
<p>But I <em>want</em> an array of references, because I want to represent the idea that elements can never be null. Fortunately, I can do this by writing a structure that ‘wraps’ a reference, and creating an array of that. I don’t even have to write that wrapper myself, because it’s already a template in the standard library: <a href="http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper"><code class="language-plaintext highlighter-rouge">std::reference_wrapper</code></a>.</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">reference_wrapper</span><span class="o"><</span><span class="n">RenderComponent</span><span class="o">>></span> <span class="n">mFlatSprites</span><span class="p">;</span>
</code></pre></div></div>
<p>Stay with me now, because I’m closing in on the point of this post. This solution creates a new problem: what should the following code do?</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// flatSprite is of type RenderComponent&</span>
<span class="k">const</span> <span class="k">auto</span> <span class="n">it</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">find</span><span class="p">(</span><span class="n">mFlatSprites</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">mFlatSprites</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">flatSprite</span><span class="p">);</span>
</code></pre></div></div>
<p>Should it compare the instance each element in the array refers to with that referred-to by <code class="language-plaintext highlighter-rouge">flatSprite</code>? Or should it compare the values of the underlying pointers involved – the addresses at which the RenderComponents reside – which is what I want?</p>
<p>Turns out the implementers of <code class="language-plaintext highlighter-rouge">std::reference_wrapper</code> didn’t want to make that call for you, which is a good thing. The code does not compile because <code class="language-plaintext highlighter-rouge">bool operator==(const std::reference_wrapper<RenderComponent>, const RenderComponent&)</code> is undefined.</p>
<p>I could just write a definition for that operator myself and make it compare the addresses, but I decided not to. There may be cases down the line where I want that operator to compare the values rather than the addresses, and I want to make it explicit what I’m trying to do here. Finally we’re back to that first line of code.</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">const</span> <span class="k">auto</span> <span class="n">it</span> <span class="o">=</span> <span class="n">FindByAddress</span><span class="p">(</span><span class="n">specialEntities</span><span class="p">,</span> <span class="n">specialEntity</span><span class="p">);</span>
<span class="c1">// except in this case it's actually:</span>
<span class="k">const</span> <span class="k">auto</span> <span class="n">it</span> <span class="o">=</span> <span class="n">FindByAddress</span><span class="p">(</span><span class="n">mFlatSprites</span><span class="p">,</span> <span class="n">flatSprite</span><span class="p">);</span>
</code></pre></div></div>
<p><code class="language-plaintext highlighter-rouge">FindByAddress</code> is defined like so:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">auto</span> <span class="nf">FindByAddress</span><span class="p">(</span>
<span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">reference_wrapper</span><span class="o"><</span><span class="n">RenderComponent</span><span class="o">>>&</span> <span class="n">v</span><span class="p">,</span>
<span class="k">const</span> <span class="n">RenderComponent</span><span class="o">&</span> <span class="n">rc</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">for</span> <span class="p">(</span><span class="k">auto</span> <span class="n">it</span> <span class="o">=</span> <span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span> <span class="n">it</span> <span class="o">!=</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">();</span> <span class="o">++</span><span class="n">it</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">const</span> <span class="k">auto</span> <span class="n">deref</span> <span class="o">=</span> <span class="o">*</span><span class="n">it</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="o">&</span><span class="n">deref</span><span class="p">.</span><span class="n">get</span><span class="p">()</span> <span class="o">==</span> <span class="o">&</span><span class="n">rc</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="n">it</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">return</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Which we can make more generic by turning it into a template:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span><span class="o"><</span><span class="k">typename</span> <span class="nc">T</span><span class="p">></span>
<span class="k">auto</span> <span class="n">FindByAddress</span><span class="p">(</span>
<span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">reference_wrapper</span><span class="o"><</span><span class="n">T</span><span class="o">>>&</span> <span class="n">v</span><span class="p">,</span>
<span class="k">const</span> <span class="n">T</span><span class="o">&</span> <span class="n">tRef</span><span class="p">)</span>
</code></pre></div></div>
<p>In fact we could make it even more generic and not constrain it to only working with <code class="language-plaintext highlighter-rouge">std::vectors</code> by having it take two iterators, a <em>begin</em> and an <em>end</em>. Or, in the bright future, a <a href="http://www.fluentcpp.com/2017/01/12/ranges-stl-to-the-next-level/">range</a>. I’ll leave that as an exercise for the reader.</p>
<p>I’ll also leave as an exercise for the reader the task of pointing out mistakes I’ve made, or why an array of references is a bad idea, or generally letting me know what you think of the code I’ve shared here either on <a href="http://www.twitter.com/nershly">Twitter</a> or in the comments below. Can I really refer to my cakes and eat them?</p>
<p>Shout out to <a href="https://twitter.com/EliasDaler/">Elias Daler</a> for his recent <a href="https://eliasdaler.github.io/re-creation-devlog-december-march/">dev log</a>, which alerted me to the existence of reference wrappers and started all of this.</p>
Halo: Reach2017-04-05T00:00:00+00:00http://rachelnertia.github.io/gaming/2017/04/05/halo-reach<p><img src="/images/halo-reach/Reach_TotS_HogCharge.jpg" alt="" /></p>
<p>Your friends die. You die. The planet dies. You don’t exactly ‘win the game’ at the end of <a href="https://en.wikipedia.org/wiki/Halo:_Reach"><em>Halo: Reach</em></a>’s single-player campaign.</p>
<p>Watching the latest <em>Star Wars</em> film, <a href="https://en.wikipedia.org/wiki/Rogue_One"><em>Rogue One</em></a>, I was struck by the similarity of its finale to that of <em>Reach</em><sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>. In <em>Rogue One</em> (spoilers, by the way), the heroes’ self-sacrifice allows Princess Leia to escape with the plans for the Death Star – the film ends almost immediately before <a href="https://en.wikipedia.org/wiki/Star_Wars_(film)"><em>A New Hope</em></a> begins. In <em>Reach</em>, the heroes’ self-sacrifice allows the Pillar of Autumn to escape, with Cortana and the Master Chief aboard, and therefore find the first Halo ring. The last lines of <em>Reach</em>’s script are the first of <a href="https://en.wikipedia.org/wiki/Halo:_Combat_Evolved"><em>Halo: Combat Evolved</em></a>:</p>
<blockquote>
<p><strong>Captain Keyes</strong>: Cortana, all I need to know is <em>did we lose them</em>?</p>
<p><strong>Cortana</strong>: I think we both know the answer to that.</p>
</blockquote>
<p>Stories which deploy this conceit have to be prequels – at least, I can’t think of any examples which aren’t – because the only way you can get away with such a bleak ending is if the audience knows how it all works out okay in the end.</p>
<!--more-->
<p><img src="/images/halo-reach/Reach_TotS_FP01.jpg" alt="" /></p>
<p>Which it does, of course, in three games’ time. Your character’s role is to set up the events of the first game, although you’d be quite confused about the whole affair if you chose <em>Reach</em> as your entry point to the story – it’s more of a whistle-stop farewell tour for <a href="https://en.wikipedia.org/wiki/Bungie">Bungie</a> than an open door to new fans. It’s not surprising that the studio’s last outing with the franchise wasn’t aiming to be bigger, better, and ‘more badass’ than the last. Instead, they just wanted to come up with a fitting way to say goodbye. There’s really no way you could play this without having played the other games; it’s just too much of a love letter from Bungie to the series and its fans.</p>
<p><em>Reach</em> is probably the best Halo game in pure mechanical terms, but it definitely isn’t the most significant. Historically speaking, it didn’t redefine and reinvigorate the console FPS the way the original <em>Halo</em> did. Personally speaking, I didn’t spend hundreds of hours playing it with friends (and other miscreant Xbox Live denizens) like I did with <a href="https://en.wikipedia.org/wiki/Halo_3"><em>Halo 3</em></a>, and it wasn’t the first real introduction to first-person shooters that <em>Combat Evolved</em> was to me as a wee person<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>.</p>
<p><img src="/images/halo-reach/Reach_LnoS_Sabre.jpg" alt="" /></p>
<p>It drops the design ball in a few areas. The newly added <a href="http://halo.wikia.com/wiki/Armor_Ability">armour abilities</a> feel like an undercooked replacement for <em>Halo 3</em>’s <a href="http://halo.wikia.com/wiki/Equipment">equipment items</a>. In that game, you would pick up an item like Bubble Shield and it would go into your single-item equipment slot. After one use it would be expended and you’d have to find another one. Equipment added a valuable extra tactical layer to the game.</p>
<p><em>Reach</em>’s armour abilities are similar: you can only have one at a time, but you can use it over and over again until you swap it for something else. Some of them are direct analogues to equipment items from <em>Halo 3</em>. For example, there’s one that deploys a bubble shield, and one that briefly turns you invisible. Unfortunately, you’ll hardly ever use those, because one of the other abilities is <em>sprint</em>. Yes, the ability to run fast. The problem with having sprint as one of the armour abilities is that it is always useful, always applicable. It is hard to give up something like that just so you can occasionally spawn a decoy version of yourself. One of the abilities is a jetpack, which feels like a fair trade for sprint, but it’s an exception – the rest are useful once, but rarely twice.</p>
<p><img src="/images/halo-reach/ReachCampaign_m30_Env02.jpg" alt="" /></p>
<p>In some ways, the weapon selection tells the same story. The classics make a return, more or less. The <a href="https://www.halopedia.org/MA37_assault_rifle">Assault Rifle</a> is much the same as ever, albeit with more polys. The Pistol is pleasantly similar to <em>Combat Evolved</em>’s and <a href="https://en.wikipedia.org/wiki/Halo_3:_ODST"><em>ODST</em></a>’s but it is upstaged by the new <a href="https://www.halopedia.org/Battle_rifle">Battle Rifle</a> substitute: the <a href="https://www.halopedia.org/M392_DMR">DMR</a>. It’s an accurate, punchy, general-purpose carbine-type gun that is useful in almost every situation. And if you’re anything like me, you will end up using it in almost every situation. It is the headshot gun. So you have <em>that</em>, and then you have a grab-bag of new weapons, most of which are hard to use effectively, or whose functionality is heavily overlapped by something significantly better. It’s disappointing.</p>
<p>On the other hand, this is the game where Bungie really figured out how to make their weapons feel <em>punchy</em>. There’s more weight to everything, less floatiness. The DMR is the perfect example of this: when you pull the trigger it kicks back at you, the crosshair in the middle of the HUD puffs up, and the sound of the shot rings out. The main ingredient is the sound design, which is strong across the board.</p>
<p><img src="/images/halo-reach/Reach-m10_1stperson.jpg" alt="" /></p>
<p>Speaking of audio: the soundtrack is placed front-and-centre as it is in the previous games. Like in <em>ODST</em>, Martin O’Donnell and Michael Salvatori get to depart from the musical identity of the first three games. They do it well, giving <em>Reach</em> a unique feel that references the older games’ soundtracks but is not slavishly imitative of them. Where the music from the trilogy games strives to evoke a nearly religious sense of awe (and sometimes, horror), <em>Reach</em>’s music is forlorn, regretful and more grounded.</p>
<p>It’s not quite as good as <a href="https://www.youtube.com/watch?v=a33iI6xfld0"><em>ODST</em>’s solemn night-jazz</a>, but what is? Check it out:</p>
<iframe width="100%" height="380" src="https://www.youtube.com/embed/53_CUSmf8fQ" frameborder="0" allowfullscreen=""></iframe>
<p>There’s good variety in the levels in the campaign and, on the whole, the level design is the strongest in the series. You move from one well-thought-out combat arena to the next, from vehicular section to long-distance engagement to close-quarters firefight to showdown with some particularly challenging combination of enemies. There’s a brief space section which sees you piloting a space fighter around a space station and a Covenant ship, leading into a mid-game crescendo of action. It’s actually a pretty good level, and doesn’t outstay its welcome.</p>
<p>The main thing about <em>Halo</em> level design is that it is all about supporting the game’s AI, which in <em>Reach</em> is the most varied and interesting it’s ever been. The full array of Covenant baddies from the previous games return. Sections which see you fighting <a href="http://halo.wikia.com/wiki/Jiralhanae">Brutes</a> (big burly ape-men) lead into battles against <a href="http://halo.wikia.com/wiki/Sangheili">Elites</a> (big burly… lizard<sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">3</a></sup>..? men?) – who are faster and scarier to fight than they were in the first two games. The new <a href="http://halo.wikia.com/wiki/T%27vaoan">Skirmishers</a> take the place of sniper-<a href="http://halo.wikia.com/wiki/Kig-Yar">Jackals</a> but are more versatile and highly mobile, able to jump onto the roofs of buildings and cover ground surprisingly quickly and attack from unexpected directions, which is exactly the sort of thing you want to see AI enemies do.</p>
<p>There’s also no <a href="https://www.halopedia.org/Flood">Flood</a>, thank god. The body/cosmic horror is missed, but would not fit in thematically anyhow, and the extra Covenant compensate for the lost enemy variety.</p>
<p><img src="/images/halo-reach/Reach_TotS_Gunning.jpg" alt="" /></p>
<p>And that’s <em>Halo: Reach</em>. There’s more to talk about, of course. When the writing succeeds. When it fails. The skyboxes. The <a href="http://halo.wikia.com/wiki/Unggoy">Grunt</a> voices, left un-translated from their original language. The health system. The option to customise your character – and play a lady-Spartan (neat!). The multiplayer. The details. The ending. Oh god, the <em>ending</em>.</p>
<p>Like I said, mechanically speaking it’s the best <em>Halo</em> game. It’s every element from the original game, matured and refined. If I wanted to explain the core gameplay of <em>Halo</em> to someone, I might just point to <em>Reach</em> before <em>Combat Evolved</em>. The catch is that I wouldn’t actually recommend playing through it to that same person – it may be the best, but it’s also the last game someone new to the series should play. The reason is simple:</p>
<p>It’s for fans.</p>
<p><img src="/images/halo-reach/Reach_Nightfall_Cinematic.jpg" alt="" /></p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>Which I replayed last year. Yeah, this post has been sitting in my drafts for a while. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>The family laptop me and my brother had to run our copy of <em>Halo: Combat Evolved</em> on had limited graphics functionality. It was only years later, when we installed it on a better system, that we discovered the Master Chief’s armour was in fact painted green, not white, and that there were weathered metallic (normal-mapped!) textures on things we thought were completely smooth. On that old computer I remember thinking how cool it was that the game went into slow motion when lots of things were happening all at once, which, in hindsight, was actually just the framerate dropping into single figures. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p>One of <em>Halo</em>’s strengths (which is visible in Bungie’s other work, <a href="https://en.wikipedia.org/wiki/Destiny_(video_game)"><em>Destiny</em></a> and <a href="https://en.wikipedia.org/wiki/Marathon_(video_game)"><em>Marathon</em></a>), is that with the exception of the Brutes the alien design is actually <em>alien</em>. <a href="#fnref:3" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
San Francisco2017-03-21T00:00:00+00:00http://rachelnertia.github.io/travel/2017/03/21/san-francisco<p><img src="/images/sanfran17/1.JPG" alt="" /></p>
<p>I was recently in San Francisco for five-ish days to attend <a href="/game%20dev/2017/03/14/my-first-gdc/">Game Developer’s Conference</a>. It was my first time in an American city – previous trips to the US have taken me only to skiing resorts. We spent most of our time in and around the conference, and only really had time for a bit of proper sightseeing on Saturday.</p>
<p>It’s a nice place, but very different to what I’m used to. In Scotland we barely have any tall buildings, so when I’m surrounded on all sides by skyscrapers I felt a little bit like I was going to fall into the sky, which is the most country-bumpkin thing about myself I’ve ever admitted (on this blog).</p>
<!--more-->
<p>We visited <a href="https://www.google.co.uk/maps/place/PIER+39/@37.808673,-122.4120097,17z/">Pier 39</a> in Fisherman’s Wharf, the touristy waterfront district, where they have lots of shops selling seafood and souvenir stuff, and sealions.</p>
<p><img src="/images/sanfran17/sealions.JPG" alt="" title="Arf arf arf arf arf arf arf arf arf" /></p>
<p>It’s also one of the places where you can get a boat out to Alcatraz, the famous prison island, or to explore the Bay. You can see the Golden Gate Bridge in the distance. It’s called that because it bridges the Golden Gate, which is the narrow strait connecting the Bay to the Pacific Ocean.</p>
<p><img src="/images/sanfran17/alcatraz.JPG" alt="" /></p>
<p>On one of the piers at Fisherman’s Wharf is the <a href="http://www.museemecaniquesf.com/">Musée Mécanique</a>, a museum for old arcade machines, from titles as recent as <em>Tekken</em> to contraptions that date back to as early as the 1930s, honky-tonk self-playing pianos, zoetropes with handles the viewer must crank, archaic shooting galleries. It’s free to enter but you have to pay about a quarter for each machine, like a real arcade. What I was most struck by was getting to play an original version of <em>Asteroids</em> and discovering just how much I underestimated the brightness of the game’s vector display. The bullets fired by the player are like phosphorus flares against the deep blackness of the screen.</p>
<p><img src="/images/sanfran17/asteroids.JPG" alt="" title="Not pictured: the bullets like phosphorus flares against the deep blackness of the screen. The camera couldn't do it justice." /></p>
<p>San Francisco is a very pretty city, full of art and ornate architecture, and it’s a beautiful place to visit – but I’d be remiss if I didn’t mention the vast inequality on display around almost every corner. Wealthy game developers file into the Moscone Centre every day past homeless people who are living in tents on the streets, pushing their belongings in shopping trolleys.</p>
<p>I don’t know. I wanted to write something ‘profound’ and stimulating about this, but how can anyone? People are suffering. And it’s all very well to point out San Francisco’s particularly upsetting homelessness problem and what a stark contrast it all is to the towers of glass and gold, and just tut and shake your head like it’s not something that could happen here, but it <em>is</em> something that could happen here. It’s something that already happens here.</p>
<p>And it’s a solveable problem. We all know it is.</p>
<p>Sorry for the downer ending.</p>
<p><img src="/images/sanfran17/4.JPG" alt="" /></p>
My First GDC2017-03-14T00:00:00+00:00http://rachelnertia.github.io/game%20dev/2017/03/14/my-first-gdc<p><img src="/images/gdc_logo.jpg" alt="" /></p>
<p><a href="http://www.gdconf.com/">Game Developers Conference</a> is an annual gathering of people involved in the game industry from all over the world. It takes place in and around the <a href="https://www.google.co.uk/maps/place/Moscone+Center/@37.7838675,-122.4034264,17z">Moscone Centre</a> in San Francisco, California. I’ve always wanted to go, but it’s expensive to get out there and get accommodation and <em>very</em> expensive for the kind of pass that gets you into lots of interesting talks and events, which is one of the main reasons to go.</p>
<p>Very luckily, and to my great surprise, this year I got to go for free (for reasons I’ll explain). I was in San Francisco from Tuesday 28th February until Sunday 5th March and have spent most of my free time since I got back recovering. Here are some words about my trip.</p>
<!--more-->
<h3 id="hook-line-and-thinker"><em>Hook, Line and Thinker</em></h3>
<p><img src="/images/hlat_poster.jpg" width="50%" alt="Hook, Line and Thinker poster" title="Hook, Line and Thinker poster" /></p>
<p>This is <a href="https://rhythmlynx.itch.io/hook-line-and-thinker">a game</a> by my friend <a href="https://twitter.com/rhythm_lynx">Connor</a> that he originally made for <a href="https://itch.io/jam/fishing-jam-2">Fishing Jam</a> on <a href="http://www.lexaloffle.com/pico-8.php">PICO-8</a>, a fantasy console. He began working on a post-jam version with <a href="https://twitter.com/Doddsy91">Andrew</a> helping on the audio side of things.</p>
<h3 id="defold">Defold</h3>
<p><img src="/images/defold_logo.png" alt="" /></p>
<p>A <a href="http://www.defold.com/">game engine</a> developed by <a href="https://king.com/">King</a> with a focus on 2D, mobile games. I haven’t had a chance to really play around with it yet. They held a competition to encourage people to promote and make games with it, offering as a prize paid-for flights for up to three people to San Francisco, with GDC expo tickets and hotel rooms to boot, and a dedicated booth space for showing off the game they submitted. Connor and Andrew ported <em>Hook, Line and Thinker</em> to Defold and entered the competition. <a href="https://forum.defold.com/t/defold-gdc-competition-2017-the-winning-games/4481">They won</a>, and invited me to come as their third ‘team member’ in early January, just as I was resigning to not getting to go to GDC for another year. I was quite surprised!</p>
<p>Connor had already been in America for a week for <a href="http://trainjam.com/">TrainJam</a> before myself and Andrew flew out on the Tuesday, and arrived as the first two days of GDC were drawing to a close. The expo part of GDC didn’t open until Wednesday morning.</p>
<h3 id="talks">Talks</h3>
<p>There was a possibility (which I didn’t investigate) of being able to upgrade my expo pass to one that would let me attend talks if I negotiated with the right people at my company about it. I was right not to waste time doing so, though – we weren’t there for the first two days of the conference, which is when most of the extremely juicy talks are, and between manning the booth, exploring the expo and meeting people there was barely any time to go to talks anyway.</p>
<p>I got to attend two talks. On Thursday morning I attended Ste Curran’s talk <a href="http://stecurran.com/double-tap/">on gun violence in games</a> (some of his previous GDC talks are available on the web, and are <a href="https://www.youtube.com/watch?v=6W1sHzgAnVs">excellent</a>), and on Friday I attended a brief talk on prototyping (it was okay).</p>
<h3 id="expo">Expo</h3>
<p><img src="/images/gdc17/far.jpg" alt="Far: Lone Sails" /></p>
<p>The Moscone Centre consists of three enormous buildings called the North, South and West halls. The West hall was mostly dedicated to talks, containing some pretty cavernous lecture rooms, but had two relaxed areas for videogames (the <a href="http://indiemegabooth.com/announcing-line-gdc-2017/">Indie Megabooth</a> and <a href="http://thewildrumpus.co.uk/mildrumpus">Mild Rumpus</a>) and a corner for board games run by <a href="https://www.shutupandsitdown.com/">Shut Up and Sit Down</a>. The South hall was the bigger of the two expo halls, full of big players like Microsoft, Oculus/Facebook and Sony, as well as booths dedicated to national representation like the Scottish booth. The North hall contained all the wee games, the <a href="http://www.igf.com/">Independent Games Festival</a> finalists, the universities and colleges, and is where we were situated.</p>
<p>The ‘Made with Defold’ booth was in the corner of the hall, but the expo was so busy there was a lot of traffic coming our way anyway. The other games at the booth were cool and the developers of each were all nice people. Almost everyone who played <em>Hook, Line and Thinker</em> enjoyed it, and some played almost every level. Those who had things they didn’t like about it usually offered good constructive feedback.</p>
<p>During the times I got to explore the hall I managed to see a number of interesting games, and play a few. It was pretty cool to get to interact with the developers of games that were IGF finalists at the IGF pavilion, many of whom I look up to and admire for their work. Mostly I just embarrassed myself when I tried to speak to ‘famous’ devs (I imagine it must be pretty exhausting to have people constantly coming up to you and squee-ing about how excited they are to meet you all day). There was also a collection of interesting things in the <a href="http://www.gdconf.com/news/heres-lineup-games-playable-gdc-2017s-alt-ctrl-gdc-showcase/">Alt.Ctrl.GDC</a> section.</p>
<h3 id="igfgdc-awards">IGF+GDC Awards</h3>
<p><img src="/images/gdc17/igf_gdc_awards.jpg" alt="The awards hall" /></p>
<p>On Wednesday evening me and Connor went to watch the IGF and Game Developer’s Choice awards, a glitzy event where a handful of critically successful games are held up above the rest. I have mixed feelings about awards, award ceremonies and the effects they have, but both the back-to-back shows were highly entertaining. Nina Freeman and Tim Schafer hosted the IGF and Game Developer’s Choice awards respectively; both were good but Schafer’s ability to crack jokes and hold attention is incredible – they’re available to watch <a href="https://www.twitch.tv/videos/125754127">online</a>. It was neat to attend in person because there’s a vibe in the room that just doesn’t come across when you’re watching it over a livestream.</p>
<h3 id="people">People</h3>
<p>There was a good crowd of people I know from the Scottish game dev community wandering about, some who I hadn’t spoken to in a while, and it was good to catch up. More importantly I got to meet a lot of new people. Every night of GDC there are countless parties and get-togethers (I have no idea how anyone has enough energy to survive). On Friday evening I went to the Shut Up and Sit Down after party, learned a new game (<em>Good Cop Bad Cop</em> – an excellent wee hidden roles game) and got to hug Paul Dean.</p>
<p>All in all, a very successful trip. I hope I get to go again!</p>
Global Game Jam 20172017-02-07T00:00:00+00:00http://rachelnertia.github.io/game%20dev/2017/02/07/global-game-jam-2017<p><img src="/images/si-the-wave.jpg" alt="" /></p>
<p><a href="/game%20dev/2016/02/02/global-game-jam/">Last year</a> I took part in <a href="http://globalgamejam.org/">Global Game Jam</a> at <a href="http://globalgamejam.org/2017/jam-sites/abertay-university">Abertay University</a>, and I had such a good time that this year I did it again.</p>
<p>The theme was ‘Waves’. I teamed up with <a href="https://twitter.com/DziekDB">Dziek Dyes Bolt</a>, <a href="https://twitter.com/Fentlegen">Callum Fowlie</a> (two members of last year’s team) and <a href="https://twitter.com/ScarletCatalie">Natalie Clayton</a> to make ‘Si the Wave, Be the Wave’, a competitive local multiplayer game in which two players, each controlling a crowd of characters, must race to complete Mexican waves. You can <a href="http://globalgamejam.org/2017/games/si-wave-be-wave">check it out and download it</a> on the Global Game Jam website (Windows only). The final version is a bit broken. If you’re feeling brave, the predictably turgid source code is available on <a href="https://github.com/rachelnertia/GGJ2017">GitHub</a>.</p>
<p>The jam went a bit differently for me this time around. Unlike last year we actually had our mechanic working before the end of Saturday, rather than on Sunday morning, so we had time to rethink our idea and iterate upon it. However, we didn’t quite have enough work for everyone to do, and we had the usual difficulties one has when one tries to make a 2D game in Unity. I’m not quite as pleased with our game this time around – I think last year’s concept was <em>very strong</em> in comparison – but I still had a valuable experience trying new things and getting to write messy code, something that is quite refreshing after 5 months of programming as a day job.</p>
<p>The atmosphere at Abertay was fantastic once again, with the organisers (some of the lecturers from Arts, Media and Games) successfully creating a positive, healthy atmosphere. There’s always a lot of talk about staying up for the whole length of the jam and eating lots of junk food (the <a href="https://www.youtube.com/watch?v=2xfxx27HbM4">keynote video</a> this time around even encouraged it) and I think it’s important to reject that attitude. It doesn’t lead to better games <em>or</em> developers. They also put emphasis on the process and not the product, which is how it should be.</p>
<p>And they gave everyone jam at the end.</p>
<p>A whole load of rad games got made. <a href="http://globalgamejam.org/2017/jam-sites/abertay-university/games">Check them out</a>. Some highlights are <a href="http://globalgamejam.org/2017/games/microwaves">MicroWaves</a>, <a href="http://globalgamejam.org/2017/games/ola-de-la-vida">Ola De La Vida</a>, <a href="http://globalgamejam.org/2017/games/kraken-adventure-endless-sea-crap">A Kraken Adventure</a>, <a href="http://globalgamejam.org/2017/games/calling-mother">Calling Mother</a>, <a href="http://globalgamejam.org/2017/games/ragnar-flying-axe">Ragnar The Flying Axe</a>, <a href="http://globalgamejam.org/2017/games/%EF%BD%85%EF%BD%83%EF%BD%88%EF%BD%8F%EF%BD%83%EF%BD%88%EF%BD%81%EF%BD%8D%EF%BD%82%EF%BD%85%EF%BD%92">E C H O C H A M B E R</a> and <a href="http://globalgamejam.org/2017/games/porcelain-pork-purloiner">Porcelain Pork Purloiner</a>.
Finally, my friends’ game <a href="http://globalgamejam.org/2017/games/tiny-town-traffic-technician">Tiny Town Traffic Technician</a> was <a href="https://twitter.com/StevenTaarland/status/823201930625380352">my first try</a> of the <a href="https://www.youtube.com/watch?v=qYfNzhLXYGc">HTC Vive</a>. I can definitely see the appeal!</p>
<p>There’s a <a href="https://twitter.com/hashtag/AGLjam17?src=hash">Twitter hashtag</a> if you wanna scroll through that.</p>
My 20162017-01-01T00:00:00+00:00http://rachelnertia.github.io/personal/2017/01/01/2016-retrospective<p><img src="/images/arthurs-seat-new-years-day.jpg" alt="Me on Arthur's Seat on New Year's Day" title="Natalie took this!" /></p>
<p>2016 was a pretty positive year for me, even though the world at large seemed determined to produce bad news. Here’s some of the big things that happened in my life this year.</p>
<h3 id="i-finished-university">I finished university</h3>
<p>I may have graduated in November, but I was done with my time at Abertay after handing in my final project at the end of June. This was about two months after everyone else had handed in theirs. Final year is pretty hard at the best of times, and recovering from a bereavement certainly doesn’t help. At a few points I was ready to give up, but fortunately the staff at Abertay understood and allowed me to delay the final deadline so that I could focus on other stuff, like the maths exam. It simply would not have worked out any other way – I was pushing myself to the breaking point trying to do everything at once.</p>
<p>I made it, and I’m glad I did. The graduation ceremony, while being nothing more than a ceremony, turned out to be a nice way to bookend my time at Abertay. I’m very grateful to my teachers and the other staff, such as the university counsellors, who helped me get there.</p>
<h3 id="i-got-a-job">I got a job</h3>
<p>During my final push to complete university I continued applying to jobs as I had been throughout the year. This was quite depressing, with most applications ignored completely by overburdened hiring departments, but when all of your friends are going through the same process there’s an air of solidarity that helps to keep you going.</p>
<p>Eventually I applied for a junior programming role at Rockstar North, not expecting much, but found myself being offered a job less than a month later. I have not stopped feeling surprised.</p>
<p>I started in August and my first few months have been great. I am very lucky.</p>
<h3 id="i-moved-back-to-edinburgh">I moved back to Edinburgh</h3>
<p>It has been very sad to leave Dundee behind. At points I’ve felt very homesick for it. I don’t expect the feeling to go away, but I’m feeling more settled in Edinburgh now that I’ve moved into a flat on the other side of town.</p>
<p>Living at my mum’s for three months was alright – she and I get along pretty well – but I’m glad to have ‘escaped’. There was something uncomfortable about going to work along the same route I used to take to school, or sleeping in the same bed seven year-old me used to sleep in. Now I have my own place in a different part of town and I have something like the feeling of independence I had while I was in Dundee.</p>
<h3 id="my-friends-were-awesome">My friends were awesome</h3>
<p>And I am certain they will continue to be awesome!</p>
<p>It sounds a bit sappy, but it’s true. They have picked me up and put me back on my feet when I’ve been down and brought me many laughs and smiles. They all deserve the very best for 2017.</p>
<p>If you’re reading this, you’re probably one of my friends. If not, maybe you will be one day. Either way: you rock, and I wish you a happy new year!</p>
<iframe width="100%" height="360" src="https://www.youtube.com/embed/tRcPA7Fzebw" frameborder="0" allowfullscreen=""></iframe>
<p>(And I’m sure David would too.)</p>
2016 in Gaming2017-01-01T00:00:00+00:00http://rachelnertia.github.io/gaming/2017/01/01/2016-in-gaming<p>This post is about what I played in 2016 which, as I see it, was a pretty amazing year for games.</p>
<p>On the tabletop front I enjoyed some fantastic games. The main one that I can think of is, oddly enough, <a href="https://www.fantasyflightgames.com/en/products/condottiere/"><em>Condottiere</em></a>. I’ve owned <em>Condottiere</em> for years but in 2016 I spent a few long evenings playing it over and over with the same people and gained a lot of appreciation for it. It’s a tightly-designed blend of strategy, hidden information and bluffing, with nice theming and artwork to boot. It’s also very obviously the main inspiration for <a href="https://www.playgwent.com/en"><em>Gwent</em></a>. I’ve a few misgivings about <em>Condottiere</em> – random luck can win the day sometimes and there’s a bit of a snowball effect – but despite any criticisms I have this is one of those games that’s physically small and cheap enough that I think every board gamer ought to have a copy.</p>
<p>This year also introduced me to <a href="https://boardgamegeek.com/boardgame/178900/codenames"><em>Codenames</em></a>. I must have played it more than fifty times so far, and it’s yet to disappoint as a quick, easy way to engage people around a table.</p>
<p><img src="/images/hearts-of-stone-00.jpg" alt="The Witcher III - Hearts of Stone" title="Hearts of Stone" /></p>
<p>Meanwhile in videogame land <a href="http://store.steampowered.com/app/292030/"><em>The Witcher III</em></a> continued to amaze me. The <em>Hearts of Stone</em> expansion demonstrated more storytelling finesse on its own than most full games with a refreshingly <em>Witcher</em>-y take on <em>Faust</em>. I’ve yet to play <em>Blood and Wine</em>, the second expansion, but I’m really looking forward to it.</p>
<iframe width="100%" height="315" src="https://www.youtube.com/embed/HskOcc1ILAM" frameborder="0" allowfullscreen=""></iframe>
<p><a href="http://devildaggers.com/"><em>Devil Daggers</em></a>: a super-intense FPS with a super-intense aesthetic in which the only goal is to see how long you can survive against enormous swarms of enemies. Playing it in front of a crowd at <a href="/gaming/2016/10/27/adventures-in-the-real-world/">Games Are For Everyone</a>, in a cavernous old wine cellar beneath South Bridge in Edinburgh, with thick red candles strewn about, isn’t something I’ll forget in a hurry. Hopefully in 2017 I’ll live for longer than 150 seconds.</p>
<p><img src="https://img.itch.io/aW1hZ2UvNTg1OTQvMjYzNTA2LnBuZw==/original/zfR3je.png" alt="Lieve Oma" title="Lieve Oma" /></p>
<p><a href="https://vltmn.itch.io/lieve-oma"><em>Lieve Oma</em></a> was also featured at Games Are For Everyone. It’s about going for a walk with your grandmother in the woods. I found it very touching. I won’t say anymore. I hope you check it out.</p>
<p>This year I’ve not had much time to spend on big long games, which has given shorter-form games like <em>Devil Daggers</em> and <em>Lieve Oma</em> a chance to shine while mainstream triple-A releases have fallen to the wayside. I’m currently halfway through a replay of <a href="http://store.steampowered.com/app/205100/"><em>Dishonored</em></a>, including its excellent DLC, which I want to complete before I get the sequel. As I write this I’m sitting watching Natalie play the new <a href="http://store.steampowered.com/app/379720/"><em>Doom</em></a>. A lot of demons are exploding. It seems to really capture some of the design spirit of the original <em>Doom</em> games while confidently doing its own thing – a bit like <em>Devil Daggers</em>, I suppose. Also, <a href="/gaming/2016/03/22/oblivion/"><em>Oblivion</em> turned 10 this year</a>. Wild.</p>
<p>There’s much more to write about here, other games I’ve played and enjoyed, but there could never be enough time to cover everything, or even remember it all. If 2017 has half as rich a crop of good games I want to play I’ll never be able to catch up. And that’s okay.</p>
Easy Arguments2016-12-24T00:00:00+00:00http://rachelnertia.github.io/programming/2016/12/24/easy-arguments<p>We’ve all been there. We learn about a new-ish C++ feature, we consider using it, we weigh our optimism against our wariness of falling into the “use <em>all</em> the features!” trap. We remember the sad times when we or others were a little too eager and back away nervously. Maybe another time, we say, retreating into the darkness – it may be dark, but it’s darkness you’re familiar with.</p>
<p>The argument to adopt new-ish C++ features can be quite difficult, and for good reason. Sometimes the argument practically wins itself, though, in one simple, concise example. This post is about my current favourite.</p>
<!--more-->
<h3 id="variadic-functions">Variadic Functions</h3>
<p>C-style <a href="http://en.cppreference.com/w/cpp/utility/variadic">varargs</a> are awkward to work with and unsafe in many ways, such as being completely typeless. Let’s say you have a function that needs to branch based on the types of the arguments it’s given. The classic example is some kind of <code class="language-plaintext highlighter-rouge">printf</code>: you pass a string, followed by a set of arguments to be formatted into that string. Without type introspection, it is necessary to find some other way to specify the types of the arguments. In the classic <code class="language-plaintext highlighter-rouge">printf</code>, this information is encoded by the programmer into the string argument.</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">printf</span><span class="p">(</span><span class="s">"One is %d and %s is 2"</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="s">"two"</span><span class="p">);</span>
<span class="c1">// outputs: One is 1 and two is 2</span>
</code></pre></div></div>
<p>This is not safe. If we mixed up our <code class="language-plaintext highlighter-rouge">%d</code> and <code class="language-plaintext highlighter-rouge">%s</code> there then we would probably crash the program. Some compilers feature enabled-by-default extensions that will warn/error you if they see this happening, but they are not obliged to.</p>
<p>So let’s write a function that knows about the types of its varargs. First, we need some kind of wrapper that goes around values and stores information about their type:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">struct</span> <span class="nc">Arg</span>
<span class="p">{</span>
<span class="k">enum</span> <span class="k">class</span> <span class="nc">Type</span>
<span class="p">{</span>
<span class="n">Int</span><span class="p">,</span>
<span class="n">Float</span><span class="p">,</span>
<span class="n">Double</span><span class="p">,</span>
<span class="n">String</span>
<span class="p">};</span>
<span class="n">Arg</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">value</span><span class="p">)</span> <span class="o">:</span> <span class="n">m_Type</span><span class="p">(</span><span class="n">Type</span><span class="o">::</span><span class="n">Int</span><span class="p">),</span> <span class="n">m_IntValue</span><span class="p">(</span><span class="n">value</span><span class="p">){};</span>
<span class="n">Arg</span><span class="p">(</span><span class="k">const</span> <span class="kt">float</span> <span class="n">value</span><span class="p">)</span> <span class="o">:</span> <span class="n">m_Type</span><span class="p">(</span><span class="n">Type</span><span class="o">::</span><span class="n">Float</span><span class="p">),</span> <span class="n">m_FloatValue</span><span class="p">(</span><span class="n">value</span><span class="p">){};</span>
<span class="n">Arg</span><span class="p">(</span><span class="k">const</span> <span class="kt">double</span> <span class="n">value</span><span class="p">)</span> <span class="o">:</span> <span class="n">m_Type</span><span class="p">(</span><span class="n">Type</span><span class="o">::</span><span class="n">Double</span><span class="p">),</span> <span class="n">m_DoubleValue</span><span class="p">(</span><span class="n">value</span><span class="p">){};</span>
<span class="n">Arg</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">value</span><span class="p">)</span> <span class="o">:</span> <span class="n">m_Type</span><span class="p">(</span><span class="n">Type</span><span class="o">::</span><span class="n">String</span><span class="p">),</span> <span class="n">m_StringValue</span><span class="p">(</span><span class="n">value</span><span class="p">){};</span>
<span class="n">Type</span> <span class="n">m_Type</span><span class="p">;</span>
<span class="k">union</span> <span class="p">{</span>
<span class="kt">int</span> <span class="n">m_IntValue</span><span class="p">;</span>
<span class="kt">float</span> <span class="n">m_FloatValue</span><span class="p">;</span>
<span class="kt">double</span> <span class="n">m_DoubleValue</span><span class="p">;</span>
<span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">m_StringValue</span><span class="p">;</span>
<span class="p">};</span>
<span class="p">};</span>
</code></pre></div></div>
<p>We have some function that takes an array of Arg, and iterates through them, branching on each based on their m_Type.</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">DoThingsWithArgs</span><span class="p">(</span><span class="kt">int</span> <span class="n">numArgs</span><span class="p">,</span> <span class="n">Arg</span><span class="o">*</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// ...</span>
<span class="p">}</span>
</code></pre></div></div>
<p>But we don’t want to force the user to build their own array of Args every time they want to use this function. We want the array-building to be handled automatically. Fortunately, this is quite straightforward.</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span> <span class="o"><</span><span class="k">typename</span> <span class="nc">T0</span><span class="p">,</span> <span class="k">typename</span> <span class="nc">T1</span><span class="p">,</span> <span class="k">typename</span> <span class="nc">T3</span><span class="p">></span>
<span class="kt">void</span> <span class="nf">DoThingsWithArgs</span><span class="p">(</span><span class="n">T0</span> <span class="n">a</span><span class="p">,</span> <span class="n">T1</span> <span class="n">b</span><span class="p">,</span> <span class="n">T2</span> <span class="n">c</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// none of the constructors for Arg have been marked</span>
<span class="c1">// as explicit, so we can get away with this syntax</span>
<span class="n">Arg</span> <span class="n">argArray</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span> <span class="p">};</span>
<span class="c1">// we put the non-template DoThingsWithArgs inside</span>
<span class="c1">// a new namespace 'internal' to avoid confusion</span>
<span class="n">internal</span><span class="o">::</span><span class="n">DoThingsWithArgs</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="n">argArray</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>What’s going on here? We’re using an initialiser list to construct an array of Args. As long as a constructor for Arg exists that can take type T0, T1 or T3, this will compile. If the user attempts to pass some type that isn’t handled by Arg (e.g. a pointer to <code class="language-plaintext highlighter-rouge">int</code>) then compilation will fail. Type safety!</p>
<p>But we have a problem. We need to write one overload of <code class="language-plaintext highlighter-rouge">DoThingsWithArgs</code> for every possible number of arguments.</p>
<p>That is an infinite number of overloads.</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// one arg</span>
<span class="k">template</span> <span class="o"><</span><span class="k">typename</span> <span class="nc">T0</span><span class="p">></span>
<span class="kt">void</span> <span class="nf">DoThingsWithArgs</span><span class="p">(</span><span class="n">T0</span> <span class="n">a</span><span class="p">)</span> <span class="p">{</span>
<span class="n">Arg</span> <span class="n">argArray</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="n">a</span> <span class="p">};</span>
<span class="n">internal</span><span class="o">::</span><span class="n">DoThingsWithArgs</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">argArray</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">// two arg</span>
<span class="k">template</span> <span class="o"><</span><span class="k">typename</span> <span class="nc">T0</span><span class="p">></span>
<span class="kt">void</span> <span class="n">DoThingsWithArgs</span><span class="p">(</span><span class="n">T0</span> <span class="n">a</span><span class="p">,</span> <span class="n">T1</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
<span class="n">Arg</span> <span class="n">argArray</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="p">};</span>
<span class="n">internal</span><span class="o">::</span><span class="n">DoThingsWithArgs</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">argArray</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">// etc...</span>
</code></pre></div></div>
<p>It doesn’t have to be this way. Enter <strong>variadic templates</strong>!</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span> <span class="o"><</span><span class="k">typename</span><span class="o">...</span> <span class="nc">Args</span><span class="p">></span>
<span class="kt">void</span> <span class="nf">DoThingsWithArgs</span><span class="p">(</span><span class="n">Args</span><span class="p">...</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
<span class="n">Arg</span> <span class="n">argArray</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="n">args</span><span class="p">...</span> <span class="p">};</span>
<span class="n">internal</span><span class="o">::</span><span class="n">DoThingsWithArgs</span><span class="p">(</span><span class="k">sizeof</span><span class="p">...(</span><span class="n">Args</span><span class="p">),</span> <span class="n">argArray</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Here, <code class="language-plaintext highlighter-rouge">typename... Args</code> lets us specify an arbitrary number of types to a template. The list of types will be referred to as <code class="language-plaintext highlighter-rouge">Args</code>. We unroll this ‘<a href="http://en.cppreference.com/w/cpp/language/parameter_pack">parameter pack</a>’ to form the argument list of the function using <code class="language-plaintext highlighter-rouge">Args... args</code>.</p>
<p>Inside the function, writing <code class="language-plaintext highlighter-rouge">args...</code> evaluates to the list of actual arguments. For example, if we called <code class="language-plaintext highlighter-rouge">DoThingsWithArgs</code> like so:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">DoThingsWithArgs</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">,</span> <span class="s">"hello"</span><span class="p">);</span>
</code></pre></div></div>
<p><code class="language-plaintext highlighter-rouge">args...</code> would evaluate to:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Arg</span> <span class="n">argArray</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">1</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">,</span> <span class="s">"hello"</span> <span class="p">};</span>
</code></pre></div></div>
<p>Finally, <code class="language-plaintext highlighter-rouge">sizeof...(Args)</code> returns the size of the parameter pack, and therefore the size of <code class="language-plaintext highlighter-rouge">argArray</code>.</p>
<p>This is all pretty neat, huh? And also hard to argue with. Once your toolchain has fully migrated to C++11, updating old code to use parameter packs instead of heavily-overloaded function templates should be a total no-brainer.</p>
<p>I hope you’ve found this blog post informative. If there’s anything unclear or odd about it, let me know in the comments or on Twitter. Can you think of other good examples of new language features that old code should be upgraded to use?</p>
<p>Oh, and happy holidays!</p>
CppCon 20162016-12-19T00:00:00+00:00http://rachelnertia.github.io/programming/2016/12/19/cppcon-2016<p>Lots of good talks came out of <a href="https://www.youtube.com/user/CppCon">CppCon 2016</a>. Like my <a href="/game%20dev/2016/12/02/steam-dev-days-video-picks/">Steam Dev Days</a> post, this is a roundup of some videos I think are worth watching.</p>
<p>Warning: C++ enthusiasts ahead. Obviously.</p>
<p>Jason Turner (the guy behind <a href="http://chaiscript.com/">ChaiScript</a>, <a href="https://www.youtube.com/playlist?list=PLs3KjaCtOwSZ2tbuV1hx8Xz-rFZTan2J1">C++ Weekly</a>, and one half of <a href="http://cppcast.com/">CppCast</a>) produced two interesting talks this year. The first is <a href="https://youtu.be/uzF4u9KgUWI">Practical Performance Practices</a>, which is full of good advice for navigating the labyrinth of gotchas that is modern C++, where there are at least 5 ways to do every little thing, and 3 of them are okay, and 4 of them are bad. The second talk is <a href="https://www.youtube.com/watch?v=zBkNBP00wJE">Rich Code for Tiny Computers: A Simple Commodore 64 Game in C++17</a>, in which he shows off some pretty neat stuff.</p>
<p>Here is Herb Sutter talking about dynamic memory management in a talk entitled <a href="https://youtu.be/JfmTagWcqoE">Leak-Freedom in C++… By Default</a>, going into examples of when and where to use the standard library’s smart pointers. He actually brings up a multithreading-ready version of the <code class="language-plaintext highlighter-rouge">weak_ptr</code>/<code class="language-plaintext highlighter-rouge">shared_ptr</code>-based resource bank class I showed off in <a href="/programming/2016/11/16/weak-ptr-fun-times/">a recent post</a>.</p>
<p><a href="https://www.youtube.com/watch?v=BP6NxVxDQIs">Want fast C++? Know your hardware!</a> is about, well, knowing your hardware. This is one of those annoying harsh realities. You want to not have to think about the metal. The whole <em>point</em> of high-level programming languages like C++ is to get away from worrying about the hardware. Worrying about the hardware is the hardware developer’s job, right? Well, no. At least until languages catch up with the fact that the performance bottleneck in computing is no longer CPU speed but memory speed<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>, data-oriented code is going to be the way forward for high-performance applications<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>.</p>
<p>I enjoyed this talk on <a href="https://www.youtube.com/watch?v=wBER1R8YyGY">“Colonies, performance and why you should care”</a>. Basically, a ‘colony’ is a container written for fast insertion, erasure and iteration; the kind of thing you want to put your GameObjects in. This is one of the many nice things coming out of <a href="https://www.youtube.com/watch?v=dMupATOJKWc">SG14</a>, the ISO-C++ study group focusing on low-latency, real-time applications like games.</p>
<p>That’s all I have time for, but I recommend having a browse around the selection of videos. There are significantly more than there were for Steam Dev Days, and some of them are very focused, so there was no way I could have watched and judged them all. Hopefully the ones I’ve linked here are a good starting point for your own meandering through the archives.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>If you know of any languages or features of any language which abstractify data-oriented programming practices, please tell me about them. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>Fun fact: Data on CDs/DVDs for games which use streaming for most or all of their assets (so basically any seamless open-world game since GTA 3) have optimized data layouts on disk, with data commonly accessed at around the same time placed physically near each other to minimize the amount of movement needed to move from one asset to the next. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Steam Dev Days 20162016-12-02T00:00:00+00:00http://rachelnertia.github.io/game%20dev/2016/12/02/steam-dev-days-video-picks<p><img src="/images/SteamDevDays01.jpg" alt="" /></p>
<p>The second ever <a href="http://steamcommunity.com/devdays">Steam Dev Days</a> was held in October and, by all accounts, was a pretty rad event. Fortunately for us shmucks who didn’t go Valve have kindly put recordings of all the talks and panels on YouTube. The full playlist is <a href="https://www.youtube.com/playlist?list=PLckFgM6dUP2ihiMeKHoyIdHvhRSyqwQsp">here</a>, but I’ve watched most of all of them and can guide you towards what I think are the best ones.</p>
<p>Each heading should be a link to its corresponding YouTube video. Please let me know if I missed one or messed one up!</p>
<h3 id="welcome"><a href="https://youtu.be/mJqo7XzwJd0">Welcome</a></h3>
<p>This is basically just a mission statement for what Steam Dev Days is aiming to be: not an expo, more of a conference, but more intimate than <a href="http://www.gdconf.com/">Game Developers Conference</a>.</p>
<h3 id="steam-business-update"><a href="https://youtu.be/XGCyfEYfLks">Steam Business Update</a></h3>
<p>It’s really cool to look back and reflect on how Steam has evolved over the years. I’ve been there for almost all of that time, installing it because of <em>Dark Messiah of Might and Magic</em> (<a href="https://www.youtube.com/watch?v=p7T9tJiw6AU">the best game ever</a>) in 2006 and gradually becoming more of a regular user until <a href="http://store.steampowered.com/sub/469/?snr=1_5_9__13"><em>The Orange Box</em></a> exploded my brain with SHEER GAMING VALUE FOR MONEY and transformed me into a lifelong Valve fan and <em>enormous</em><sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup> Steam library-haver. I can remember Steam’s first crappy iteration and all the ways it’s changed on the path to becoming the terrifying juggernaut it is today. It’s interesting to get the perspective of someone at Valve on that history, and learn about where they think they’re taking the platform next.</p>
<h3 id="steam-controller"><a href="https://youtu.be/7I4SiAiKqqk">Steam Controller</a></h3>
<p>Input programming is usually pretty horrible, for all the reasons <a href="http://www.fortressofdoors.com/">Lars Doucet</a> (developer on <a href="http://www.defendersquest.com/index.html"><em>Defenders Quest</em></a>) talks about. His enthusiasm for the <a href="http://store.steampowered.com/app/353370/">Steam Controller</a> and its API is infectious – I wasn’t interested in owning one before this talk, but now I want to get one just so that I can play with it as a programmer.</p>
<h3 id="sound-advice-from-successful-developers"><a href="https://youtu.be/FCJDgvhXg3c">Sound Advice from Successful Developers</a></h3>
<p>Does what it says on the tin, unless you interpreted “sound” as “audio”. Businessy, in the good way.</p>
<h3 id="ugc-and-workshop-in-ark-survival-evolved"><a href="https://youtu.be/faweKXUTKgQ">UGC and Workshop in <em>ARK: Survival Evolved</em></a></h3>
<p>I haven’t played <a href="https://survivetheark.com/"><em>ARK</em></a>. I don’t think I ever will - it’s not really my thing - but I find it fascinating to watch its history unfold. I remember being quite excited to watch <a href="https://www.bistudio.com/games/dayz"><em>DayZ</em></a> develop from a <a href="https://www.youtube.com/watch?v=KRpPIyJDSEQ">shonky, obscure <em>ArmA II</em> mod</a> to PC gaming household name. Of the many games following in its footsteps, <em>ARK</em> definitely seems to be taking the most confident strides, overtaking its inspiration in almost every way.</p>
<h3 id="early-access"><a href="https://youtu.be/HNtry3eLx-s">Early Access</a></h3>
<p>Worthy discussion of the pros and cons of <a href="http://store.steampowered.com/genre/Early%20Access/">Early Access</a> from developers working on the frontline. Each panellist has a different perspective and approach, but no one positions themselves as the developer who got it ‘right’. Having said that, there’s a bit of ego-grooming, but it’s not bad.</p>
<h3 id="anti-cheat-for-multiplayer-games"><a href="https://youtu.be/hI7V60r7Jco">Anti-Cheat for Multiplayer Games</a></h3>
<p>I don’t cheat in games. Consequently, I know nothing about how cheating is done, and therefore less than nothing about how to prevent it. I like the presenter’s examples of simple game design changes that can discourage cheating. It’s also useful to have an overview of Steam’s anti-cheat and game moderation features.</p>
<h3 id="healthy-publisher-relationships"><a href="https://youtu.be/7qf0WCy0X-w">Healthy Publisher Relationships</a></h3>
<p>Put together, these panellists probably have enough industry experience to make me look like a newborn. They have a lot of really well-articulated advice to share on when and when not to get a publisher, and how to do it properly.</p>
<h3 id="vulkan-graphics"><a href="https://youtu.be/DWLkA6-wzj0">Vulkan Graphics</a></h3>
<p>A panel of graphics programmers talk about <a href="https://www.khronos.org/vulkan/">Vulkan</a>, the new open-source low-level graphics API on the block. They seem pretty pleased and I’m now even more eager to learn it.</p>
<h3 id="vr-developer-panel"><a href="https://youtu.be/gJw5GQmEETg">VR Developer Panel</a></h3>
<p>I don’t have one of these newfangled ‘VRs’, but even my neo-skeptic mind can tell there’s a lot of interesting stuff to talk about with regards to making VR games. In this panel the developers of <a href="http://fantasticcontraption.com/"><em>Fantastic Contraption</em></a>, <a href="www.hoverjunkers.com/"><em>Hover Junkers</em></a>, <a href="http://www.spacepiratetrainer.com/"><em>Space Pirate Trainer</em></a> and <a href="http://audio-shield.com/"><em>Audioshield</em></a> share the insights they’ve gained from working on the frontline. The YouTube video’s thumbnail image is rather good, too.</p>
<p><img src="/images/SteamDevDays02.jpg" alt="" /></p>
<p>That’s all of them, assuming I haven’t missed one somewhere. Even if you only watch a couple of them, I think you’ll have an edifying old time.</p>
<p>Is there one you think I missed? Or one talk in particular that really grabbed your attention? Let me know what you think!</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>I’m too ashamed to count how many unplayed games there are in it, my friends. Too ashamed. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
std::weak_ptr in Action2016-11-16T00:00:00+00:00http://rachelnertia.github.io/programming/2016/11/16/weak-ptr-fun-times<p>No, I don’t know how the capitalisation should work in that title, either.</p>
<p><a href="/programming/2016/11/12/intro-to-smart-ptrs/">In my last post</a> I talked about how I’m starting to use the C++ standard library’s smart pointers in my own code and finding it quite pleasant. But all I did was name and give brief descriptions of the three templates – <code class="language-plaintext highlighter-rouge">unique_ptr</code>, <code class="language-plaintext highlighter-rouge">shared_ptr</code> and <code class="language-plaintext highlighter-rouge">weak_ptr</code>. I didn’t give any examples of them in use.</p>
<h3 id="one-rendercomponent-one-sftexture">One RenderComponent, One sf::Texture</h3>
<p>In my game engine Entities are made up of Components (a common <a href="http://gameprogrammingpatterns.com/component.html">design pattern</a>). The PhysicsComponent connects it to the physical world. The RenderComponent describes how to draw it. RenderComponents can have textures. For now all my rendering code makes use of <a href="http://www.sfml-dev.org/">SFML</a>’s graphics library, so RenderComponents make use of textures through <a href="http://www.sfml-dev.org/documentation/2.4.1/classsf_1_1Texture.php">sf::Texture</a> objects.</p>
<p>Initially, I’m willing to take the simplest course of action: RenderComponent has a sf::Texture member.</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">RenderComponent</span> <span class="p">{</span>
<span class="n">sf</span><span class="o">::</span><span class="n">Texture</span> <span class="n">mTexture</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>
<p>When I want to use the texture, I call <code class="language-plaintext highlighter-rouge">mTexture.loadFromFile("example.png")</code> and continue on my way.</p>
<p>Advantages include:</p>
<ul>
<li>When the RenderComponent is deallocated, so is the sf::Texture, along with the actual texture data that might have been loaded onto the GPU’s memory with <code class="language-plaintext highlighter-rouge">loadFromFile</code>.</li>
</ul>
<p>Disadvantages include:</p>
<ul>
<li>It’s wasteful of main memory. sf::Texture has many members. I’m probably never going to use most of them.</li>
<li>It’s wasteful of GPU memory. If two RenderComponents use example.png, two copies of it will be sitting in the graphics card’s memory. Why load an asset twice? This would also be wasteful of main memory because the sf::Textures would be identical too.</li>
</ul>
<p>I can solve the first disadvantage by having RenderComponent own a pointer to an sf::Texture instead.</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">RenderComponent</span> <span class="p">{</span>
<span class="n">sf</span><span class="o">::</span><span class="n">Texture</span><span class="o">*</span> <span class="n">mTexture</span> <span class="o">=</span> <span class="nb">nullptr</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>
<p>Nice. When I want the RenderComponent to be textured, I allocate a <code class="language-plaintext highlighter-rouge">new sf::Texture</code> and call <code class="language-plaintext highlighter-rouge">loadFromFile</code> with it. Unfortunately I now have to remember to call <code class="language-plaintext highlighter-rouge">delete</code> at some point, and I might screw up by exposing the pointer to outside bits of code, who might deallocate the memory or modify the pointer. Hence:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">RenderComponent</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o"><</span><span class="n">sf</span><span class="o">::</span><span class="n">Texture</span><span class="o">></span> <span class="n">mTexture</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>
<p>Those insecurities are now nicely stitched up. Unfortunately, I’m still worried about being wasteful of space when multiple RenderComponents are using the same texture.</p>
<h3 id="multiple-rendercomponents-one-sftexture">Multiple RenderComponents, One sf::Texture</h3>
<p>You could accomplish this in a bunch of ways. Here’s one that takes advantage of smart pointers to minimize book-keeping and waste. First, I give RenderComponent a <code class="language-plaintext highlighter-rouge">shared_ptr</code> so that it can participate in shared ownership of an sf::Texture with other objects.</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">RenderComponent</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o"><</span><span class="n">sf</span><span class="o">::</span><span class="n">Texture</span><span class="o">></span> <span class="n">mTexture</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>
<p>When I want to set the texture to example.png, I need a way of knowing if there is already a dynamically-allocated sf::Texture somewhere out there that’s been loaded with example.png.</p>
<p>Enter the TextureLibrary class. It keeps track of all that for me. Setting the RenderComponent’s texture is a matter of writing <code class="language-plaintext highlighter-rouge">mTexture = sTextureLibrary.LoadTexture("example.png")</code>, and I’m guaranteed not to be creating a duplicate. When no RenderComponents are using example.png, it will be automatically cleaned up.</p>
<p>TextureLibrary needs to know about the reference count of each sf::Texture it oversees without actually modifying it. A perfect fit for <code class="language-plaintext highlighter-rouge">std::weak_ptr</code>.</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">TextureLibrary</span>
<span class="p">{</span>
<span class="nl">private:</span>
<span class="c1">// Map of {filename, texture} key-value pairs.</span>
<span class="n">std</span><span class="o">::</span><span class="n">unordered_map</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">weak_ptr</span><span class="o"><</span><span class="n">sf</span><span class="o">::</span><span class="n">Texture</span><span class="o">>></span> <span class="n">mLoadedTextures</span><span class="p">;</span>
<span class="nl">public:</span>
<span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o"><</span><span class="n">sf</span><span class="o">::</span><span class="n">Texture</span><span class="o">></span> <span class="n">LoadTexture</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">filename</span><span class="p">)</span>
<span class="p">{</span>
<span class="c1">// Cast filename to all-lower case.</span>
<span class="n">std</span><span class="o">::</span><span class="n">transform</span><span class="p">(</span><span class="n">filename</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">filename</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">filename</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="o">::</span><span class="n">tolower</span><span class="p">);</span>
<span class="c1">// Check if the filename has already been loaded.</span>
<span class="k">if</span> <span class="p">(</span><span class="n">mLoadedTextures</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span> <span class="o">!=</span> <span class="n">mLoadedTextures</span><span class="p">.</span><span class="n">end</span><span class="p">())</span>
<span class="p">{</span>
<span class="c1">// Make sure the weak_ptr is not dangling before we create a new reference.</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">mLoadedTextures</span><span class="p">[</span><span class="n">filename</span><span class="p">].</span><span class="n">expired</span><span class="p">())</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">mLoadedTextures</span><span class="p">[</span><span class="n">filename</span><span class="p">].</span><span class="n">lock</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="c1">// There is no sf::Texture using this file. Create a new one.</span>
<span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o"><</span><span class="n">sf</span><span class="o">::</span><span class="n">Texture</span><span class="o">></span> <span class="n">temp</span><span class="p">(</span><span class="k">new</span> <span class="n">sf</span><span class="o">::</span><span class="n">Texture</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">temp</span><span class="o">-></span><span class="n">loadFromFile</span><span class="p">(</span><span class="n">filename</span><span class="p">))</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">shared_ptr</span><span class="o"><</span><span class="n">sf</span><span class="o">::</span><span class="n">Texture</span><span class="o">></span> <span class="n">shared</span><span class="p">(</span><span class="n">temp</span><span class="p">.</span><span class="n">release</span><span class="p">());</span>
<span class="n">mLoadedTextures</span><span class="p">[</span><span class="n">filename</span><span class="p">]</span> <span class="o">=</span> <span class="n">shared</span><span class="p">;</span>
<span class="k">return</span> <span class="n">shared</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nb">nullptr</span><span class="p">;</span>
<span class="c1">// If loadFromFile failed, temp will go out of scope here and delete itself.</span>
<span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>
<p>Concise and safe. There are definitely drawbacks – a little reference-counting overhead here and there – but for now I’m willing to believe the benefits outweigh the costs.</p>
Smart Pointers Are Quite Good2016-11-12T00:00:00+00:00http://rachelnertia.github.io/programming/2016/11/12/intro-to-smart-ptrs<p>The concept of the smart pointer is not particularly new. It’s probably existed for as long as <code class="language-plaintext highlighter-rouge">malloc</code> and <code class="language-plaintext highlighter-rouge">free</code> have been inspiring programmers to invent increasingly elaborate garbage collection systems instead of manually managing the heap memory they use. In fact it’s quite easy to create some form of smart pointer without realizing you’re replicating the pattern. All you do is write a class which wraps up a pointer to a dynamically-allocated block of memory. Maybe it prevents other parts of the codebase coming in and pointing that pointer at something else without freeing the memory. Maybe it calls <code class="language-plaintext highlighter-rouge">delete</code> on the pointer in the destructor. <em>Voila</em>. You’ve written a ‘smart’ pointer: an abstraction which automates or simplifies resource management.</p>
<p>If this is all a bit alien to you, you might be fairly new to C++ and still getting used to how pointers and manual memory management work in general. You also might not be up to speed on how the language standard has evolved in recent years. One nice evolution I’ve recently started taking advantage of is the addition of smart pointer class templates to the standard library.</p>
<p><code class="language-plaintext highlighter-rouge">std::unique_ptr</code> helps with exclusive-ownership resource management. <code class="language-plaintext highlighter-rouge">std::unique_ptr<int> p(new int)</code> makes wrapper around a pointer to a dynamically-allocated <code class="language-plaintext highlighter-rouge">int</code>. Nobody else can point to that <code class="language-plaintext highlighter-rouge">int</code>, and certainly nobody else can delete it out from underneath <code class="language-plaintext highlighter-rouge">p</code><sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>. When <code class="language-plaintext highlighter-rouge">p</code> goes out of scope and its destructor is called it deallocates the <code class="language-plaintext highlighter-rouge">int</code> so you don’t have to remember to call <code class="language-plaintext highlighter-rouge">delete</code> yourself to avoid a resource leak. The overhead of using a <code class="language-plaintext highlighter-rouge">unique_ptr</code> instead of a raw <code class="language-plaintext highlighter-rouge">int*</code>? Negligible. The maintainability overhead of using a raw pointer? Definitely not negligible. This kind of smart pointer receives a big thumbs-up from me, and having a nice implementation right there in the standard library makes it hard to defend not making use of it<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>.</p>
<p><code class="language-plaintext highlighter-rouge">std::shared_ptr</code>, on the other hand, is for shared-ownership resource management. Multiple <code class="language-plaintext highlighter-rouge">shared_ptr</code> instances can point to the same block of data without the programmer needing to worry about someone deleting it before everyone else has finished with it. In order to do this it introduces reference-counting into the mix, so this time, yes, there <em>is</em> some overhead. That overhead, however, is book-keeping you’d probably be doing anyway. When a <code class="language-plaintext highlighter-rouge">shared_ptr</code>’s destructor is called, the reference count variable it shares with the other <code class="language-plaintext highlighter-rouge">shared_ptr</code>s that point to the same resource is decremented. If the reference count hits zero, it deallocates the resource.</p>
<p>There’s one more. <code class="language-plaintext highlighter-rouge">std::unique_ptr</code> and <code class="language-plaintext highlighter-rouge">std::shared_ptr</code> have a scrawny sibling: <code class="language-plaintext highlighter-rouge">std::weak_ptr</code>. It acts like a <code class="language-plaintext highlighter-rouge">shared_ptr</code>, but doesn’t participate in shared ownership. When pointed at a resource, the weak pointer shares a reference count variable with any <code class="language-plaintext highlighter-rouge">shared_ptr</code>s that also point to that resource. Unlike the <code class="language-plaintext highlighter-rouge">shared_ptr</code> it doesn’t modify the reference count; it just looks at it. This means it can tell when it’s <em>dangling</em> - when it points at memory that’s been freed - because the reference count is 0. Useful!</p>
<p>The main takeaway here is that I like these things, and I think should too. Once you’re used to them they’re very useful tools. If you’re still not convinced, my next post will demonstrate a use-case I found for <code class="language-plaintext highlighter-rouge">weak_ptr</code> in a spare-time project that might tip the scales.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>At least without writing purposefully bad code. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>In most circumstances. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Adventures in the Real World2016-10-27T00:00:00+00:00http://rachelnertia.github.io/gaming/2016/10/27/adventures-in-the-real-world<p>I had two new experiences last week that were fresh, eye-opening and actually quite inspiring: a journey to an island, and a journey underground…</p>
<p><img src="/images/inchcolm_02.jpg" alt="" /></p>
<h2 id="the-inchcolm-project">The Inchcolm Project</h2>
<h3 id="sunday-16th-october">Sunday 16th October</h3>
<p>I was one of seventy-ish lucky people to take a ferry from South Queensferry out to the small isle of <a href="https://en.wikipedia.org/wiki/Inchcolm">Inchcolm</a> in order to take part in an experience best described simply as ‘<a href="http://dear-esther.com/"><em>Dear Esther</em></a> in real life’.</p>
<p>With our smartphones in our hands, we roamed the island’s pathways, navigating our way towards the specific geo-tagged areas in which we’d receive a little audio narration from a sad man. Not the same sad man as the one from <em>Dear Esther</em> – this one was bereaved by the loss of a Rachel, and had a Scottish accent rather than an English one. Hearing this guy open his speeches with my name over and over again, I couldn’t help but feel it leant a little something to my experience that made it a bit different to that of non-Rachels on the island. It was hard to take in and digest all the narrative that was there in the time we had, but there was definitely an appreciable level of terror of the sea, which I can relate to. There were symbolic, story-related art installations scattered around the island (some in quite hard to find places), and members of the <a href="https://twitter.com/mantra_sound">Mantra Collective</a> playing musical accompaniments to some spaces. You could walk through the pitch-black tunnel that runs through one of the island’s two hills to the sound of a violin, its notes echoing eerily through the darkness, and emerge blinking into the sunlight at the other end, feeling very spectacular indeed.</p>
<p>Inchcolm is a beautiful place. Its ruined abbey is kept company by the bunkers and turrets of the World Wars – almost all the islands in the Firth are encrusted with these concrete barnacles. There are seals in the surrounding waters who swim into the little bay where the boat docks and a thin strip of grassy green land connects the two halves of the island. I think they know people love to spot them and come close just to bask in attention. There is a rock out a bit into the water which has been covered in garden gnomes and christened, yes, ‘Inch-gnome’.</p>
<p>While we were there the weather cleared up a little bit, and warm rays of sunshine poked through to us from the West, lighting up the Forth bridges in the distance. To the South there was a clear view to Edinburgh, looking windswept and small in the shadow of Arthur’s Seat, but proud nonetheless.</p>
<p>At the end of our time on the island we went into a darkened room in the abbey to watch <em>Dear Esther</em> being played, projected onto the rough stone wall. Then we were led into another room and played several songs from the game by the whole Mantra Collective. It’s <a href="https://jessicacurry.bandcamp.com/album/dear-esther">beautiful music</a>, some of my favourite music in all the world, and I’m intensely grateful to have been able to experience it in such a stunning setting.</p>
<p><img src="/images/inchcolm_01.jpg" alt="" /></p>
<p>There’s an <a href="http://www.abertay.ac.uk/discover/news/news-archive/2016/name,31749,en.html">article</a> about the project on the Abertay University website, written before the fact, if you’re interested.</p>
<h2 id="games-are-for-everyone-volume-iv">Games Are For Everyone, Volume IV</h2>
<h3 id="thursday-20th-october">Thursday 20th October</h3>
<p>Through a mixture of bad luck and incompetence on my part, this was the first Games Are For Everyone I’ve managed to attend, and oh boy do I feel sad about missing out on all the previous events.</p>
<p>It took place at <a href="http://unusualvenuesedinburgh.com/venues/the-caves-venue-edinburgh">The Caves</a>, a massive converted whisky cellar in the bowels of the Edinburgh old town (it’s just off Cowgate, beneath South Bridge, to be exact), which was a weird, cool, kinda surreal space to be in.</p>
<p>There were a lot of games there. Some were running on television screens or monitors, while others were set up in these cool faux-arcade cabinets that <a href="http://wethrowswitches.com/">We Throw Switches</a> have. Among the lineup were:</p>
<ul>
<li><a href="https://vltmn.itch.io/lieve-oma"><em>Lieve Oma</em>, by Florian Veltman</a>. I played this when it was released, it’s one of my favourites of the year, and I heartily recommend checking it out.</li>
<li><a href="http://manifold.garden/"><em>Manifold Garden</em></a>: There’s a lot of hype around this extremely gif-able game, and I can’t say it isn’t justified. It looks completely unlike anything else, and every time I see it I can’t help but try to work out how it does its infinitely-repeating-world thing. Unfortunately I didn’t play it while I had the chance.</li>
<li><em>Pathfinder</em>: You don’t play this game. Instead, you watch a drummer play it. Using a drumkit. It’s kind of amazing, even if half the time you can’t work out what the hell is going on, and very, very loud. <a href="http://users.sussex.ac.uk/~thm21/ICLI_proceedings/2016/Practical/Performances/3_cm_pathfinder.pdf">This</a> is the best link I could find for it.</li>
<li><a href="https://lightspeedgames.itch.io/gravitypong"><em>Gravity Pong</em>, by Amy Parent</a>. This is a neat little twist on Pong, delivered with a lot of polish. There seemed to be people playing it against their friends on more or less non-stop for the whole evening.</li>
</ul>
<p>And there were a tonne of others, all really cool. To my pleasant surprise <a href="http://devildaggers.com/"><em>Devil Daggers</em></a> was there and I got to show off my skills. I can only make it up to about 150 seconds, which isn’t as good as I aim to get someday, but still quite impressive to someone who’s only just played the game for the first time. It had a cellar all to itself in which ominous red candles had been lit. The game was being projected onto the bare stones of the cellar wall, just like Dear Esther had been. All very sinister and altar-like, quite suitable for <a href="https://www.youtube.com/watch?v=GSHjB_OXzLw">the most Faustian game ever made</a>.</p>
<p>I got to meet lots of new people as well as chat with existing games friends, which is something I seem to thrive on more and more, and I also got to help out a little with running the event, which was rewarding despite the fact I didn’t really get to sit down for the whole evening.</p>
<p>All in all a good time, but I don’t think dragging myself home at 1 in the morning on a workday is something I should repeat often.</p>
<p><img src="/images/gafe_01.jpg" alt="" title="Pathfinder" /></p>
<p>Photo credit goes to We Throw Switches and <a href="">Ellie Morag</a>. Thanks, folks!</p>
Object Factory with std::function2016-10-16T00:00:00+00:00http://rachelnertia.github.io/programming/2016/10/16/object-factory-variant<p>The Factory Method pattern! I need it for a thing. I needed to use it but I needed an example, and my search led me to <a href="https://blog.noctua-software.com/object-factory-c++.html">this informative and well-written blog post by Guillaume Chereau</a>. You should read it!</p>
<blockquote>
<p>In this post I am going to talk about a little trick that I found very useful when dealing with a lot of subclasses of a single base class. This is typically what we see in video game, where we have a base Object class that represents any kind of object in the game, and then one subclass for each type of object, like the player, enemies, etc.</p>
</blockquote>
<p>Guillaume presents this nice way to set up factory functions for subclasses of Object: inherit from an ObjectFactory base class, override the ‘create object’ method, make the constructor register the instance with the global <a href="http://en.cppreference.com/w/cpp/container/map">std::map</a> of string type names and ObjectFactory pointers, instantiate a global instance of the ObjectFactory subclass. It’s a nice way of doing things, but it makes you write out so much similar-ish code that he ends up using a macro so he can just write a single line:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Player.cpp</span>
<span class="n">REGISTER_TYPE</span><span class="p">(</span><span class="n">Player</span><span class="p">)</span>
</code></pre></div></div>
<p>Macros, in my experience, are a liability for generating mysterious compiler errors and difficult-to-debug code. I don’t like having to rely on them to reduce code duplication or improve readability, so I started thinking of different ways to do it. What I came up with is basically binding a callback function. In my implementation, I’m giving <a href="http://en.cppreference.com/w/cpp/utility/functional/function">std::function</a> a whirl. Here’s the general idea:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">ObjectFactory</span> <span class="p">{</span>
<span class="nl">public:</span>
<span class="n">Factory</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">typeName</span><span class="p">,</span>
<span class="n">std</span><span class="o">::</span><span class="n">function</span><span class="o"><</span><span class="n">Object</span><span class="o">*</span><span class="p">(</span><span class="n">Entity</span><span class="o">*</span><span class="p">)</span><span class="o">></span> <span class="n">factoryFunc</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">mFactoryFunc</span> <span class="o">=</span> <span class="n">factoryFunc</span><span class="p">;</span>
<span class="n">Object</span><span class="o">::</span><span class="n">RegisterType</span><span class="p">(</span><span class="n">typeName</span><span class="p">,</span> <span class="k">this</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">Object</span><span class="o">*</span> <span class="n">CreateObject</span><span class="p">()</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">mFactoryFunc</span><span class="p">();</span>
<span class="p">}</span>
<span class="nl">private:</span>
<span class="n">std</span><span class="o">::</span><span class="n">function</span><span class="o"><</span><span class="n">Object</span><span class="o">*</span><span class="p">()</span><span class="o">></span> <span class="n">mFactoryFunc</span><span class="p">;</span>
<span class="p">};</span>
<span class="k">class</span> <span class="nc">Object</span> <span class="p">{</span>
<span class="k">static</span> <span class="n">std</span><span class="o">::</span><span class="n">map</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">,</span> <span class="n">ObjectFactory</span><span class="o">*></span> <span class="n">smFactories</span><span class="p">;</span>
<span class="nl">public:</span>
<span class="kt">bool</span> <span class="n">RegisterType</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">typeName</span><span class="p">,</span> <span class="n">ObjectFactory</span><span class="o">*</span> <span class="n">factory</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">smFactories</span><span class="p">[</span><span class="n">typeName</span><span class="p">]</span> <span class="o">=</span> <span class="n">typeFactory</span><span class="p">;</span>
<span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">Object</span><span class="o">*</span> <span class="n">CreateObject</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">typeName</span><span class="p">,</span> <span class="n">Object</span><span class="o">*</span> <span class="n">object</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">smFactories</span><span class="p">[</span><span class="n">type</span><span class="p">]</span><span class="o">-></span><span class="n">CreateObject</span><span class="p">(</span><span class="n">object</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>
<p>We don’t need subclasses of ObjectFactory any more, so we don’t need to write as much code. We just instantiate an ObjectFactory, providing a name and a lambda.</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Player.cpp</span>
<span class="k">static</span> <span class="n">ObjectFactory</span> <span class="nf">PlayerFactory</span><span class="p">(</span>
<span class="s">"Player"</span><span class="p">,</span>
<span class="p">[]()</span><span class="o">-></span><span class="n">Object</span><span class="o">*</span>
<span class="p">{</span>
<span class="k">return</span> <span class="k">new</span> <span class="n">Player</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">);</span>
</code></pre></div></div>
<p>It’s not quite as compact as <code>REGISTER_TYPE(Player)</code>, but you gain a lot of flexibility this way without having to go to the bother of writing out a big ObjectFactory subclass when you want to do something a bit different. Or compromise morally by using macros. You can bind more than just lambdas to std::functions: you can bind ordinary functions, member functions, any callable target.</p>
<p>One could use an alternative to std::function, as there are tradeoffs to consider, but this works for me, for now. I’m not likely to be using my object factory thousands of times per frame, and I bet the map lookup time outweighs the overhead of the function object call. The Object Factory pattern is not meant to be used in performance-critical situations, but for situations where flexibility and decoupling are desired. At any rate, in this instance it’s a tradeoff between virtual method calls and a slightly different kind of pointer-following. It’s always gonna suck.</p>
<p>As a final note: I’m actually using a <a href="http://en.cppreference.com/w/cpp/container/unordered_map">std::unordered_map</a> instead of a regular std::map because apparently lookup by key is faster with an unordered_map. Iteration over the values is slower, but that’s not what I’m going to be doing more of.</p>
Quorn Bolognese2016-09-10T00:00:00+00:00http://rachelnertia.github.io/food/2016/09/10/recipe-quorn-bolognese<p><img src="/images/recipes/quorn-bolognese/finish.jpg" alt="" /></p>
<p>I took a whole bunch of photos one time I was making dinner about four months ago, when I still lived in Dundee. All of them have been sitting in a folder on my hard drive since then, untouched and unused, just like any other dumb blog post idea I get halfway through executing and then forget or fail to finish. At long last, however, here it is: the photographically-illustrated recipe I braved the bemused comments of my old flatmate for. “Why are you taking photos of your food?” he asked, as I pointed my mediocre digital camera into a steamy saucepan. I opened my mouth to speak, but couldn’t answer his question. Why do I do these things? So that YOU, dear reader, can learn how to make some reasonably okay faux-Bolognese using Quorn instead of beef? Or because deep inside of me there is a darkness waiting to emerge, a great ink blot from the deepest recesses of my soul, and I believe it is only through filling the void with frivolous ‘creative’ activities that I can prevent it rising to the surface?</p>
<p>To be honest, it’s more of a list of suggestions than a recipe, because I tend to just chuck whatever I happen to have into most things I cook and, usually, it turns out okay. Hopefully the main takeaway from this will be that yeah, you <em>can</em> just make regular old straightforward and wholesome meals using Quorn, that it’s easy to cook with, and usually cheaper than meat.</p>
<!--more-->
<h3 id="ingredients">Ingredients</h3>
<p>There’ll be no quantities here. Use your intuition. You’re gonna need/want:</p>
<ul>
<li>An <strong>onion</strong></li>
<li>An <strong>carrot</strong></li>
<li>An’ some <strong>celery</strong></li>
<li><strong>Garlic</strong>, be it freshly crushed or chopped or in the form of dry granules – you do you</li>
<li>Other things? I don’t know?</li>
<li>A big ol’ saucepan or something like that. Whatever it is, it needs to be able to go on the stove without catching fire or cracking or melting or food spilling over the sides. You probably have at least one item in your kitchen which will satisfy these criteria.</li>
</ul>
<p>And some of this stuff:</p>
<p><img src="/images/recipes/quorn-bolognese/01.jpg" alt="" title="You know, the main ingredient." /></p>
<p>Last time I was in Lidl you could buy this stuff from the freezer section for less than £2. If it’s more than that now, then probably Brexit is to blame? It’s easy to stock up on, can be kept in the freezer for whenever you need it, and you don’t even need to defrost it before cooking. Ideal!</p>
<p>The future is fungal, baby<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>.</p>
<h3 id="how-to-cook-the-thing">How to Cook the Thing</h3>
<p>Firstly just generally get your <em>mise</em> on. Chop up your <strong>onion</strong> and your <strong>other vegetables</strong>. Get all your things ready. Take a few deep breaths. Offer up thanks to the mushroom god. Savour the moment.</p>
<p>Now it’s onion time.</p>
<p><img src="/images/recipes/quorn-bolognese/onion-time.jpg" alt="" title="Onion and on and on and on" /></p>
<p>Put a bit of <strong>olive oil</strong> in the pan and set it on a medium-to-low heat. Once the oil’s warmed up, chuck in the <strong>chopped onion</strong>. Stir a bit as the onion cooks, going from pale to semi-translucent, so it doesn’t burn and get stuck to the bottom of the pan. This’ll take maybe only two minutes, depending on the heat. You might want to add a few drops of <strong>apple cider vinegar</strong>, which brings out the sweetness and smells amazing as it evaporates<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>.</p>
<p>Once the onion’s cooked is when I usually add the <strong>Quorn</strong>. Dispense that frosty fungus into the pan and keep turning it over as it thaws in the heat.</p>
<p><img src="/images/recipes/quorn-bolognese/02.jpg" alt="" /></p>
<p>Now that it’s defrosted, I add the <strong>chopped tomatoes and/or purée</strong>. Tomato is a pretty key ingredient for Bolognese. Stick it in, stir it up.</p>
<p><img src="/images/recipes/quorn-bolognese/03.jpg" alt="" /></p>
<p>We’re now entering the Season, Sprinkle and Simmer phase of the Sauce Development Pipeline. You may add seasoning like <strong>salt</strong> and <strong>pepper</strong>, but I usually skip the salt and just use a bit of pepper. Sprinkle a generous amount of <strong>oregano</strong> and <strong>basil</strong> into the pan.</p>
<p>Add any other vegetables you might want to add like, in this case, <strong>carrot</strong> and <strong>celery</strong> (both great ways to bulk up any meal!).</p>
<p><img src="/images/recipes/quorn-bolognese/04.jpg" alt="" /></p>
<p>This is the bit where I’ll say that, while the sauce will turn out just fine without very small bits of animal in it, if you’re not particularly ideologically pure like me then you could add a <strong>beef stock cube</strong> or dash of <strong>Worcestershire Sauce</strong> for a meatier, richer body. As I see it, just because it’s Quorn doesn’t mean it has to be a totally vegetarian recipe. It’s up to you!</p>
<p>The carrots will need at least 15 minutes to soften up and as a whole the sauce needs time for all the flavours to mix together, so add a little water, stick the lid on and let it simmer for, well, as long as you’d like. Go and read a book. Come back occasionally to stir it and make sure it’s not sticking to the bottom of the pan.</p>
<p>I like to add frozen <strong>garden peas</strong> or <strong>petits pois</strong> like 3 minutes from the end, giving them enough time to thaw out and warm up. They add a little variety.</p>
<p>Once everything’s nice and softened up and saucy (thick, with not too much loose water sloshing around), your Quorn Bolognese is now ready to eat, with pasta or whatever. Enjoy it, and thanks for reading!</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>Confession: I’m only writing this because I wanted to write that phrase in something. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>Trust me, with apple cider vinegar is the best way to fry onions. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Now Reading2016-08-30T00:00:00+00:00http://rachelnertia.github.io/reading/2016/08/30/now-reading<p><img src="/images/now-reading/edge-of-the-world.JPG" alt="" /></p>
<p>I just finished reading Michael Pye’s <strong><em>The Edge of the World: How the North Sea Made Us Who We Are</em></strong>. This took a bit longer than expected because I lost the book when I was ten pages from the end and couldn’t find it for weeks until it eventually turned up in my mum’s office room<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>. Weird how things can just vanish and reappear. Anyway, I enjoyed it! It’s a sweeping overview of the growth of trade and interconnectedness in northern Europe and the shifts in culture that came along with it. It goes from the fall of the Roman Empire up to the dawn of the modern era, taking in all kinds of interesting bits like the rise of the <a href="https://en.wikipedia.org/wiki/Frisians">Frisian</a> trade network, which spread commerce across the North Sea, and the plague laws, which contributed to the creation of the modern nation-state. There’s too much contained within to talk about here, and usually it’s an engrossing read, but I don’t think I can recommend reading it cover-to-cover the way I did. There’s a little too much fluff, or occasional sidetracks into details which are interesting but slow down the pace a bit. So maybe this book is better suited for dipping in and out of, skimming through sections until something catches your eye.</p>
<p>I’m now reading a book I found on the charity exchange bookshelf at my GP practice. It was a lucky find, and I only noticed it because I was in a queue for the front desk and its colourful binding made it stand out. It’s probably the most esoteric thing I’ve read all year.</p>
<!--more-->
<p><img src="/images/now-reading/history-of-the-middle-ages-cover.JPG" width="49%" alt="The Cover of the History of the Middle Ages" style="display:inline;" />
<img src="/images/now-reading/history-of-the-middle-ages-02.JPG" width="49%" style="display:inline;" /></p>
<p><strong><em>History of the Middle Ages</em></strong> is a Soviet Russian school textbook translated into English, and it’s rather different from the history textbooks I had in school. Not just because it’s a beautifully illustrated hardcover and sort of old-timey compared to the school textbooks of today, but because (so far) it has a whole different slant in terms of the specific history it’s trying to tell. Instead of focusing on the deeds of different kings and who they married and who fought who, it’s much more interested in class politics, running a thread through time and trying to show how the feudal system formed, what things were like before and how it led into the future of class oppression. It’s not just “There were knights who were loyal to the king and had land,” it’s, “…and peasants were subjugated by the ruling class in these specific ways…” If that makes sense. Like, these are the names of the three parts the book is broken into: “Establishment of the Feudal System,” “The Development of the Feudal System” and “The Feudal System Begins to Decline. Capitalist Relations Take Shape.”</p>
<p>Here’s a quote:</p>
<blockquote>
<p>“For over 30 years, the Saxons fought valiantly for their freedom. Then Charlemagne managed to win the Saxon nobility over to his side, generously endowing them with land. The Saxon nobles began to support the invaders in the struggle against their own people. Their treachery allowed Charlemagne to subjugate the Saxons.”</p>
</blockquote>
<p>I’ll let you know how it shapes up as I read further. I’m pretty excited.</p>
<p><img src="/images/now-reading/history-of-the-middle-ages-01.JPG" alt="" /></p>
<p>I might see if I can find a copy of the first book in the series, <em>History of the Ancient World</em>. Probably difficult to find! Although, hey, I found less-nice-looking a copy of this one on <a href="https://www.amazon.co.uk/History-Middle-Ages-Y-Agibalova/dp/0828539197">Amazon</a>, so there may yet be hope.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>Yeah, I’m still living in my mum’s house. No, not in the basement. There isn’t one. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
London Trip (16th-19th June)2016-08-01T00:00:00+00:00http://rachelnertia.github.io/personal/2016/08/01/ldn-trip<h3 id="introduction">Introduction</h3>
<p>In June me and Natalie took a trip down to London. I started writing this blog post about it on the way back to Dundee, but completely forgot to finish it because of how much work I had to do. So here it is, a month and a bit late…</p>
<!--more-->
<h3 id="night-bus">Night Bus</h3>
<p>London isn’t actually that far from Dundee, but getting between the two isn’t very easy.</p>
<p>The bus to London takes at least 12 hours. The train takes about half the time and is more comfortable, but is almost fully 3 times more expensive than the bus, <em>even with a 18-25 railcard</em>. So the price of the bus ticket wins out, I book the bus, and I regret my decision for the entire journey. I’m sure the same thing will happen next time I travel south. Having vowed never to suffer the bus again, I’ll go to book train tickets, balk at the price, quickly take back my vow, and the cycle will begin anew.</p>
<h3 id="london-is-weird">London is Weird</h3>
<p>It really is. Maybe if you’re from London or near it or somewhere like it you don’t realise how weird it is. To someone who has only ever lived in Dundee (a small, compact city), Edinburgh (a small-ish, compact city) and the <em>countryside</em>, and who feels slightly overwhelmed by the size and density of <em>Glasgow</em>, it’s like stepping out of the cold into a boiling-hot jacuzzi of crowds, shops, cars and public transport. Everyone is busy and going places. People are kind of rude. It’s noisy and hot. The shops are an endlessly-repeating pattern of MacDonalds, WHSmiths, Pret A Manger, and other chain shops. Lots of things are made of red brick (how strange!).</p>
<p>Sadly we didn’t have time to check out the museums or art galleries, which are my favourite part of London, but we did get to spend some time with an old friend.</p>
<p>On the Friday evening we went looking for a place to eat and found an Italian restaurant which looked nice. We asked for a table and the waitress asked if we’d like to sit outside. It turned out there was a little patio/balcony through some glass doors at the back of the restaurant, which looked out over a quiet, leafy, densely-packed alleyway. It was like we’d stumbled upon a magic hidden pocket of calm.</p>
<p><img src="/images/me_eating_pizza.jpg" width="50%" alt="Me eating pizza" title="My pizza had an avocado on it." /></p>
<h3 id="videobrains">VideoBrains</h3>
<p><a href="http://www.videobrains.co.uk/">VideoBrains</a> is a monthly <a href="https://www.patreon.com/VideoBrains">Patreon-funded</a> event where speakers deliver speeches about videogames and stuff related to them. All the talks end up on YouTube and there are <a href="https://www.youtube.com/watch?v=CTlIATbd2dM">some</a> <a href="https://www.youtube.com/watch?v=32CghZ-JIb8">real</a> <a href="https://www.youtube.com/watch?v=G7KMD1DdtQQ">bangers</a> you should watch. The atmosphere is cosy, welcoming and inclusive, with nervous first-timers taking the stage alongside experienced, confident speakers and being treated all the same. The audience is quite small (you can only fit so many people in a small pub), so the feeling is intimate, and it’s easy to mingle and meet new people. I got to finally meet and say hi to people who I’ve been following on Twitter and/or corresponding with for years. Speeches are short, lo-fi and often very funny. Regular breaks in between them allow you to say hi to people and get food and drink.</p>
<p>Oh, and there was free cake because it was <a href="https://twitter.com/_JakeTucker">Jake</a>’s birthday!</p>
<p><a href="http://loadingonline.co.uk/">The Loading Bar</a>, where VB happens, is super cool. There’s lots to drink (London prices, I’m afraid), lots of different consoles to play on, arcade machines, an enormous collection of board games, and lots of space to move about in between the main floor and the basement. It’s full of (very kitschy) videogame-y touches: a tabletop decorated with a collage videogame box cover art, fan-art and promotional posters, curtains tied back with audio cables, stupid names for cocktails like ‘Garden Barfare.’</p>
<p>I really wish there was a place like it up in Scotland. If there is, I haven’t seen it. And I’d love for there to be something VideoBrains-y up this way, too, because it is very awesome.</p>
<h3 id="the-return">The Return</h3>
<p>Another epic, uncomfortable bus journey. After a couple hours some drunk Scottish people got on board and one of them sat at the front and vaped. The bus driver had to stop the bus and come upstairs to tell him to stop, multiple times.</p>
<p>We made it home, dishevelled and exhausted, at about midnight.</p>
Handling JSON with json.hpp2016-07-03T00:00:00+00:00http://rachelnertia.github.io/programming/2016/07/03/json-hpp<p><a href="https://github.com/nlohmann/json">json.hpp</a> is a single-header C++ library for handling <a href="https://en.wikipedia.org/wiki/JSON">JSON</a>. It provides easy, clean ways to read from and write to JSON files. It’s written in C++ 11, which has pros (great functionality, trivial to integrate) and cons (won’t work with older compilers or those that don’t fully support C++ 11), but, like, it’s 2016, man. It’s about time to make use of modern C++, rather than just stare wistfully at it from afar.</p>
<p>Reading in JSON from a file is easy. Let’s say you’ve got a file called ‘data.json’ which looks like this:</p>
<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
</span><span class="nl">"info"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Rachel"</span><span class="p">,</span><span class="w">
</span><span class="nl">"age"</span><span class="p">:</span><span class="w"> </span><span class="mi">22</span><span class="p">,</span><span class="w">
</span><span class="nl">"likesBacon"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>
<p>To read it into a C++ application, you use a <code class="language-plaintext highlighter-rouge">std::ifstream</code> to feed the data to an instance of <code class="language-plaintext highlighter-rouge">nlohmann::json</code>:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="n">json</span> <span class="o">=</span> <span class="n">nlohmann</span><span class="o">::</span><span class="n">json</span><span class="p">;</span>
<span class="n">json</span> <span class="n">j</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">ifstream</span> <span class="nf">ifs</span><span class="p">(</span><span class="s">"data.json"</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">ifs</span><span class="p">.</span><span class="n">is_open</span><span class="p">())</span> <span class="p">{</span>
<span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">ifs</span> <span class="o">>></span> <span class="n">j</span><span class="p">;</span>
<span class="n">ifs</span><span class="p">.</span><span class="n">close</span><span class="p">();</span>
</code></pre></div></div>
<p>Next, you operate on <code class="language-plaintext highlighter-rouge">j</code> using a variety of syntax options to extract the data you want. <code class="language-plaintext highlighter-rouge">json::find</code> is a safe way to search the JSON for a particular attribute (field). Standard square-brackets syntax can be used to extract the value of an attribute, which can itself be another group of attributes. To make accessing the sub-attributes of an attribute easier you can just create another <code class="language-plaintext highlighter-rouge">json</code> object, like so:</p>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Person</span> <span class="n">person</span><span class="p">;</span>
<span class="c1">// verify that "info" attribute exists in j</span>
<span class="k">if</span> <span class="p">(</span><span class="n">j</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="s">"info"</span><span class="p">)</span> <span class="o">!=</span> <span class="n">j</span><span class="p">.</span><span class="n">end</span><span class="p">())</span> <span class="p">{</span>
<span class="n">json</span> <span class="n">info</span> <span class="o">=</span> <span class="n">j</span><span class="p">[</span><span class="s">"info"</span><span class="p">];</span>
<span class="c1">// verify that "name" attribute exists in info</span>
<span class="k">if</span> <span class="p">(</span><span class="n">info</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="s">"name"</span><span class="p">)</span> <span class="o">!=</span> <span class="n">info</span><span class="p">.</span><span class="n">end</span><span class="p">())</span> <span class="p">{</span>
<span class="n">person</span><span class="p">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">info</span><span class="p">[</span><span class="s">"name"</span><span class="p">];</span> <span class="c1">// person.name == "Rachel"</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>And that’s how simple it is to extract data from a .json file and use it in an application.</p>
<p>Outputting to a file is easy, too. You just fill up a <code class="language-plaintext highlighter-rouge">json</code> object and then stream it out to an <code class="language-plaintext highlighter-rouge">std::ofstream</code> or something of the sort.</p>
<p>I really like this little library, although I’ve only scratched the surface of what you can do with it here. I wanted to make others aware of it for the next time they need to handle JSON in C++. There’s no standard library support for JSON in C++ like there is in other languages like Python and there’s not really a go-to non-standard option out there, so recommendations are useful. I’m using it to create an import system for <a href="http://www.aseprite.org/">Aseprite</a>, which can export .json files to accompany sprite-sheets. More on that later.</p>
I'm Back!2016-07-01T00:00:00+00:00http://rachelnertia.github.io/personal/2016/07/01/i'm-back<p>Hello. Things have been quiet around here for the last month or so, as I swore off writing blog posts and working on side projects in order to commit all my energy to finishing my dissertation. I submitted that yesterday, having reached the point where I could abandon it, so now I can return to the blog pilot seat, strap in, and write some bad metaphors.</p>
<h3 id="where-im-at">Where I’m At</h3>
<p>So I ‘finished’ my dissertation a couple months later than originally scheduled because I deferred it into the summer. I don’t know how well it’ll do and I am very pessimistic but my supervisor seemed to like it, which means one of us is insane. I’m fairly confident, at least, that it’s the best dissertation/honours project I could have done in the unusual circumstances I had to do it. I’ll write about it all soon.</p>
<p>The lease for the flat I lived in in Dundee for the last 3 years expired on Thursday, so I’ve moved back to Edinburgh and set up camp in my old bedroom at my mum’s house. It’s quiet here. There’s no constant noise of people in the street, chatting outside the pub, cars, trucks and buses rushing up and down the road. Just the occasional swoosh of a car, or the buzz of a lawnmower. My room is stuffed with my belongings like a bursting sack. I’m trying to create some kind of order from the chaos but there’s just so much.</p>
<h3 id="what-next">What Next</h3>
<p>Doors are open to many things. I might even have a job soon. Until then I’m going to crack on with a lot of projects, blog posts and improvements to this site. Check in with family members and friends, go for a lot of walks. Oh, and definitely squeeze in some gaming quality time. Stay tuned!</p>
Cool Links2016-05-21T00:00:00+00:00http://rachelnertia.github.io/2016/05/21/cool-links<p>The World Wide Web is big and scary, and sometimes you need the recommendations of others to guide your way to webpages worth watching. Here, therefore, are some cool links to cool things that you might want to, cool-ly, inspect.</p>
<p><a href="https://www.youtube.com/watch?v=29MAL8pJImQ"><strong>Sandi Metz - Nothing is Something</strong></a> (keynote speech at RailsConf 2015) Should be interesting and educational for all the programmers out there. Sandi talks about how to tackle object oriented programming problems, and the <a href="https://en.wikipedia.org/wiki/Null_Object_pattern">Null Object</a> pattern, the idea of the <em>Active Nothing</em>. It’s Ruby-focused, but practical Object-Oriented Design lessons are applicable across most languages. <a href="https://www.youtube.com/watch?v=JOM5_V5jLAs">Her speech from the previous year</a> is more about ‘life’ than programming, but it is very, very worth a watch.</p>
<p><a href="http://woodlandsecrets.co/episode/54"><strong>Woodland Secrets Ep. 54: Katherine Cross</strong></a> – This was a great episode, with Merritt Kopas and her guest, Katherine Cross, holding a long, in-depth conversation on the subjects of sociology, work, gamification, and online discourse. Katherine’s writing on society, culture and games is well worth exploring. <a href="https://quinnae.com/">Go and check it out</a>.</p>
<p><a href="https://www.youtube.com/watch?v=MsG6-eZpqKc"><strong>Here’s a talk about universal basic income</strong></a>. Worth a listen.</p>
<p>You may have heard of <strong>99% Invisible</strong>, the excellent design podcast. <strong><a href="http://99percentinvisible.org/episode/turf-wars/">Episode 212: Turf Wars of East New York</a></strong>, contains some excellent historical insight into the widespread issue facing American cities (and other cities around the world) of gentrification, 20th-century shifts in inner city residential demographics, and how inextricably knotted up it all is with US racist and ethnic tension.</p>
<blockquote>
<p>Landlords and real estate investors saw opportunity in the desperation of immigrant populations. They would come to hone two profit-driven tactics that would subsequently shape neighborhoods around the country: fear-induced white flight and predatory lending.</p>
</blockquote>
The Next Civilization Game Sounds Okay2016-05-14T00:00:00+00:00http://rachelnertia.github.io/gaming/2016/05/14/civ-6-announcement-thoughts<p>I tend to complain about the <em>Civilization</em> games whenever they come up. I really want to love them (and other <a href="https://en.wikipedia.org/wiki/4X">4X games</a>), but every installment has some elements that just feel <em>wrong</em>, making the overall experience long, boring, frustrating and unfulfilling.</p>
<p><a href="http://franchise.civilization.com/en/games/civilization-vi/"><em>Civilization VI</em></a> was just revealed by <a href="http://www.firaxis.com/">Firaxis</a> and pegged for an October release, and the way the designers say they’re shaking up the formula has really piqued my interest: every change mentioned in <a href="https://www.rockpapershotgun.com/2016/05/11/civilization-vi-details/">Rock, Paper, Shotgun’s details splurge</a> and <a href="http://www.pcgamer.com/civilization-6-everything-you-need-to-know/">PC Gamer’s</a> addresses a problem I have with <em>Civilization V</em> (and, by extension, the others).</p>
<p>I’m not getting <em>hyped</em>, or anything sticky like that, but I think about strategy games a lot - particularly the elusive and mysterious creature that is the 4X-I-Find-Enjoyable - so I am getting <em>intrigued</em>.</p>
<!--more-->
<p><img src="/images/civ_6_01.png" alt="Civ 6 screenshot 1" /></p>
<p>The revised way that city improvements work, to begin with, places an emphasis on the terrain and on bringing information into the main playing-space of the game, the map, where it should be. In previous installments cities work like <a href="http://www.dandwiki.com/wiki/SRD:Bag_of_Holding">Bags of Holding</a> for libraries, factories and other buildings, while the countryside surrounding them transforms from a wilderness into an ugly mash of tile improvements. Every city ends up looking more of less the same: a one-hex blob of buildings (sprouting the occasional world wonder) in a field of farms, plantations and mines. The <em>Civ VI</em> system, in which city tile improvements are ‘districts’ (e.g. campus) in which buildings of that district’s type (e.g. library, university, research lab) are built, ought to be more pleasant to look at, more readable and more strategically engaging. Win, win, win.</p>
<p>From the screenshots it still looks like regular tile improvements like farmland are in, although they seem less densely-clustered. How the district system plays with invasion and pillaging going on also hasn’t been explained.</p>
<p><img src="/images/civ_6_02.png" alt="Civ 6 screenshot 1" /></p>
<p>Technology is the next big thing on my list. I haven’t really pinned down what I want from a <em>Civilization</em> technology system yet, but the <em>Civ I</em> through <em>V</em>’s ‘You put the Science Points in and get the Gunpowder out’ approach <em>definitely</em> isn’t it. In my experience I just end up researching everything on the tree one-by-one and there’s never any real reason to do anything more nuanced, like prioritizing specific branches, trading tech with other players or stealing it from them.</p>
<p><em>Civ VI</em>’s system biases civilizations towards learning certain technologies through their environment and what they do. Y’know, like real civilizations. Examples given: Coastal cities give a bonus to research speed for sailing tech, and having a quarry or two will provide a boost to learning masonry. This is cool and how it should be.</p>
<p>I like the sound of faster and more focused game modes for both singleplayer and multiplayer. Games of <em>Civ</em> just take too damn long, and it’s nice to have specific objectives sometimes, especially for multiplayer.</p>
<p>They’ve also said they’re overhauling diplomacy but haven’t given any details. In my opinion they’d have to try pretty hard to make it worse, so I’m looking forward to positive changes in that area, too.</p>
<p>There are other details but I’ve less strong thoughts about them, like overhauls to the way the military works. I like that they’re sticking to the one-unit-per-hex system, and stuff like embedded units and formations are probably going to be welcome additions/changes.</p>
<p><img src="/images/civ_6_03.png" alt="Civ 6 screenshot 1" /></p>
<p>Finally, I dig the bright, colourful and simple art direction they’re going for this time around. For some reason <em>Civ V</em> makes my eyes hurt after even a short time playing. If <em>VI</em> is as easy on the eyes as the screenshots are, I might be inclined to judge it more fairly. (EDIT: <a href="http://uk.ign.com/articles/2016/05/13/how-firaxis-will-redefine-civilizations-art-style-in-civ-6-ign-first">This article on IGN</a> about the art direction is very encouraging.)</p>
<p>I have so many questions I want answered, though: Will there be global warming and climate change<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>? Pollution, engaged with? The Internet, meaningfully included? A satisfying endgame to make everything preceding it fully worthwhile?</p>
<p>Will this be the <em>Civ</em> game I love?</p>
<p>(The screenshots were shamelessly poached from PC Gamer. Thanks, PC Gamer!)</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>I wonder if you can eliminate yourself from the game through bad decisions this time around. Probably not, but <a href="http://www.jareddiamond.org/Jared_Diamond/Collapse.html">how civilizations collapse is just as fascinating as how they rise</a>, and one of these days I’de like to see a <em>Civ</em> or <em>Civ</em>-like game try to reflect that by not always being about the inexorable ascent. Sometimes a survival story is what you’re looking for, not a power fantasy. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Augmented Reality on the PlayStation Vita2016-05-08T00:00:00+00:00http://rachelnertia.github.io/game%20dev/2016/05/08/augmented-reality-ps-vita<p><img src="/images/psvita.jpg" alt="PlayStation Vita" title="It's a PlayStation Vita!" /></p>
<p>The coursework for Applied Game Technologies<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup> lets you make more or less what you want, but what you make has to be a game and use either red-blue anaglyph <a href="https://en.wikipedia.org/wiki/Stereoscopy">stereoscopic 3D</a> on PC or augmented reality on the PlayStation Vita. I chose the second option.</p>
<!--more-->
<p><a href="https://en.wikipedia.org/wiki/Augmented_reality">Augmented reality</a> (AR) technology renders computer-generated objects - text, characters, icons - on top of the real world so that they appear to be a part of it. It comes in many forms and there are lots of different approaches to it. The version we were taught how to use on the PS Vita makes use of the in-built camera. Each frame of the camera feed is searched for the presence of AR markers, simple shapes printed on bits of paper. Once found, the size and orientation of the marker in the image is used to generate a transformation matrix matching the marker’s position and orientation relative to the camera. Then you use this transform as an ‘anchor’ for objects you render.</p>
<p><img src="/images/ps_vita_ar_cards.jpg" alt="PS Vita AR cards" title="Some of the default AR markers for the PS Vita." /></p>
<h3 id="what-the-game-is">What the Game is</h3>
<p>The player is operating a police drone in a totalitarian state using an augmented reality interface. It is their job to pick out and apprehend wanted criminals from among a crowd of civilians. Before playing the game the AR markers are laid out on a flat surface. As many can be used as wanted, and more markers enables a larger playing area. Civilians are represented as small spheres and they wander about on the tabletop. Among them, one of them is the player’s <strong>target</strong>, who they must <strong>shoot</strong>, but there’s no way to know which it is until they begin <strong>scanning</strong>.</p>
<p><img src="/images/psvita_ar/01.png" alt="Screenshot 1" title="The player hasn't scanned yet." /></p>
<p><strong>Scanning</strong> is triggered by pressing the Square button. If the target is contained inside the big green rectangle, then <em>every</em> civilian inside the rectangle turns red. The fewer there are in the rectangle, the more red they’ll become. They will remain the same colour unless they are scanned again. The player must use the redness to narrow down their search for the target, scanning ever smaller and smaller groups of civilians. There is a cooldown time to prevent the player from scanning constantly.</p>
<p>To help the player home in on smaller groups of civilians without having to move the Vita up really close to the table (and potentially lose track of markers), the camera can be zoomed in and out<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup> using the left and right shoulder buttons.</p>
<p><img src="/images/psvita_ar/02.png" alt="Screenshot 2" title="The target was within the rectangle, so all the civilians in it have been turned ever so slightly red." /></p>
<p>When the player has scanned enough that they’re pretty certain which civilian is the target they can <strong>shoot</strong> by pressing the X (Cross) button. If a civilian is beneath the crosshair in the middle of the screen when the player shoots, it is killed. If it was the target, the player is awarded points, plus a bonus if they manage to neutralize their target within 20 seconds. Shooting non-target civilians is penalized.</p>
<p>Once the target has been eliminated, a new one is assigned, and the game continues forever<sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">3</a></sup>.</p>
<p><img src="/images/psvita_ar/04.png" alt="Screenshot 3" title="This civilian is fully red - the player has recently scanned it and discovered that it must be the target. All they need to do now is shoot!" /></p>
<h3 id="dynamic-re-parenting">Dynamic Re-parenting</h3>
<p>Every civilian is parented to (‘belongs to’) a marker. Its transformation matrix is defined in terms local to the transformation matrix of its parent marker. When a marker is ‘lost’ by the tracking system, either because it’s been covered up by something or it’s gone off-camera, all of its child civilians are re-parented to the marker nearest to them. Give or take a little jankiness (the marker-tracking software isn’t perfect), the ‘world’ positions of civilians remain constant when they’re re-parented, so you don’t notice that anything’s happened. This helps give the illusion that the Vita screen is a window onto a world that is larger than its dimensions. This wasn’t that tricky to implement once I had figured out what I was doing - the code behind it is stupid and the maths is straightforward.</p>
<p>When the system has lost track of all markers the game is paused, so the player can put their Vita face-down on the table, walk away, and come back later to pick up where they left off.</p>
<h3 id="the-video">The Video</h3>
<p>The video shows everything there is in the game, if you can make it out on the screen. Unfortunately there’s no way to capture video straight from the PS Vita’s screen without a bunch of hackery, so I had to get my friend David Ferguson to film over my shoulder while I played. Thanks, David!</p>
<p>I was going to edit and annotate/commentate the footage, but doing that stuff always takes <em>way</em> longer than you expect it to.</p>
<iframe width="100%" height="315" src="https://www.youtube.com/embed/PoDMdOttS1Y" frameborder="0" allowfullscreen=""></iframe>
<h3 id="reflection">Reflection</h3>
<p>I’m pleased with how it all turned out. Around week seven of the semester Grant prompted us to take a couple hours just to do a bit of research, come up with an idea, and create a plan for executing it. I had a bunch of ideas, so I picked the one that seemed to best occupy the ground between ‘easy’ and ‘interesting’. Next, I wrote down all the things I could think of that I’d need to do: problems to figure out, assets to make, code to write. Wherever I could, I cut ideas or relegated them to a box of ‘extra features’ so that the scope of the project was as contained as possible. Then I divided all the tasks over the coming 8 weeks or so, giving myself a bite-size chunk of work to do each week. It never felt like I was spending too much time on it, but I had everything completed, including the written report, well before the deadline. There were a ton of extra things I could have added to the game, like more mechanics and sound effects, but I think I left it in a good place.</p>
<p>I don’t even own a Vita, let alone a development kit for the platform, so after I leave uni I’ll never be able to run the game again. I can’t even share the full source code because it’s written on top of Non Disclosure Agreement-bound Sony code. So other than the video I don’t really have much to <em>show</em> for this project, and that’s a shame. There’s the possibility I could develop the game in the future, porting what I have to a different platform (e.g. Android) and engine (e.g. Unity), though. That’d be cool.</p>
<p>My main take-away is that a good plan well-executed really teaches you the value of creating a feasible, straightforward plan and sticking to it. It seems like an obvious lesson, but as someone whose project plans tend to devolve and quite often end up being ignored, I never fully appreciated it until now. Crappy mental health has limited my time and energy for working on things, so it’s become imperative to be as productive as I can when I can. I’m glad I’m learning how to manage myself effectively, and doing some things I’m happy with, despite the circumstances.</p>
<p>You can read the report I wrote for the coursework <a href="/extra_stuff/agt_report.pdf">here</a>.</p>
<p>I’m waiting on my grade now. Hopefully it’s good, but who cares if it isn’t - I learned stuff and had fun.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>No, it’s not a very good name for a module. Especially for one on a course named ‘Computer Games Technology.’ <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>It’s not really zooming the camera, just scaling the camera feed texture as it is rendered to the screen and scaling the projection matrix. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p>I didn’t have time to create a win or lose state. <a href="#fnref:3" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Box2D Raycasting Engine Progress2016-04-27T00:00:00+00:00http://rachelnertia.github.io/programming/2016/04/27/box2d-raycasting-progress<p><a href="/programming/2016/04/07/box2d-raycasting-test/">I’ve been working</a> on an old-fashioned raycast-rendering system that uses Box2D’s <code class="language-plaintext highlighter-rouge">b2World::RayCast</code> method to draw the world instead of casting rays against a grid the way <em>Wolfenstein 3D</em> does it.</p>
<p>Where I left off I’d just managed to get a limited generic system up and running. Every fixture (shape) in the <code class="language-plaintext highlighter-rouge">b2World</code> was rendered as a wall. Nothing could be partially transparent, nothing could appear behind anything else, there was no support for differently-coloured walls, and there were no sprites. In the intervening time I’ve enabled these capabilities.</p>
<p><img src="/images/b2dray/05.png" alt="" title="I get a lot of test-sprite mileage out of this dwarf." /></p>
<!--more-->
<h2 id="different-types-of-things">Different Types of Things</h2>
<p>Every Box2D fixture can store a <code class="language-plaintext highlighter-rouge">void</code> pointer to anything the programmer wants, for example a ‘GameObject’ instance. Right now I’m pointing my fixtures to instances of a simple structure that tells the rendering function how to draw the fixture:</p>
<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="k">struct</span> <span class="nc">UserDataTest</span> <span class="p">{</span>
<span class="k">enum</span> <span class="k">class</span> <span class="nc">Type</span> <span class="p">{</span>
<span class="n">Wall</span><span class="p">,</span>
<span class="n">Sprite</span>
<span class="p">}</span> <span class="n">type</span><span class="p">;</span>
<span class="n">sf</span><span class="o">::</span><span class="n">Color</span> <span class="n">color</span> <span class="o">=</span> <span class="n">sf</span><span class="o">::</span><span class="n">Color</span><span class="o">::</span><span class="n">White</span><span class="p">;</span>
<span class="n">sf</span><span class="o">::</span><span class="n">Texture</span><span class="o">*</span> <span class="n">texture</span> <span class="o">=</span> <span class="nb">nullptr</span><span class="p">;</span>
<span class="kt">float</span> <span class="n">sprite_radius</span> <span class="o">=</span> <span class="mf">1.0</span><span class="n">f</span><span class="p">;</span>
<span class="p">};</span></code></pre></figure>
<ul>
<li><strong><code class="language-plaintext highlighter-rouge">type</code></strong> is used to branch the rendering algorithm. Are we rendering a wall or a sprite?</li>
<li><strong><code class="language-plaintext highlighter-rouge">color</code></strong> is, uh, the colour. I did some translating there, from American to British English. It tells the renderer what colour the thing (wall or sprite) should be. Can have alpha < 100%.</li>
<li><strong><code class="language-plaintext highlighter-rouge">texture</code></strong> is only used for sprites. I don’t know how to texture the walls yet and thus far thinking about it has just made my head hurt.</li>
<li><strong><code class="language-plaintext highlighter-rouge">sprite_radius</code></strong> is used when rendering sprites.</li>
</ul>
<h2 id="sprites">Sprites</h2>
<p><img src="/images/b2dray/14.png" alt="" /></p>
<p>In a <em>Wolfenstein 3D</em>-style renderer, walls and sprites are drawn in two separate passes. First, you cast a bunch of rays against your wall grid and draw the walls. As you go, you store the distance each ray travelled before it hit a wall in a kind of one-dimensional depth buffer. Then you sort the list of sprites based on how far away they are from the camera and start drawing them starting with the one furthest away. Each time you draw a column of sprite-pixels, you check whether the distance to that bit of the sprite is less than the value in the depth buffer. If it is, you draw. <a href="http://lodev.org/cgtutor/raycasting3.html">Here’s a better, more in-depth explanation</a>.</p>
<p>In this new system, sprites are rendered as part of the same pass as walls, which means they can’t just be stored as an array of positions. They need to be fixtures which the Box2D ray can intersect with. So what shape should they be?</p>
<p>In the end, each sprite is just a line segment. It begins at the left edge of the sprite and ends at the right edge, passing through the sprite’s centre. It is perpendicular to the line that joins the sprite’s centre to the camera’s position. That is, it ‘faces’ the camera.</p>
<p>If it were possible to represent sprites as line segments here then everything would be perfect - but doing so would mean having to update them all every frame to make sure they face straight at the camera, which wouldn’t play nicely with Box2D. They would also be rubbish for physics stuff.</p>
<p>So sprites are circles. The ray intersects the circumference of the circle and the I do some maths to project that intersection point onto the camera-facing sprite-line that the circle contains. (I won’t go into the maths here.) This is where the <code class="language-plaintext highlighter-rouge">sprite_radius</code> member of <code class="language-plaintext highlighter-rouge">UserDataTest</code> comes in handy, because there’s no way to know how big the intersected circle is (or indeed if it’s a circle at all). Using the projection we can learn how far along the sprite-line we are, and use that value as a <strong>U</strong> co-ordinate to texture the line we finally draw.</p>
<p>It’d be nice to find a better solution; perhaps a hybrid in which sprites’ physical components are circular but the part that the raycaster cares about is just a line segment, rotated every frame to face the camera.</p>
<h3 id="distortions">Distortions</h3>
<p>When casting rays from the camera there are two ways to figure out what size the angle between each ray should be:</p>
<ul>
<li>Rotate the camera’s forward vector.</li>
<li>Skew the camera’s forward vector along a ‘viewing plane’ vector. The viewing plane is perpendicular to the forward vector.</li>
</ul>
<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="c1">// [-1, 1] How far across the screen from the current ray is.</span>
<span class="c1">// -1: far left</span>
<span class="c1">// +1: far right</span>
<span class="kt">float</span> <span class="n">screenx</span> <span class="o">=</span> <span class="o">-</span><span class="mf">1.0</span><span class="n">f</span> <span class="o">+</span> <span class="p">(</span><span class="mf">2.0</span><span class="n">f</span> <span class="o">*</span> <span class="p">(</span><span class="n">i</span> <span class="o">/</span> <span class="n">screen_width</span><span class="p">));</span>
<span class="c1">// Determine ray direction...</span>
<span class="c1">// Rotate the camera's forward vector:</span>
<span class="kt">float</span> <span class="n">view_angle</span> <span class="o">=</span> <span class="p">(</span><span class="n">PI</span> <span class="o">*</span> <span class="mf">0.25</span><span class="n">f</span><span class="p">);</span>
<span class="n">RotateVec</span><span class="p">(</span><span class="n">camera</span><span class="p">.</span><span class="n">fwd</span><span class="p">,</span> <span class="n">view_angle</span> <span class="o">*</span> <span class="n">screenx</span><span class="p">);</span>
<span class="c1">// OR skew it along the view plane:</span>
<span class="n">b2Vec2</span> <span class="nf">view_plane</span><span class="p">(</span><span class="o">-</span><span class="n">camera</span><span class="p">.</span><span class="n">fwd</span><span class="p">.</span><span class="n">y</span><span class="p">,</span> <span class="n">camera</span><span class="p">.</span><span class="n">fwd</span><span class="p">.</span><span class="n">x</span><span class="p">);</span>
<span class="p">(</span><span class="n">camera</span><span class="p">.</span><span class="n">fwd</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">screenx</span> <span class="o">*</span> <span class="n">view_plane</span><span class="p">)</span>
<span class="c1">// Determine the end point of the ray in world space:</span>
<span class="n">b2Vec2</span> <span class="n">rayend</span> <span class="o">=</span> <span class="n">camera</span><span class="p">.</span><span class="n">pos</span> <span class="o">+</span> <span class="n">ray_length</span> <span class="o">*</span> <span class="n">raydir</span><span class="p">;</span></code></pre></figure>
<p>There are two ways to calculate the distance from the camera to each ray intersection point:</p>
<ul>
<li>Use the actual (or <em>Euclidean</em>) distance.</li>
<li>Use the perpendicular distance.</li>
</ul>
<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="c1">// Actual distance:</span>
<span class="kt">float</span> <span class="n">distance</span> <span class="o">=</span> <span class="n">ray</span><span class="p">.</span><span class="n">Length</span><span class="p">();</span>
<span class="c1">// OR</span>
<span class="c1">// Perpendicular distance:</span>
<span class="kt">float</span> <span class="n">distance</span> <span class="o">=</span> <span class="n">DotProduct</span><span class="p">(</span><span class="n">ray</span><span class="p">,</span> <span class="n">camera</span><span class="p">.</span><span class="n">fwd</span><span class="p">);</span></code></pre></figure>
<p>These different modes can be combined for different results. (View Plane + Actual Distance) and (Rotated Forward Vector + Perpendicular Distance) don’t look so good, which leaves us with 2 rendering modes: (View Plane + Perpendicular Distance) and (Rotated Forward Vector + Actual Distance).</p>
<p>Below, the images on the left were rendered with (View Plane + Perpendicular Distance), and those on the right with (Rotated Forward Vector + Actual Distance):</p>
<p><img src="/images/b2dray/09.png" width="49%" style="display:inline;" />
<img src="/images/b2dray/10.png" width="49%" style="display:inline;" /></p>
<p><img src="/images/b2dray/07.png" width="49%" style="display:inline;" />
<img src="/images/b2dray/08.png" width="49%" style="display:inline;" /></p>
<p>As you can see on the left, the first mode gives nice, straight edges on nice, straight-edged things, while on the right the second gives a fisheye effect. The first method distorts curved objects badly towards the edge of the screen if you’re not looking at them dead-on while the second renders them as they should appear. Swings and roundabouts.</p>
<p>What’s my point with all this? It affects sprite rendering. To the raycaster, sprites are circles, so in (View Plane + Perpendicular Distance) mode, sprites get distorted if you’re not facing them dead on, like this particularly bad example:</p>
<p><img src="/images/b2dray/11.png" width="49%" style="display:inline;" />
<img src="/images/b2dray/12.png" width="49%" style="display:inline;" /></p>
<p>In both screenshots the camera is the same distance from the sprite. In the next image the second mode (Rotated Forward Vector + Actual Distance) is used. The sprite is still distorted, but in a less extreme way. The remaining distortion is there because the camera is WAY up close. (The sprite’s pixels are taller than they are wide for a completely different reason.)</p>
<p><img src="/images/b2dray/13.png" alt="" /></p>
<p>The distortion of curves and sprites is less obvious when the camera is further away and the field of view is decreased, but it’d be nice to find a proper fix for it.</p>
<h2 id="transparency--drawing-things-behind-other-things">Transparency / Drawing Things Behind Other Things</h2>
<p>I thought I could just cast a ray into the world, pushing ray intersection points onto a list of some sort, and stop when the ray hit something with fully opaque. Then I’d step backwards through the list, which would be nicely sorted in order of distance from the camera, drawing intersections one by one. There are two problems with this:</p>
<ol>
<li><code class="language-plaintext highlighter-rouge">b2World::RayCast</code> doesn’t return results (intersection points) in order of increasing distance from the start point of the ray. <a href="http://www.iforce2d.net/b2dtut/world-querying">It just returns intersections in any old order</a>, because optimisations.</li>
<li>Doing things this way would prevent me from supporting walls of different heights later on; a shorter, fully-opaque object in the foreground would stop us drawing another, taller one in the background.</li>
</ol>
<p>So instead I collect <em>every</em> ray intersection point into a list, then sort that list, then draw from back to front. A new <code class="language-plaintext highlighter-rouge">std::vector</code> is constructed, filled, and sorted. <em>For every column of pixels on the screen</em>.</p>
<p>In spite of this, it runs fast… just not in debug builds.</p>
<h3 id="debug-iterator-fun">Debug Iterator Fun</h3>
<p>All this <code class="language-plaintext highlighter-rouge">std::vector</code> manipulation causes the framerate to plummet thanks to a bunch of run-time checks which are added into the code for all Standard Container Library (SCL) containers. This extra code is absent in release builds, where <code class="language-plaintext highlighter-rouge">_ITERATOR_DEBUG_LEVEL = 0</code> by default (<a href="https://msdn.microsoft.com/en-us/library/aa985982(v=vs.120).aspx">Read</a> <a href="https://msdn.microsoft.com/en-us/library/hh697468(v=vs.120).aspx">more</a>). It’s possible to <code class="language-plaintext highlighter-rouge">#define</code> that macro to 0 in your debug builds, but unless the same has been done for all the .libs and .dlls you’re linking and running with then conflicts will occur because of different-sized iterators. Which means you need to rebuild all your external dependencies.</p>
<p>Yeah, screw that. Now I just have a custom configuration in Visual Studio called ‘ReleaseNoOpt’, which is just the release configuration but with compiler optimisations turned off (<code class="language-plaintext highlighter-rouge">/Od</code>), so I can inspect variables and all that good stuff but the program doesn’t run horribly slowly. Problem solved! Maybe.</p>
<h2 id="next-steps">Next Steps</h2>
<p>I think I’m going to wait a bit before I push any changes to the <a href="https://github.com/rachelnertia/Box2D-Raycasting-Test">GitHub repository</a>, in the hope that I can iron out some things and maybe find a better solution for sprites. I’ve been planning a game using this system, so I have a big To Do list. Up top is stuff like adding support for sprites of different heights and sizes, which will definitely go into the next version of the example on GitHub. After that is things I need for the game, like animated sprites, moving things around, some kind of level-editing tool… I’ll probably be writing about that stuff too as I go through it.</p>
<p>That’s all for now, I think. This post ended up WAY longer than I expected it to be. Good grief.</p>
<p>UPDATE 17/05/2016: I’ve put this stuff on the ‘experimental’ branch of the GitHub repo.</p>
Raycasting in Box2D2016-04-07T00:00:00+00:00http://rachelnertia.github.io/programming/2016/04/07/box2d-raycasting-test<p><img src="/images/b2dray/02.png" width="49%" style="display:inline;" title="Box2D debug draw output, with the camera represented as the big circle." alt="Box2D debug draw output" />
<img src="/images/b2dray/01.png" width="49%" style="display:inline;" title="Raycast-render function output from the camera's perspective." alt="Raycast-render function output" /></p>
<p>In this case, ‘raycasting’ refers to an old-school rendering algorithm used in early ‘pseudo-3D’ games such as <em>Wolfenstein 3D</em>. <a href="http://lodev.org/cgtutor/raycasting.html">This tutorial</a> provides a good overview of how it’s normally implemented in its simplest form: for each column of pixels on the screen. The world is represented as a 2D grid of integers in which the number 0 is empty space and anything else is a wall. Each ray iterates over the grid until it intersects a wall, whereupon you use the distance from the camera to the wall to draw a vertical line of pixels on the screen. Simple! Then you can add more on top, like texturing the walls and floor, ‘sprites’ which aren’t on the grid and always face the camera, etc.</p>
<p><img src="/images/crawlspace_2015_03_04.png" alt="Grid-based raycasting example from 2015." title="A grid-based raycasting experiment from 2015, showing textured walls, sprites, and tile-mapped floor rendered in a pixel shader." /></p>
<p>(Reminder that I tend to add mouse-over text to my images.)</p>
<p>What if you want the freedom to have walls that aren’t grid-aligned, though? It’s easy enough to write functions which test for intersection between line segments (rays) and arbitrary polygons and circles, but when the number of objects in your world grows large, unless you want to raycast against <em>every</em> object in your scene hundreds of times each frame, you’re going to want to sort those objects into some kind of <a href="http://gameprogrammingpatterns.com/spatial-partition.html">spatial partition</a>. This will take a fair bit of your time, energy and sanity.</p>
<p>The good news is that <a href="http://box2d.org/">Box2D</a> already sorts every fixture (shape) in its world into a spatial partition. This is great because it saves us the effort of doing so, <em>and</em> gives us access to all the other cool stuff Box2D does. The <code class="language-plaintext highlighter-rouge">b2World::RayCast</code> function is fast and easy to use - so why not try using it to render the Box2D world from a first-person perspective?</p>
<p>Download the demo program (Windows only) from <a href="https://github.com/rachelnertia/Box2D-Raycasting-Test/releases/download/v0.1/box2d_raycasting_test.zip">here</a>. Controls are in the readme that should be included in the .zip or on the readme on the front page of the <a href="https://github.com/rachelnertia/Box2D-Raycasting-Test">GitHub repo</a> where you can view all the source code.</p>
<p>Next I’m going to add sprites. I think I’ve figured out how to do it in my head and just need to put my thoughts into code. The nice thing is that I <em>should</em> be able to render sprites in the same pass as I render the walls – in my old grid-based raycaster the walls are rendered and the sprites are handled afterwards. On the other hand, to handle partially-transparent sprites (and walls) I’ll have to continue rays beyond their first intersection-point, which complicates things somewhat.</p>
<p>Texturing the walls is going to take more time to solve. On a grid it’s easy to figure out how far along the wall the ray intersection-point is, here not so much. I’m going to be doing a lot of head-scratching, and I fear the solution I come up with in the end will be sub-optimal. Won’t know until I try, though!</p>
<p>The images below demonstrate the difference made by calculating the ray direction and intersection-point distance in different ways. If I were going to explain this here I’d want to use some diagrams. Maybe later, huh?</p>
<p><img src="/images/b2dray/03.png" width="49%" style="display:inline;" title="Perpendicular distance and view plane." />
<img src="/images/b2dray/04.png" width="49%" style="display:inline;" title="Euclidean distance and rotated forward vector." /></p>
<p><strong>Further reading:</strong></p>
<p>The <a href="http://www.cgwmuseum.org/galleries/index.php?year=1993&pub=2&id=108">108th issue of Computer Gaming World</a> from July 1993, featuring this quote about the 7th Game Developer’s Conference, is pretty cool to read:
<img src="/images/cgw_quote.jpg" alt="" /></p>
Batman V Superman2016-03-26T00:00:00+00:00http://rachelnertia.github.io/2016/03/26/batman-v-superman<table>
<tbody>
<tr>
<td>BATMAN:</td>
<td>Stop it, Superman!</td>
</tr>
<tr>
<td>SUPERMAN:</td>
<td>Stop what, Batman?</td>
</tr>
<tr>
<td>BATMAN:</td>
<td>Antagonizing me!</td>
</tr>
<tr>
<td>SUPERMAN:</td>
<td>In what way have I been antagonizing you?</td>
</tr>
<tr>
<td>BATMAN:</td>
<td>Ever since we moved in together you’ve been passive-aggressively eating my groceries, leaving dishes in the sink, not taking the rubbish out, and more. You know I can’t stand mess! You must be doing it on purpose.</td>
</tr>
<tr>
<td>SUPERMAN:</td>
<td>I’m too busy to do chores! I have to be out <em>there</em>, all the time, using my superpowers to save people. If you had superpowers, maybe you’d understand!</td>
</tr>
<tr>
<td>BATMAN:</td>
<td>This time you’ve <em>crossed the line</em>! How dare you. Maybe if you <em>didn’t</em> have superpowers you’d have a little bit of perspective. I had to <em>become</em> a superhero. You just had it all handed to you on a plate!</td>
</tr>
<tr>
<td>SUPERMAN:</td>
<td>Oh, unlike your family’s seemingly-infinite wealth?</td>
</tr>
<tr>
<td>BATMAN:</td>
<td>My parents died!</td>
</tr>
<tr>
<td>SUPERMAN:</td>
<td>My parents died, too!</td>
</tr>
<tr>
<td>BATMAN:</td>
<td>…I guess we’re not so different after all.</td>
</tr>
<tr>
<td>SUPERMAN:</td>
<td>Batman. Let’s make up and put this behind us.</td>
</tr>
<tr>
<td>BATMAN:</td>
<td>Agreed. Best of friends, forever.</td>
</tr>
<tr>
<td>THE JOKER:</td>
<td>Hello boys!</td>
</tr>
<tr>
<td>BATMAN:</td>
<td>Joker! What happened to your face?</td>
</tr>
<tr>
<td>JOKER:</td>
<td>Do you like it? Hmm? I thought you would, Batsy. But what about you, “Super Man”? Do I look… a little familiar?</td>
</tr>
<tr>
<td>SUPERMAN:</td>
<td>Lex Luthor! You look like Lex Luther! How is this possible?</td>
</tr>
<tr>
<td>JOKER:</td>
<td>Instead of leaving you to ponder this mystery I’m going to immediately give it all away! I injected Lexy’s DNA into my face and BLAM! New face, new me, newly-found villainous outlook on life, and a wonderfully <em>eeevil</em> scheme to take over the world and <em>destroy you both</em>!</td>
</tr>
<tr>
<td>SUPERMAN:</td>
<td>Look out, Batman, he’s got a weapon that exploits your only weakness that the writer doesn’t read enough comics to know about!</td>
</tr>
<tr>
<td>BATMAN:</td>
<td>…Kryptonite?</td>
</tr>
<tr>
<td>JOKER:</td>
<td>Time to die, boys!</td>
</tr>
<tr>
<td>SUPERMAN:</td>
<td><em>Laser eyes attack! PEW!</em></td>
</tr>
<tr>
<td>JOKER:</td>
<td>Oh ho ho, you think that will work on me now, Supes? Don’t you remember that Lex Luthor’s DNA is <em>immune to lasers</em>?</td>
</tr>
<tr>
<td>SUPERMAN:</td>
<td>Quick, Batman, use your large bank account!</td>
</tr>
<tr>
<td>BATMAN:</td>
<td>The Joker can’t be bribed. He just burns all the money I send him.</td>
</tr>
<tr>
<td>SUPERMAN:</td>
<td>There’s no way to stop him, then!</td>
</tr>
<tr>
<td>BOTH:</td>
<td>Oh no!</td>
</tr>
<tr>
<td>JOKER:</td>
<td>Ha ha ha!</td>
</tr>
<tr>
<td>BATMAN:</td>
<td>Superman…</td>
</tr>
<tr>
<td>SUPERMAN:</td>
<td>Batman…</td>
</tr>
<tr>
<td>BOTH:</td>
<td>I love you.</td>
</tr>
<tr>
<td>WONDER WOMAN:</td>
<td>Hello, I am here now as you saw in the trailers. Power pose!</td>
</tr>
<tr>
<td>JOKER:</td>
<td>What?! A <em>female</em>? Is this some kind of SJW plot?</td>
</tr>
<tr>
<td>WONDER WOMAN:</td>
<td>I use my special move, ‘Pop-Feminism’!</td>
</tr>
<tr>
<td>JOKER:</td>
<td>I’m melting for some reason!</td>
</tr>
<tr>
<td>WONDER WOMAN:</td>
<td>Goodbye, Joker. I guess you could say that this time it is <em>you</em> who has been <em>joked</em>.</td>
</tr>
<tr>
<td>JOKER:</td>
<td>Argh!</td>
</tr>
<tr>
<td>BATMAN & SUPERMAN:</td>
<td>Thanks, Wonder Woman! We thought that by combining our powers of Super and Bats we could take on any challenge, but in the end it turned out we were missing the most important power of all: Wonder!</td>
</tr>
<tr>
<td>WONDER WOMAN:</td>
<td>And how!</td>
</tr>
<tr>
<td> </td>
<td><em>Wonder Woman turns to the camera with her mouth open. Hundreds of DC-universe characters pour out.</em></td>
</tr>
<tr>
<td>WONDER WOMAN:</td>
<td>Feeling teased, nerds?</td>
</tr>
</tbody>
</table>
<p>THE END</p>
<p>Tables, huh?</p>
Oblivion2016-03-22T00:00:00+00:00http://rachelnertia.github.io/gaming/2016/03/22/oblivion<p><img src="/images/oblivion_01.png" alt="" /></p>
<p>Beneath the Great Oak of Chorrol I approach member of the town watch. Apart from his Chorrol uniform, he is an exact copy of every other guardsman in the game. The gruff stare. The podgy face. The stubble. He tells me he is on duty but doesn’t stop me from launching into conversation - I suppose he’s aware that while I’m talking to him, everything else in the world, including lawbreakers, is frozen.</p>
<p>The conversation goes like this: I boast about some feat I’ve accomplished, then I admire his few positive features, then I crack a stinking joke, then I wrap up by attempting to coerce him into liking me more. Then I do it all again. I am speaking at such breakneck speed that he is barely able to respond before the next phrase is blasted from my mouth. From moment to moment his disposition towards me varies wildly, as I alternately offend and impress him.</p>
<p>At the back of my mind I wonder whether this counts as <a href="http://tvtropes.org/pmwiki/pmwiki.php/Main/VideoGameCrueltyPotential">NPC torture</a>. At the front of my mind I continue clicking away at the conversation wheel. You see, this is how I get better at talking to people.</p>
<!--more-->
<p><img src="http://staticdelivery.nexusmods.com/mods/101/images/31809-1-1274387385.jpg" alt="" title="This map has to be modded in because the world map is a horrible sepia affair by default." /></p>
<p>Let me explain: In Oblivion, when you <a href="http://www.uesp.net/wiki/Oblivion:Leveling">level up</a>, you pick three attributes to improve. Each attribute is tied to three skills. Depending on how much you improved those three skills since your last level-up, you’ll get to increase that attribute by up to 5 points, instead of a meagre 1 point.</p>
<p>Getting to increase three of your chosen attributes by 5 points each time you level up is <a href="http://www.uesp.net/wiki/Oblivion:Efficient_Leveling">efficient levelling</a>, which matters because in the unmodded game your enemies level up with you, and you won’t have any advantage over them unless your attributes and skills are as good as they can be. This is Oblivion’s ‘levelling problem’, and it’s surprising that the game escaped playtesting without a fix for it, and even more surprising that it went on to be such an enormous success in spite of it. Of all the reasons I can think of why people don’t look back so fondly on Oblivion as they do on Morrowind, the level scaling problem has to be the biggest.</p>
<p>It’s certainly put me off regular trips back to Cyrodiil - too many times have I reached level 15 only to find myself to be the weakest entity in the entire gameworld. This time I’m playing with <a href="http://www.nexusmods.com/oblivion/mods/40190/?">Francesco’s mod</a> installed (sans extra creatures and items), which overhauls the level scaling so that it still exists but is less of a joy-killing nightmare hellride, though I’m not yet a high enough level to have felt its impact. So I might not need to efficiently level to the degree that I am. It’s strangely <em>satisfying</em>, though. (And old habits die hard!)</p>
<p>The Personality attribute is tied to Mercantile, Illusion magic and Speechcraft, so if I want to get that juicy +5 to Personality next time I level up, I’ve got to practice these skills, which means playing the conversation minigame to up my Speechcraft. By this point in my playthrough I’ve gone from actually paying attention to the bizarre and tedious conversation minigame to, well, this:</p>
<p><img src="http://i.imgur.com/8oqiSr1.gif" alt="" /></p>
<p>Oblivion is weird. Amazing. Weird.</p>
<p>It’s also 10 years old as of last Sunday, which is a scary and impressive fact. It means that 10 years ago 12-year-old me walked into GAME on the high street and picked it off the shelf. I’d read about this RPG in PC Gamer. I’d played Morrowind enough for it to have left a permanent mark on my soul. The cashier asked if I was sure my PC could run it. I scoffed at him and strode out towards the bus stop.</p>
<p>My PC couldn’t run it. It lagged, groaned, creaked, had strange graphical errors and crashed at regular intervals<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>, but the main thing I remember is the audio being broken. Every time an object clattered to the floor my speakers would screech like they’d been possessed by avant-garde music demons, making a sound somewhere between scratchy white noise and the actual thing it was supposed to sound like. 12-year-old me persisted for a while, but eventually gave up.</p>
<p>Years later I bought it again on Xbox 360 and this time it wasn’t a buggy experience<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>, so I really got into it for the first time. Later still I bought it <em>again</em> on Steam with all its DLC and expansions on Steam.</p>
<p>There’s still a lot of Oblivion that I’ve yet to experience. I’ve never even touched the Shivering Isles expansion, or finished the main quest, or finished any of the guild questlines. I just kind of stop once I reach a certain point, and when I return I play with different mods so I have to abandon my old character. I don’t think this is a bad cycle or anything. It’s just not helpful when it comes to ever reaching the point where I feel like I’ve seen all there is to see.</p>
<p>I’ll leave you with this screenshot of the game I took five years ago:</p>
<p><img src="/images/oblivion_old_01.jpg" alt="" /></p>
<p>Like Oblivion as a whole, there’s a lot going on in there.</p>
<h3 id="further-reading">Further Reading</h3>
<p>The Oblivion bits (which start <a href="http://www.shamusyoung.com/twentysidedtale/?p=28910">here</a>) are obviously the most relevant, but I recommend every entry in Rutskarn’s <a href="http://www.shamusyoung.com/twentysidedtale/?p=28081">Altered Scrolls</a> series for a really well-written, insightful in-depth look at the Elder Scrolls games. Here’s a quote:</p>
<blockquote>
<p>I intimated earlier in the series that there is no such thing, broadly speaking, as an unsuccessful Elder Scrolls game. The least you can expect of any main franchise entry is success on its own terms, at its own goals, in its own era. This doesn’t guarantee it’ll still be a success tomorrow or would have been one yesterday.</p>
</blockquote>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>To be fair to the computer I had at the time, it does this on everything. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>Well, it didn’t CTD at least. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Shaking Hands with Aliens - Global Game Jam 2016 at Abertay2016-02-02T00:00:00+00:00http://rachelnertia.github.io/game%20dev/2016/02/02/global-game-jam<p><img src="/images/ggj_logo.jpg" alt="" /></p>
<p>This weekend I took part in Global Game Jam for the first time.</p>
<p><a href="http://globalgamejam.org/">Global Game Jam</a> is an annual happening where people gather at specific locations all over the world and make games. It’s not like <a href="http://http://ludumdare.com/compo/">Ludum Dare</a> where you can work from home - instead the emphasis is very much on being in a shared space, meeting and working with new people. <a href="http://globalgamejam.org/2016/jam-sites/abertay-university">Abertay University was host</a> to a throng of jammers, a crowd consisting of students, teachers, local industry and many other sorts of people.</p>
<!--more-->
<p>The atmosphere was fantastic: full of energy, positivity and productivity, with everyone looking out for each other. There’s a bit of ‘crunch culture’ inherent in game jams and while <a href="http://www.thetreehouse.website/five-of-the-reasons-i-decided-not-to-participate-in-global-game-jam-this-year/">some jams and jam locations end up creating quite toxic environments</a>, the organisers and everyone at Abertay seemed to be on board with the real purpose of game jams: the process, not the product. Game jams are about practicing your skills, learning new ones, working with people and making things that don’t quite work. Above all, they’re about <strong>having fun</strong>.</p>
<p><img src="/images/ggj16_03.jpg" alt="" /></p>
<p>I didn’t have a pre-formed team when I pitched up on Friday but luckily I fell in with <a href="https://twitter.com/DziekDB">Dziek Dyes-Bolt</a>, a fellow programmer and 4th-year CGT, <a href="https://twitter.com/Fentlegen">Callum Fowlie</a> and <a href="https://twitter.com/TonePersson">Tone Persson</a>, 4th-year artists both, and <a href="https://soundcloud.com/dercii/sets/global-game-jam-2016">Chris D’Arcy</a>, who contributed audio to multiple projects. I hadn’t worked with any of them before but it seemed to me like we cooperated pretty well.</p>
<p>The theme was ‘Ritual’, so somehow we decided to make a game about shaking hands with aliens. All the aliens have different handshaking protocols you have to learn so as not to cause offense, because they’ll blow up the Earth if you do, and your only help is an unhelpfully-verbose book entitled ‘The Handshaker’s Guide to the Galaxy’. In the end it played a bit like <a href="http://www.keeptalkinggame.com/">Keep Talking and Nobody Explodes</a>, with one player thumbing through the Guide and the other holding the controller.</p>
<p><img style="float: right; width: 30%" src="/images/ggj16_02.jpg" /></p>
<p>The game ‘generates’ aliens by matching together a body, a hand and a head. Each body part has specific rules attached to it; for example the head dictates which direction your hand should approach the alien’s from. We only made 3 bodies, 3 heads and 4 hands, but even these small numbers create quite a wide number of possible aliens (36, to be exact!). I wanted to find a way to generate the text which would go in the Guide, as it would let us change and add rules without needing to manually rewrite the document, but didn’t have enough time. In the end Tone and Callum got to write the Guide, and seemed to have a lot of fun writing it.</p>
<p>Me and Dziek finally had something playable by the end of Sunday morning and we were able to submit the game before the end of the jam at 3pm. People came over to try it out and watching them be initially confounded before learning the game and eventually succeeding was immensely satisfying.</p>
<p><img src="/images/interstellar_soiree_01.png" alt="" title="First contact" /></p>
<p><a href="http://globalgamejam.org/2016/games/interstellar-soir%C3%A9e">You can download the game, including the full Unity project, from its page on the Global Game Jam website</a> (Windows only; Xbox 360 controller required). Be warned, though: there is one accidental mistake in the Guide, and in the version we demoed immediately after the jam we increased the time limit to 35 seconds to make it easier. Hopefully we’ll add more functionality and polish (and maybe even aliens!) in the weeks ahead and release a post-jam version of the game<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>.</p>
<p>In the meantime if you’d like to play Interstellar Soirée in its present form the best way is to ask me! I’m planning on demoing it at <a href="https://www.facebook.com/groups/AbertayGDS/">Game Development Society</a> on Thursday, so if you’re there you can give it a shot.</p>
<p><a href="http://globalgamejam.org/2016/jam-sites/abertay-university/games">Check out the other games made at Abertay this weekend</a> - in the time I spent wandering around trying to get a look at them all after 3pm on Sunday I barely got to see a quarter of them. So many games!</p>
<p>I want to thank Dziek for being a rad coding buddy, Tone and Callum for being amazing artists making amazing art, Chris for his audio skills and everyone else involved in the jam, especially <a href="https://twitter.com/Loakers">Ryan</a> for creating an awesome creative space to work in!</p>
<p><a href="https://storify.com/Loakers/global-game-jam-2016-at-abertay-univeristy">Here’s a Storify of the weekend.</a></p>
<p><img src="/images/ggj16_01.jpg" alt="" title="Natalie Clayton let me crash at hers both nights, which meant I didn't have to trudge back and forth all the way to my place twice in the freezing cold, but also meant I didn't change clothes all weekend ~" /></p>
<p>‘Jam’ doesn’t look like a real word to me any more.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>If you feel like taking a look at our code: go easy on us. Jam code, particularly when it’s collaborative, is always going to be messy like a bowl of spaghetti. When it’s me and Dziek writing it, even more so. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Flappy Word 'Released'2016-01-26T00:00:00+00:00http://rachelnertia.github.io/game%20dev/2016/01/26/flappy-word-release<p><img style="float: right;" src="/images/flappy_word_v1_0.gif" /></p>
<p>This news is about a month old by now, but: that’s right, I’m ‘done’ with Flappy Word.</p>
<p>You can play a web build <a href="https://googledrive.com/host/0B7qrbyhEE5SeRXE0ajFhQmh4aVk/">here</a> or on the <a href="http://inertia.itch.io/flappy_word">itch.io page</a>, where you can also download versions for Windows, Mac or Linux<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>.</p>
<p><br /></p>
<h3 id="things-i-learned">Things I learned</h3>
<p><strong>1)</strong> I think Unity’s WebGL build target isn’t quite <em>there</em> yet. <a href="http://blogs.unity3d.com/2015/12/07/unity-5-3-webgl-updates/">They’ve dropped the ‘preview’ label</a> but all this really means is that it’s now at a point where the Unity folks are willing to cover support tickets about it – if you’re a Premium or Enterprise user. It’s still kind of laggy and outputs <em>enormous</em> files which the user has to download. I don’t want to be too down on it but at least for the immediate future if I want to target HTML5/WebGL I’ll probably just do it the ‘hard’ way and write some JavaScript<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>. I’m sure it’ll be good eventually.</p>
<p><strong>2)</strong> Implementing the word-typing (you know, the main mechanic) taught me a fair bit.</p>
<p><strong>a)</strong> Use <a href="https://msdn.microsoft.com/en-us/library/system.enum.parse(v=vs.110).aspx">System.Enum.Parse</a> to convert between letters (chars) and key codes (enums) so you know which key the player should type next. I don’t understand what magic this function is performing but it’s very useful.</p>
<p><strong>b)</strong> I used <a href="http://docs.unity3d.com/ScriptReference/Resources.html">Resources</a> for the dictionary file. I’ve no idea if this is the optimal way to handle big text-based data assets in Unity, but it was simple and I’ve found no reason to switch to any other method.</p>
<figure class="highlight"><pre><code class="language-csharp" data-lang="csharp"><span class="kt">string</span> <span class="n">dictionary</span> <span class="p">=</span> <span class="p">(</span><span class="n">Resources</span><span class="p">.</span><span class="nf">Load</span><span class="p">(</span><span class="s">"dictionary"</span><span class="p">)</span> <span class="k">as</span> <span class="n">TextAsset</span><span class="p">).</span><span class="n">text</span><span class="p">;</span></code></pre></figure>
<p><strong>c)</strong> This big huge string is parsed and broken up into an array of strings, which is then sorted for length. Sorting is nice and simple thanks to an anonymous <a href="https://msdn.microsoft.com/en-gb/library/ms173171.aspx">delegate</a>:</p>
<figure class="highlight"><pre><code class="language-csharp" data-lang="csharp"><span class="n">words</span><span class="p">.</span><span class="nf">Sort</span><span class="p">(</span>
<span class="k">delegate</span> <span class="p">(</span><span class="kt">string</span> <span class="n">s1</span><span class="p">,</span> <span class="kt">string</span> <span class="n">s2</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">s1</span><span class="p">.</span><span class="n">Length</span><span class="p">.</span><span class="nf">CompareTo</span><span class="p">(</span><span class="n">s2</span><span class="p">.</span><span class="n">Length</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">);</span></code></pre></figure>
<p>Delegates are kind of analogous to <a href="http://en.cppreference.com/w/cpp/language/lambda">modern C++ lambdas</a> (wee local function objects), with differences. They can’t capture variables from their scope, but other methods can be ‘assigned’ to them (I don’t think I understand what that actually means yet).</p>
<p><strong>3)</strong> Screen shake made the game feel better, but it introduced audio problems. I was using <a href="http://docs.unity3d.com/ScriptReference/AudioSource.PlayClipAtPoint.html">AudioSource.PlayClipAtPoint</a>, which had worked fine up until then as a quick throwaway audio clip solution, but now that the camera (and therefore listener) was jiggling about the 3D spatialisation was noticeable, and horrible. Detaching the Listener from the camera worked, but it still bothered me that I didn’t have a method for just playing non-spatialised temporary audio clips.</p>
<figure class="highlight"><pre><code class="language-csharp" data-lang="csharp"><span class="k">static</span> <span class="k">public</span> <span class="n">AudioSource</span> <span class="nf">PlayClip2D</span><span class="p">(</span><span class="n">AudioClip</span> <span class="n">clip</span><span class="p">,</span> <span class="kt">float</span> <span class="n">volume</span> <span class="p">=</span> <span class="m">1.0f</span><span class="p">,</span>
<span class="kt">float</span> <span class="n">pitch</span> <span class="p">=</span> <span class="m">1.0f</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">GameObject</span> <span class="n">temp</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">GameObject</span><span class="p">(</span><span class="s">"TempAudio"</span><span class="p">);</span>
<span class="n">AudioSource</span> <span class="n">asource</span> <span class="p">=</span> <span class="n">temp</span><span class="p">.</span><span class="n">AddComponent</span><span class="p"><</span><span class="n">AudioSource</span><span class="p">>();</span>
<span class="n">asource</span><span class="p">.</span><span class="n">clip</span> <span class="p">=</span> <span class="n">clip</span><span class="p">;</span>
<span class="n">asource</span><span class="p">.</span><span class="n">spatialBlend</span> <span class="p">=</span> <span class="m">0.0f</span><span class="p">;</span> <span class="c1">// Make it 2D</span>
<span class="n">asource</span><span class="p">.</span><span class="n">volume</span> <span class="p">=</span> <span class="n">volume</span><span class="p">;</span>
<span class="n">asource</span><span class="p">.</span><span class="n">pitch</span> <span class="p">=</span> <span class="n">pitch</span><span class="p">;</span>
<span class="n">asource</span><span class="p">.</span><span class="nf">Play</span><span class="p">();</span> <span class="c1">// Start the sound</span>
<span class="nf">Destroy</span><span class="p">(</span><span class="n">temp</span><span class="p">,</span> <span class="n">clip</span><span class="p">.</span><span class="n">length</span><span class="p">);</span> <span class="c1">// Destroy the object after clip duration.</span>
<span class="k">return</span> <span class="n">asource</span><span class="p">;</span>
<span class="p">}</span></code></pre></figure>
<p>So I had to write my own function which does EXACTLY what PlayClipAtPoint does but without the position and zeroing out the <code>spatialBlend</code> variable. Because the Unity scripting API doesn’t have one for some reason.</p>
<p><strong>4)</strong> Unity’s UI stuff is cool. My UIController script sure as hell doesn’t interface with it as gracefully as I’d like. That’s something to improve upon next time.</p>
<p><strong>5)</strong> Avoid having one big monolithic script that controls everything by factoring parts of it out into separate scripts as early as possible, even if you end up attaching them all to one ‘controller’ GameObject. It’s just better that way. The mono-Monobehaviour I created was horrifying to work with until I refactored most of it out into new scripts.</p>
<p>Anyway, if I keep going I’ll be writing for ages. This was a surprisingly educational project.</p>
<h3 id="repository">Repository</h3>
<p>I’ve decided to make the <a href="https://bitbucket.org/r_crawford/flappy-word">Bitbucket repository</a> public. By NO means should any of the code within be imitated. It is all bad. Horrible and bad, but if you end up taking a look hopefully you can learn how not to do things.</p>
<p>You could clone it, or you could just download the <a href="https://www.dropbox.com/s/72k769m5jr741sc/flappy-word-v1-0-src.zip?dl=0">full source in a zip file</a>.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>I don’t know how well the Mac or Linux versions work because I can’t test them. Let me know! <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>Maybe try a framework/engine to help like <a href="http://phaser.io/">Phaser</a> or <a href="http://superpowers-html5.com/index.en.html">Superpowers</a>. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
DirectX 11 Framework2016-01-18T00:00:00+00:00http://rachelnertia.github.io/programming/2016/01/18/directx-framework<p>This post is about the framework code I’ve written as part of my Honours project application. The aim of the framework is to make working with DirectX 11 as painless as possible. I won’t actually discuss anything about my project in it. The framework will expand as the project goes on, hopefully blossoming into something other people might consider using, so taking stock when it’s in its most simple form is a pretty worthwhile blog post.</p>
<h2 id="the-window">The Window</h2>
<p><img src="/images/directx_framework_window_01.png" alt="" title="Busy bees, just like me." /></p>
<p>Window management works like it does in <a href="http://www.sfml-dev.org/">SFML</a>. Sort of. That’s the goal, anyway.</p>
<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="n">dxf</span><span class="o">::</span><span class="n">Window</span> <span class="n">window</span><span class="p">;</span>
<span class="n">window</span><span class="p">.</span><span class="n">Create</span><span class="p">(</span><span class="mi">640</span><span class="p">,</span> <span class="mi">480</span><span class="p">,</span> <span class="s">"DirectX Window"</span><span class="p">);</span>
<span class="k">while</span> <span class="p">(</span><span class="n">window</span><span class="p">.</span><span class="n">IsOpen</span><span class="p">())</span> <span class="p">{</span> <span class="c1">// application main loop</span>
<span class="n">dxf</span><span class="o">::</span><span class="n">WindowEvent</span> <span class="n">event</span><span class="p">;</span>
<span class="k">while</span> <span class="p">(.</span><span class="n">window</span><span class="p">.</span><span class="n">PollEvent</span><span class="p">(</span><span class="n">event</span><span class="p">))</span> <span class="p">{</span> <span class="c1">// event processing loop</span>
<span class="k">switch</span> <span class="p">(</span><span class="n">event</span><span class="p">.</span><span class="n">type</span><span class="p">)</span> <span class="p">{</span>
<span class="k">case</span> <span class="n">dxf</span><span class="o">::</span><span class="n">WindowEvent</span><span class="o">::</span><span class="n">Closed</span><span class="p">:</span>
<span class="n">window</span><span class="p">.</span><span class="n">Close</span><span class="p">();</span>
<span class="k">break</span><span class="p">;</span>
<span class="nl">default:</span>
<span class="k">break</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="n">window</span><span class="p">.</span><span class="n">Clear</span><span class="p">();</span> <span class="c1">// clear to black</span>
<span class="n">window</span><span class="p">.</span><span class="n">Bind</span><span class="p">();</span> <span class="c1">// prepare to render</span>
<span class="c1">// ... draw objects here ...</span>
<span class="n">window</span><span class="p">.</span><span class="n">Display</span><span class="p">();</span> <span class="c1">// flip buffers</span>
<span class="p">}</span></code></pre></figure>
<p>The <code>dxf::Window</code> manages the application’s DirectX device and a bunch of other DirectX objects which it creates, like a swap chain and render target<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>. <code>Window::Create()</code> sets up DirectX and the destructor cleans everything up, so the Window is the first thing an application using this framework needs to create before it gets on with important things.</p>
<h2 id="shaders">Shaders</h2>
<p>Currently there’s only vertex and pixel shaders. Setting up shaders is straightforward.</p>
<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="c1">// Set up the simple vertex shader.</span>
<span class="n">dxf</span><span class="o">::</span><span class="n">VertexShader</span> <span class="n">simple_vs</span><span class="p">;</span>
<span class="n">simple_vs</span><span class="p">.</span><span class="n">Create</span><span class="p">(</span><span class="n">m_window</span><span class="o">-></span><span class="n">GetDevice</span><span class="p">(),</span> <span class="s">"shaders/simple_vs.hlsl"</span><span class="p">,</span> <span class="s">"main"</span><span class="p">));</span></code></pre></figure>
<p>This finds the shader code file and compiles it</p>
<p>Vertex shaders are special because they have an <code>ID3D11InputLayout*</code> associated with them. I used to have to set these up manually by filling out an array of <code>D3D11_INPUT_ELEMENT_DESC</code> structs and calling <code>ID3D11Device::CreateInputLayout</code>, which necessitates a tonne of pointless bespoke code which is a chore to write and easy to mess up<sup id="fnref:2" role="doc-noteref"><a href="#fn:2" class="footnote" rel="footnote">2</a></sup>. Now, though, I use black magic in the form of shader reflection to automatically generate the input layout object as demonstrated <a href="https://takinginitiative.wordpress.com/2011/12/11/directx-1011-basic-shader-reflection-automatic-input-layout-creation/">here</a> (thanks, Bobby Anguelov!), which eases the process greatly. I’m wondering what else I could do with shader reflection.</p>
<p>When it’s time to render, you just <code>Bind</code> the shader to the device context along with all the other objects.</p>
<p>There’s objects associated with shaders, too, such as Textures, Samplers, and ConstantBuffers, all currently rather skeletally implemented. I’m working on features as I come to need them.</p>
<h2 id="meshes">Meshes</h2>
<p>The Mesh class manages vertex and index buffers. Currently I don’t handle non-indexed meshes. To create a mesh (in this case, an indexed quad):</p>
<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="n">dxf</span><span class="o">::</span><span class="n">Mesh</span> <span class="n">mesh</span><span class="p">;</span>
<span class="kt">unsigned</span> <span class="n">quad_indices</span><span class="p">[</span><span class="mi">6</span><span class="p">];</span>
<span class="n">quad_indices</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// bottom left</span>
<span class="n">quad_indices</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="c1">// top left</span>
<span class="n">quad_indices</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="c1">// top right</span>
<span class="n">quad_indices</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// bottom left</span>
<span class="n">quad_indices</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="c1">// top right</span>
<span class="n">quad_indices</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span> <span class="c1">// bottom right</span>
<span class="c1">// Pass in the device, a pointer to the first index, and how many indices</span>
<span class="c1">// there are.</span>
<span class="n">mesh</span><span class="p">.</span><span class="n">SetIndices</span><span class="p">(</span><span class="n">window</span><span class="o">-></span><span class="n">GetDevice</span><span class="p">(),</span> <span class="n">quad_indices</span><span class="p">,</span> <span class="mi">6</span><span class="p">);</span>
<span class="c1">// This structure should match up with the input structure used in the vertex </span>
<span class="c1">// shader the mesh is rendered with otherwise weird not good things will happen.</span>
<span class="k">struct</span> <span class="nc">Vertex</span> <span class="p">{</span>
<span class="n">D3DXVECTOR3</span> <span class="n">position</span><span class="p">;</span>
<span class="p">};</span>
<span class="n">Vertex</span> <span class="n">quad_verts</span><span class="p">[</span><span class="mi">4</span><span class="p">];</span>
<span class="n">quad_verts</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">position</span> <span class="o">=</span> <span class="n">D3DXVECTOR3</span><span class="p">(</span><span class="mf">0.0</span><span class="n">f</span><span class="p">,</span> <span class="mf">0.0</span><span class="n">f</span><span class="p">,</span> <span class="mf">0.0</span><span class="n">f</span><span class="p">);</span> <span class="c1">// bottom left</span>
<span class="n">quad_verts</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="n">position</span> <span class="o">=</span> <span class="n">D3DXVECTOR3</span><span class="p">(</span><span class="mf">0.0</span><span class="n">f</span><span class="p">,</span> <span class="mf">1.0</span><span class="n">f</span><span class="p">,</span> <span class="mf">0.0</span><span class="n">f</span><span class="p">);</span> <span class="c1">// top left</span>
<span class="n">quad_verts</span><span class="p">[</span><span class="mi">2</span><span class="p">].</span><span class="n">position</span> <span class="o">=</span> <span class="n">D3DXVECTOR3</span><span class="p">(</span><span class="mf">1.0</span><span class="n">f</span><span class="p">,</span> <span class="mf">1.0</span><span class="n">f</span><span class="p">,</span> <span class="mf">0.0</span><span class="n">f</span><span class="p">);</span> <span class="c1">// top right</span>
<span class="n">quad_verts</span><span class="p">[</span><span class="mi">3</span><span class="p">].</span><span class="n">position</span> <span class="o">=</span> <span class="n">D3DXVECTOR3</span><span class="p">(</span><span class="mf">1.0</span><span class="n">f</span><span class="p">,</span> <span class="mf">0.0</span><span class="n">f</span><span class="p">,</span> <span class="mf">0.0</span><span class="n">f</span><span class="p">);</span> <span class="c1">// bottom right</span>
<span class="c1">// Pass in the device, a pointer to the first vertex, the size of each vertex, and</span>
<span class="c1">// how many vertices there are.</span>
<span class="n">mesh</span><span class="p">.</span><span class="n">SetVertices</span><span class="p">(</span><span class="n">window</span><span class="o">-></span><span class="n">GetDevice</span><span class="p">(),</span> <span class="o">&</span><span class="n">quad_verts</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">quad_verts</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="mi">4</span><span class="p">);</span></code></pre></figure>
<p>This abstracts away nitty-gritty DirectX code, which is nice.</p>
<p>Actually rendering the mesh isn’t quite the way I’d like it yet. I’d like the verbs to be something like ‘render [mesh] to [target]’ where target is an instance of some kind of RenderTarget class. For now the process is:</p>
<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="n">mesh</span><span class="p">.</span><span class="n">Bind</span><span class="p">(</span><span class="n">window</span><span class="o">-></span><span class="n">GetContext</span><span class="p">());</span>
<span class="n">mesh</span><span class="p">.</span><span class="n">Draw</span><span class="p">(</span><span class="n">window</span><span class="o">-></span><span class="n">GetContext</span><span class="p">());</span></code></pre></figure>
<h2 id="imgui">ImGui</h2>
<p>There’s more to talk about but I’ll finish for now by talking about the GUI layer.</p>
<p><a href="https://github.com/ocornut/imgui">ImGui</a> is where that nifty little ‘Test’ window comes from. ImGui is <em>rad</em>, and I wouldn’t know about it if not for a news post on Gamasutra a few months ago. I’ve not used it extensively yet so there might be drawbacks I’ve not yet spotted, but for my debug UI purposes it looks like the best option there is <sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">3</a></sup>.</p>
<p>ImGui doesn’t do any rendering. You send it commands, it constructs lists of vertices, and you handle the rendering. You don’t even need to worry too much about how to do that, because there are examples which show how to write a renderer for DirectX, OpenGL or another environment which you can just copy into your codebase.</p>
<p>Example:</p>
<p><img src="/images/imgui_window.png" alt="" /></p>
<figure class="highlight"><pre><code class="language-cpp" data-lang="cpp"><span class="kt">bool</span> <span class="n">b</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
<span class="n">ImGui</span><span class="o">::</span><span class="n">Begin</span><span class="p">(</span><span class="s">"Test Window"</span><span class="p">,</span> <span class="o">&</span><span class="n">b</span><span class="p">);</span>
<span class="n">ImGui</span><span class="o">::</span><span class="n">Text</span><span class="p">(</span><span class="s">"Hello"</span><span class="p">);</span>
<span class="n">ImGui</span><span class="o">::</span><span class="n">End</span><span class="p">();</span></code></pre></figure>
<p>ImGui is haphazardly integrated with the rest of my program at the moment and doesn’t yet make use of my useful framework code, so tidying that up is definitely a thing I want to do in the weeks ahead.</p>
<p>Next steps: actually implementing Honours project stuff…</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>I’m planning to factor the render target out into a separate class which the Window will own an instance of. It’ll be possible to render to any given ‘RenderTarget’, then render <em>that</em> to the Window’s back buffer RenderTarget. All this might not be completely possible. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:2" role="doc-endnote">
<p>I tried some really horrible ways of getting around writing that annoying repetitive input layout code before I happened upon shader reflection. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
<li id="fn:3" role="doc-endnote">
<p>I encountered a few problems while setting it up which I will try to write about (later) so that other people have a less frustrating time. <a href="#fnref:3" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Nomad2016-01-10T00:00:00+00:00http://rachelnertia.github.io/game%20dev/2016/01/10/nomad-prototype<p><img src="/images/nomad_logo.png" alt="nomad logo" /></p>
<p><img src="/images/nomad_01.gif" alt="nomad gif" /></p>
<h2 id="an-unfinished-prototype">An Unfinished Prototype</h2>
<p>This was going to be an exploration-focused game about scavenging your way around asteroid fields and derelict space stations using a suite of clunky and unconventional movement tools. I got stuck in, began working on a grappling gun attachment which you could swap out a thruster for… and then the rest of Summer 2015 happened. This weekend I reopened the Unity project, made the game presentable, and decided to put it out as it is.</p>
<p>I’d like to come back to it – the idea’s been kicking around in my head for about 3 years and it wants out pretty bad – but it probably won’t happen in the immediate future. At least this way the game gets out into the world.</p>
<p>Download it on <a href="http://inertia.itch.io/nomad">itch.io</a>.</p>
Flappy Word v32015-12-18T00:00:00+00:00http://rachelnertia.github.io/2015/12/18/flappy-word-v3<p>Yup, still plugging away at this. The game should be embedded below.</p>
<!--more-->
<iframe src="https://googledrive.com/host/0B7qrbyhEE5SeT3VzNlQ3b3czc1E" width="650" height="490" scrolling="no" frameborder="0"></iframe>
<p>I’ve got a bunch of things left to do:</p>
<ul>
<li>Title screen.</li>
<li>Code cleanup.</li>
<li>Tweak the WebGL build memory size.</li>
<li>Maybe squeeze in a bit more juice.</li>
<li>Tweak numbers.</li>
<li>Improve the way it looks.</li>
<li>High score leaderboard.</li>
<li>
<s>Detailed lore and backstory.</s>
</li>
</ul>
<p>The first six are pretty straightforward. The title screen is the work of a few hours. The game’s code is a horrible mess which is well overdue a bit of a tidy, but I know where I’m going with that and I’ve already made inroads. Tweaking the WebGL build memory size is interesting and should help the game run on more computers. Adding more juice is the sort of thing I <em>could</em> end up sinking countless hours into, along with tweaking the numbers behind the game and making it look nicer, if I wasn’t already very bored of doing so.</p>
<p>The last one – an online high score leaderboard – is tricky. It’s something I’ve never done before and it will involve some kind of centralised database. It might mean integrating with some website. I just don’t know. Daunting. It’s a matter of what I want to do with the game. Put it up on a portal like <a href="http://www.kongregate.com">Kongregate</a>? How difficult will that be? Let people download it off or play it on <a href="http://itch.io">itch.io</a> and other places? Heck, could it even be a Steam game..?</p>
<p>Let me know what you think about the changes, and what I ought to do with Flappy Word going forward! If you want you can play <a href="/2015/10/23/flappy-word-v1/">version 1</a> and <a href="/2015/12/03/flappy-word-v2/">version 2</a>.</p>
Flappy Word v22015-12-03T00:00:00+00:00http://rachelnertia.github.io/2015/12/03/flappy-word-v2<p>Flappy Word!</p>
<p>I’ve made some changes to Flappy Word since <a href="/2015/10/23/flappy-word-v1/">version 1</a> back in November. Tell me what you think after the break!</p>
<!--more-->
<iframe src="https://googledrive.com/host/0B7qrbyhEE5SeWDMxYnpqd2Z1bkU" width="650" height="490" scrolling="no" frameborder="0"></iframe>
<p>This time I switched to <a href="http://yal.cc/hosting-html5-games-on-google-drive/">hosting using Google Drive</a>. Hope it works okay.</p>
<p>EDIT: This build has annoying audio bugs which I <em>think</em> I’ve fixed for the next version.</p>
Flappy Word v1 Feedback2015-10-28T00:00:00+00:00http://rachelnertia.github.io/2015/10/28/flappy-word-v1-feedback<p>People seem to like <a href="/2015/10/23/flappy-word-v1/"><em>Flappy Word</em></a>. According to one person it is “officially more addicting than Flappy Bird!”</p>
<p>Is that good?</p>
<p>##Technical Issues</p>
<p>The game runs, but not as well as it ought to.</p>
<p>It takes an annoyingly long time to start up. With no loading screen it seems like nothing is happening, so I need to look into ways to both improve the load time and implement a loading screen if possible.</p>
<p>On some computers it didn’t work at all. The issue was usually reported as something to do with the browser not being able to allocate enough memory to hold the game, but I haven’t sat down at one of the offending computers to see the error for myself.</p>
<p>I’ll start by looking at storage usage. The folder containing the v1 WebGL release build of <em>Flappy Word</em> is <strong>32.3 MB</strong>. That’s a lot considering how simple this game is. In 1990 the capacity of a normal desktop computer’s hard drive was about <strong>40 MB</strong> (<a href="http://royal.pingdom.com/2010/02/18/amazing-facts-and-figures-about-the-evolution-of-hard-disk-drives/">source</a>). Consumer-available RAM units didn’t break the 40 MB barrier until around 2000 (<a href="http://www.jcmit.com/memoryprice.htm">source</a>).</p>
<p>Where’s all this data coming from?</p>
<p><img src="/images/flappy_word_v1_data_01.png" alt="" /></p>
<p>The Compressed folder just contains tiny versions of the files in the Release folder, but since the game still loads and runs just fine if I delete them it’s not clear if they’re used at all.</p>
<p><img src="/images/flappy_word_v1_data_02.png" alt="" /></p>
<p>Within the Release folder the biggest file by a long way is <strong>build.js</strong>, which I believe contains engine code, game logic code, and so on all compiled into JavaScript. No text file should be this large. <a href="http://www.sublimetext.com/">Sublime Text</a> can’t seem to open it. Notepad struggles. <a href="https://notepad-plus-plus.org/">Notepad++</a> craps itself when you try to scroll down through the wall of whitespace-less code.</p>
<p>I guess that if I were to simply write this game in JavaScript the all the source files put together would amount to a tiny fraction of this 20 MB monolith. It might take a bit longer to make because I’m not exactly experienced in JS, but this is not a complicated game and it doesn’t need a heavyweight engine like Unity backing it up. I don’t think I can control the size of the builds.js file that Unity creates, but I’ll certainly look into it.</p>
<p><img src="/images/flappy_word_v1_data_03.png" alt="" /></p>
<p>So what’s in the asset-containing file, <strong>builds.data</strong>? It accounts for almost 20% of the folder size, and in this case I actually can control how much space it takes up.</p>
<p>I’ve changed the game a little bit since v1, but if I launch Unity, rebuild the game and look at the editor log I get to look at a breakdown of the assets which the game uses. Unused assets are stripped out of the build.</p>
<p><code>
1.1 mb 17.1% Assets/Resources/dictionary.txt<br />
717.7 kb 11.1% Assets/COURBD.TTF<br />
52.5 kb 0.8% Assets/Blast-SoundBible.com-2068539061.wav<br />
25.3 kb 0.4% Resources/unity_builtin_extra<br />
24.8 kb 0.4% Assets/Typewriter SFX/Stereo/Tab 1.wav<br />
6.4 kb 0.1% Assets/Typewriter SFX/Stereo/Key 04.wav<br />
...
</code></p>
<p>The biggest space-hog by a long way is the dictionary, but even then 1.1 MB isn’t much to worry about. There are probably smarter ways to handle the dictionary file that I haven’t had time to figure out yet. Currently the entire thing is loaded into memory for fast access and to sort it by word length, which my gut tells me is better than doing a bunch of file reading operations every time I need to get a new word.</p>
<p>My next question is how much the game actually takes up in memory. If I run it in the Unity editor and look at the profiler, I get this:</p>
<p><img src="/images/flappy_word_v1_data_04.png" alt="" /></p>
<p><strong>472 MB</strong>. It seems like a large amount of space, but this is running unoptimized in the editor, after all. How much memory is it using when it runs in the browser? Chrome’s task manager says the tab with Flappy Word running in it sits at around <strong>230 MB</strong> or so, meaning the game uses less memory in release than it does in the editor, as you’d expect. I haven’t found a way to see the game’s exact memory usage in the browser yet. Still, looking back at our RAM-capacity-over-time stats… it’s a lot.</p>
<p>Another technical issue others have reported and that I’ve seen for myself is a certain amount of input lag or choppiness in framerate from time to time. I think this might just be Unity’s WebGL player’s fault. There might be ways I can improve it.</p>
<p>Anyway. That’s all very interesting and the biggest problems seem outside my control. What about the actual game?</p>
<p>##The Actual Game</p>
<ul>
<li>The first negative that came up was people not realising what they were supposed to do. Coupled with the fact that the game didn’t have focus by default so their keyboard input did nothing until they clicked on it, this made for a pretty confusing first impression. I can solve this pretty easily just by putting in a tutorial prompt right at the beginning.</li>
<li>People seemed to like the little boost you get with each letter typed because it “adds complexity without adding new interactions”, as one person said. I chucked it in when I thought of it at the last minute and found it made every keypress mechanically meaningful, which I like, so I’m glad others like it. I think the strength of the boost, a long with a lot of other parameters, needs tweaking.</li>
<li>The ramp from short words to allowing longer ones feels about right.</li>
<li>The typewriter sounds were a good call.</li>
<li>People seem to be into the idea of a typing game which isn’t just about typing fast (like <em>Typing of the Dead</em>).</li>
<li>Profanity is good. Because the game starts off with only short words and most rude words are short, the ratio of rude words is abnormally high at the beginning. “In the last ~15 minutes I’ve had ‘penis’ twice and ‘phalli’ once.” I played the game last night and literally the first word that came up was ‘anus’.</li>
</ul>
<p>So that’s where <em>Flappy Word</em> is at the moment.</p>
<p><img src="/images/connor_enabling.png" alt="" /></p>
Flappy Word v12015-10-23T00:00:00+00:00http://rachelnertia.github.io/2015/10/23/flappy-word-v1<p>Here’s a little game I’ve been making over the last few weeks because the name popped into my head one day. I’ve put it behind a break because otherwise it autoplays.</p>
<!--more-->
<p>Type the words that come up to flap.</p>
<iframe src="https://googledrive.com/host/0B7qrbyhEE5SeN0tka3BWQ296R2M" width="650" height="490" scrolling="no" frameborder="0"></iframe>
<p>There’s still a few things I want to do to it, and a bunch of questions I haven’t answered about the mechanics, look and feel of the thing, but… maybe by this point I’ve spent a bit too much time on what is essentially a joke <em>Flappy Bird</em> pseudo-clone?</p>
<p>I think it’s way too easy at the moment.</p>
<p>EDITED 14/12/2015: The game iframe references a Google Drive folder instead of one on this website.</p>
Test Images2015-10-21T00:00:00+00:00http://rachelnertia.github.io/2015/10/21/images<p>This is just a test post to see if I can host images on this interblog.</p>
<p>Here should be a photograph I took of one of the wind turbines on my dad’s farm:</p>
<p><img src="/images/wind_turbine.jpg" alt="wind turbine" title="Wind turbines are awesome." /></p>
<p>Here should be an animated gif:</p>
<p><img src="/images/redline.gif" alt="Redline" title="You're just a voice, pal. You don't know a god damn thing about blogging!" /></p>
The Martian2015-10-10T00:00:00+00:00http://rachelnertia.github.io/2015/10/10/the-martian<iframe width="560" height="315" src="https://www.youtube.com/embed/ej3ioOneTy8" frameborder="0" allowfullscreen=""></iframe>
<p><br /></p>
<p>Review in one sentence: Ridley Scott’s <em>The Martian</em> is really really good, and you should go see it.</p>
<p>The setup is simple: a near-future NASA mission puts humans on Mars for the first time, but a storm forces them to bring a premature end to their expedition and take off. During their rush to escape astronaut Mark Watney, played by Matt Damon, is separated, presumed dead and left behind - but he survives. The film is about him using his wits to survive long enough to be rescued.</p>
<p>It’s a long shot. Fractally the story sets up impossible-seeming challenges, then its characters procedurally beat them. Watching Watney and co. come up with solutions to their problems is like watching <em>Iron Man</em> invent his suit but with actual science.</p>
<p>There’s a lot of humour and warmth in there, too, in a film that could be very cold and remote. Mark Watney’s smug intellect sets him up to be unapproachable, but it’s balanced by the sense of humour he has about the immense gravity of his situation. That kind of describes the film as a whole - all the dense brainy stuff is kept afloat by joke after joke.</p>
<p>There’s a lot of <em>everything</em> in this film, to be honest. It’s got drama which never feels forced or artificial. It’s got detailed yet economical descriptions of how things work. It’s got hundreds of little insights into how different smart people think. It’s got a large and diverse cast in terms of race, gender and age - all talented and all on top form<sup id="fnref:fn-1" role="doc-noteref"><a href="#fn:fn-1" class="footnote" rel="footnote">1</a></sup>. And it’s not just about Americans, either, like so many US-aggrandising space films.</p>
<p>Music-wise the original pieces of the soundtrack reminded me a lot of <em>Moon</em> - no bad thing - while the rest is like a rapid current of upbeat retro pop intermittently unleashed with excellent pacing, <em>Guardians of the Galaxy</em>-style. You <em>will</em> bop along to at least one of the songs in this movie. It’s cheesy as hell and the film owns it, acknowledging it with just the right amount of irony.</p>
<p>It has <em>that</em> shot of the NASA control centre right at the moment when it erupts with joy and papers fly into the air for some reason. When was the last time you saw <em>that</em> in a movie?</p>
<p><em>The Martian</em> is the optimistic, visionary sci-fi movie I think my subconscious has been screaming out for. A near-perfect balance of details and drama. It’s a must-see.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:fn-1" role="doc-endnote">
<p>Can I just take a moment to say that I think <a href="http://www.imdb.com/name/nm1567113/?ref_=tt_cl_t2">Jessica Chastain</a> is fantastic? Especially in this film. <a href="#fnref:fn-1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Calculus in Lua2015-10-05T00:00:00+00:00http://rachelnertia.github.io/programming/2015/10/05/calculus-in-lua<p>Lately I unearthed a file named ‘maths.lua’ which I’ve had sitting around on my hard drives for about two years. It contains a very small library of maths functions, most of which are to do with calculus. I remember writing these functions after learning numerical methods for <a href="https://en.wikipedia.org/wiki/Numerical_integration">integration</a> and <a href="https://en.wikipedia.org/wiki/Numerical_differentiation">differentiation</a> and while I was enthusiastically getting to grips with the <a href="http://www.lua.org/">Lua</a> programming language<sup id="fnref:1" role="doc-noteref"><a href="#fn:1" class="footnote" rel="footnote">1</a></sup>. It was satisfying to translate the knowledge I had picked up into code rather than just having it sit in my head waiting to be remembered badly when the exam came around, assuming there even was a question involving them, which there probably wasn’t.</p>
<p>Here are some cool things about functions in Lua:</p>
<ul>
<li>They can output multiple return values.</li>
<li>They can receive a variable number of arguments.</li>
<li>They can be anonymous.</li>
<li>They can be defined within other functions and can access variables of their enclosing functions, which is called ‘lexical scoping’.</li>
<li>Tail calls are done properly, meaning that if a function returns by calling another function, the program will not go back to the first function after the second is complete only to exit it. Hence tail calls can’t overflow the stack.</li>
<li>Finally, they’re first-class values, so they can be stored in variables, passed as arguments to other functions and returned by other functions as output.</li>
</ul>
<p>All the calculus functions I wrote take advantage of the last feature on that list, as it makes the conceptual jump from ‘mathematical functions’ to ‘programming language functions’ small, where in other languages like C++ the gap can be quite large. This is easiest to show by example. This Lua function takes another function f(x) and returns a new function which, when called, will return an approximate value for the derivative f’(x):</p>
<figure class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="c1">-- Approximates the derivative of a function by obtaining </span>
<span class="c1">-- the forward difference.</span>
<span class="c1">-- f: A function of x (e.g. f(x) = x^2).</span>
<span class="c1">-- delta: The interval used in the approximation.</span>
<span class="n">approx_derivative</span> <span class="o">=</span> <span class="k">function</span> <span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">delta</span><span class="p">)</span>
<span class="kd">local</span> <span class="n">delta</span> <span class="o">=</span> <span class="n">delta</span> <span class="ow">or</span> <span class="mf">1e-4</span>
<span class="k">return</span> <span class="k">function</span> <span class="p">(</span><span class="n">x</span><span class="p">)</span>
<span class="k">return</span> <span class="p">(</span><span class="n">f</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">delta</span><span class="p">)</span> <span class="o">-</span> <span class="n">f</span><span class="p">(</span><span class="n">x</span><span class="p">))</span><span class="o">/</span><span class="n">delta</span>
<span class="k">end</span>
<span class="k">end</span></code></pre></figure>
<p>To show this in action, here’s a function which cubes its input value.</p>
<figure class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="k">function</span> <span class="nf">cube</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
<span class="k">return</span> <span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">;</span>
<span class="k">end</span></code></pre></figure>
<p><code>print(cube(2))</code> gives us 8. <code>fdash = approx_derivative(cube)</code> stores the function generated by <code>approx_derivative</code> in <code>fdash</code>. Now I’ve done that, I can call <code>fdash(x)</code>, which should return 3x<sup>2</sup>.</p>
<figure class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="o">></span> <span class="nb">print</span><span class="p">(</span><span class="n">fdash</span><span class="p">(</span><span class="mi">2</span><span class="p">))</span>
<span class="mi">12</span><span class="p">.</span><span class="mi">000600010023</span></code></pre></figure>
<p>3 * 2 * 2 = 12. The output isn’t quite right, because it’s an approximate, but it’s close enough.</p>
<p>The reason I dug this file up is because our coursework for this year’s Applied Mathematics module involves using the classical fourth-order Runge-Kutta (<a href="https://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods#The_Runge.E2.80.93Kutta_method">RK4</a>) algorithm to numerically solve some ordinary differential equations as part of a dynamics solution. And I distinctly remembered writing a Lua implementation of the algorithm, even though I didn’t remember at all what the algorithm was or even what it did. And lo, here it is:</p>
<figure class="highlight"><pre><code class="language-lua" data-lang="lua"><span class="c1">-- 'classical' 4th-order Runge-Kutta, or 'RK4'</span>
<span class="n">runge_kutta</span> <span class="o">=</span> <span class="k">function</span> <span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">timestep</span><span class="p">)</span>
<span class="kd">local</span> <span class="n">timestep</span> <span class="o">=</span> <span class="n">timestep</span> <span class="ow">or</span> <span class="mi">0</span><span class="p">.</span><span class="mi">1</span>
<span class="k">return</span> <span class="k">function</span> <span class="p">(</span><span class="n">start_x</span><span class="p">,</span> <span class="n">start_y</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
<span class="kd">local</span> <span class="n">x</span> <span class="o">=</span> <span class="n">start_x</span>
<span class="kd">local</span> <span class="n">y</span> <span class="o">=</span> <span class="n">start_y</span>
<span class="kd">local</span> <span class="n">t</span> <span class="o">=</span> <span class="n">time</span>
<span class="c1">-- loop until i >= t</span>
<span class="k">for</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="n">timestep</span> <span class="k">do</span>
<span class="kd">local</span> <span class="n">k1</span> <span class="o">=</span> <span class="n">f</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
<span class="kd">local</span> <span class="n">k2</span> <span class="o">=</span> <span class="n">f</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="p">(</span><span class="n">timestep</span><span class="o">/</span><span class="mi">2</span><span class="p">),</span> <span class="n">y</span> <span class="o">+</span> <span class="p">(</span><span class="n">timestep</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span><span class="o">*</span><span class="n">k1</span><span class="p">)</span>
<span class="kd">local</span> <span class="n">k3</span> <span class="o">=</span> <span class="n">f</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="p">(</span><span class="n">timestep</span><span class="o">/</span><span class="mi">2</span><span class="p">),</span> <span class="n">y</span> <span class="o">+</span> <span class="p">(</span><span class="n">timestep</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span><span class="o">*</span><span class="n">k2</span><span class="p">)</span>
<span class="kd">local</span> <span class="n">k4</span> <span class="o">=</span> <span class="n">f</span><span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="n">timestep</span><span class="p">,</span> <span class="n">y</span> <span class="o">+</span> <span class="n">timestep</span><span class="o">*</span><span class="n">k3</span><span class="p">)</span>
<span class="n">y</span> <span class="o">=</span> <span class="n">y</span> <span class="o">+</span> <span class="p">(</span><span class="n">timestep</span><span class="o">/</span><span class="mi">6</span><span class="p">)</span><span class="o">*</span><span class="p">(</span><span class="n">k1</span> <span class="o">+</span> <span class="mi">2</span><span class="o">*</span><span class="n">k2</span> <span class="o">+</span> <span class="mi">2</span><span class="o">*</span><span class="n">k3</span> <span class="o">+</span> <span class="n">k4</span><span class="p">)</span>
<span class="n">x</span> <span class="o">=</span> <span class="n">x</span> <span class="o">+</span> <span class="n">timestep</span>
<span class="k">end</span>
<span class="k">return</span> <span class="n">y</span>
<span class="k">end</span>
<span class="k">end</span></code></pre></figure>
<p>Having done this already gives me a bit of a head start on my coursework (hopefully), but I might have to adapt it to another language. It’s cool that it’s there, anyway. Thanks, past me!</p>
<p>It might seem like this blog post is ending rather abruptly, but I really need to get on with other things - I’ll tidy the maths.lua file up and post it on Gist or something soonish as it could be a useful resource for others looking to learn Lua.</p>
<p>Note to self: posts involving maths will be much nicer once I’ve set up MathJax. I’d better get on with that.</p>
<div class="footnotes" role="doc-endnotes">
<ol>
<li id="fn:1" role="doc-endnote">
<p>I’m still pretty keen on it, I just don’t have much use for it at the moment. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↩</a></p>
</li>
</ol>
</div>
Initial Post2015-09-23T00:00:00+00:00http://rachelnertia.github.io/2015/09/23/initial-post<p>Hi! This is my attempt to create a blog and portfolio site using <a href="https://jekyllrb.com/">Jekyll</a> with hosting provided by <a href="https://pages.github.com/">GitHub Pages</a>. Doing things this way rather than the WYSIWYG way appeals to my inner coder; I have as much control as I want, rather than being restricted by the finicky interfaces provided by Weebly or WordPress or Blogger or any one of the many different free, easy-to-use blogging/site-creation options I’ve tried over the years. It might be trickier, but really there’s nothing I can’t get used to, and it’s good experience for someone who’s never really done any web development before. I’m using <a href="https://github.com/poole/poole">Poole</a> as my starting point, following the example of <a href="http://joshualande.com/jekyll-github-pages-poole/">this guy</a>.</p>
<p>There’s some things I want to get set up and working:</p>
<ul>
<li>Disqus comments</li>
<li>Google Analytics</li>
<li>Hook up the domain name I registered with this site</li>
</ul>
<p>Then I want to fiddle with the theme a lot until it suits my tastes. Keep it clean and simple, but give it a bit more flavour.</p>
<p>Also, portfolio things. I’m not sure what that will look like, maybe a page for each project, linked to from a ‘Portfolio’ page? I guess I’ll just make it up as I go along!</p>