<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Game Dev Blog — Sheeraz Khan</title>
    <link>https://blog.lemesherry.com/</link>
    <atom:link href="https://blog.lemesherry.com/feed.xml" rel="self" type="application/rss+xml"/>
    <description>Game dev blog by Sheeraz Khan — Lead Game Developer shipping Unity &amp; C# games. Architecture, gameplay systems, physics, optimization — lessons from real productions.</description>
    <language>en</language>
    <lastBuildDate>Thu, 01 Oct 2026 00:00:00 GMT</lastBuildDate>
    <item>
      <title>How CricketX Turns Every Batting Session Into a Training Plan</title>
      <link>https://blog.lemesherry.com/cricketx-batting-analysis</link>
      <guid isPermaLink="true">https://blog.lemesherry.com/cricketx-batting-analysis</guid>
      <pubDate>Thu, 01 Oct 2026 00:00:00 GMT</pubDate>
      <description>Introducing Batting Analysis in CricketX: explore an in-game report, follow a delivery-level pattern, and turn it into focused practice.</description>
      <content:encoded><![CDATA[<p>A batting session can tell you more than its final score. Batting Analysis is the in-game report for looking back at the deliveries you faced and finding what to work on next.</p>
<p>The new two-minute walkthrough below starts on the ground, opens the full report and follows a controlled demonstration through its matchups, pitch map, technique and progress. The sections after it explain the numbers and views in more detail.</p>
<p>Detailed Batting Analysis connects every delivery with its bowler, speed, length, outcome, bat contact, timing and player movement. You can start with the full session, find a weak area, and keep narrowing the data until you understand what needs to improve.</p>
<div class="blog-video-slot is-landscape" data-blog-video-id="cricketx-batting-analysis-video-1" style="--video-aspect-ratio: 16 / 9">
  <div class="blog-video-fallback">
    <strong>Introducing Batting Analysis in CricketX</strong>
    <a href="/blog-assets/cricketx-batting-analysis/cricketx-batting-analysis-intro-v5.mp4">Open video</a>
  </div>
  <p class="blog-video-fallback-caption">A two-minute look at the in-game report, from a controlled demonstration session to a clearer practice question.</p>
  <noscript>
    <style>.blog-video-fallback,.blog-video-fallback-caption{display:none!important}</style>
    <figure class="blog-video-native">
      <video controls playsinline preload="metadata" aria-label="Introducing Batting Analysis in CricketX" poster="/blog-assets/cricketx-batting-analysis/video-poster-v5.jpg">
        <source src="/blog-assets/cricketx-batting-analysis/cricketx-batting-analysis-intro-v5.mp4" type="video/mp4">
        <track kind="captions" src="/blog-assets/cricketx-batting-analysis/batting-analysis-intro-v5.vtt" srclang="en" label="English" default>
        Your browser cannot play this video.
      </video>
      <figcaption>A two-minute look at the in-game report, from a controlled demonstration session to a clearer practice question.</figcaption>
    </figure>
  </noscript>
</div><h2 id="it-starts-with-every-ball-you-played"><a class="heading-anchor" href="#it-starts-with-every-ball-you-played" aria-label="Link to this section">#</a>It starts with every ball you played</h2>
<p>The walkthrough uses a controlled demonstration session of 120 deliveries: 115 legal balls, two wides and three no-balls. The no-balls also include three runs from the bat.</p>
<p>That line at the top of the interface matters. Percentages such as strike rate and control need to use the correct legal-ball count, while wides and no-balls still belong to the complete session record.</p>
<p>Each delivery stays connected to the information CricketX already had while it was being played:</p>
<ul>
<li>Bowler type</li>
<li>Batting side</li>
<li>Delivery side</li>
<li>Length</li>
<li>Speed</li>
<li>Outcome</li>
<li>Ball landing position</li>
<li>Bat contact and swing timing</li>
<li>Headset movement and viewing direction</li>
</ul>
<p>This is the foundation of the whole report. You are not looking at separate numbers that happen to come from the same session. You are looking at the same deliveries from different angles.</p>
<p>So when the report shows a problem, you can investigate it instead of guessing.</p>
<h2 id="first-understand-the-full-session"><a class="heading-anchor" href="#first-understand-the-full-session" aria-label="Link to this section">#</a>First, understand the full session</h2>
<p>Overview gives you the quickest answer to a simple question: how did this session go?</p>
<p><strong>Control</strong> shows how often the batter stayed in control of the shot. A legal-ball miss, an OUT, poor contact or a badly mistimed swing lowers it. It is not a label for “safe” shots, and it is not another name for dismissals. It combines the parts of a delivery that show whether the batter controlled the bat and the result.</p>
<p>The other cards show:</p>
<ul>
<li>Strike rate</li>
<li>Dot-ball percentage</li>
<li>Boundary percentage</li>
<li>Scoring-shot percentage</li>
<li>Bat contact</li>
<li>Swing timing</li>
</ul>
<p>These numbers answer different questions. Strike rate shows scoring speed. Bat contact shows how often the bat met the ball. Timing shows whether contact was early or late. One good number cannot hide every other problem.</p>
<p>The lower panel turns the report into <strong>Strengths</strong>, <strong>Needs Work</strong>, and <strong>Focus Next</strong>. These notes come from the current session. Their purpose is not to praise or criticise the player. Their purpose is to give the next practice a clear starting point.</p>
<p>That is the real value of Overview. It does not leave you with “55% Control” and expect you to decide what that means. It shows you where to look next.</p>
<h2 id="use-filters-to-find-the-real-problem"><a class="heading-anchor" href="#use-filters-to-find-the-real-problem" aria-label="Link to this section">#</a>Use filters to find the real problem</h2>
<p>Filters apply to the whole report, not only the open tab.</p>
<p>You can narrow the session by bowler type, delivery side, length, speed or outcome. Training sessions can also be separated by batting side. CricketX only shows filter options that actually exist in the session, so the player is not searching through empty categories.</p>
<p>The controlled session in the video gives a simple example:</p>
<ul>
<li>Across the full session: <strong>55% control</strong> and a strike rate of <strong>72</strong>.</li>
<li>Against right-arm fast bowling: <strong>80% control</strong>, a strike rate of <strong>147</strong>, and no OUTs.</li>
<li>Against right-arm leg spin: <strong>47% control</strong>, a strike rate of <strong>7</strong>, and two OUTs.</li>
</ul>
<p>The full result says the session needs work. The filtered result says something much more useful: pace was handled well, while leg spin caused a clear problem.</p>
<p>The player can keep narrowing it. Select deliveries at 120 kilometres per hour and above to study faster bowling. Select Good Length to study one landing area. Combine filters when the question needs to be more exact.</p>
<p>Every other tab follows those active filters. This means the same leg-spin problem can be inspected through Matchups, Pitch Map, Technique, Scoring, Profile and Progress without losing the selected deliveries.</p>
<p>This is the point where broad feedback becomes a specific training target.</p>
<h2 id="see-which-deliveries-changed-the-result"><a class="heading-anchor" href="#see-which-deliveries-changed-the-result" aria-label="Link to this section">#</a>See which deliveries changed the result</h2>
<p>Once you have found a weaker area, Matchups helps explain what created it. It starts with a direct pace-versus-spin comparison and places strike rate, Control, boundaries and OUTs together.</p>
<p>The lower panel then provides four comparison views.</p>
<h3 id="bowler"><a class="heading-anchor" href="#bowler" aria-label="Link to this section">#</a>Bowler</h3>
<p>Bowler compares every bowling style faced in the session. It is the clearest place to see whether the batter performed differently against right-arm pace, left-arm pace, off spin, leg spin or another available type.</p>
<h3 id="delivery"><a class="heading-anchor" href="#delivery" aria-label="Link to this section">#</a>Delivery</h3>
<p>Delivery compares the actual ball types that appeared, such as leg breaks, yorkers, full tosses and top spinners.</p>
<p>Two bowlers can belong to a similar category while asking very different questions of the batter. This view moves the analysis closer to the delivery that caused the result.</p>
<h3 id="length"><a class="heading-anchor" href="#length" aria-label="Link to this section">#</a>Length</h3>
<p>Length compares where the deliveries pitched: yorker, full, good length, short, or any other length present in the session.</p>
<p>This helps separate a bowling-style problem from a landing-area problem. The batter might be comfortable against leg spin in general but struggle when it lands on a good length.</p>
<h3 id="speed"><a class="heading-anchor" href="#speed" aria-label="Link to this section">#</a>Speed</h3>
<p>Speed compares pace ranges, from slower deliveries to more than 140 kilometres per hour.</p>
<p>It shows whether control, scoring or OUTs changed as the pace increased. Because the same filters remain active, the batter can study speed across the whole session or only against one bowler type.</p>
<p>These are not four unrelated charts. They help you move from “I struggled against spin” to something you can actually practise, such as “good-length leg breaks reduced my Control and produced two OUTs.”</p>
<p>The closer the report gets to the exact delivery, the easier it becomes to build the right drill.</p>
<h2 id="put-the-weakness-back-on-the-pitch"><a class="heading-anchor" href="#put-the-weakness-back-on-the-pitch" aria-label="Link to this section">#</a>Put the weakness back on the pitch</h2>
<p>Pitch Map places the analysis back on the pitch.</p>
<p>In <strong>Control</strong> view, every zone shows the percentage of legal balls played in control from that landing area. Every dot is a delivery. Every marked <strong>OUT</strong> is a real wicket from a ball that landed there.</p>
<p>Those OUT markers are important. They are not general warnings and they are not every false shot. They show the landing positions of deliveries that actually ended in a wicket.</p>
<p>The panel on the right groups those OUTs by length, pace or spin, and delivery type. The map shows where the problem happened. The breakdown helps explain what produced it.</p>
<p>Open <strong>Strike Rate</strong> and the same pitch zones show runs scored per 100 legal balls. A zone can have good control but weak scoring, or quick scoring with poor control. Looking at both views prevents one number from hiding the trade-off.</p>
<p>Together, the views answer two practical questions:</p>
<ol>
<li>Where did the batter lose control?</li>
<li>Where was the batter able to score?</li>
</ol>
<p>Now the next practice can be built around a real location and delivery type. A weak good-length area against leg spin is much easier to practise than a vague instruction to “play spin better.”</p>
<h2 id="check-what-happened-in-your-technique"><a class="heading-anchor" href="#check-what-happened-in-your-technique" aria-label="Link to this section">#</a>Check what happened in your technique</h2>
<p>Two shots can finish with the same result for very different reasons. Technique looks at the movement behind the outcome.</p>
<h3 id="ball-tracking"><a class="heading-anchor" href="#ball-tracking" aria-label="Link to this section">#</a>Ball Tracking</h3>
<p>Ball Tracking measures the angle between the player&#39;s viewing direction and the ball at contact. A larger angle means the ball was farther away from where the player was looking when the bat met it.</p>
<p>This does not try to replace a coach&#39;s judgement. It gives the player a repeatable measure of whether the ball remained in view through contact.</p>
<h3 id="head-discipline"><a class="heading-anchor" href="#head-discipline" aria-label="Link to this section">#</a>Head Discipline</h3>
<p>Head Discipline shows head drift and the horizontal distance between the head and the ball.</p>
<p>These are related but different. A batter can keep the head fairly still and still finish too far away from the ball. The two measures make that difference visible.</p>
<h3 id="swing-timing"><a class="heading-anchor" href="#swing-timing" aria-label="Link to this section">#</a>Swing Timing</h3>
<p>Swing Timing shows whether contact happened early or late. The demonstration session contains many early swings, which gives the player something specific to work on rather than only seeing the final scoring result.</p>
<h3 id="bat-contact"><a class="heading-anchor" href="#bat-contact" aria-label="Link to this section">#</a>Bat Contact</h3>
<p>Bat Contact measures how well the ball met the bat. A swing can make contact and still be poorly middled. This view separates simply hitting the ball from hitting it cleanly.</p>
<p>In the demonstration report, head movement and position are reasonably strong, while ball tracking and early timing need more attention. Instead of trying to rebuild the whole batting technique, the player leaves with two focused areas to work on.</p>
<p>The data does not replace a coach. It gives the player and coach repeatable evidence they can use together.</p>
<h2 id="understand-what-your-shots-produced"><a class="heading-anchor" href="#understand-what-your-shots-produced" aria-label="Link to this section">#</a>Understand what your shots produced</h2>
<p>Scoring contains two connected views.</p>
<p>The <strong>Wagon Wheel</strong> uses the real direction and distance of each legal-ball result. Scoring shots extend into the field. Misses, leaves and bowled balls remain near the stumps because the ball did not travel as a scoring shot.</p>
<p>The <strong>Delivery Outcomes</strong> panel separates dots, singles, twos, threes, fours, sixes, OUTs, wides and no-balls.</p>
<p>The wagon wheel shows <em>where</em>. Delivery Outcomes shows <em>what happened</em>.</p>
<p>Together, they can reveal whether the next session should focus on placement, strike rotation or boundary scoring. They can also show that a high strike rate came from one scoring area rather than control around the full field.</p>
<h2 id="see-the-complete-shape-of-your-batting"><a class="heading-anchor" href="#see-the-complete-shape-of-your-batting" aria-label="Link to this section">#</a>See the complete shape of your batting</h2>
<p>Profile condenses the session into six batting traits.</p>
<ul>
<li><strong>Control</strong> uses the same control result explained earlier.</li>
<li><strong>Timing</strong> measures how close contact came to the moment of peak bat speed.</li>
<li><strong>Power</strong> uses bat speed at contact.</li>
<li><strong>Intent</strong> uses scoring rate to show how actively the batter scored.</li>
<li><strong>Placement</strong> measures the spread of scoring directions.</li>
<li><strong>Watching</strong> uses the angle between the player&#39;s viewing direction and the ball.</li>
</ul>
<p>The radar chart makes the overall shape easy to read. It might show strong timing and placement beside weaker watching or control. The detail remains available in the earlier tabs, but Profile makes the balance visible in one place.</p>
<p>The panel on the right shows control at each difficulty level. That prevents a strong overall number from hiding a large drop when the session became harder.</p>
<p>Profile gives you the summary. The earlier views give you the evidence behind it.</p>
<h2 id="measure-whether-the-practice-is-working"><a class="heading-anchor" href="#measure-whether-the-practice-is-working" aria-label="Link to this section">#</a>Measure whether the practice is working</h2>
<p>Finding a weakness only matters if you can check whether it improved. In Training mode, Progress follows your performance as the session continues.</p>
<p><strong>Control</strong> is a rolling percentage over the latest 12 legal balls. It reacts to improvement and sudden drops instead of flattening the whole session into one average.</p>
<p><strong>Runs</strong> is the cumulative team total after each legal ball, with extras included.</p>
<p><strong>Contact</strong> is the rolling average of contact quality across the same 12-ball window. Misses are excluded from the contact calculation, because this graph measures the quality of contact when contact happened.</p>
<p>The active filters also apply here. Filter the report to leg spin first and Progress becomes a chart of the leg-spin drill. Filter it to Good Length or faster bowling and the graph follows that question instead.</p>
<p>This closes the training loop. Make an adjustment, face the delivery again, and see whether the result changes.</p>
<h2 id="match-style-modes-follow-the-innings"><a class="heading-anchor" href="#match-style-modes-follow-the-innings" aria-label="Link to this section">#</a>Match-style modes follow the innings</h2>
<p>Training mode uses Progress. In Chase and other over-based modes, the report opens <strong>Overs</strong> instead.</p>
<p><strong>Runs per Over</strong> groups the score into blocks of six legal balls and includes extras.</p>
<p><strong>Trend</strong> shows those over totals as a line, making strong and weak overs easier to compare.</p>
<p><strong>Worm</strong> keeps a cumulative total after every over, showing the scoring journey across the innings.</p>
<p>These views connect the technical report with match rhythm. A player can see not only how a delivery was played, but also how control and scoring developed across an over-based challenge.</p>
<h2 id="turn-the-report-into-the-next-session"><a class="heading-anchor" href="#turn-the-report-into-the-next-session" aria-label="Link to this section">#</a>Turn the report into the next session</h2>
<p>The best use of Detailed Batting Analysis is a simple loop:</p>
<ol>
<li>Play a session.</li>
<li>Use Overview to find the strongest and weakest areas.</li>
<li>Apply filters to isolate the problem.</li>
<li>Use Matchups, Pitch Map and Technique to understand what caused it.</li>
<li>Build the next practice around that exact situation.</li>
<li>Return to Progress or Overs to measure what changed.</li>
</ol>
<p>For the demonstration session, that could mean filtering right-arm leg spin, checking which lengths caused the two OUTs, reviewing ball tracking and early swing timing, then practising those deliveries again.</p>
<p>The instruction is no longer “face more spin.” It is clear, testable, and connected to the next report.</p>
<h2 id="what-vr-adds-to-the-training"><a class="heading-anchor" href="#what-vr-adds-to-the-training" aria-label="Link to this section">#</a>What VR adds to the training</h2>
<p>Traditional net practice remains valuable. It provides real bowling, a physical environment and direct coaching that a simulator should not pretend to replace.</p>
<p>VR adds something different: the system already knows the delivery that was sent, where it landed, how the virtual bat moved, where the headset was facing, what contact occurred and how the ball finished.</p>
<p>Collecting the same connected record in a normal practice session can require several cameras, sensors, radar, careful notes and time spent joining the information afterwards. Inside the simulation, those events can be measured together and the same problem can be repeated on demand.</p>
<p>That is what turns a session into more than time spent facing deliveries. You can see what worked, find what held you back, and return with a clear plan to improve it.</p>
<p>CricketX is live on Meta Quest.</p>
<p>🥽 <a href="https://www.meta.com/experiences/cricket-x/6986676891412191/" target="_blank" rel="noopener noreferrer">Try CricketX on Meta Quest</a></p>
<p>🌐 <a href="https://cricketx.net" target="_blank" rel="noopener noreferrer">Learn more about CricketX</a></p>
]]></content:encoded>
    </item>
    <item>
      <title>Building Games With an AI Agent — Without Losing the Fun</title>
      <link>https://blog.lemesherry.com/two-games-two-days</link>
      <guid isPermaLink="true">https://blog.lemesherry.com/two-games-two-days</guid>
      <pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate>
      <description>The seven-step workflow behind Arrow Jam and Grid Patch: build one game loop, teach the code what difficulty feels like, then automate the repeated work.</description>
      <content:encoded><![CDATA[<p>If you came here from LinkedIn, you already know what I built.</p>
<p>This is the part I left out.</p>
<p>I did not give an AI agent one huge prompt and wait for two games to appear. I divided each game into small stages. Every stage had one clear goal, one way to test it, and one question for me:</p>
<p><em>Does this feel right when I play it?</em></p>
<p><strong>I decide → the agent builds → I play → I correct → the correction becomes a rule.</strong></p>
<p>The agent handled the repeated work: writing code, rebuilding systems, generating levels and running tests. I stayed with the part I enjoy most: playing, finding what felt wrong and deciding what should change.</p>
<p>I used this loop for Arrow Jam first, then reused it for Grid Patch. These were the seven steps.</p>
<h2 id="the-workflow-in-one-look"><a class="heading-anchor" href="#the-workflow-in-one-look" aria-label="Link to this section">#</a>The workflow in one look</h2>
<ol>
<li>Build the main gameplay.</li>
<li>Make one playable level easy to create and test.</li>
<li>Turn the feeling of difficulty into rules.</li>
<li>Design how difficulty should change from level to level.</li>
<li>Let the generator create, solve and reject levels in bulk.</li>
<li>Make the UI fit the game.</li>
<li>Keep changing the small interactions until the game feels good to play.</li>
</ol>
<p>I moved to the next step only when I could play the current one and understand what it needed next.</p>
<h2 id="step-1-build-the-main-gameplay-first"><a class="heading-anchor" href="#step-1-build-the-main-gameplay-first" aria-label="Link to this section">#</a>Step 1: Build the main gameplay first</h2>
<p>Before thinking about hundreds of levels, menus or animations, I needed one action worth repeating.</p>
<p>For <strong>Arrow Jam</strong>, that action is tapping an arrow.</p>
<p>If the straight path from the arrow&#39;s head to the edge is clear, the arrow flies out. If another arrow is in the way, it hits that arrow and costs a life. The puzzle is to remove free arrows, open new paths and slowly unlock the board.</p>
<p>For <strong>Grid Patch</strong>, the action is drawing a rectangle.</p>
<p>You drag across the board to create a patch. It must contain exactly one clue and follow that clue&#39;s shape and number rules. The level ends when the patches cover the full board correctly.</p>
<p>One test board was enough. The question was not “is the game finished?” It was “do I want to make this move again?”</p>
<h2 id="step-2-make-one-level-easy-to-create-and-test"><a class="heading-anchor" href="#step-2-make-one-level-easy-to-create-and-test" aria-label="Link to this section">#</a>Step 2: Make one level easy to create and test</h2>
<p>Once the main action worked, I built a small <strong>Level Lab</strong> for each game.</p>
<p>In Arrow Jam, one level starts as a recipe:</p>
<ul>
<li>Choose a shape.</li>
<li>Choose its size.</li>
<li>Choose the arrow length and how much the arrows can bend.</li>
<li>Choose the number of lives.</li>
<li>Change the variation number to get a different board.</li>
</ul>
<p>I can press <strong>Quick Test</strong> without starting the full game. I can play the level, reload it after a change, or watch the solver remove every arrow in the correct order.</p>
<p>Grid Patch has a similar testing space, but its generator starts with a complete solution. It divides the board into rectangles, then creates one clue for each rectangle.</p>
<p>The AI agent could build one change, the tools could prove that the level was valid, and I could immediately play it.</p>
<p>Fast feedback kept the work fun.</p>
<h2 id="step-3-turn-the-feeling-of-difficulty-into-rules"><a class="heading-anchor" href="#step-3-turn-the-feeling-of-difficulty-into-rules" aria-label="Link to this section">#</a>Step 3: Turn the feeling of difficulty into rules</h2>
<p>“Hard” is a feeling first. The code only understands it after I explain that feeling using rules and numbers.</p>
<h3 id="arrow-jam-difficulty-comes-from-blocked-paths"><a class="heading-anchor" href="#arrow-jam-difficulty-comes-from-blocked-paths" aria-label="Link to this section">#</a>Arrow Jam: difficulty comes from blocked paths</h3>
<p>My first Arrow Jam difficulty system cared too much about board size.</p>
<p>At one point, it called a level with 13 arrows Hard. I played it and said:</p>
<p>“This is literally really easy.”</p>
<p>A bigger board can mean more work, but not always more thinking. So I changed what the code measured.</p>
<p>Arrow Jam now looks at how deeply the arrows block one another. The code removes all currently free arrows in groups and counts how many groups are needed to clear the board.</p>
<p>It also checks how many taps are safe at each point. If many arrows can leave, the player can move quickly. If only a few are safe, the player has to stop and read the board.</p>
<p>That gave every tier its own feeling:</p>
<ul>
<li><strong>Easy</strong> keeps moving. Most taps are safe.</li>
<li><strong>Normal</strong> asks for a short look before the next tap.</li>
<li><strong>Hard</strong> makes the player read the board.</li>
<li><strong>Super Hard</strong> makes the order of the taps important.</li>
<li><strong>Nightmare</strong> can have lock chains around 40 layers deep.</li>
</ul>
<p>Every level still has to be solvable and look clean. Difficulty should create thought, not visual mess.</p>
<h3 id="grid-patch-difficulty-comes-from-tempting-wrong-choices"><a class="heading-anchor" href="#grid-patch-difficulty-comes-from-tempting-wrong-choices" aria-label="Link to this section">#</a>Grid Patch: difficulty comes from tempting wrong choices</h3>
<p>Grid Patch needed a completely different system.</p>
<p>Here, a rectangle can look correct at first but leave another clue with nowhere to go. The player has to understand the problem, remove or redraw the patch, and try a better choice.</p>
<p>The generator creates puzzles with exactly one solution. Then a human-style solver counts the easy moves, the choices that lead to a dead end, and the reasoning needed to discover each problem.</p>
<p>An Easy puzzle asks for almost no correction. A Nightmare puzzle can contain 30 to 40 tempting choices that the player must rule out.</p>
<p>The board can grow, but size is not the main source of difficulty. The real difficulty is how often the player has to stop, think and reconsider.</p>
<p>Two different games. Two different ways to measure “Hard.”</p>
<p>The workflow stayed the same: decide what the player should feel first, then teach the code how to recognize it.</p>
<h2 id="step-4-build-the-difficulty-curve"><a class="heading-anchor" href="#step-4-build-the-difficulty-curve" aria-label="Link to this section">#</a>Step 4: Build the difficulty curve</h2>
<p>A difficulty system can judge one level. A difficulty curve decides how hundreds of levels should feel together.</p>
<p>Too many hard levels in a row become tiring. Too many easy levels in a row become boring. A good campaign needs both pressure and rest.</p>
<p>For both games, the opening levels teach the rules. Hard first appears at level 20, Super Hard at 50 and Nightmare at 100. Harder levels do not sit directly beside one another. Normal levels around them give the player time to recover, and Easy levels return less often as the player improves.</p>
<p>The level number also changes the intensity inside each tier. Two levels can both say Hard without feeling exactly the same.</p>
<h2 id="step-5-generate-and-test-many-levels-at-once"><a class="heading-anchor" href="#step-5-generate-and-test-many-levels-at-once" aria-label="Link to this section">#</a>Step 5: Generate and test many levels at once</h2>
<p>Only after the gameplay, Level Lab, difficulty rules and curve were ready did I create levels in large numbers. Generating 1000 levels before knowing what a good level feels like would only create 1000 problems faster.</p>
<p>For Arrow Jam, the level number creates a recipe: difficulty, shape, size, arrow length, bendiness and variation. The generator builds a board, then the tools ask:</p>
<ul>
<li>Is it solvable?</li>
<li>Did it reach the requested difficulty?</li>
<li>Does the picture shape still look complete?</li>
<li>Is it too similar to another level?</li>
<li>Does it contain rows of same-facing arrows that become boring repeat taps?</li>
</ul>
<p>If a level fails, the system tries another version.</p>
<p>Grid Patch starts from its requested tier but needs more reasoning checks. One solver proves that the puzzle has exactly one solution. Another follows a more human way of thinking. It rejects puzzles that need unfair guessing, miss the difficulty, repeat another board or lack the planned wrong choices.</p>
<p>During one rebuild of 995 Grid Patch levels, the generator made <strong>573,807 attempts</strong>.</p>
<p>Only 995 were accepted.</p>
<p>Exactly <strong>7</strong> levels worked on the first attempt. Level 984 needed <strong>11,078 attempts</strong> by itself.</p>
<p>I did not press a button 573,807 times (thankfully). The generator and agent handled that work. Tests checked every accepted level, while I played a smaller selection from the easy, middle and difficult parts of each tier.</p>
<p>The code catches a broken level.</p>
<p>I play the levels to catch a boring one.</p>
<p>That is the balance that made this workflow useful for me.</p>
<h2 id="step-6-make-the-ui-fit-the-game"><a class="heading-anchor" href="#step-6-make-the-ui-fit-the-game" aria-label="Link to this section">#</a>Step 6: Make the UI fit the game</h2>
<p>Arrow Jam is fast and energetic. Arrows fly away, blocked arrows hit the piece in front, difficulty badges are strong and the win moment has movement and confetti.</p>
<p>Grid Patch is slower and more thoughtful. Its board uses soft colours, painted patches and clear clue shapes. The player should be able to study the full board without the UI fighting for attention.</p>
<p>Both games build their UI in code instead of separate layout files full of hand-placed elements. This made it easier for the agent to apply one design change across the game.</p>
<p>But the decision still came from playing.</p>
<p>Arrow Jam first used arrow-shaped life indicators. They matched the theme, but they did not feel like lives. So I changed them to hearts.</p>
<p>The first idea was clever. The second was clear. Clear was better.</p>
<h2 id="step-7-make-every-touch-feel-good"><a class="heading-anchor" href="#step-7-make-every-touch-feel-good" aria-label="Link to this section">#</a>Step 7: Make every touch feel good</h2>
<p>The game can now work, create levels and look good — and still feel bad in the player&#39;s hands.</p>
<p>This was not about expected puzzle-game controls. It was about finding where the player had to wait, repeat an action or wonder what happened — then removing that friction.</p>
<h3 id="grid-patch"><a class="heading-anchor" href="#grid-patch" aria-label="Link to this section">#</a>Grid Patch</h3>
<ul>
<li><p><strong>Turn a redraw into one move.</strong> At first, changing an area meant removing the old patch before dragging its replacement. Crossing several patches meant removing each one. That was too much work for one thought: <em>I want this area to be shaped differently.</em></p>
<p>Now I drag directly over the old patches, and they fade under the preview. A valid release replaces them all; an invalid one leaves the board untouched. The redraw is saved as one decision, so undo restores the old arrangement in one step.</p>
</li>
<li><p><strong>Guide the drag without revealing the answer.</strong> The preview starts neutral. Once it contains a clue, it takes that clue&#39;s colour and brightens when its area and shape follow the rules. It checks only visible information, never the hidden solution. It confirms the shape, not the answer.</p>
</li>
</ul>
<h3 id="arrow-jam"><a class="heading-anchor" href="#arrow-jam" aria-label="Link to this section">#</a>Arrow Jam</h3>
<ul>
<li><p><strong>Never stop the player&#39;s rhythm.</strong> While one arrow is still flying away, the player can tap the next. Its cells leave immediately, input stays open, and only the win waits for all movement to finish. A quick solution becomes one smooth chain instead of tap, wait, tap, wait.</p>
</li>
<li><p><strong>Let a wrong tap explain itself.</strong> A blocked arrow moves forward until it hits the arrow in its way. The blocker shakes, and the first arrow returns in red. The board shows the cause where the player is already looking. Tapping the same blocked arrow again does not take another life for the same mistake.</p>
</li>
<li><p><strong>Make arrows feel like different weights.</strong> Short arrows leave with a bright, quick sound. Long arrows sound deeper and last a little longer. Connecting sound to body length helps a large arrow feel larger.</p>
</li>
<li><p><strong>Offer help when it becomes useful.</strong> The first large board teaches zooming and moving in two steps. Later boards wait until progress stops, then show only the gesture that fits the current view. Help disappears when the player acts. Menus, adverts and time outside the app never count as being stuck.</p>
</li>
</ul>
<p>None of these changes added another level. They removed an extra action, a forced pause, an unclear mistake, a flat response or an unwanted interruption. That is what made both games feel better to play.</p>
<p>The AI agent could implement each correction quickly. It still needed me to play, feel the small problem and describe the better experience. That loop — play, notice, explain, rebuild — is where a working game started to feel like mine.</p>
<h2 id="what-the-ai-agent-actually-changed-for-me"><a class="heading-anchor" href="#what-the-ai-agent-actually-changed-for-me" aria-label="Link to this section">#</a>What the AI agent actually changed for me</h2>
<p>The agent wrote most of the code. It created tools, added tests, rebuilt systems and repeated jobs that would have taken a lot of manual time. But it was never one perfect prompt.</p>
<p>Every useful correction became part of the project as code, a test, a design rule or another generator check.</p>
<p>That is also why Grid Patch was faster to build after Arrow Jam. The second game reused the project structure, the testing pattern, the Level Lab, the campaign tools, the UI systems and the build setup. Its gameplay was new, but the way of working was already there.</p>
<p>AI did not remove the thinking. It shortened the distance between a thought and a version I could play.</p>
<p>I spent less time creating levels one by one, moving UI pieces or checking the same rules again. I spent more time playing and asking:</p>
<p><em>Does this feel right?</em></p>
<p>That is the workflow in one idea: make one thing fun, make it easy to test, turn the feeling into rules, then let the system repeat the work.</p>
<p>It is the workflow I would use again for the next game.</p>
<p>Arrow Jam is live and free on Google Play:</p>
<p>🔗 <a href="https://play.google.com/store/apps/details?id=com.velnestgames.arrowjam" target="_blank" rel="noopener noreferrer">Play Arrow Jam</a></p>
<p>Grid Patch is live and free on Google Play:</p>
<p>🔗 <a href="https://play.google.com/store/apps/details?id=com.velnestgames.gridpatch" target="_blank" rel="noopener noreferrer">Play Grid Patch</a></p>
<p>Wanna give one a try? I&#39;d genuinely love to know which level felt too easy, too hard or simply not fun. That feedback can become the next rule.</p>
<p>Ps. The plan was to keep enjoying games while another game was being built. I think that part worked very well HeHe :P</p>
]]></content:encoded>
    </item>
    <item>
      <title>How I Earned My Place in Games</title>
      <link>https://blog.lemesherry.com/earning-my-place</link>
      <guid isPermaLink="true">https://blog.lemesherry.com/earning-my-place</guid>
      <pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
      <description>The final part — how I took on a probation most new hires weren&apos;t expected to finish, built 11 games in under 3 months, and heard the words that made everything worth it. Part 3.</description>
      <content:encoded><![CDATA[<p>In <a href="/first-game-dev-job">part 2</a>, I finally got the job — with a test waiting on the other side of it.</p>
<p>I&#39;d come into Game District as a trainee, on lower pay than everyone around me, with a simple deal: prove what I could do, and my pay would follow. Then they handed me the test that would decide it.</p>
<p>This is the part where everything that came before — the broken laptop, the rejections, the interview I froze in — finally added up to something. This is part 3, the last one.</p>
<h2 id="the-test"><a class="heading-anchor" href="#the-test" aria-label="Link to this section">#</a>The test</h2>
<p>The deal was simple, and a little terrifying. In 3 months, build 10 of 12 small games from scratch — real, playable ones, each with its own set of levels. Clones of the hyper-casual hits everyone knew back then: a Helix Jump, a Snake.io, a 2048-style 3D merge, a Bridge Race. The games themselves weren&#39;t really the point. The point was to see what I was made of — how I thought, how quickly I learned, what I could actually ship on my own.</p>
<p>Most new hires weren&#39;t expected to finish all of them. The whole thing was built to push you past your limit and find out where that limit was.</p>
<p>I should have been intimidated. Instead, I couldn&#39;t believe my luck. They were going to pay me to sit and build one game after another, all day, every day? That wasn&#39;t a test to me. That was everything I&#39;d ever wanted, handed to me and called a job.</p>
<h2 id="so-i-disappeared-into-it"><a class="heading-anchor" href="#so-i-disappeared-into-it" aria-label="Link to this section">#</a>So I disappeared into it</h2>
<p>Every game was a new puzzle, and I loved each one. How does the ball actually punch through the rings in a Helix Jump? How should a snake grow and turn so it feels right under your thumb? I&#39;d build one, polish it until it played the way it should, and go straight into the next — not because a clock was ticking, but because I genuinely couldn&#39;t wait to start the one after it.</p>
<p>When I finally looked up, I&#39;d built 11 of the 12. It had taken me 2 months and 15 days.</p>
<p>I wasn&#39;t chasing a record. I just loved the work too much to stop.</p>
<h2 id="what-it-led-to"><a class="heading-anchor" href="#what-it-led-to" aria-label="Link to this section">#</a>What it led to</h2>
<p>That stretch was meant to take a full 3 months, and most people weren&#39;t expected to clear it at all. I&#39;d done more than was asked, in less time than was given — and after that, things moved quickly.</p>
<p>They took me off the practice games and put me on real ones: production titles with actual players waiting. I started designing core systems — the architecture underneath a game, not just the surface. And before long I was being pulled into concept meetings for the bigger projects, sitting in the rooms where the real decisions got made.</p>
<p>A few months earlier, I&#39;d frozen on a single line of code in an interview. Now I was helping decide how whole games would be built. I still think about that gap — how short the distance really was, and how impossibly far it had felt.</p>
<h2 id="the-thing-i-never-saw-coming"><a class="heading-anchor" href="#the-thing-i-never-saw-coming" aria-label="Link to this section">#</a>The thing I never saw coming</h2>
<p>Months in, a new group came through the studio on a visit — students from GameTrain, the same program I&#39;d come up through, touring the partner studios in Lahore to see real game development up close. It was the exact trip I&#39;d once been too poor to take.</p>
<p>This time, I was on the other side of it. The head of HR called me into the meeting room — just me — to meet them, and to show them what excellence in this work could look like. Or at least, that&#39;s how it was put to me.</p>
<p>Then, with me standing right there in front of all of them, they turned to the room and said:</p>
<p>&quot;Sheeraz might not even know this yet, but he&#39;s one of the best game developers we&#39;ve ever had here.&quot;</p>
<p>I didn&#39;t know what to do with that. I&#39;d been making games for a matter of months. Not long before, I&#39;d been one of them — a gamer from a village with a broken laptop, getting turned away by everyone I asked for a way in. And now I was the example they were holding up.</p>
<p>I won&#39;t pretend I&#39;d found some secret. I hadn&#39;t. All I ever really did was love the work enough to keep going at it — past the rejections, past the freeze, past every good reason to give up. I didn&#39;t have the degree, or the right city, or the safe path. I just had the one thing that turned out to matter most: I couldn&#39;t stay away from it.</p>
<h2 id="where-it-became-real"><a class="heading-anchor" href="#where-it-became-real" aria-label="Link to this section">#</a>Where it became real</h2>
<p>That&#39;s the whole story — from a broken laptop in Ghotki to a studio I was proud to build games for.</p>
<p>I&#39;m still on this road, and I think I always will be. There have been other studios since, other kinds of games, things I&#39;ve gotten to make that the kid with the cracked screen could never have pictured. But this was where it became real — where &quot;I want to make games&quot; quietly turned into &quot;I make games.&quot;</p>
<p>If you&#39;ve read all three parts, thank you, truly. I wrote this for anyone sitting where I once sat: wanting something badly, with no clear way in, and every reason to believe it just isn&#39;t meant for people like them. I promise you it can be. You don&#39;t need permission, or the perfect background, or the safe path. You only need to love it enough to keep showing up — and to keep going when the answer is no.</p>
<p>It took me a long time to hear my first yes. But it came. Yours can too.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How I Got My First Game Dev Job</title>
      <link>https://blog.lemesherry.com/first-game-dev-job</link>
      <guid isPermaLink="true">https://blog.lemesherry.com/first-game-dev-job</guid>
      <pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
      <description>How I got my first game development job with no computer science degree — the interview I froze in, the weeks of silence, and the gamble that sent me to a city where I knew no one. Part 2.</description>
      <content:encoded><![CDATA[<p>The moment I learned how games are actually built, I was hooked.</p>
<p>I&#39;d loved playing them my whole life. But making them turned out to be a different kind of joy entirely — and it became mine the instant I started. Learning it was never going to be the hard part. Getting someone to pay me to do it was.</p>
<p>In <a href="/zero-to-game-dev">part 1</a>, after a year of trying with nothing to show for it, I&#39;d finally landed a seat in a game development course I never thought I&#39;d get into. This part is everything that came after — the interview that fell apart, the weeks of silence, and the gamble that changed everything.</p>
<p>This is part 2.</p>
<h2 id="3-months-to-prove-it"><a class="heading-anchor" href="#3-months-to-prove-it" aria-label="Link to this section">#</a>3 months to prove it</h2>
<p>The course was run by <a href="https://www.linkedin.com/school/game-train/" target="_blank" rel="noopener noreferrer">GameTrain</a>, a software training studio in Lahore. 3 months, fully online, 9 to 6 every day. At the end, the best students would be sent to interview with real studios. That was the whole prize — not a certificate, but a real shot at a job.</p>
<p>I&#39;d joined a week late, but catching up never felt like a chore. I was obsessed. The class ran 9 to 6, but mine ran past midnight — not because anyone asked me to, but because I couldn&#39;t make myself stop. I&#39;d finish the day&#39;s lessons and keep going on my own, chasing down anything about games that caught my eye, building little things just to see if I could. Some days were 16 hours long and they flew by. For the first time in my life, learning didn&#39;t feel like studying. It felt like play.</p>
<p>I wasn&#39;t starting from nothing — but I wasn&#39;t far from it, either. I&#39;d built Discord bots before, sure, but mostly by gluing together snippets and answers I found online. I didn&#39;t really understand the fundamentals, and I wouldn&#39;t have called myself a real developer. C# was a whole new world. I started at the very beginning — what a class even is, how to write a function, how all the pieces fit together. It came quickly, faster than I&#39;d expected, because I simply couldn&#39;t put it down.</p>
<p>What carried me was my own curiosity. I was so into this that I kept wandering off the course path — reading about things we hadn&#39;t reached yet, breaking stuff, trying ideas that had nothing to do with that week&#39;s lesson. And whenever I got stuck, my mentors were there: <a href="https://www.linkedin.com/in/muhammadhaditanveer/" target="_blank" rel="noopener noreferrer">Muhammad Hadi</a>, <a href="https://www.linkedin.com/in/wasim414/" target="_blank" rel="noopener noreferrer">Wasim Akram</a>, <a href="https://www.linkedin.com/in/aqib-shafiq-506917189/" target="_blank" rel="noopener noreferrer">Aqib Shafiq</a>, and the rest of the staff at GameTrain. They stayed back after class, again and again, and patiently helped me understand whatever I&#39;d gone off chasing — even the things that had nothing to do with the course. I owe them more than I can say.</p>
<p>My very first build was tiny: a little car on a floating road, straight out of the course&#39;s opening unit. You steered it with the arrow keys and tried not to hit the obstacles. The first time I wrote a line of C# and watched that car actually roll forward across the screen, that old &quot;Hello World&quot; feeling came rushing back — but bigger. I had made something move. By the end of those 3 months, making games had stopped feeling like a course I was taking. It felt like the thing I was meant to do.</p>
<p>There was only one part I couldn&#39;t be part of. Near the end, my class got the chance to visit real game studios in Lahore — to walk in and see, with my own eyes, how the games I loved were actually made. I wanted that more than I know how to put into words. But the trip cost money I didn&#39;t have, and my parents had even less. They would have found it for me somehow if I&#39;d asked — and that&#39;s exactly why I didn&#39;t. I couldn&#39;t put the weight of a want, just a want, onto people who were already giving me everything they had. So I stayed home while the others went, and I told myself my turn would come.</p>
<h2 id="the-interview-i-froze-in"><a class="heading-anchor" href="#the-interview-i-froze-in" aria-label="Link to this section">#</a>The interview I froze in</h2>
<p>Then the course ended, and the calls started.</p>
<p>One by one, my classmates were getting hired. My first interview was with the studio I wanted most — I&#39;d had my eye on it from the moment I learned the course could lead there. Just being on that call felt like a dream. And the person interviewing me was someone I genuinely looked up to: a team lead with the kind of game knowledge and industry experience I could only hope to have one day.</p>
<p>I sat at my desk back home in Ghotki, nervous and hopeful. We talked about games and engines, and that part went well. Then they asked me to write a small piece of code, right there on the call — a simple function that returns the power of a number.</p>
<p>And here&#39;s the part that still gets me: I knew how to do it.</p>
<p>But my mind started racing. Should I use Unity&#39;s built-in Mathf.Pow? Or write it out with a loop — wait, a loop, for something that already has a built-in function? That&#39;s wasteful, they&#39;d never like that. And what if they didn&#39;t like my approach either way?</p>
<p>The more I overthought it, the less I could do. I couldn&#39;t type a single line. I just sat there, frozen, staring at an empty screen. My first real game development interview, at the studio I wanted more than any other, in front of someone I admired — and it was all too much. I just wasn&#39;t in my senses.</p>
<p>I knew I&#39;d lost it before the call even ended. They never called back.</p>
<h2 id="the-silence"><a class="heading-anchor" href="#the-silence" aria-label="Link to this section">#</a>The silence</h2>
<p>Then came the part I wasn&#39;t ready for: nothing.</p>
<p>A week passed. Then another. One by one, the rest of my class got hired, and my phone stayed silent. Slowly, I understood why. Most of them had computer science degrees. I didn&#39;t. They lived near Lahore, where the studios were. I was a whole province away, back in my village. On paper, I was the easy one to skip.</p>
<p>I had come so far — found the work I loved, fought my way into that course, poured every hour I had into it. And now it looked like it might all end right here, quietly, just short of everything.</p>
<h2 id="the-gamble"><a class="heading-anchor" href="#the-gamble" aria-label="Link to this section">#</a>The gamble</h2>
<p>So I did something that scared me.</p>
<p>If every studio was in Lahore, then I would go to Lahore — the same city I couldn&#39;t afford to even visit a month before. Except this time it wasn&#39;t for a tour. It was to go and find a real opportunity at a real studio.</p>
<p>Because deep down, I believed the passion I&#39;d found for making games had to lead somewhere. I didn&#39;t know where yet. What I knew was what I wanted: to be a game developer at a studio that would actually pay me to make games. To earn a living doing the thing I loved. To get better at it the only way that&#39;s real — by building actual games on a real team, and learning what it truly takes to finish and ship one.</p>
<p>It was a risk, and it was the only move I could see. So I took the bet.</p>
<p>My parents didn&#39;t have much, but they put together around 15,000 rupees and pressed it into my hands — more than they could really spare. I knew this was my one shot, and that somehow, with that little, I had to make it work. I packed one bag and left for a city where I knew almost no one. My older brother&#39;s old roommate let me sleep on his floor.</p>
<p>Then I made that money stretch as far as it would go. For days I walked — kilometres at a time, studio to studio — instead of paying for rides, because every rupee had to cover rent, food, and the next day of trying. It was the same thing I&#39;d done years before, walking street to street to find someone who&#39;d teach me to code. Only now I knew a little more, and I had a lot less to lose.</p>
<h2 id="the-phone-call"><a class="heading-anchor" href="#the-phone-call" aria-label="Link to this section">#</a>The phone call</h2>
<p>One of those studios was <a href="https://www.linkedin.com/company/game-district/" target="_blank" rel="noopener noreferrer">Game District</a>. The interview felt good — really good. And then, again, silence. Days went by with no answer, while my 15,000 rupees kept shrinking and every day in the city cost money I didn&#39;t have.</p>
<p>I was almost out of money, and almost out of hope. So I went back to the people who had never let me down — my mentors. I met <a href="https://www.linkedin.com/in/wasim414/" target="_blank" rel="noopener noreferrer">Wasim</a> in person for the first time, and within a day he&#39;d found me another lead and set up a new interview, a couple of days away. A backup. A reason to hold on a little longer.</p>
<p>The evening before that backup interview, my phone rang.</p>
<p>It was Game District. I had the job.</p>
<p>I still can&#39;t describe the sound I made. What I remember is how hard it was to get the words out when I called home — how my voice broke in the middle of telling my parents that the money, the bag, the floor in a stranger&#39;s house, all of it had been worth it. After a year of trying — after every rejection and every silent week — I had finally found my opportunity: a real chance to make something out of game development, the true passion I&#39;d discovered in myself.</p>
<h2 id="one-last-test"><a class="heading-anchor" href="#one-last-test" aria-label="Link to this section">#</a>One last test</h2>
<p>I had the job — but I came in as a trainee, on lower pay than the others. I didn&#39;t settle for that, though. I&#39;d worked out a deal: from there on, what I earned would rise with how well I performed.</p>
<p>And to measure that, there was a test waiting — a run of work most new hires weren&#39;t even expected to finish in the time they were given, built to show exactly what someone could do. I didn&#39;t fully grasp that yet. All I knew was that I hadn&#39;t come this far to let it slip.</p>
<p>What I did with it — and how fast — is the part of this whole story I&#39;m proudest of. But that&#39;s part 3.</p>
<p>For now, I&#39;ll leave it here. If you&#39;re somewhere in the hard part right now — sending out your work, hearing nothing back, wondering if your turn is ever going to come — I hope this one stays with you. I&#39;m not special. I was just someone who got told no, again and again, and kept going anyway. If that&#39;s you too, I&#39;d love for you to keep going — and to come back for the last part, where all of it finally paid off.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How I Got Into Game Development</title>
      <link>https://blog.lemesherry.com/zero-to-game-dev</link>
      <guid isPermaLink="true">https://blog.lemesherry.com/zero-to-game-dev</guid>
      <pubDate>Tue, 16 Jun 2026 00:00:00 GMT</pubDate>
      <description>How I went from a gamer in a small town in Pakistan to game development — teaching myself to code, getting turned away, and finding the way in. Part 1.</description>
      <content:encoded><![CDATA[<p>A few years ago, I was just another gamer in a small town in Pakistan, playing on a broken laptop. I had no idea how the games I loved were actually made.</p>
<p>Today, I make games for a living.</p>
<p>This is the story of how I crossed that distance. This is part 1.</p>
<h2 id="i-was-a-gamer-first"><a class="heading-anchor" href="#i-was-a-gamer-first" aria-label="Link to this section">#</a>I was a gamer first</h2>
<p>Before any of this, I was a gamer — and not a casual one.</p>
<p>For more than 16 years, I played to win: top 10% in most games I touched, mostly shooters like Counter-Strike 1.6 and CS:GO. For years, I had one dream — to go pro.</p>
<p>But deep down, I knew it would never happen. Where I lived, professional gaming wasn&#39;t a career — no teams, no tournaments, no way in. And even if there had been, I was far too poor to chase it.</p>
<p>I grew up in a village in Ghotki, in Sindh, Pakistan, where fast internet was a luxury. My laptop&#39;s screen was cracked and dead, so I ran it on an old monitor — a basic machine with no graphics card, playing whatever it could.</p>
<p>So I knew games — how they feel, why some just <em>work</em>. I just had no idea how anyone actually built one. That world felt impossibly far from mine.</p>
<h2 id="teaching-myself-to-code"><a class="heading-anchor" href="#teaching-myself-to-code" aria-label="Link to this section">#</a>Teaching myself to code</h2>
<p>On Discord, I noticed a few people building their own bots — little programs that run tasks on their own. I&#39;d never pictured myself making software. But watching them, a quiet thought crept in: maybe I could learn this too.</p>
<p>So I Googled &quot;best programming language to learn.&quot; The answer that kept coming back was C++. With no teacher and no plan — just YouTube and time — a free course by Code with Harry became my classroom.</p>
<p>At the end of January 2021, I wrote my first real program. All it did was show two words on a black screen: &quot;Hello World!&quot;</p>
<p>I know how small that sounds. But I still remember staring at it. I had given a computer an instruction, and it had listened. Something clicked. I wanted to build things.</p>
<p>Then the road got steep. The deeper I went, the harder it got — and with no one to ask, the excitement slowly drained out of me, until one day I simply stopped.</p>
<h2 id="the-door-that-didnt-open"><a class="heading-anchor" href="#the-door-that-didnt-open" aria-label="Link to this section">#</a>The door that didn&#39;t open</h2>
<p>After a while, I decided I needed a real teacher — a person, not a video.</p>
<p>But the computer centers in my city only taught the basics: Microsoft Office, a simple web page. I joined one anyway, sat through spreadsheet formulas until the boredom won, and left.</p>
<p>Then I heard about a man in my city who built websites for a living — someone people respected. Nobody had his number, just a rough idea of his neighborhood.</p>
<p>So I went to find him. I walked through streets lined with hundreds of houses, asking, guessing, hoping. And somehow, I found the right door.</p>
<p>I knocked. He opened it himself, half-asleep — I think I&#39;d woken him from an afternoon nap. Standing on his doorstep in the heat, I told him I just wanted to learn to code. I offered to pay him whatever I could. I offered to work for free. Anything, if he would only teach me.</p>
<p>He said no. He couldn&#39;t help me. We never made it past his doorstep, and I walked home with nothing.</p>
<p>That rejection broke something in me. I stopped completely — no tutorials, no code, nothing — for almost two months. As far as I was concerned, that part of my life was over.</p>
<p>What I didn&#39;t know was that the thing that would pull me back was waiting in the last place I&#39;d have thought to look.</p>
<h2 id="finding-my-way-back"><a class="heading-anchor" href="#finding-my-way-back" aria-label="Link to this section">#</a>Finding my way back</h2>
<p>It was Discord — the very place that had started all of this.</p>
<p>For those two months I&#39;d been there again, not to learn, just to be around other gamers and forget coding entirely. But little by little, I drifted into other rooms: ones full of developers, sharing what they built. And there I found a language I&#39;d never tried — JavaScript.</p>
<p>JavaScript made sense to me in a way C++ never had. I didn&#39;t need ten lines of code just to see a result. Without quite noticing, my excitement came rushing back. I started building my own Discord bots and putting them online, free, for anyone to use.</p>
<p>The one I&#39;m proudest of is Sherry Music Bot. Other bots locked their best features behind payment — audio effects that turn an ordinary song into a calm &quot;lofi&quot; version, or a slowed, echoing remix. I built all of it and gave it away for nothing.</p>
<p>It spread fast. Soon, in a community of more than 10,000 people, my name was known for the things I&#39;d made. I wasn&#39;t earning money — but I was earning something I valued far more: a real name among other developers, the kind of respect that only comes from building something people genuinely love to use. That kept me going.</p>
<h2 id="the-video-that-changed-everything"><a class="heading-anchor" href="#the-video-that-changed-everything" aria-label="Link to this section">#</a>The video that changed everything</h2>
<p>Then, in September 2021, a single video changed the direction of my life.</p>
<p>It was called &quot;Game Development in Pakistan,&quot; by Mooroo, a famous Pakistani vlogger, sponsored by a training program called <a href="https://www.linkedin.com/school/game-train/" target="_blank" rel="noopener noreferrer">GameTrain</a> in Lahore.</p>
<p>Until that moment, I had no idea people even made games in Pakistan — it had never once crossed my mind. Suddenly there was a door I didn&#39;t know existed, in my own country. I clicked, and I couldn&#39;t look away.</p>
<p>So I applied. A GameTrain mentor named <a href="https://www.linkedin.com/in/muhammad-sufyan-hito/" target="_blank" rel="noopener noreferrer">Muhammad Sufyan</a> interviewed me. He was a Counter-Strike player too, so we spent most of it talking about games. (To this day, the best interview I&#39;ve ever had.)</p>
<p>But then came the bad news. I was about a week too late. The program had started, every seat was full, and there was no room unless someone dropped out. I said I understood. I hadn&#39;t expected much anyway — I&#39;d applied just to see what might happen.</p>
<h2 id="the-door-that-opened"><a class="heading-anchor" href="#the-door-that-opened" aria-label="Link to this section">#</a>The door that opened</h2>
<p>Two days later, my phone rang again.</p>
<p>One of the chosen students couldn&#39;t join. A single seat had opened — and they were offering it to me.</p>
<p>I think about that moment often. I had done everything I could, and still been turned away, again and again. There was nothing left to try. And then, out of nowhere, the door opened on its own.</p>
<p>I&#39;ve come to believe that what&#39;s truly meant for you finds its way to you — often through a path you never planned, at the moment you&#39;ve stopped expecting it. Call it destiny, call it God&#39;s plan — I only know it wasn&#39;t me who forced that door open this time. All I had to do was say yes.</p>
<p>So I did. With everything in me — yes.</p>
<p>And just like that, after a year of dead ends and closed doors, after almost giving up for good, I was in. To this day, I thank God for that one empty seat.</p>
<p>This was where it truly began — though nowhere near the end of the hard part. Inside GameTrain, I&#39;d have to learn an entire craft from nothing, fast. And the hardest battle was still ahead: getting a real studio to take a chance on someone like me. That&#39;s part 2.</p>
<p>But that night, none of it mattered yet. After every door that had shut in my face, one had finally opened — not by my hand, but somehow, right on time. And this time, I walked through it.</p>
<p>If you&#39;ve ever wanted something so badly it hurt, with no clear way to reach it, I&#39;d love for you to walk the rest of this road with me. The hardest — and the best — parts are still to come.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
