<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Chris Longden</title>
    <description>The latest articles on DEV Community by Chris Longden (@chris_longden).</description>
    <link>https://dev.to/chris_longden</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4144655%2F46f03cbf-247d-4343-a3d9-670d68eb53d9.jpeg</url>
      <title>DEV Community: Chris Longden</title>
      <link>https://dev.to/chris_longden</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chris_longden"/>
    <language>en</language>
    <item>
      <title>What a few days of playtest telemetry found that my own testing never did</title>
      <dc:creator>Chris Longden</dc:creator>
      <pubDate>Sat, 26 Sep 2026 19:10:23 +0000</pubDate>
      <link>https://dev.to/chris_longden/what-a-few-days-of-playtest-telemetry-found-that-my-own-testing-never-did-20b</link>
      <guid>https://dev.to/chris_longden/what-a-few-days-of-playtest-telemetry-found-that-my-own-testing-never-did-20b</guid>
      <description>&lt;p&gt;I'm building &lt;a href="https://christopherlongden.itch.io/farshore" rel="noopener noreferrer"&gt;Farshore&lt;/a&gt;, a first-person mystery that runs in the browser: three.js, no engine, every sound synthesised live in Web Audio. In its first days of open playtest, nine people found problems I never had, for one reason: I always know where to go.&lt;/p&gt;

&lt;h2&gt;
  
  
  The logger
&lt;/h2&gt;

&lt;p&gt;With &lt;code&gt;?playtest=1&lt;/code&gt;, the game logs story beats (changes to its own story flags), what players examine and use, hints, fall rescues, "unstick" presses, position every 10 s and frame rate every 30 s. Nothing personal. Every event is stamped with &lt;strong&gt;active time&lt;/strong&gt; (seconds actually playing), so a tea break doesn't look like being stuck. A small script turns the logs into stalls: three active minutes with no progress, plus what the player tried in the meantime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four lessons
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Read state the player can change live.&lt;/strong&gt; A chapter copied a story flag into a constant when it loaded. The player did the right thing, but the hints kept sending them back to do it again.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;answeredAtBuild&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subAdultWakened&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// starting visuals only&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isAnswered&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subAdultWakened&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// everything else&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. "Safe" has to mean dry ground.&lt;/strong&gt; An invisible floor under the sea counted as a safe spot, so pressing unstick in the water said "You climb back to solid stone" and left the player where they were. Water floors are now flagged, and never saved as safe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Edges over water are walls, not drops.&lt;/strong&gt; One player got six fall rescues in three seconds: the net put them back on the edge they'd fallen from, and the key they were holding walked them off again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Coming back must say what changed.&lt;/strong&gt; The first player to finish wrote: &lt;em&gt;"I thought I came back to the same level to do the same thing because I haven't finished something."&lt;/em&gt; Returns now say what's moved on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Blind AI playtesters
&lt;/h2&gt;

&lt;p&gt;I also ran AI players that see only screenshots and on-screen text. They're bad at navigation (all three stalled on a key every human found in 35 seconds), but they walk into every edge. Treat them as a pointer to where to look, not a verdict.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;The hard part of playtesting isn't finding players; it's knowing what happened when you weren't watching. A few hundred lines of logging turned "it was confusing" into "they stood here, tried this four times, and left". Most fixes shipped the same day.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://christopherlongden.itch.io/farshore" rel="noopener noreferrer"&gt;Farshore plays in the browser&lt;/a&gt;. If you get stuck, that's exactly what the logs are for.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>threejs</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
