<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Cowleyfornia Studios</title>
    <description>Cowleyfornia Studios&apos; blog</description>
    <link>https://cowleyforniastudios.com/</link>
    <atom:link href="https://cowleyforniastudios.com/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Mon, 10 Aug 2026 08:47:22 +0000</pubDate>
    <lastBuildDate>Mon, 10 Aug 2026 08:47:22 +0000</lastBuildDate>
    <generator>Jekyll v4.4.1</generator>
    
      <item>
        <title>Introducing Eyot - A programming language where the GPU is just another thread</title>
        <description>&lt;p&gt;&lt;a href=&quot;https://github.com/steeleduncan/eyot&quot;&gt;Eyot&lt;/a&gt; is a new language I’m building to make offloading work to the GPU as seamless as spawning a background thread.&lt;/p&gt;

&lt;p&gt;Eyot source code is transparently compiled for both CPU and GPU, with communication between the two handled by the runtime. Traditional GPU programming expects you to handle many tasks, such as memory allocation, compiling the kernel, scheduling work, etc. These have long been handled by a language runtime when writing code for the CPU, and Eyot extends that convenience to code destined for the GPU as well.&lt;/p&gt;

&lt;p&gt;The intended users are those in areas where the GPU or other accelerators are used heavily, e.g. game development, numerical analysis and AI.&lt;/p&gt;

&lt;p&gt;It is early days for Eyot. It is not ready for real work, but you can experiment with it, and if you do, I’d love to hear your thoughts. To take a simple example (available in the &lt;a href=&quot;https://eyot-playground.cowleyforniastudios.com#blog-example-1&quot;&gt;playground&lt;/a&gt;)&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;fn square(value i64) i64 {
   print_ln(&quot;square(&quot;, value, &quot;)&quot;)
   return value * value
}

cpu fn main() {
    // 1. call it directly
    print_ln(&quot;square(2) on cpu = &quot;, square(2))

    // 2. call it as a worker running on cpu
    let cpu_worker = cpu square
    send(cpu_worker, [i64]{ 3 })
    print_ln(receive(cpu_worker))

    // 3. call it as a worker running on the gpu
    let gpu_worker = gpu square
    send(gpu_worker, [i64]{ 4, 5, 6 })
    print_ln(receive(gpu_worker))
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;First, this declares the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;square&lt;/code&gt; function which takes and returns a 64 bit integer. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt; then calls this in 3 different ways that illustrate Eyot’s distinguishing feature&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;square&lt;/code&gt; function is called as you’d expect, directly, and on the CPU&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;A &lt;em&gt;CPU worker&lt;/em&gt; is created from the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;square&lt;/code&gt; function (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;let cpu_worker = cpu square&lt;/code&gt;). This worker processes values sent to it with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;send&lt;/code&gt; function on a background CPU thread. After squaring the number, the worker returns it through the call to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;receive&lt;/code&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;This time a &lt;em&gt;GPU worker&lt;/em&gt; is created rather than a CPU &lt;em&gt;worker&lt;/em&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;let gpu_worker = gpu square&lt;/code&gt;). This causes the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;square&lt;/code&gt; function to be compiled as a kernel, and run on the GPU, otherwise it acts identically. As you can see Eyot’s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;print_ln&lt;/code&gt; works GPU-side&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;motivation&quot;&gt;Motivation&lt;/h3&gt;

&lt;p&gt;I’ve worked on many projects where shifting computation to the GPU presented an obvious path to better performance that got ignored due to the difficulty of doing so. These projects were not just in obvious areas like computer vision or game development, but also in unlikely matches for GPU programming, like desktop application development.&lt;/p&gt;

&lt;p&gt;For example, back when I worked on Texifier, a macOS LaTeX editor, I adjusted the venerable TeX typesetting system to output polygons directly into GPU memory, rather than writing a PDF. This reduced latency far enough that we could update the output in real time. The feature was popular, but the difficulty of making it work left me questioning if the project was worth it.&lt;/p&gt;

&lt;p&gt;With Eyot I want to build a language where working on the GPU is ingrained so deeply in the language’s design that it becomes trivial. For a long time we have thought about the CPU/OS combination as something that runs our code, rather than a device to be manipulated. Eyot simply extends this to the GPU. Options like CUDA exist already, but with Eyot the intention is to build the entire language around that model of GPU concurrency.&lt;/p&gt;

&lt;h3 id=&quot;current-status&quot;&gt;Current status&lt;/h3&gt;

&lt;p&gt;Progress is slow as I work on this in my spare time (sponsors appreciated!), and I’ve recently had a break with the arrival of a new baby, but my major roadmap items are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Rendering&lt;/strong&gt; Eyot facilitates access to the GPU for computational purposes only at this stage. Game development is a big target for this project, so rendering support is high on my wishlist. I’m hoping to do this using Vulkan, and simultaneously replace OpenCL in favour of Vulkan compute&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Syntax&lt;/strong&gt; I’ve deferred development of Eyot’s syntax so I can experiment with the CPU/GPU interaction without adding language features that would not be viable in both cases. Major missing syntax features for me are Algebraic Data Types, Lambdas and some form of interface/trait style polymorphism&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;GPU Memory management&lt;/strong&gt; There is a lot of work here. Vectors and strings can only be allocated CPU-side, this is something that should work on the GPU, I’d also like the memory manager to be able to transparently shift allocations to shared buffers when appropriate&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt; Following the principle of &lt;em&gt;Make it work, make it right, make it fast&lt;/em&gt; mantra, I will probably leave this for the immediate future, but it would be nice to throw real workloads at Eyot soon and get them up to speed&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Standard library&lt;/strong&gt; This doesn’t need improving, I have only a handful of functions, it needs starting…&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is also useful to state some things I will not be working on&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Automatic parallelisation&lt;/strong&gt; Eyot does not, and will not, automatically parallelise work across CPU/GPU cores. The intention is to be a convenient option for distributing work across processors, not reduce control.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Theoretically optimal performance&lt;/strong&gt; Eyot is not intended as a total replacement for current GPGPU libraries any more than C and C++ are intended as a total replacements for Assembly. I would consider significant performance deviations between Eyot code and equivalent C/Vulkan code to be a bug, but for me ease of use is an acceptable price to pay for some performance penalties&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Being the next great general purpose language&lt;/strong&gt; There will be as few syntax differences between GPU and CPU as possible, so the language design will be bound by the GPU capabilities, which may restrict what I can add to Eyot’s syntax&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks for reading. You can learn more about Eyot from &lt;a href=&quot;https://steeleduncan.github.io/eyot/&quot;&gt;its documentation&lt;/a&gt; and &lt;a href=&quot;https://github.com/steeleduncan/eyot&quot;&gt;source code&lt;/a&gt;. If you want to try it, there is the &lt;a href=&quot;https://eyot-playground.cowleyforniastudios.com#hello-world&quot;&gt;playground&lt;/a&gt;, or you can &lt;a href=&quot;https://github.com/steeleduncan/eyot/?tab=readme-ov-file#how-to-try-it&quot;&gt;install Eyot on your machine&lt;/a&gt;.&lt;/p&gt;

</description>
        <pubDate>Sun, 08 Mar 2026 00:00:00 +0000</pubDate>
        <link>https://cowleyforniastudios.com/2026/03/08/announcing-eyot/</link>
        <guid isPermaLink="true">https://cowleyforniastudios.com/2026/03/08/announcing-eyot/</guid>
        
        
      </item>
    
      <item>
        <title>Why I wrote a commercial game in C in 2025</title>
        <description>&lt;p&gt;For the last few years we’ve been working on a train management game, Iron Roads, &lt;a href=&quot;https://store.steampowered.com/app/2171550/Iron_Roads/&quot;&gt;which we released to Early Access&lt;/a&gt; today. Somewhat atypically for a game releasing in 2025, Iron Roads is written in pure C, not C++, pure C99. As a choice it has had its ups and downs, which I wanted to share in this post.&lt;/p&gt;

&lt;p&gt;The TLDR for why I chose C is that I wanted easy portability and simplicity, but most importantly I wanted clarity over what my code was doing. I wanted to know where it was allocating memory, where performance problems were likely to arise, and I was willing to pay a considerable price to work in a language that doesn’t obscure those details at all.&lt;/p&gt;

&lt;h2 id=&quot;the-requirements-ie-the-game&quot;&gt;The requirements, i.e. the game&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/images/games/ironroads/screenshots/1-cover-1080p.png&quot; alt=&quot;Iron roads screenshot&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Clearly any technical decision should be a function of the game being written.&lt;/p&gt;

&lt;p&gt;Iron roads is a 2D train simulation game. Our focus when developing has been the gameplay arising from optimising a complex network of tracks with a large number of trains. Additionally, we’ve always wanted this to be a game that is portable to all platforms, and accessible to a wide range of players. Technically, this means:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The graphics code would be simple. Unlike a 3D game there would be no need for linear algebra, or the operator overloading that tends to be useful in in that case&lt;/li&gt;
  &lt;li&gt;The simulation code would not be as simple. The pathfinding calculations are complex, run frequently, and I knew I would spend a lot of time optimising the engine to support large numbers of trains&lt;/li&gt;
  &lt;li&gt;It would need to be portable to a wide range of platforms. An unfortunate quirk of developing games is that the SDKs for some of the platforms you target lie beyond an NDA. This has the unfortunate effect that most programming languages that are popular choices on desktop platforms, have not been ported&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;other-languages-i-tried&quot;&gt;Other languages I tried&lt;/h2&gt;

&lt;p&gt;In a technical sense Iron Roads has followed a winding path to its final form, starting from a series of partial prototypes. In total there were four in three languages: Go, Haskell and Rust.&lt;/p&gt;

&lt;p&gt;Haskell was the most interesting of these experiments, and worth a blog post of its own. Personally, I wish it had worked out because it was a lot of fun to work on. Unfortunately the requirements of a high frequency game loop seemed to be too much at odds with idiomatic Haskell code to work out for me. Before long every function I wrote seemed to be over the IO monad, and it stopped feeling like Haskell code at all.&lt;/p&gt;

&lt;p&gt;Go and Rust were more viable choices, and it is not hard to see myself having written Iron Roads in either of them. Unfortunately they share with Haskell the difficulty of porting the language runtime to a console, and no ports seem to be publicly available. As mentioned above, the NDAs mean that very few languages have first class support for console platforms, and Go, Rust and Haskell are not among those that do.&lt;/p&gt;

&lt;p&gt;There are cases where a language has been ported by some energetic individual. To get access you would need to persuade that individual you have also signed the NDA. Often you get access, but the upstream project likely wouldn’t, so there is no guarantee that breaking changes won’t appear upstream at any time, leaving the NDAd fork behind.&lt;/p&gt;

&lt;p&gt;C/C++ are provided by all platform owners, so they are safe choices, and C# has enough corporate momentum behind it to more or less guarantee a port, but beyond that the only languages I felt confident I could rely on being available were those that embed in C, like Lua, or those that compile to it, like Nim (aka the prototype I regret not writing!).&lt;/p&gt;

&lt;h2 id=&quot;lua&quot;&gt;Lua&lt;/h2&gt;

&lt;p&gt;I should come clean that saying I wrote Iron Roads in C is a lie. Iron Roads is written in C and Lua.&lt;/p&gt;

&lt;p&gt;Lua, for those who are not familiar with it, is a scripting language designed to be easily embeddable in other applications, and is commonly used in games for that purpose. I wrote the lower level code that runs every video or simulation tick in C (approx 40k sloc), but a lot of higher level game logic, including all the level specific code, is in Lua (approx 8k sloc).&lt;/p&gt;

&lt;p&gt;This structure seems almost an inevitable outcome for a game written in C. &lt;a href=&quot;https://en.wikipedia.org/wiki/Greenspun%27s_tenth_rule&quot;&gt;Greenspun’s tenth rule&lt;/a&gt; states that any sufficiently complex C program contains a partial implementation of Common Lisp, but in the gamedev world it would be more accurate to say that any sufficiently complex game in C/C++ contains Lua, and Iron Roads is no exception.&lt;/p&gt;
&lt;h2 id=&quot;why-not-c&quot;&gt;Why not C++?&lt;/h2&gt;

&lt;p&gt;An immediate question for someone working in C is why they are not working in C++?&lt;/p&gt;

&lt;p&gt;Given that I always knew I’d be writing the “content” in Lua, my priority for the C code was to build a highly efficient and reliable engine for routing trains, ticking their positions, and rendering it all. The routing engine especially is a non-trivial piece of logic, and from the start I have been worried about its efficiency.&lt;/p&gt;

&lt;p&gt;When profiling previous games I wrote in C++ to improve their performance I would often find STL containers as the root of a performance issue, only to have to rewrite those segments of code to an optimised pure C equivalent.&lt;/p&gt;

&lt;p&gt;There is nothing wrong with those containers, or their implementation, but they hide the dynamic memory allocation and de-allocation they carry out for you. It is their greatest feature, however it becomes easy to write code that looks like it should be efficient, but is not. I personally found working in C to help with this problem!&lt;/p&gt;

&lt;p&gt;I was also tired of the compilation speed of C++. I’ve never worked with a C++ codebase that is quick to compile.&lt;/p&gt;

&lt;p&gt;When writing a game, especially when covering the roles of both designer and programmer, a lot of my time is spent in a loop of playing the game, finding something to change, changing it, and playing again. I strongly believe that speeding up this iteration loop improves my process enough to have an observable effect on the quality of the game I am writing.&lt;/p&gt;

&lt;p&gt;Generalisations are never accurate, but I find that idiomatic C++ tends to take longer to compile than the equivalent idiomatic C code. This was a huge vote in favour of C for me for Iron Roads.&lt;/p&gt;

&lt;p&gt;Finally, C’s struct literals are incredible. I have no explanation for why they never made it to C++.&lt;/p&gt;

&lt;h2 id=&quot;successes&quot;&gt;Successes&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Fast Compilation&lt;/strong&gt; Iron Roads builds quickly, so I can iterate fast, and in this way C has helped my workflow a lot&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Optimisation is easy&lt;/strong&gt; In general I found the performance of the code I wrote to be “unsurprising”. There are very few “invisible” side effects in C, so it was easy to understand what would incur a performance or memory penalty, and avoid it&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Minimal issues porting&lt;/strong&gt; It is not that C is perfectly cross-platform. Clearly it isn’t, and the many shims in codebase attest to that. However I’ve never run into any platform where it is &lt;em&gt;impossible&lt;/em&gt; to port C, which is great&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real success though, is that for me choosing C was part of a broader pattern of choosing the most straightforward tech possible to build Iron Roads. Possibly I just can’t be trusted to write C++, but this has been great for readability and performance of the codebase, and great for keeping me focussed on the game I am writing rather than the technology I am using to write it.&lt;/p&gt;

&lt;h2 id=&quot;failures&quot;&gt;Failures&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Serialisation&lt;/strong&gt; Compared to serialisation in almost any modern language, serialising state in C (or C++) is excruciating. There are no reflection capabilities in C, and minimal capabilities in C++, so you need to manually specify each and every field when serialising or deserialising the game state&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Boilerplate&lt;/strong&gt; This seems almost too obvious to point out, but strings, arrays, dictionaries, etc in C require a lot of boilerplate. This strings problem was mildly annoying when the game was only in English, but it become more serious when we localised the game to Chinese&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Runtime issues&lt;/strong&gt; Valgrind and asan are amazing, and it is hard to imagine having written the game without them, but they pick up issues at runtime that other languages flag at compile time&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;In truth I’m not sold on writing games in C, and I don’t think I’d repeat the process. I’m happy with the outcome both codewise, and designwise, but the process of getting there was needlessly difficult.&lt;/p&gt;

&lt;p&gt;I don’t see much point in returning to C++, but I am very interested in experimenting with modern, higher level languages that compile to C. I think the first prototype of my next game will be written in Nim!&lt;/p&gt;
</description>
        <pubDate>Mon, 20 Jan 2025 00:00:00 +0000</pubDate>
        <link>https://cowleyforniastudios.com/2025/01/20/choosing-c/</link>
        <guid isPermaLink="true">https://cowleyforniastudios.com/2025/01/20/choosing-c/</guid>
        
        
      </item>
    
      <item>
        <title>Perceivable consequence, or why we reworked Iron Roads&apos; new townscreen</title>
        <description>&lt;p&gt;Iron Roads has seen influx of new testers recently, and with them have arrived new perspectives and feedback.
This feedback has kicked off a new cycle of worrying, analysing and fixing &lt;a href=&quot;/2023/12/18/thematic&quot;&gt;as we described in our last blog&lt;/a&gt;.
This time we aren’t worried so much about the systems in the game, so much as we are worried about whether we are communicating those systems to players effectively.&lt;/p&gt;

&lt;p&gt;A lot of the feedback has been of the form “I had fun playing, but can you explain why X happened when I did Y”.&lt;/p&gt;

&lt;p&gt;This represents an issue we need to address.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Perceivable Consequence&lt;/em&gt; is the formal term for this concept.
It was defined by &lt;a href=&quot;https://www.gamedeveloper.com/design/formal-abstract-design-tools&quot;&gt;Doug Church&lt;/a&gt; as “A clear reaction from the game world to the action of the player” (Errant Signal made a &lt;a href=&quot;https://www.youtube.com/watch?v=XfFteTrAvZw&quot;&gt;good video essay about it&lt;/a&gt;).
It is important because for a player’s choice to feel meaningful, it must to be obvious what the consequences of that choice would be.
So, without Perceivable Consequence there can be no meaningful choices on the part of the player, and their agency in the world is reduced.&lt;/p&gt;

&lt;p&gt;To be clear: I am only discussing management/simulation games here. There are many reasons why one may wish to break this rule in other genres, but they are not relevant here.
In management/simulation games, the core loop consists of players observing the state of the game’s system with some goal in mind, thinking about how to achieve that goal, and then making changes resulting from their analysis.
It is a design based on the idea that players are able to predict the results of their actions.
If not, the game loop falls apart.&lt;/p&gt;

&lt;p&gt;This isn’t to say it should always be easy to achieve goals, or that there should never be surprises, but ideally any surprise arises due to players’ not yet knowing the game’s full systems, rather than a lack of predictability in the game.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://assets1.ignimgs.com/2014/04/24/ds2gif-a29b76.gif&quot; alt=&quot;Hidden enemy pushes you off a ledge in Dark souls&quot; /&gt;&lt;/p&gt;

&lt;p&gt;To take a non-management game example: anyone who has played Dark Souls has likely been pushed off a ledge by a hidden enemy.
It is annoying when it happens the first time, but you respawn, return to that point, avoid the enemy this time, collect the souls you lost and continue - no harm done.
However if that enemy were randomly placed, or you weren’t able to recollect your souls, your death would be unpredictable, unavoidable and unfixable.
The game would cease to be fun, and instead it would be random and annoying.&lt;/p&gt;

&lt;p&gt;This is all well and good, but what does it mean for Iron Roads?
We are slowly reworking UI screens, trying to bring all the information you might need about your train network to the surface in a consistent way.
If you are struggling to achieve a task, we want you to know why.&lt;/p&gt;

&lt;p&gt;For example, this week we worked on town growth.&lt;/p&gt;

&lt;p&gt;Very early testers might remember the Economic activity bar on the town information screen.
It showed how much was going on in the town, and when it the bar became full, the town would grow. The problem was that it was not at all obvious where these numbers came from.
It was a complex equation I was very proud of, and that I thought provided a good growth model for the town.
Whether or not this is true was moot. It was far too complex to explain via the  UI, so we didn’t explain it at all.
Players asked what the bar meant, we had no simple answer, so we doubled down on our mistake and hid it.&lt;/p&gt;

&lt;p&gt;Clearly this was not our finest hour.&lt;/p&gt;

&lt;p&gt;In this update we’ve replaced the town growth system with something simpler and clearer.
The town screen displays the number of passengers and cargo units that arrived in the last hour.
Alongside this is a target number of units / hour.
When you achieve this rate, the town grows, and a new, higher target is shown.
It may not be as sophisticated a growth model as before, but it is more understandable, and hopefully it could be said to be “A clear reaction from the game world to the action of the player”. You can see it below.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/blog/new-townscreen.png&quot; alt=&quot;New Townscreen&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There is a lot more to do on this front, but it has been a while since we pushed an update, so we’ve collected this along with some bugfixes, new scenario level selector art, and other UI tweaks into a release.
It is a big change, so as always, feedback is always appreciated!&lt;/p&gt;
</description>
        <pubDate>Sat, 09 Mar 2024 00:00:00 +0000</pubDate>
        <link>https://cowleyforniastudios.com/2024/03/09/townscreen/</link>
        <guid isPermaLink="true">https://cowleyforniastudios.com/2024/03/09/townscreen/</guid>
        
        
      </item>
    
      <item>
        <title>A new theme and a new mode</title>
        <description>&lt;p&gt;Our update cycles seem to begin with us worrying about Iron Roads, pinpointing the source of our uneasiness, worrying some more, working on changes to assuage our concerns, sharing the result with play-testers and iterating based on feedback.
This time was no different, and stemmed from a new worry - &lt;em&gt;does Iron Roads have a thematic identity of its own?&lt;/em&gt; - and an old worry we &lt;a href=&quot;/2023/8/30/nextfest&quot;&gt;wrote about back in August&lt;/a&gt; - &lt;em&gt;have we effectively teased out gameplay that focusses on optimisation of networks.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/blog/challenge.png&quot; alt=&quot;Challenge mode with new train&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;thematic-update&quot;&gt;Thematic update&lt;/h2&gt;

&lt;p&gt;When analysing the state of Iron Roads, we were happy with the progress we made on gameplay, but less so with how we had neglected theme and storytelling in the game.
Thematically we felt Iron Roads lacked a strong identity/narrative hook.&lt;/p&gt;

&lt;p&gt;We’ve wanted to tackle themes of development in Iron Roads for a while, after reflecting early on that we’d made a game that rewarded bulldozing the countryside and covering it in concrete and metal.
This isn’t to say we want to make a game that discourages all development, but one that asks the player to balance the needs of the society with the needs of the ecosystem that society relies on.&lt;/p&gt;

&lt;p&gt;Iron Roads is now set in a world where humans have driven themselves to extinction, leaving behind a planet being repopulated by erudite animals seeking to rebuild in way that spares them the same fate as the humans that preceded them.
Your job is to connect society again, balancing competing needs as you do so.
This fit naturally with the offbeat tone Iron Roads already had, requiring only minor updates to the contracts, artwork and descriptions.&lt;/p&gt;

&lt;p&gt;The second step is adding gameplay elements to relate this theme.
It is easy to make a game in this genre that rewards smart choices about how you build.
However, many problems with over-development are not solved by smart building, but by &lt;em&gt;not&lt;/em&gt; building. And it is harder to create a game in this genre that rewards that!&lt;/p&gt;

&lt;p&gt;To this end, the archaeological remains some may remember from the Horseshoe Isle are back. You will also notice fields scattered throughout the maps.
Building on top of these will sometimes, but not always, damage the town relying on these features.
It is only a start, but it has added an element of strategy about how you route your tracks, that we hope adds to both the gameplay and narrative.&lt;/p&gt;

&lt;h2 id=&quot;challenge-mode&quot;&gt;Challenge mode&lt;/h2&gt;

&lt;p&gt;We’ve long felt that the strongest gameplay in Iron Roads was to be found iterating on an established network, and trying to optimise it towards some goal.
For this reason we added graphs, and moved from emails to long strings of increasingly hard contracts to encourage this style of playing.
However, graphs are only useful as a tool to help the player complete an objective; they don’t encourage that objective themselves.
So we’re pretty excited to have finally added a challenge mode to Iron Roads.
You are given a fixed period of (in-game) time to transport as many passengers or cargo as possible in that time.&lt;/p&gt;

&lt;p&gt;It took us a few tries to find a challenge that worked. We even experimented with a “roguelite” survival mechanic before settling on a fixed period of in-game time.
The ‘countdown’ mechanic is easy to communicate, works well with graphs, encourages optimisation and doesn’t have the negative feeling of failing our roguelite version had. Most importantly, we both agreed that it was fun.
We love how much weight this change adds to each choice you make, and the interaction with the development mechanics discussed above: Each field destroyed is potentially a loss of customers (we say potentially because there is an element of chance or luck), and each field you choose to preserve makes it harder to build an efficient network and beat your score.&lt;/p&gt;

&lt;p&gt;We’ve set up a high score board and linked it to Iron Road’s Discord so you can compete against yourself, us as the developers, and each other on these challenges.
There are two fixed challenges in the demo, and a randomly-generated weekly challenge that rotates on Friday mornings.&lt;/p&gt;

&lt;h2 id=&quot;steam-capitalism-and-economy-fest&quot;&gt;Steam Capitalism and Economy fest&lt;/h2&gt;

&lt;p&gt;Other notable changes in this update cycle&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;We’ve begun work on a random map generator. Currently we are using this to generate the weekly challenges, but at some point we will enable the endless mode in which you can play however you wish&lt;/li&gt;
  &lt;li&gt;We’ve begun testing the mobile version. Thanks to those who have given us feedback already, and if you wish to join them please drop by the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#mobile&lt;/code&gt; channel in our &lt;a href=&quot;https://discord.com/invite/enA4zD2hJz&quot;&gt;Discord&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;UI updates. The smaller screen size of the mobile version forced us to confront some inefficiencies in our UI design. Although mobile and desktop will not be identical in all ways, we felt that most of the changes we made on mobile were improvements on the desktop version as well, and switched on both platforms. You will notice a more consistent design to dialogue boxes, a new top bar, and less reliance on tooltips to document the UI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our next event with Iron Roads is Steam’s Capitalism and Economy fest in January, and it is with the hope of gathering feedback on the changes mentioned above before this event that we are pushing 0.2.0 of the demo now.&lt;/p&gt;

&lt;p&gt;As always, we’d love to hear your thoughts, positive or negative.
Especially the latter. With some luck your comments will worry us enough that our objective for the next update becomes clearer!&lt;/p&gt;
</description>
        <pubDate>Mon, 18 Dec 2023 00:00:00 +0000</pubDate>
        <link>https://cowleyforniastudios.com/2023/12/18/thematic/</link>
        <guid isPermaLink="true">https://cowleyforniastudios.com/2023/12/18/thematic/</guid>
        
        
      </item>
    
      <item>
        <title>Emails are dead - long live contracts!</title>
        <description>&lt;p&gt;The upcoming update will remove emails from the game and replace them with a similar, but different, concept of &lt;em&gt;contracts&lt;/em&gt;.
As much as we liked the whimsy and storytelling of the emails, in practice they have some issues in Iron Roads:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Accepting an email is busywork for a player&lt;/strong&gt; We had a system of on one email for every task. We had reasoned that more than one email for a task is unnecessary reading, and no email leading to a task is confusing. However testers noted that the process of clicking through even this single mandatory email to view the task added nothing, and became especially irritating the second time through a scenario&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Hard to refuse&lt;/strong&gt; In principle you can ignore an email or not accept that task. However the personalised nature of an email nudges players to accept each associated task. This has led the scenarios down a more linear direction than we intended, and it has inhibited us from adding really challenging optional tasks&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Emails don’t display the task list they link to very well&lt;/strong&gt; This could be solved by improving emails rather than removing them, but it is an issue. Conversely, &lt;strong&gt;there is no way to associate a task with the story text that led to it&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our proposed solution to these issues is to merge the emails system and the tasks system into a single contracts system.
The old email screen becomes the contracts screen, showing a list of contracts available to the player at that point in time in the left column.
Clicking on a contract will display the contract details in the right column, showing the tasks associated with that contract, the reward, and contextual text for those who are interested in the narrative aspect.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/blog/contracts.png&quot; alt=&quot;Contracts screen WIP&quot; /&gt;&lt;/p&gt;

&lt;p&gt;With this UI we can show a choice of contracts that a player may want to accept and, critically, it allows a player to opt out of a contract they are not enjoying.
The more optional nature allows larger groups of contracts, specialising in specific areas of the game, and including harder challenges for advanced players.&lt;/p&gt;

&lt;p&gt;All of this links back to the observation in our &lt;a href=&quot;/2023/8/30/nextfest&quot;&gt;previous post&lt;/a&gt; that Iron Roads seems to play best when it is viewed as an optimisation game.
Setting up the network and getting the first few passengers moving is rewarding, and helps us tell a story, but the mechanics seem to be at their strongest when you are improving your network
Contracts place more emphasis on this phase of each scenario.&lt;/p&gt;

&lt;p&gt;Dare I say it, this update is proving to be easier to implement than the cargo update, so if all goes well it will be in your hands within the week!&lt;/p&gt;

&lt;p&gt;As always, if this interests you, join us on &lt;a href=&quot;https://discord.gg/enA4zD2hJz&quot;&gt;Discord&lt;/a&gt; to give it a try.&lt;/p&gt;
</description>
        <pubDate>Sat, 16 Sep 2023 00:00:00 +0000</pubDate>
        <link>https://cowleyforniastudios.com/2023/09/16/contracts/</link>
        <guid isPermaLink="true">https://cowleyforniastudios.com/2023/09/16/contracts/</guid>
        
        
      </item>
    
      <item>
        <title>Summer updates for Iron Roads: cargo scenario, a proper tutorial, and what the game actually is</title>
        <description>&lt;p&gt;We’ve had a busy summer with Iron Roads, with the first pre-alpha playtest in May, and Steam’s NextFest in June.&lt;/p&gt;

&lt;p&gt;After those we trawled through our &lt;a href=&quot;https://discord.gg/enA4zD2hJz&quot;&gt;Discord&lt;/a&gt;, Steam, Twitter messages and YouTube playthroughs to understand what was and wasn’t working with Iron Roads.
Based on that, we’ve been working towards the &lt;strong&gt;0.1.0&lt;/strong&gt; update, which is looking to be a significant overhaul.&lt;/p&gt;

&lt;p&gt;Two key insights we identified were problems with onboarding players, and communicating what kind of game Iron Roads sets out to be.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/games/ironroads/screenshots/1-cover-1080p.png&quot; alt=&quot;Iron Roads layout&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;the-tutorial-was-not-nearly-good-enough&quot;&gt;The tutorial was not nearly good enough&lt;/h2&gt;

&lt;p&gt;Watching streamers and Youtubers playing Iron Roads is very useful playtesting for us, as it not only lets us see everything they do, but their discussion with their chat spells out their thought process as they play.&lt;/p&gt;

&lt;p&gt;There were some great long playthroughs of Iron Roads, for example &lt;a href=&quot;https://www.youtube.com/watch?v=Hz49kRoLVLg&quot;&gt;this&lt;/a&gt; or &lt;a href=&quot;https://www.youtube.com/watch?v=OwdG7Q6rsoM&quot;&gt;this&lt;/a&gt;, but there were also a number of videos where a player tried it and gave up after a few minutes when they got stuck.&lt;/p&gt;

&lt;p&gt;The problem is that the tutorial in the demo, which in hindsight was a rushed, last-minute addition, was not very good.
It didn’t cover close to enough of the game mechanics, and it failed to familiarise the player with more complex aspects of Iron Roads, such as no stop zones and waypoints.&lt;/p&gt;

&lt;p&gt;How did this happen?
We think this blind-spot came about as many of our initial testers were from the Open TTD community, and for them Iron Roads’ minimal interface and train mechanics needed no explanation.
There is a lesson in there about selection bias when people sign up to test a game: playtesters do not necessarily represent the &lt;em&gt;average gamer&lt;/em&gt;, and feedback should be interpreted with this in mind.
It is not the fault of testers of course, so the second lesson is to just write a good tutorial for your game!&lt;/p&gt;

&lt;p&gt;Anyhow, &lt;strong&gt;0.1.0&lt;/strong&gt; will ship with what we hope is a much improved tutorial.&lt;/p&gt;

&lt;h2 id=&quot;what-is-the-game&quot;&gt;What is the game?&lt;/h2&gt;

&lt;p&gt;Another issue we picked up on from feedback is that it isn’t clear what kind of game Iron Roads wants to be.
Is it a chill game? An optimisation game? A puzzle game?&lt;/p&gt;

&lt;p&gt;Marina and I talked a lot in the early days about a train simulation with the “accessibility of Mini Metro” and the “depth of Open TTD”, but we hadn’t thought about this for a while, and we certainly hadn’t spent time articulating exactly how we’d achieve that “depth”.&lt;/p&gt;

&lt;p&gt;It took some thinking and playing, but we came to the conclusion that the greatest joy in Iron Roads is optimising networks to carry passengers faster, cheaper and in ever greater numbers.&lt;/p&gt;

&lt;p&gt;In other words: the game we had spent the last year working on was in fact an optimisation game.&lt;/p&gt;

&lt;p&gt;Looking at Iron Roads through this lens, we’ve added graphs to help players track how their network is performing. We’ve also altered the challenges in the scenarios to focus on optimisation-type tasks, and we’ve rebalanced to make it easier to edit networks without losing money.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/static/images/blog/graphs.png&quot; alt=&quot;A graph&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We realised we needed to do a much better job communicating this depth and optimisation-as-the-mainstay-of-the-game when describing it.
Presented with Iron Roads’ minimal interface and cute graphics, players can well be forgiven for thinking it is an overly-simplistic train game unworthy of their time, and painfully for us, a few did.&lt;/p&gt;

&lt;p&gt;A good example is the welcome screen, which shows a single train moving on a single line around three towns in a loop.
This is hardly an advertisement of the depth lurking beneath Iron Roads’ minimal UI.
This, along with the Steam page, press-kit, etc will all be revamped.&lt;/p&gt;

&lt;h2 id=&quot;new-content&quot;&gt;New Content&lt;/h2&gt;

&lt;p&gt;So far I’ve described the issues we’ve fixed, but we’ve also been adding new content.&lt;/p&gt;

&lt;p&gt;A common request in the Discord has been to add cargo to the game, so &lt;strong&gt;0.1.0&lt;/strong&gt; comes with a new scenario, set in a new biome (desert this time) that does just that.
The difficulties of managing a production chain have worked well with our focus on Iron Roads as an optimisation game.
You make a change to your network, stare at the production graph to see the result, and repeat until you’ve hit your target.&lt;/p&gt;

&lt;p&gt;With so many different tasks it has been a big update, and our TODO lists are not empty yet.
We hope to have things wrapped up soon though so we can send it out into the world, find out what we missed and get going on fixing it all over again!&lt;/p&gt;

&lt;p&gt;If you haven’t already, do join us on &lt;a href=&quot;https://discord.gg/enA4zD2hJz&quot;&gt;Discord&lt;/a&gt; and give it a try.&lt;/p&gt;
</description>
        <pubDate>Wed, 30 Aug 2023 00:00:00 +0000</pubDate>
        <link>https://cowleyforniastudios.com/2023/08/30/nextfest/</link>
        <guid isPermaLink="true">https://cowleyforniastudios.com/2023/08/30/nextfest/</guid>
        
        
      </item>
    
      <item>
        <title>Just the ticket</title>
        <description>&lt;p&gt;Something very exciting happened last month: Iron Roads was released into the big scary world and onto the screens of the first batch of alpha testers. What a ride it’s been (please excuse the train puns).&lt;/p&gt;

&lt;p&gt;We’ve had an enthusiastic, and unexpected, response to our call for testers. We are grateful to the lovely folks who put up with the bugs and major quality of life issues, joined our fledgling Discord community and shared their thoughts. Their feedback has changed both our short-term and longer-term roadmap, but I’ll get to that in a bit.&lt;/p&gt;

&lt;p&gt;The question of ‘will people play and enjoy my game?’ haunts every developer’s mind and until you have a playable prototype, you can never know the answer. At the same time you don’t want your early testers to get derailed (I promise I’ll stop!) from your vision because your prototype has too many placeholders and missing content. It’s a tricky balance, but we reasoned that if we wanted to create a game people wanted to play, we would need to involve them as early as possible, even though it meant putting something out there we were not entirely happy with.&lt;/p&gt;

&lt;p&gt;We aimed for a complete (ha!) version of a small slice of gameplay and posted about it on Reddit, and had a really positive response. It’s not there yet, and there’s a lot to fix, but we were particularly thrilled to find out that some people have played the demo for over eight hours. This is all very promising and makes us think that we’re on the right track (I’ll see myself out…). Below is a particularly intricate layout created during this testing (thanks to Kaigoni, who kindly gave us permission to exhibit this wonderful layout).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/blog/kaigoni-network.jpg&quot; alt=&quot;Intricate layout&quot; /&gt;&lt;/p&gt;

&lt;p&gt;So, back to the feedback and what we got up to in the last few weeks. On &lt;a href=&quot;https://discord.gg/enA4zD2hJz&quot;&gt;Discord&lt;/a&gt;, players can vote for features they would like, which helps us decide if an idea is popular and what to prioritise. After Duncan had fixed some gnarly bugs we missed when playtesting internally, we addressed some quality of life issues brought to our attention by the community. This included improving the WASD controls, adding edge scrolling, cleaning up UI issues, adding a tutorial and fixing typos. More serious changes were changing no entry zones into no-stop zones (this still needs more work) and adding waypoints to give players more control over the precise routes taken by their trains.&lt;/p&gt;

&lt;p&gt;Interestingly, there is very little overlap between what our to-do list looked like before we got tester feedback, and after. The former list veered towards tasks that are more fun for us to do, but are less of a priority for players. Things like animations, new towns and reducing train speed around corners. We will still add these, but the external voices have made us more objective with how we prioritise our time.&lt;/p&gt;

&lt;p&gt;We’ve also tried to increase Iron Roads’ visibility during the Steam Next Fest that starts today. We’ve updated our trailer and made a ‘watch devs play’ video. If you are a streamer, journalist, or just someone who would like to play Iron Roads and talk about it somewhere - even at the pub with your mates, please do get in touch. Anyone can playtest by downloading the demo on &lt;a href=&quot;https://store.steampowered.com/app/2171550/Iron_Roads&quot;&gt;Steam&lt;/a&gt; and joining our &lt;a href=&quot;https://discord.gg/enA4zD2hJz&quot;&gt;Discord&lt;/a&gt;. And consider wishlisting Iron Roads, because, you know, algorithms.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/blog/stream-still.jpg&quot; alt=&quot;Intricate layout&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Once we have recover from Next Fest, we’ll continue ticking off player requests, fixing bugs and more excitingly, developing new scenarios and generally adding new content to Iron Roads.&lt;/p&gt;
</description>
        <pubDate>Mon, 19 Jun 2023 00:00:00 +0000</pubDate>
        <link>https://cowleyforniastudios.com/2023/06/19/just-the-ticket/</link>
        <guid isPermaLink="true">https://cowleyforniastudios.com/2023/06/19/just-the-ticket/</guid>
        
        
      </item>
    
      <item>
        <title>Introducing Iron Roads</title>
        <description>&lt;p&gt;We have been working on a train management game called &lt;a href=&quot;/ironroads&quot;&gt;Iron Roads&lt;/a&gt; over the past few months.
Now that it is beyond the prototype phase and approaching its public debut at Steam’s summer NextFest, we thought it would be a good time to start a devlog.&lt;/p&gt;

&lt;div class=&quot;video-container&quot;&gt;
    &lt;iframe src=&quot;https://www.youtube.com/embed/L6EKX2LzJ4U&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Iron Roads&lt;/em&gt; is a train management game in which players lay tracks, buy trains and set their routes to establish train networks that connect people and cargo to the towns and places they need to be.
Our initial focus will be on PC platforms, but if all goes well, we hope to release on mobile platforms and, if the stars really align, consoles.&lt;/p&gt;

&lt;h3 id=&quot;with-iron-roads-we-are-aiming-to-create-a-train-management-game-with-the-deep-sandboxy-nature-of-openttd-that-is-as-easy-to-pick-up-as-a-game-like-mini-metro&quot;&gt;With &lt;em&gt;Iron Roads&lt;/em&gt; we are aiming to create a train management game with the deep sandboxy nature of &lt;em&gt;OpenTTD&lt;/em&gt; that is as easy to pick up as a game like &lt;em&gt;Mini Metro&lt;/em&gt;.&lt;/h3&gt;

&lt;p&gt;Given all the train management games out there, why have we decided to add to the collection?
We love the depth of games like &lt;em&gt;OpenTTD&lt;/em&gt; and &lt;em&gt;Simutrans&lt;/em&gt;, and the creative possibilities their sandboxes give players, but we wanted to create a game that is easier to learn while still maintaining their depth.
&lt;em&gt;Mini Metro&lt;/em&gt;’s beauty and immediate accessibilty was an influence on this aspect of our design.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/games/ironroads/screenshots/1-cover-1080p.png&quot; alt=&quot;Iron Roads cover image&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A final inspiration for &lt;em&gt;Iron Roads&lt;/em&gt; is the humour and whimsy of the Bullfrog management games, a torch carried today by games like &lt;em&gt;Lets Build a Zoo&lt;/em&gt;, &lt;em&gt;Overcrowd: A commute ‘em up&lt;/em&gt;, or the excellent &lt;em&gt;Two Point&lt;/em&gt; games.&lt;/p&gt;

&lt;h3 id=&quot;progress-so-far&quot;&gt;Progress so far&lt;/h3&gt;

&lt;p&gt;The version of &lt;em&gt;Iron Roads&lt;/em&gt; we have now is developed from the second prototype we built.&lt;/p&gt;

&lt;p&gt;The first prototype had a hexagonal grid, isometric art, a wave function collapse-style constraint solver to lay out art, and it was written in Golang.
We initially tried to cram everything we had learned from making our previous games into this early prototype, without considering whether it really benefitted the game.
This resulted in a somewhat player-unfriendly prototype buckling under the weight of its complexity.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/blog/iron-roads-that-never-was.svg&quot; alt=&quot;The Iron Roads that never was&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We loved how the art looked (shown above), but the isometric perspective resulted in some sprites occluding tiles behind them, making it less clear what tile a click corresponded to.
Hex tiles also lead naturally to six directions on the board, which proved inferior for building layouts to square tiles, which naturally allow eight directions.
Technically, Golang is a fantastic language to write games in, and we were sad to leave it behind, but getting a version of that prototype running on mobile was becoming very time-consuming.
More worryingly it wasn’t clear consoles would be a possibility at all.
In general, our enthusiasm had gotten the better of us, we had added unnecessary complexity everywhere, and it hampered both development and gameplay.&lt;/p&gt;

&lt;p&gt;After making the painful decision to ditch our work entirely, we started from scratch on the second (and current) incarnation of &lt;em&gt;Iron Roads&lt;/em&gt; as a top-down game, with square non-overlapping tiles, written in C, and with a straightforward manual process for laying out art.
Freed from the unnecessary complexity, it didn’t take long to functionally catch up with the previous prototype.
More importantly, iterating on systems was quicker, and we could focus on building a game players would enjoy.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/games/ironroads/screenshots/3-serviceinfo-1080p.png&quot; alt=&quot;Iron Roads as it is today&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;what-next&quot;&gt;What next?&lt;/h3&gt;

&lt;p&gt;Right now we are playtesting internally, iterating systems to perfect the balance, and improving on the user interface.
We have finished most of the tutorial ‘level’ (we need to decide whether these will be called campaigns / scenarios / maps / levels, but you get the idea), and we’ve started on a second larger one that allows for more complex train networks.&lt;/p&gt;

&lt;p&gt;Incidentally, we have found Jesse Schell’s book, The Art of Game Design, an invaluable prompt to make us look at Iron Roads from different perspectives (lenses as they’re referred to in the book).&lt;/p&gt;

&lt;p&gt;These first two maps will form the demo of &lt;em&gt;Iron Roads&lt;/em&gt; that will be part of Steam’s NextFest in June.
In preparation for this we will be playtesting with willing volunteers.
Please get in touch if this is something you’d like to be involved with, we’d be forever grateful!
The best way to do so is to email us or drop by our &lt;a href=&quot;https://discord.gg/enA4zD2hJz&quot;&gt;Discord&lt;/a&gt;.&lt;/p&gt;
</description>
        <pubDate>Fri, 14 Apr 2023 00:00:00 +0000</pubDate>
        <link>https://cowleyforniastudios.com/2023/04/14/introducing-iron-roads/</link>
        <guid isPermaLink="true">https://cowleyforniastudios.com/2023/04/14/introducing-iron-roads/</guid>
        
        
      </item>
    
      <item>
        <title>2022 in review</title>
        <description>&lt;p&gt;Happy New Year!&lt;/p&gt;

&lt;p&gt;Inspired by the excellent &lt;a href=&quot;https://alexvermeer.com/8760hours/&quot;&gt;8,760 hours guide&lt;/a&gt; we’ve written a recap of last year: what went well, what didn’t, where we tried hard and where we didn’t.&lt;/p&gt;

&lt;h3 id=&quot;what-went-well&quot;&gt;What went well?&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;/paris&quot;&gt;We’ll always have Paris&lt;/a&gt; was the project that dominated our 2022. It was an artistic project, undertaken purely for the joy of making it. We loved developing it, and got to see many people play it and understand what we were trying to achieve, so it goes on this part of the list.&lt;/p&gt;

&lt;p&gt;We’ll always have Paris was our second project, and looking back we are happy that we didn’t repeat the mistakes from our first project, &lt;a href=&quot;/sarawak&quot;&gt;Sarawak&lt;/a&gt;. Reusing the engine saved a lot of time. As well as that we were careful to think ahead more carefully, which shortened the development period and yielded a leaner, better-focussed game.&lt;/p&gt;

&lt;p&gt;We’ll always have Paris was the first game we released on mobile. We developed it from the outset to work on both mobile and desktop, but I personally think that the phone platform suits the single-session experience better. A highlight of the mobile release for me was being selected as Game of the Day for both the UK and US App Stores.&lt;/p&gt;

&lt;p&gt;Because of the niche themes explored in We’ll always have Paris, we spent a lot of energy making sure it reached the right audience. We are grateful for everyone who took the time to play the game and wrote thoughtful reviews.&lt;/p&gt;

&lt;p&gt;Towards the end of the year, we exhibited We’ll always have Paris at the &lt;a href=&quot;https://adventurexpo.org/&quot;&gt;AdventureX&lt;/a&gt; narrative games convention. It was a tremendously fun and validating experience, that we wrote about &lt;a href=&quot;/2022/11/14/adventure-x-2022&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;what-didnt-go-well&quot;&gt;What didn’t go well?&lt;/h3&gt;

&lt;p&gt;On a personal level, extensive home renovations took over most of 2022. Working in a construction site is conducive to neither focus nor creativity. We’re glad that’s all done and we can replace the time that ate up with developing games once again.&lt;/p&gt;

&lt;p&gt;We’ll always have Paris sold well compared to our expectations, but realistically it wasn’t profitable. Profitability was never an goal for this project, but we would like our future games to sell enough to enable us to work full time on them.&lt;/p&gt;

&lt;h3 id=&quot;where-did-we-try-hard&quot;&gt;Where did we try hard?&lt;/h3&gt;

&lt;p&gt;We put effort into working smarter, by simplifying and improving our processes. When building games it is easy to add tools and steps to the development process, but it is hard to take them away, and the creeping complexity can cause larger problems than those you were trying to solve. This year we greatly simplified our systems. Process-wise, we committed to weekly progress discussions to keep development on track. Still lots to improve with both of these.&lt;/p&gt;

&lt;p&gt;We both worked to improve our skills, and learn more about our respective crafts.&lt;/p&gt;

&lt;p&gt;We spent significant time understanding our combined strengths and interests - which have shifted since we started working on Sarawak many years ago - and planned our upcoming project, &lt;a href=&quot;/ironroads&quot;&gt;Iron Roads&lt;/a&gt;, with this in mind.&lt;/p&gt;

&lt;h3 id=&quot;where-did-we-not-try-hard-enough&quot;&gt;Where did we not try hard enough?&lt;/h3&gt;

&lt;p&gt;We need to delineate work and leisure time better. It is not sustainable, or realistic, to be fixing bugs late on Sunday night and expecting to wake up fresh and inspired on Monday morning. This is of course a problem shared by many, so any ideas on how to tackle this are most welcome!&lt;/p&gt;

&lt;p&gt;Our original plan for the first part of 2022 was to release Sarawak on mobile. We quickly realised that porting Sarawak to mobile was going to take a very long time due to the way it was written. We’ve not second guessed our decision, but if Sarawak had been designed from the start with portability in mind, we wouldn’t have had to cancel it, and Sarawak mobile would be out there. The upside is that we did not repeat the mistake, and Paris released on all platforms from day one.&lt;/p&gt;

&lt;p&gt;This one is possibly a consequence to the single-playthrough nature of our previous two games, but we didn’t try hard enough to build and engage a community around our work. We hope to improve this with Iron Roads.&lt;/p&gt;

&lt;p&gt;For time and motivation reasons, I didn’t add many new artworks and listings to the Etsy shop.&lt;/p&gt;

&lt;h3 id=&quot;2023&quot;&gt;2023&lt;/h3&gt;

&lt;p&gt;So, what lies ahead for us? We’ll be working hard on Iron Roads and posting regular updates on that.
We also hope to increase the frequency of these long-form posts here - so do get in touch if you have any comments or ideas.&lt;/p&gt;

&lt;p&gt;Wishing you all the best for 2023&lt;/p&gt;
</description>
        <pubDate>Tue, 03 Jan 2023 00:00:00 +0000</pubDate>
        <link>https://cowleyforniastudios.com/2023/01/03/2022-recap/</link>
        <guid isPermaLink="true">https://cowleyforniastudios.com/2023/01/03/2022-recap/</guid>
        
        
      </item>
    
      <item>
        <title>1.0.5 update for We&apos;ll always have Paris</title>
        <description>&lt;p&gt;We just sent out the 1.0.5 update of We’ll always have Paris. There are no big changes, it just fixes a small typo, and a crash that could occur if the game could find no sound devices. We’ve only managed to reproduce the crash on Windows, but it may have affected other systems as well.&lt;/p&gt;

&lt;p&gt;Happy Holidays!&lt;/p&gt;
</description>
        <pubDate>Thu, 22 Dec 2022 00:00:00 +0000</pubDate>
        <link>https://cowleyforniastudios.com/2022/12/22/paris-1-0-5/</link>
        <guid isPermaLink="true">https://cowleyforniastudios.com/2022/12/22/paris-1-0-5/</guid>
        
        
      </item>
    
  </channel>
</rss>
