{"id":159,"date":"2026-08-20T09:34:12","date_gmt":"2026-08-20T09:34:12","guid":{"rendered":"https:\/\/blogs.scummvm.org\/ramyak\/?p=159"},"modified":"2026-08-20T10:39:45","modified_gmt":"2026-08-20T10:39:45","slug":"gsoc-2026-director-engine-and-visual-debugger","status":"publish","type":"post","link":"https:\/\/blogs.scummvm.org\/ramyak\/2026\/08\/20\/gsoc-2026-director-engine-and-visual-debugger\/","title":{"rendered":"GSoC 2026: Director Engine and Visual Debugger"},"content":{"rendered":"<p>Hi, I am Ramyak. My work centered on the Macromedia Director preservation effort in ScummVM: extending the ImGui-based visual debugger (DT), fixing engine compatibility bugs surfaced by the Gus games, implementing embedded movie cast members, and building screenshot-diff tooling into the ScummVM buildbot. All links below point to the pull requests.<\/p>\n<p>Please refer to the links at the end of this post for weekly breakdowns.<\/p>\n<h4>Key deliverables<\/h4>\n<ul>\n<li><strong>Movie cast members <\/strong>(<a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7752\">#7752<\/a>):<br \/>\nembedded Director movies that run as parallel sprites, managing separate execution states while sharing global variables.<\/li>\n<li><strong>Lingo execution tracer <\/strong>(<a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7816\">#7816<\/a>):<br \/>\na flamegraph view inside the debugger that records Lingo execution for performance and control-flow analysis.<\/li>\n<\/ul>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-147\" src=\"https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/08\/Screenshot-2026-08-12-at-12.02.55-AM.png\" alt=\"\" width=\"1600\" height=\"988\" srcset=\"https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/08\/Screenshot-2026-08-12-at-12.02.55-AM.png 1600w, https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/08\/Screenshot-2026-08-12-at-12.02.55-AM-300x185.png 300w, https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/08\/Screenshot-2026-08-12-at-12.02.55-AM-1024x632.png 1024w, https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/08\/Screenshot-2026-08-12-at-12.02.55-AM-768x474.png 768w, https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/08\/Screenshot-2026-08-12-at-12.02.55-AM-1536x948.png 1536w, https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/08\/Screenshot-2026-08-12-at-12.02.55-AM-1200x741.png 1200w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><\/p>\n<ul>\n<li><strong>ImageDiff on buildbot<\/strong>:<br \/>\nbrought screenshot-diff regression testing into the ScummVM buildbot dashboard, plus a set of Director regression test movies, so rendering changes can be caught visually.<\/li>\n<\/ul>\n<figure id=\"attachment_36\" aria-describedby=\"caption-attachment-36\" style=\"width: 2560px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-36\" src=\"https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/06\/image-scaled.png\" alt=\"\" width=\"2560\" height=\"1388\" srcset=\"https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/06\/image-scaled.png 2560w, https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/06\/image-300x163.png 300w, https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/06\/image-1024x555.png 1024w, https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/06\/image-768x416.png 768w, https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/06\/image-1536x833.png 1536w, https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/06\/image-2048x1110.png 2048w, https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/06\/image-1200x651.png 1200w, https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/06\/image-1980x1074.png 1980w\" sizes=\"auto, (max-width: 2560px) 100vw, 2560px\" \/><figcaption id=\"caption-attachment-36\" class=\"wp-caption-text\">pic of the tool from dev chat<\/figcaption><\/figure>\n<ul>\n<li><strong>Gus games compatibility<\/strong>:<br \/>\ndetection entries and a series of engine fixes (film loops, mouse dispatch, digital video, sound channels) that make the Gus titles playable.<\/li>\n<\/ul>\n<figure id=\"attachment_95\" aria-describedby=\"caption-attachment-95\" style=\"width: 2162px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-95\" src=\"https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/07\/Screenshot-2026-07-09-at-3.18.11-PM.png\" alt=\"\" width=\"2162\" height=\"792\" srcset=\"https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/07\/Screenshot-2026-07-09-at-3.18.11-PM.png 2162w, https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/07\/Screenshot-2026-07-09-at-3.18.11-PM-300x110.png 300w, https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/07\/Screenshot-2026-07-09-at-3.18.11-PM-1024x375.png 1024w, https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/07\/Screenshot-2026-07-09-at-3.18.11-PM-768x281.png 768w, https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/07\/Screenshot-2026-07-09-at-3.18.11-PM-1536x563.png 1536w, https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/07\/Screenshot-2026-07-09-at-3.18.11-PM-2048x750.png 2048w, https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/07\/Screenshot-2026-07-09-at-3.18.11-PM-1200x440.png 1200w, https:\/\/blogs.scummvm.org\/ramyak\/wp-content\/uploads\/sites\/84\/2026\/07\/Screenshot-2026-07-09-at-3.18.11-PM-1980x725.png 1980w\" sizes=\"auto, (max-width: 2162px) 100vw, 2162px\" \/><figcaption id=\"caption-attachment-95\" class=\"wp-caption-text\">movie paused at a breakpoint<\/figcaption><\/figure>\n<p>Before the coding period I made around 10 contributions building the initial Director visual debugger and fixing film loop rendering, which laid the groundwork for the GSoC work.<\/p>\n<h4>Director visual debugger (DT)<\/h4>\n<ul>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7553\">#7553<\/a> Fix bugs and crashes throughout the visual debugger<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7564\">#7564<\/a> Improve search and add a Windows panel<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7577\">#7577<\/a> Improve cast details, add script browser navigation and keyboard shortcuts<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7612\">#7612<\/a> Fix script not rendering in the script viewer<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7646\">#7646<\/a> Fix crashes, stale state, and navigation in the debugger<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7690\">#7690<\/a> Call-stack highlighting, Cast window improvements, and paused redraw<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7781\">#7781<\/a> ImGui debugger improvements (sortable cast lists, thumbnail refreshing)<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7816\">#7816<\/a> Add a Lingo execution tracer that records execution as a flamegraph <em>(in review)<\/em><\/li>\n<\/ul>\n<h4>Director engine fixes and features<\/h4>\n<ul>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7563\">#7563<\/a> Fix empty cast slot error and immediate sprite drag in D4+<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7598\">#7598<\/a> Add detection entries for Gus Goes to Cyberopolis (Windows and Mac)<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7614\">#7614<\/a> Add detection entry for Gus Goes to Cybertown<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7620\">#7620<\/a> Fix film loop shift when swapping a cast member with Lingo<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7633\">#7633<\/a> Fix mouseUp dispatching to the wrong sprite in D4<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7727\">#7727<\/a> Fix film loop D4 and D5+ behavior (freeze during pauses)<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7752\">#7752<\/a> Implement movie cast members as parallel interactive movies<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7780\">#7780<\/a> Fix trail-sprite erasure and 0x0 digital-video sizing<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7825\">#7825<\/a> Share sound channels across the Stage and MIAWs <em>(in review)<\/em><\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7854\">#7854<\/a> Fix Lingo point\/rect operations and bitmap picture assignment <em>(in review)<\/em><\/li>\n<\/ul>\n<h4>Backend<\/h4>\n<ul>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm\/pull\/7779\">#7779<\/a> BACKENDS: SDL: Preserve SDL text input for active ImGui text fields<\/li>\n<\/ul>\n<h4>ImageDiff and buildbot infrastructure (scummvm-sites)<\/h4>\n<ul>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm-sites\/pull\/39\">#39<\/a> Integrate the ImageDiff screenshot diff viewer<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm-sites\/pull\/40\">#40<\/a> Add pagination and default to the last page<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm-sites\/pull\/41\">#41<\/a> Replace image comparison with a file check<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm-sites\/pull\/42\">#42<\/a> Add ImageDiff integration using the wsgi-dashboards plugin<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/scummvm-sites\/pull\/43\">#43<\/a> Fix imports after merging imagediff.py into main.py<\/li>\n<\/ul>\n<h4>Director regression test movies (director-tests)<\/h4>\n<ul>\n<li><a href=\"https:\/\/github.com\/scummvm\/director-tests\/pull\/4\">#4<\/a> D4-win: Text wrapping test movie with reference rendering<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/director-tests\/pull\/5\">#5<\/a> D4 test movies for mouseUp dispatch and text wrapping<\/li>\n<li><a href=\"https:\/\/github.com\/scummvm\/director-tests\/pull\/7\">#7<\/a> D4-win\/D5-win: clickOn manual test movie in both D4 and D5<\/li>\n<\/ul>\n<h4>Timeline<\/h4>\n<ul>\n<li><strong>May 2026: <\/strong>Community bonding, <a href=\"https:\/\/blogs.scummvm.org\/ramyak\/category\/introduction\/\">Introduction<\/a><\/li>\n<li><strong>Jun to Jul 2026 (Weeks <a href=\"https:\/\/blogs.scummvm.org\/ramyak\/category\/week-1\/\">1<\/a> <a href=\"https:\/\/blogs.scummvm.org\/ramyak\/category\/week-2\/\">2<\/a> <a href=\"https:\/\/blogs.scummvm.org\/ramyak\/category\/week-3\/\">3<\/a> <a href=\"https:\/\/blogs.scummvm.org\/ramyak\/category\/week-4\/\">4<\/a> <a href=\"https:\/\/blogs.scummvm.org\/ramyak\/category\/week-5\/\">5<\/a> <a href=\"https:\/\/blogs.scummvm.org\/ramyak\/category\/week-6\/\">6<\/a>)<\/strong><br \/>\nDebugger fixes, Gus game compatibility, ImageDiff on buildbot; midterm passed mid-July.<\/li>\n<li><strong>Jul to Aug 2026 (Weeks <a href=\"https:\/\/blogs.scummvm.org\/ramyak\/category\/week-7\/\">7<\/a> <a href=\"https:\/\/blogs.scummvm.org\/ramyak\/category\/week-8\/\">8<\/a> <a href=\"https:\/\/blogs.scummvm.org\/ramyak\/category\/week-9\/\">9<\/a> <a href=\"https:\/\/blogs.scummvm.org\/ramyak\/category\/week-10\/\">10<\/a> <a href=\"https:\/\/blogs.scummvm.org\/ramyak\/category\/week-11\/\">11<\/a> <a href=\"https:\/\/blogs.scummvm.org\/ramyak\/category\/week-12\/\">12<\/a>)<\/strong><br \/>\nMovie cast members, film loop behavior, Lingo execution tracer, final polish<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Hi, I am Ramyak. My work centered on the Macromedia Director preservation effort in ScummVM: extending the ImGui-based visual debugger (DT), fixing engine compatibility bugs surfaced by the Gus games, implementing embedded movie cast members, and building screenshot-diff tooling into the ScummVM buildbot. All links below point to the pull requests. Please refer to the [&hellip;]<\/p>\n","protected":false},"author":32,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[],"class_list":["post-159","post","type-post","status-publish","format-standard","hentry","category-contributions"],"_links":{"self":[{"href":"https:\/\/blogs.scummvm.org\/ramyak\/wp-json\/wp\/v2\/posts\/159","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.scummvm.org\/ramyak\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.scummvm.org\/ramyak\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.scummvm.org\/ramyak\/wp-json\/wp\/v2\/users\/32"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.scummvm.org\/ramyak\/wp-json\/wp\/v2\/comments?post=159"}],"version-history":[{"count":11,"href":"https:\/\/blogs.scummvm.org\/ramyak\/wp-json\/wp\/v2\/posts\/159\/revisions"}],"predecessor-version":[{"id":170,"href":"https:\/\/blogs.scummvm.org\/ramyak\/wp-json\/wp\/v2\/posts\/159\/revisions\/170"}],"wp:attachment":[{"href":"https:\/\/blogs.scummvm.org\/ramyak\/wp-json\/wp\/v2\/media?parent=159"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.scummvm.org\/ramyak\/wp-json\/wp\/v2\/categories?post=159"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.scummvm.org\/ramyak\/wp-json\/wp\/v2\/tags?post=159"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}