{"id":42,"date":"2026-09-08T13:20:01","date_gmt":"2026-09-08T13:20:01","guid":{"rendered":"https:\/\/projects.etc.cmu.edu\/spellchemists\/?p=42"},"modified":"2026-09-08T14:03:16","modified_gmt":"2026-09-08T14:03:16","slug":"week-1-a-new-start","status":"publish","type":"post","link":"https:\/\/projects.etc.cmu.edu\/spellchemists\/week-1-a-new-start\/","title":{"rendered":"Week 1: A New Start"},"content":{"rendered":"\n<p class=\"alignwide wp-block-paragraph\">Welcome to the first development blog for <strong>SpellChemists<\/strong>!<\/p>\n\n\n\n<p class=\"alignwide wp-block-paragraph\">SpellChemists is a cooperative game where players take on the role of apprentice alchemists working together to create spells. Built for the Board, the game combines digital gameplay with physical interaction: players place and move physical pieces on the Board, while the game recognizes those pieces and responds to their actions.<\/p>\n\n\n\n<div class=\"wp-block-group is-layout-grid wp-container-core-group-is-layout-b861f4ab wp-block-group-is-layout-grid\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"2143\" src=\"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/IMG_3021-edited-scaled.jpg\" alt=\"\" class=\"wp-image-34\" srcset=\"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/IMG_3021-edited-scaled.jpg 2560w, https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/IMG_3021-edited-300x251.jpg 300w, https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/IMG_3021-edited-1024x857.jpg 1024w, https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/IMG_3021-edited-768x643.jpg 768w, https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/IMG_3021-edited-1536x1286.jpg 1536w, https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/IMG_3021-edited-2048x1715.jpg 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-style-default wp-container-content-a37929a5\" style=\"margin-top:0;margin-right:0;margin-bottom:0;margin-left:0\"><img loading=\"lazy\" decoding=\"async\" width=\"2560\" height=\"1920\" src=\"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/IMG_3024-edited-scaled.jpg\" alt=\"\" class=\"wp-image-35\" srcset=\"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/IMG_3024-edited-scaled.jpg 2560w, https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/IMG_3024-edited-300x225.jpg 300w, https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/IMG_3024-edited-1024x768.jpg 1024w, https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/IMG_3024-edited-768x576.jpg 768w, https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/IMG_3024-edited-1536x1152.jpg 1536w, https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/IMG_3024-edited-2048x1536.jpg 2048w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><figcaption class=\"wp-element-caption\">The Board<\/figcaption><\/figure>\n<\/div>\n\n\n\n<p class=\"alignwide wp-block-paragraph\">During our first week of development, our main goal was to establish the technical foundation for that interaction. As part of our Gold Spike, we began testing how physical pieces communicate with the Board and how that information can be read and used reliably in Unity.<\/p>\n\n\n\n<h2 class=\"wp-block-heading alignwide\">Stabilizer for Board Glyphs<\/h2>\n\n\n\n<p class=\"alignwide wp-block-paragraph\">Board reports a Glyph as a contact with a&nbsp;glyphId&nbsp;taken from the conductive pattern on the underside of a piece. On SpellChemists early development the pieces we are using are 3D-printed, and that pattern is close enough for the on-device model to emit an id while remaining noisy enough that the same resting piece can emit several ids. The contact can also drop and return under a new&nbsp;contactId. Gameplay that reads&nbsp;contact.glyphId&nbsp;therefore sees a swap that did not happen. This might be very tricky when we have some first-time reading features.<\/p>\n\n\n\n<p class=\"alignwide wp-block-paragraph\">In the first try I developed as stabilizer to solve this problem. Each frame the stabilizer polls Glyph contacts and folds their ids into a short vote window keyed first by&nbsp;contactId. The defaults are a 0.4s window, five samples, and a 0.6 majority that also has to beat the second-place count. Until that bar is met the published id follows the latest raw value; once it is met the published id stays on the winner until another id meets the same bar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"857\" height=\"97\" src=\"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/w01-code-edited.jpg\" alt=\"\" class=\"wp-image-37\" srcset=\"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/w01-code-edited.jpg 857w, https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/w01-code-edited-300x34.jpg 300w, https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/w01-code-edited-768x87.jpg 768w\" sizes=\"auto, (max-width: 857px) 100vw, 857px\" \/><\/figure>\n\n\n\n<p class=\"alignwide wp-block-paragraph\">Unity fingers use&nbsp;glyphId == -1, so the filter is&nbsp;BoardContactType.Glyph. When a contact leaves the active set, its track is kept as a ghost for 0.25s. A new Glyph that appears within about 72 pixels of that ghost reuses the same sample history, which covers the case where the tracker rebuilds the contact. Live tracks are left alone.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"857\" height=\"298\" src=\"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/w01-code-edited-1.jpg\" alt=\"\" class=\"wp-image-38\" srcset=\"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/w01-code-edited-1.jpg 857w, https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/w01-code-edited-1-300x104.jpg 300w, https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/w01-code-edited-1-768x267.jpg 768w\" sizes=\"auto, (max-width: 857px) 100vw, 857px\" \/><\/figure>\n\n\n\n<p class=\"alignwide wp-block-paragraph\">The Board sample&nbsp;InputManager&nbsp;still draws the raw overlay.&nbsp;HaruGlyphIdStabilizerDriver&nbsp;writes a second line,&nbsp;raw \u2192 stable, with&nbsp;[warmup]&nbsp;or&nbsp;[lock]. Callers take the locked id from the stabilizer.<\/p>\n\n\n\n<figure class=\"wp-block-image alignwide size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"857\" height=\"91\" src=\"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/w01-code-edited-2.jpg\" alt=\"\" class=\"wp-image-39\" srcset=\"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/w01-code-edited-2.jpg 857w, https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/w01-code-edited-2-300x32.jpg 300w, https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-content\/uploads\/2026\/09\/w01-code-edited-2-768x82.jpg 768w\" sizes=\"auto, (max-width: 857px) 100vw, 857px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"alignwide wp-block-paragraph\">If the published id still moves, raise&nbsp;windowSeconds&nbsp;or&nbsp;majorityRatio. If lock arrives late, lower&nbsp;minVotes. If two nearby pieces share a history, lower&nbsp;reacquireDistancePixels. The overlay in&nbsp;HaruTest&nbsp;is there so those knobs can be judged against the raw Glyph line on device.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Welcome to the first development blog for SpellChemists! SpellChemists is a cooperative game where players take on the role of apprentice alchemists working together to create spells. Built for the Board, the game combines digital gameplay with physical interaction: players place and move physical pieces on the Board, while the game recognizes those pieces and [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-42","post","type-post","status-publish","format-standard","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-json\/wp\/v2\/posts\/42","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-json\/wp\/v2\/comments?post=42"}],"version-history":[{"count":3,"href":"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-json\/wp\/v2\/posts\/42\/revisions"}],"predecessor-version":[{"id":46,"href":"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-json\/wp\/v2\/posts\/42\/revisions\/46"}],"wp:attachment":[{"href":"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-json\/wp\/v2\/media?parent=42"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-json\/wp\/v2\/categories?post=42"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/projects.etc.cmu.edu\/spellchemists\/wp-json\/wp\/v2\/tags?post=42"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}