{"id":366,"date":"2018-12-18T22:42:13","date_gmt":"2018-12-18T21:42:13","guid":{"rendered":"http:\/\/www.acidpool.at\/005_wordpress\/?p=366"},"modified":"2019-05-07T17:55:33","modified_gmt":"2019-05-07T15:55:33","slug":"von-einem-der-auszog-um-sprites-zu-rippen","status":"publish","type":"post","link":"http:\/\/www.acidpool.at\/005_wordpress\/index.php\/2018\/12\/18\/von-einem-der-auszog-um-sprites-zu-rippen\/","title":{"rendered":"Von einem der auszog um Sprites zu rippen&#8230;"},"content":{"rendered":"\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1004\" height=\"288\" src=\"http:\/\/www.acidpool.at\/005_wordpress\/wp-content\/uploads\/2018\/12\/Von_einem_der_auszog.png\" alt=\"\" class=\"wp-image-367\" srcset=\"http:\/\/www.acidpool.at\/005_wordpress\/wp-content\/uploads\/2018\/12\/Von_einem_der_auszog.png 1004w, http:\/\/www.acidpool.at\/005_wordpress\/wp-content\/uploads\/2018\/12\/Von_einem_der_auszog-300x86.png 300w, http:\/\/www.acidpool.at\/005_wordpress\/wp-content\/uploads\/2018\/12\/Von_einem_der_auszog-768x220.png 768w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/figure>\n\n\n\nNachdem ich heute @wrk ein bisschen Luft habe, versuche ich einen Teil meines seit Beginn des Projektes <strong>SR:SNES:DRMM<\/strong> gesammelten Wissens zu tei&#8230; niederzuschreiben damit ich <code>[Schwarzsehermodus:ON]<\/code> wenn ich nachdem ich das Projekt demn\u00e4chst auf Eis gelegt habe und Jahre sp\u00e4ter wieder ausgrabe mir nicht wieder alles aus den Fingern saugen muss.<code>[Schwarzsehermodus:OFF]<\/code><br>\n<br>\nAnd the big black dog bit me again, wohoo&#8230;<br>\n<br>\nEgal. So ziemliche alle Beitr\u00e4ge zum Thema &#8222;SNES Sprites rippen&#8220; berufen sich auf die mit den Emulatoren einzeln einblendbaren Layer:<br>\n<br>\nHier die Version in der die verschiedenen Layer einzeln ausgeblendet werden:<br><br>\n<img decoding=\"async\" src=\"http:\/\/www.acidpool.at\/007_shadowrun\/01_srsnesdrmm\/pictures\/181218_001.png\"><br>\n<br>\nUnd hier die etwas sinnvollere in der alle anderen Layer ausgeblendet sind:<br><br>\n<img decoding=\"async\" src=\"http:\/\/www.acidpool.at\/007_shadowrun\/01_srsnesdrmm\/pictures\/181218_002.png\"><br>\n<br>\nLaut <strong>zSNES<\/strong> gibt es also vier Backround- und einen Sprite-Layer. Das stimmt mit der auf \n<a href=\"https:\/\/de.wikipedia.org\/wiki\/Super_Nintendo_Entertainment_System#Spezifikationen\" target=\"_blank\" rel=\"noopener noreferrer\">Wikipedia<\/a> befindelichen Info \u00fcberein:<br>\n<br>\n<table border=\"0\"><tr><td valign=\"top\">Aufl\u00f6sung:<\/dr><td>224 (NTSC) bzw. 239 (PAL) Bildzeilen im Progressive-Modus, 448 bzw. 478 Zeilen im Interlaced-Modus. 256 Pixel pro Zeile im Standardmodus, 512 im \u201eHigh-Res\u201c Modus.<\/td><\/tr>\n<tr><td valign=\"top\">Farbtiefe:<\/td><td>15-Bit-Farbpalette, davon theoretisch alle Farben gleichzeitig darstellbar (unter Ausnutzung des Color Add\/Subtract-Modus). Ansonsten bis zu 256 Farben aus 4096 (Mode 7).<\/td><\/tr>\n<tr><td valign=\"top\">Hintergr\u00fcnde:<\/td><td>Bis zu 4 unabh\u00e4ngig scrollbare Tilemap-Grafikebenen (Playfields), Colour Add\/Subtract Mode (zum Kombinieren der Grafikebenen f\u00fcr Transparenzeffekte zwischen den einzelnen Ebenen und Sprites), 8 Grafikmodi mit unterschiedlichen Farbtiefen und Anzahl der Ebenen, Mode 7 erlaubt das dreidimensionale Zoomen, Drehen und Verzerren einer Grafikebene. Das Kippen der Grafik war von Hause aus nicht m\u00f6glich, wurde aber durch helfende DSP-Chips in manchen Modulen gew\u00e4hrt.<\/td><\/tr>\n<tr><td valign=\"top\">Sprites:<\/td><td>128 Hardware-Sprites, 16 Farben pro Sprite (eine davon transparent), Spritegr\u00f6\u00dfen von 8 \u00d7 8 bis 64 \u00d7 64 Pixel, max. 32 Sprites pro Zeile, max. 34 Sprite-Tiles (8 \u00d7 8 Pixel) pro Zeile.<\/td><\/tr><\/table>\nDie meisten Beitr\u00e4ge schlagen vor das Spiel zu pausieren, alles bis auf die zu extrahierenden Layer auszublenden, einen Screenshot zu erstellen und dann im Bildbearbeitungsprogramm der Wahl loszulegen. Zielt man die einzelnen Phasen einer Animation ab, w\u00fcnscht einem die Mehrheit ironisch viel Spa\u00df w\u00e4hrend die Handvoll ernstzunehmender Autoren vorschl\u00e4gt die gew\u00fcnschte Animation mit ausgeblendeten Layern als Video aufzuzeichnen, die Frames zu extrahieren, jene mit den einzelnen Phasen auszusortieren und diese dann wie gewohnt im Bildbearbeitungsprogramm der Wahl zu verarbeiten.<br>\n<br>\nDas geht einen Millimeter einfacher. <strong>zSNES<\/strong> verf\u00fcgt n\u00e4mlich \u00fcber die F\u00e4higkeit pro Tastendruck nur ein Frame weiterzurechnen. Die Betonung liegt auf weiterrechnen, denn es geht um die auf den SNES-Takt bezogen erstellten Frames, nicht jene in denen sich etwas am Bildschirm ver\u00e4ndert. Man mu\u00df also immer noch x mal weiter dr\u00fccken bis man das n\u00e4chste Sprite angezeigt bekommt, aber das geht immer noch um Jahrhunderte schneller als die Version mit dem Video.<br>\n<br>\nDie Vorarbeit hierzu liegt in den &#8222;<strong>SPEED OPTIONS<\/strong>&#8220; (<em>&#8222;<strong>CONFIG<\/strong>&#8222;->&#8220;<strong>SPEED<\/strong>&#8222;<\/em>). Hier befindet sich unter &#8222;<strong>PAUSE GAME<\/strong>&#8220; der standardm\u00e4\u00dfig inaktive Punkt &#8222;<strong>INCR FRAME<\/strong>&#8222;. Hier einmal reinklicken und die Wunschtaste (<em>Bei mir hat sich ohne triftigen Grund &#8222;\u00dc&#8220; eingeb\u00fcrgert&#8230;<\/em>) eintragen.<br><br>\n<img decoding=\"async\" src=\"http:\/\/www.acidpool.at\/007_shadowrun\/01_srsnesdrmm\/pictures\/181218_005.png\"><br>\n<br>\nNicht vergessen unter &#8222;<strong>MISC<\/strong>&#8222;->&#8220;<strong>MISC KEYS<\/strong>&#8220; auch eine Taste f\u00fcr die zSNES-eigenen &#8222;<strong>SNAPSHOTS<\/strong>&#8220; (<em>alias Screenshots<\/em>) anzugeben. \ud83d\ude09<br><br>\n<img decoding=\"async\" src=\"http:\/\/www.acidpool.at\/007_shadowrun\/01_srsnesdrmm\/pictures\/181218_006.png\"><br>\n<br>\nDann geht&#8217;s auch schon los. Vor dem Animationsbeginn &#8222;<strong>PAUSE GAME<\/strong>&#8220; (<em>im Normalfall &#8222;P&#8220;<\/em>) bet\u00e4tigen, dann solange die bei &#8222;<strong>INCR FRAME<\/strong>&#8220; eingetragene Taste dr\u00fccken bis das erste Wunschsprite angezeigt wird und mit der &#8222;<strong>SNAPSHOT<\/strong>&#8222;-Taste aufnehmen. Dann mit &#8222;<strong>INCR FRAME<\/strong>&#8220; solange weiter bis das n\u00e4chste angezeigt wird, &#8222;<strong>SNAPSHOT<\/strong>&#8222;,  und so weiter und so weiter.<br>\n<br>\nMan kann btw. w\u00e4hrend dem Dr\u00fccken von &#8222;<strong>INCR FRAME<\/strong>&#8220; auch weitere Befehle eingeben. Wenn man zB. eine Richtungstaste dr\u00fcckt um die Spielfigur zu bewegen so wird diese Aktion von <strong>zSNES<\/strong> registriert und angewandt. Man k\u00f6nnte also, genug Geduld vorausgesetzt, w\u00e4hrend dem &#8222;<strong>INCR FRAME<\/strong>&#8222;-&#8222;<strong>SNAPSHOT<\/strong>&#8222;-Prozedere das Spiel auch tats\u00e4chlich spielen.<br>\n<br>\nSoviel zum Thema Screenshots.<br>\n<br>\nAn die Grenzen von Screenshots im Allgemeinen st\u00f6\u00dft der geneigte Ripper sobald sich Sprites \u00fcberlappen (<em>Da es nur einen Sprite-Layer gibt ist die Chance das es dazu kommt extrem hoch.<\/em>) oder Tilesets in Angriff genommen werden. Je besser der urpr\u00fcngliche K\u00fcnstler sein Handwerk verstanden hat desto aufwendiger wird es die Pixel korrekt zuzuordnen.<br>\n<br>\nIn der Regel wird einem erkl\u00e4rt das SNES-Sprites und Tiles zwischen 16&#215;16 und 32&#215;32 Pixel gro\u00df sind. Weil das bei den meisten klassischen JRPGs hervorragend passt, kann man (<em>in diesem Fall ich<\/em>) auch davon ausgehen das es sich bei isometrischen Spielen wie Shadowrun genauso verh\u00e4lt.<br><br>\n<img decoding=\"async\" src=\"http:\/\/www.acidpool.at\/007_shadowrun\/01_srsnesdrmm\/pictures\/181218_003.png\"><br>\n<br>\nTut es aber nicht. Vor allem der fixe Trugschluss das Tiles auf 16&#215;16 Pixel dimensioniert sind zeigt sich anhand der links \u00fcbrig bleibenden einzelnen Zeile. Dank <strong>vSNES<\/strong> wei\u00df ich mittlerweile das die Wahrheit bei ganz normalen rechtwinkeligen 8&#215;8 Pixel-Quadraten liegt.<br><br>\n<img decoding=\"async\" src=\"http:\/\/www.acidpool.at\/007_shadowrun\/01_srsnesdrmm\/pictures\/181218_004.png\"><br>\n<br>\nDer ganze Bildschirm ist (<em>zumindest bei Shadowrun<\/em>) in 8&#215;8 Pixel-Quadrate aufgeteilt. Jedes Sprite, jedes Tile, jede Font, etc. ist in 8&#215;8 Pixel Quadrate im Speicher hinterlegt. <strong>vSNES<\/strong> arbeitet mit den <code>.zst<\/code>-Dateien, den Savestates von <strong>zSNES<\/strong>. Savestates beinhalten alles was sich in dem Moment als es erstellt wurde im Speicher befand.<br><br>\n<img decoding=\"async\" src=\"http:\/\/www.acidpool.at\/007_shadowrun\/01_srsnesdrmm\/pictures\/181218_007.png\"><br>\n<br>\nDas einige Farben nicht passen liegt daran das jedem Sprite eine Palette aus 16 Farben (<em>eine davon transparent, siehe Wikipediaausschnitt<\/em>) zugeordnet ist und der MemViewer immer nur eine davon anzeigt. Warum? Keine Ahnung, ist aber f\u00fcr meine Zwecke auch egal. Um ehrlich zu sein habe ich den <strong>MemViewer<\/strong> mittlerweile gar nicht mehr aktiviert, denn der <strong>SceneViewer<\/strong> kann in der &#8222;layers&#8220;-Anzeige n\u00e4mlich diese 8&#215;8-Pixel Quadrate einzeln anzeigen.<br><br>\n<img decoding=\"async\" src=\"http:\/\/www.acidpool.at\/007_shadowrun\/01_srsnesdrmm\/pictures\/181218_008.png\"><br>\n<br>\nIn dem Screenshot sieht man leider nicht das der Mauscursor sich gerade \u00fcber Jakes Oberk\u00f6rper befindet und dieser deswegen im &#8222;tile info&#8220;-Feld vergr\u00f6\u00dfert dargestellt wird. Wirklich deutlich wird die M\u00e4chtigkeit des Viewers aber erst wenn Sprites \u00fcberlappt dargestellt werden, wie zB die T\u00fcr \u00fcber dem einem Morgue-Angestellten. F\u00e4hrt man mit dem Cursor \u00fcber das Maxerl, wird es im &#8222;tile info&#8220;-Feld vollst\u00e4ndig, ohne T\u00fcre dargestellt.<br>\n<br>\nIch habe keine Ahnung wie es sich bei scrollenden Darstellungen verh\u00e4lt, so weit bin ich mit dem Auseinandernehmen (<em>und analysieren was da gerade abgeht&#8230;<\/em>) noch nicht. Die Vermutung das sich das Bild dennoch im Speicher aus 8&#215;8 Pixel Quadraten aufbaut und am Bildschirm versetzt dargestellt wird liegt aber verdammt nahe. Zumindest funktioniert das Skyline-Hochhaus-Intro von Shadowrun auf diese Weise.<br><br>\n<img decoding=\"async\" src=\"http:\/\/www.acidpool.at\/007_shadowrun\/01_srsnesdrmm\/pictures\/181218_009.png\"><br>\n<br>\nDer Tag n\u00e4hert sich dem Ende und ich kann sagen das ich hier das Grundprinzip meines aktuellen Versuches die Sprites zu extrahieren meiner Meinung nach gut erkl\u00e4rt habe. Warum das aber noch nicht das Ende der Fahnenstange ist und warum ich extra meinen &#8222;<strong>SpriteXtractor<\/strong>&#8220; (<em>Ja, ich mag den Angebernamen immer noch *g*<\/em>) bastle um die dabei anfallende Arbeit wenigsten ein bisschen auslagern zu k\u00f6nnen erkl\u00e4re ich demn\u00e4chst.\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nachdem ich heute @wrk ein bisschen Luft habe, versuche ich einen Teil meines seit Beginn des Projektes SR:SNES:DRMM gesammelten Wissens zu tei&#8230; niederzuschreiben damit ich [Schwarzsehermodus:ON] wenn ich nachdem ich das Projekt demn\u00e4chst auf Eis gelegt habe und Jahre sp\u00e4ter wieder ausgrabe mir nicht wieder alles aus den Fingern saugen muss.[Schwarzsehermodus:OFF] And the big black &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/www.acidpool.at\/005_wordpress\/index.php\/2018\/12\/18\/von-einem-der-auszog-um-sprites-zu-rippen\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eVon einem der auszog um Sprites zu rippen&#8230;\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":367,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,5],"tags":[],"class_list":["post-366","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-black-dog","category-srsnesdrmm"],"_links":{"self":[{"href":"http:\/\/www.acidpool.at\/005_wordpress\/index.php\/wp-json\/wp\/v2\/posts\/366","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.acidpool.at\/005_wordpress\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.acidpool.at\/005_wordpress\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.acidpool.at\/005_wordpress\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.acidpool.at\/005_wordpress\/index.php\/wp-json\/wp\/v2\/comments?post=366"}],"version-history":[{"count":17,"href":"http:\/\/www.acidpool.at\/005_wordpress\/index.php\/wp-json\/wp\/v2\/posts\/366\/revisions"}],"predecessor-version":[{"id":491,"href":"http:\/\/www.acidpool.at\/005_wordpress\/index.php\/wp-json\/wp\/v2\/posts\/366\/revisions\/491"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.acidpool.at\/005_wordpress\/index.php\/wp-json\/wp\/v2\/media\/367"}],"wp:attachment":[{"href":"http:\/\/www.acidpool.at\/005_wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=366"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.acidpool.at\/005_wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=366"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.acidpool.at\/005_wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=366"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}