From ecfdd53c5f462e299576f60a5576440cb454bb2a Mon Sep 17 00:00:00 2001 From: John Bintz Date: Mon, 10 Jun 2024 22:04:40 -0400 Subject: [PATCH] it works --- agnus.png | Bin 0 -> 22040 bytes bun.c | 5 +- bun.h | 2 + copper-colors | Bin 0 -> 2560 bytes image_converter.rb | 371 +++++++++++++++++++++++++++++++++++++++------ images.s | 27 ++++ main | Bin 21500 -> 76664 bytes main.c | 212 +++++++++++++------------- mask-bitplane | Bin 0 -> 8192 bytes sprite-copperlist | Bin 0 -> 12288 bytes sprite-data | Bin 0 -> 8256 bytes system/system.s | 5 +- topaz-bitplane | Bin 0 -> 24576 bytes topaz2.png | Bin 0 -> 24267 bytes 14 files changed, 464 insertions(+), 158 deletions(-) create mode 100644 agnus.png create mode 100644 copper-colors create mode 100644 mask-bitplane create mode 100644 sprite-copperlist create mode 100644 sprite-data create mode 100644 topaz-bitplane create mode 100644 topaz2.png diff --git a/agnus.png b/agnus.png new file mode 100644 index 0000000000000000000000000000000000000000..c359964c424749d908d17d7a94b915c21992f7c6 GIT binary patch literal 22040 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 M-V&OM-ie_9FOJ~#U;qFB literal 0 HcmV?d00001 diff --git a/image_converter.rb b/image_converter.rb index dff49e3..f1594d0 100755 --- a/image_converter.rb +++ b/image_converter.rb @@ -17,6 +17,10 @@ class MaskPixel def initialize; end def color? = false + + def ==(other) + other.is_a?(MaskPixel) + end end class Color @@ -30,15 +34,24 @@ class Color WHITE = new(red: 15, green: 15, blue: 15) BLACK = new(red: 0, green: 0, blue: 0) + TRANSPARENT = new(red: -1, green: -1, blue: -1) def ==(other) red == other.red && green == other.green && blue == other.blue end + def transparent? + red == -1 && green == -1 && blue == -1 + end + def -(other) red - other.red + green - other.green + blue - other.blue end + def for_diff + 2 * red * red + 4 * green * green + 3 * blue * blue + end + alias eql? == def hash @@ -60,6 +73,8 @@ MAX_ALPHA = Magick::QuantumRange * 0.25 BIT_SHIFT = Math.log2(Magick::QuantumRange + 1) - 4 class PixelRow + include Enumerable + def initialize @row = [] end @@ -68,10 +83,284 @@ class PixelRow @row[x] = pixel end + def each(&block) + @row.each(&block) + end + + def prioritized_colors + colors_with_usage.sort_by(&:last).reverse.map(&:first) + end + + private + def colors_with_usage + last = nil + count = 0 + @row.find_all(&:color?).each_with_object({}) do |pixel, obj| + if last != pixel.color + last = pixel.color + count = 1 + end + + count += count + obj[pixel.color] ||= 0 - obj[pixel.color] += 1 + obj[pixel.color] += count + end + end +end + +class RowColors + def initialize; end +end + +class RowColorCalculator + MAX_BITPLANE_COLORS = 8 + MAX_SPRITE_COLORS = 8 + + def self.calculate(row:) + prioritized_colors = row.prioritized_colors + + bitplane_pixels_by_color = { + Color::TRANSPARENT => 0, + Color::BLACK => 1, + Color::WHITE => 2 + } + + sprite_pixels_by_color = {} + + colors_by_bitplane_pixel = {} + colors_by_sprite_pixel = {} + + prioritized_colors.each do |color| + next if bitplane_pixels_by_color.keys.include?(color) + + closest_matches = bitplane_pixels_by_color.keys.reject(&:transparent?).map do |bp_color| + [(bp_color.for_diff - color.for_diff).abs, bp_color] + end.compact + + closest_match = closest_matches.min_by(&:first) + + if bitplane_pixels_by_color.values.max == MAX_BITPLANE_COLORS - 1 + bitplane_pixels_by_color[color] = bitplane_pixels_by_color[closest_match.last] + + max_sprite_value = sprite_pixels_by_color.values.max + + if !max_sprite_value || max_sprite_value < MAX_SPRITE_COLORS - 1 + new_pixel_index = colors_by_sprite_pixel.count + sprite_pixels_by_color[color] = new_pixel_index + colors_by_sprite_pixel[new_pixel_index] = color + end + else + new_pixel_index = colors_by_bitplane_pixel.count + 3 + bitplane_pixels_by_color[color] = new_pixel_index + colors_by_bitplane_pixel[new_pixel_index] = color + end + end + + { + bitplane_pixels_by_color:, + sprite_pixels_by_color:, + colors_by_bitplane_pixel:, + colors_by_sprite_pixel: + } + end +end + +class RowMaskBitplaneCalculator + def self.calculate(row:) + bits = row.map { |p| p.is_a?(MaskPixel) ? 0 : 1 } + + bits.each_slice(8).map do |pixels| + byte = 0 + + pixels.each_with_index do |pixel, index| + bit = 7 - index + + byte |= (pixel << bit) + end + + byte + end + end +end + +class RowBitplaneCalculator + def self.calculate(row:, bitplane_pixels_by_color:) + output_pixels = row.map do |pixel| + next 0 if pixel.is_a?(MaskPixel) + + bitplane_pixels_by_color[pixel.color] || 0 + end + + bitplanes = [[], [], []] + + output_pixels.each_slice(8) do |pixels| + bits = [0] * 3 + + pixels.each_with_index do |pixel, index| + bit = 7 - index + + 3.times do |i| + bits[i] |= (((pixel >> i) & 1) << bit) + end + end + + 3.times do |i| + bitplanes[i] << bits[i] + end + end + + bitplanes + end +end + +class Sprite + attr_reader :x, :y, :color, :pixels + + # @!attribute color + # @return Color + + def initialize(x:, y:, color:) + @x = x + @y = y + @color = color + @pixels = [0] * 16 + end + + def add_pixel(x:, index:) + return if x - @x >= 16 + + @pixels[x - @x] = index + end +end + +class RowSpriteCalculator + def self.calculate(y:, row:, sprite_pixels_by_color:) + sprites_by_color = {} + + row.each_with_index.map do |pixel, x| + next if pixel.is_a?(MaskPixel) + + sprite_pixel = sprite_pixels_by_color[pixel.color] + next unless sprite_pixel + + sprite = sprites_by_color[pixel.color] + unless sprite + sprite = Sprite.new(y:, x:, color: pixel.color) + sprites_by_color[pixel.color] = sprite + end + + sprite.add_pixel(x:, index: 1) + end + + sprites_by_color + end +end + +module Amiga + class Util + TOTAL_HEIGHT = 256 + TOP_OFFSET = 44 + LEFT_OFFSET = 128 + + SPRITE_HEIGHT = TOTAL_HEIGHT + TOP_OFFSET + + def self.color_to_amiga_word(color:) + (color.blue + (color.green << 4) + (color.red << 8)) + end + + def self.sprposctl(x:, y:) + y += TOP_OFFSET + x += LEFT_OFFSET + + sprpos = ((y & 0xff) << 8) + + ((x & 0x1fe) >> 1) + sprctl = (((y + TOTAL_HEIGHT) & 0xff) << 8) + + ((y & 0x100) >> 6) + + (((y + TOTAL_HEIGHT) & 0x100) >> 7) + + (x & 1) + + { sprpos:, sprctl: } + end + end + + class BitplaneCopperlistFactory + def self.build(colors_by_bitplane_pixel:) + 5.times.map do |color_index| + color = colors_by_bitplane_pixel[color_index + 3] || Color::BLACK + + Amiga::Util.color_to_amiga_word(color:) + end.pack('n*') + end + end + + class BitplaneDataFactory + def self.build(bitplanes:) + bitplanes.map do |data| + data.pack('C*') + end + end + end + + class BitplaneMaskDataFactory + def self.build(bitplane:) + bitplane.pack('C*') + end + end + + class SpriteCopperlistFactory + # @param sprites [Array] + def self.build(sprites:, y_offset:) + obj = [] + + 8.times do |sprite_index| + color = 0 + sprpos = 0 + sprctl = 0 + + sprite = sprites[sprite_index] + if sprite + result = Amiga::Util.sprposctl(x: sprite.x, y: sprite.y + y_offset) + + color = Amiga::Util.color_to_amiga_word(color: sprite.color) + sprpos = result[:sprpos] + sprctl = result[:sprctl] + end + + obj << color + obj << sprpos + obj << sprctl + end + + obj.pack('n*') + end + end + + class SpriteDataFactory + def self.build(sprites:) + sprite_out = [''] * 8 + + sprites_with_bitplane = sprites.zip([0, 1] * 4) + + 8.times do |sprite_index| + sprite, bitplane = sprites_with_bitplane[sprite_index] + + 2.times do |current_bitplane| + result = 0 + + if bitplane == current_bitplane + sprite.pixels.each_with_index do |pixel, bit| + result |= (pixel << (15 - bit)) + end + end + + sprite_out[sprite_index] += [result].pack('n*') + end + end + + sprite_out end end end @@ -94,63 +383,53 @@ image.each_pixel do |px, x, y| rows[y].add(pixel:, x:) end -prioritized_colors = rows[50].colors_with_usage.to_a.sort { |a, b| b.last <=> a.last } +copper_colors = '' +topaz_bitplanes = [''] * 3 +sprite_copperlist = '' +sprite_data = [''] * 8 -presets_by_pixel_color = [ - nil, Color::BLACK, Color::WHITE -] +mask_bitplane = '' -unavailable_bitplane_colors = { - 0 => true, - 1 => true, - 2 => true -} +8.times do |i| + result = Amiga::Util.sprposctl(x: 319, y: 0) + sprite_data[i] = [result[:sprpos], result[:sprctl]].pack('n*') +end -MAX_BITPLANE_COLORS = 8 +rows.each_with_index do |row, y_offset| + result = RowColorCalculator.calculate(row:) -bitplane_colors = [ - nil, - Color::BLACK, - Color::WHITE -] + bitplane_pixels_by_color = result[:bitplane_pixels_by_color] + sprite_pixels_by_color = result[:sprite_pixels_by_color] + colors_by_bitplane_pixel = result[:colors_by_bitplane_pixel] -color_to_pixel_map = {} + bitplanes = RowBitplaneCalculator.calculate(row:, bitplane_pixels_by_color:) + sprites = RowSpriteCalculator.calculate(y: y_offset, row:, sprite_pixels_by_color:).values -# take 5 + BLACK + WHITE colors into bitplane_colors + mask = RowMaskBitplaneCalculator.calculate(row:) -prioritized_colors.map(&:first).each do |color| - maybe_preset_index = presets_by_pixel_color.find_index { |c| c && color == c } + mask_bitplane += Amiga::BitplaneMaskDataFactory.build(bitplane: mask) - if !maybe_preset_index.nil? - bitplane_colors[maybe_preset_index] = color - color_to_pixel_map[color] = maybe_preset_index + copper_colors += Amiga::BitplaneCopperlistFactory.build(colors_by_bitplane_pixel:) + raw_bitplanes = Amiga::BitplaneDataFactory.build(bitplanes:) - unavailable_bitplane_colors[maybe_preset_index] = true - elsif bitplane_colors.count < MAX_BITPLANE_COLORS - next_available_bitplane_color = 8.times.find { |i| !unavailable_bitplane_colors[i] } + sprite_copperlist += Amiga::SpriteCopperlistFactory.build(sprites:, y_offset:) + raw_sprite_data = Amiga::SpriteDataFactory.build(sprites:) - bitplane_colors[next_available_bitplane_color] = color - color_to_pixel_map[color] = next_available_bitplane_color + raw_bitplanes.each_with_index do |raw, index| + topaz_bitplanes[index] += raw + end - unavailable_bitplane_colors[next_available_bitplane_color] = true - else - closest_match = bitplane_colors.each_with_index.map do |bp_color, index| - next unless bp_color - - [(bp_color - color).abs, index] - end.compact.min_by(&:first) - - pp color - pp closest_match - pp bitplane_colors[closest_match.last] - puts '************************' - - color_to_pixel_map[color] = closest_match.last + raw_sprite_data.each_with_index do |raw, index| + sprite_data[index] += raw end end -pp prioritized_colors -pp bitplane_colors -pp color_to_pixel_map +8.times do |i| + sprite_data[i] += [0, 0].pack('n*') +end -# .to_a.sort(&:last).reverse +File.open('copper-colors', 'wb') { |fh| fh.print copper_colors } +File.open('topaz-bitplane', 'wb') { |fh| fh.print topaz_bitplanes.join('') } +File.open('mask-bitplane', 'wb') { |fh| fh.print mask_bitplane } +File.open('sprite-copperlist', 'wb') { |fh| fh.print sprite_copperlist } +File.open('sprite-data', 'wb') { |fh| fh.print sprite_data.join('') } diff --git a/images.s b/images.s index cf0c8c5..ffbad83 100644 --- a/images.s +++ b/images.s @@ -1,4 +1,31 @@ XDEF _coolbun + XDEF _TopazBitplanes + XDEF _CopperColors + XDEF _SpriteCopperlist + XDEF _SpriteData + XDEF _MaskBitplane _coolbun: INCBIN "images/bun small.raw" + + CNOP 0,4 + + SECTION Topaz,Data_C +_TopazBitplanes: + INCBIN "topaz-bitplane" + + CNOP 0,4 +_CopperColors: + INCBIN "copper-colors" + + CNOP 0,4 +_SpriteCopperlist: + INCBIN "sprite-copperlist" + + CNOP 0,4 +_SpriteData: + INCBIN "sprite-data" + + CNOP 0,4 +_MaskBitplane: + INCBIN "mask-bitplane" diff --git a/main b/main index 19363d4c00830848a216f978aac9b66db4e8e35f..6f276b984adeffda2c7e0840515d0f8503bb41c6 100755 GIT binary patch literal 76664 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

rpL<5mEx5Va5O=}!{e|NCu0Gb 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 delta 5752 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 TC?!BJg%f0lrNn@17Hj)|APHHP diff --git a/main.c b/main.c index ba22e1b..bfa9ee9 100644 --- a/main.c +++ b/main.c @@ -6,6 +6,7 @@ #include #include +#include #include @@ -18,6 +19,7 @@ #include "bun.h" extern struct Custom far custom; +extern struct CIA far ciaa; // this should be large enough to hold one bitplane of the largest object // you are blitting, plus one additional word on each side @@ -38,9 +40,6 @@ uint16_t custom_color = (uint16_t)offsetof(Custom, color); uint16_t custom_sprite = (uint16_t)offsetof(Custom, sprpt); uint16_t custom_sprite_control = (uint16_t)offsetof(Custom, spr); -uint16_t chip spriteData[200]; -uint16_t chip spriteData2[20]; - uint16_t spritePositionsEachLine[256][2]; void calculageSpritePositionsEachLine() { @@ -59,8 +58,15 @@ void calculageSpritePositionsEachLine() { (x & 1) \ ) +extern uint8_t chip TopazBitplanes[]; +extern uint16_t chip CopperColors[]; +extern uint16_t chip SpriteCopperlist[]; +extern uint16_t chip SpriteData[]; +extern uint16_t chip MaskBitplane[]; + int main(void) { - uint16_t *copperlist, *currentCopperlist, result; + uint16_t *copperlist, *currentCopperlist, *currentCopperColors, result, *currentSpriteCopperlist; + uint32_t spriteDataPointer; int i, x, y, height, plane; struct BunRenderer bunRenderer; @@ -72,51 +78,13 @@ int main(void) { colors[2] = 0x0fff; colors[3] = 0x000f; - printf("%p\n", &spriteData); + printf("%x\n", &SpriteData); printf("setting up, i haven't crashed...yet.\n"); - x = 150; - y = 47; - height = y + 98; - - printf("%d, %d, %d\n", x, y, height); - - spriteData[0] = SPRPOS(x, y); - spriteData[1] = SPRCTL(x, y, height); - - printf("%0x %0x\n", spriteData[0], spriteData[1]); - - for (i = 2; i < 198; i += 2) { - spriteData[i] = 0x0f + i % 16; - spriteData[i + 1] = 0xf0f0; - } - - spriteData[198] = 0x0000; - spriteData[199] = 0x0000; - - spriteData2[0] = SPRPOS(220, 70); - spriteData2[1] = SPRCTL(220, 70, 72); - /* - spriteData2[2] = 0x0345; - spriteData2[3] = 0x5678; - spriteData2[4] = 0x9abc; - spriteData2[5] = 0xdef0; - */ - spriteData2[2] = 0xffff; - spriteData2[3] = 0xffff; - spriteData2[4] = 0xffff; - spriteData2[5] = 0xffff; - spriteData2[6] = SPRPOS(230, 150); - spriteData2[7] = SPRCTL(230, 150, 151); - spriteData2[8] = 0xffff; - spriteData2[9] = 0xffff; - spriteData2[10] = 0; - spriteData2[11] = 0; - setupScreen(&screenSetup, SCREEN_WIDTH, SCREEN_HEIGHT, 3); setupInitialCurrentScreen(&screenSetup, ¤tScreen); - //setupBunRenderer(&bunRenderer, &screenSetup, ¤tScreen); + setupBunRenderer(&bunRenderer, &screenSetup, ¤tScreen); // blitter copy the first bitplane row down to the second @@ -133,11 +101,10 @@ int main(void) { ¤tScreen, &copperlistBitplanePointers ); - currentCopperlist = setUpEmptySpritesInCopperlist(currentCopperlist); - *(currentCopperlist++) = custom_color; - *(currentCopperlist++) = 0x000; + currentCopperColors = CopperColors; + currentSpriteCopperlist = SpriteCopperlist; *(currentCopperlist++) = custom_color + 2; *(currentCopperlist++) = 0x000; @@ -145,77 +112,72 @@ int main(void) { *(currentCopperlist++) = custom_color + 4; *(currentCopperlist++) = 0xfff; - *(currentCopperlist++) = custom_color + 6; - *(currentCopperlist++) = 0x00F; + for (i = 0; i < 8; ++i) { + spriteDataPointer = (uint32_t)&SpriteData; + spriteDataPointer += ((256 + 2) * 4) * i; - // sprites - *(currentCopperlist++) = custom_color + 34; - *(currentCopperlist++) = 0xF0F; + *(currentCopperlist++) = custom_sprite + i * 4; + *(currentCopperlist++) = (spriteDataPointer >> 16); - *(currentCopperlist++) = custom_color + 36; - *(currentCopperlist++) = 0xFF0; + *(currentCopperlist++) = custom_sprite + 2 + i * 4; + *(currentCopperlist++) = (spriteDataPointer & 0xffff); + } - *(currentCopperlist++) = custom_color + 38; - *(currentCopperlist++) = 0x00F; - - *(currentCopperlist++) = custom_sprite; - *(currentCopperlist++) = ((uint32_t)&spriteData2 >> 16); - - *(currentCopperlist++) = custom_sprite + 2; - *(currentCopperlist++) = ((uint32_t)&spriteData2 & 0xffff); + *(currentCopperlist++) = custom_color; + *(currentCopperlist++) = 0x3a6; for (y = 0; y < 256; ++y) { + for (i = 0; i < 8; ++i) { + *(currentCopperlist++) = custom_color + 32 + ( + // sprite color group + (i / 2) * 4 + + // 0 is transparent + 1 + + i % 2 + ) * 2; + + *(currentCopperlist++) = *(currentSpriteCopperlist++); + //*(currentCopperlist++) = 0xf0f; + + //currentSpriteCopperlist++; + + *(currentCopperlist++) = custom_sprite_control + i * 8; + *(currentCopperlist++) = *(currentSpriteCopperlist++); + + *(currentCopperlist++) = custom_sprite_control + i * 8 + 2; + *(currentCopperlist++) = *(currentSpriteCopperlist++); + } + + for (i = 3; i < 8; ++i) { + *(currentCopperlist++) = custom_color + (i * 2); + *(currentCopperlist++) = *(currentCopperColors++); + } + + *(currentCopperlist++) = 1 + ((31 + (256 / 4)) << 1) + ((44 + y) << 8); + *(currentCopperlist++) = 0xFFFE; /* - if (y > 100 && y < 135) { - *(currentCopperlist++) = custom_sprite_control; - *(currentCopperlist++) = SPRPOS(60 + y, y); - - *(currentCopperlist++) = custom_sprite_control + 2; - *(currentCopperlist++) = SPRCTL(60 + y, y, 0); - } - */ - - *(currentCopperlist++) = 1 + (1 << 1) + ((44 + y) << 8); - *(currentCopperlist++) = 0xFFFE; - - if (y == 27) { - /* - *(currentCopperlist++) = custom_sprite_control; - *(currentCopperlist++) = 0; - - *(currentCopperlist++) = custom_sprite_control + 2; - *(currentCopperlist++) = 0; - */ - - *(currentCopperlist++) = custom_sprite; - *(currentCopperlist++) = ((uint32_t)&spriteData >> 16); - - *(currentCopperlist++) = custom_sprite + 2; - *(currentCopperlist++) = ((uint32_t)&spriteData & 0xffff); - - *(currentCopperlist++) = custom_sprite_control; - *(currentCopperlist++) = SPRPOS(60, 100); - - *(currentCopperlist++) = custom_sprite_control + 2; - *(currentCopperlist++) = SPRCTL(60, 100, 198); - } - - *(currentCopperlist++) = 1 + (31 << 1) + ((44 + y) << 8); - *(currentCopperlist++) = 0xFFFE; *(currentCopperlist++) = custom_color; *(currentCopperlist++) = 0x9b8; + */ + /* + *(currentCopperlist++) = 1 + (1 << 1) + ((44 + y) << 8); + *(currentCopperlist++) = 0xFFFE; + */ + + /* *(currentCopperlist++) = 1 + ((31 + (320 / 4)) << 1) + ((44 + y) << 8); *(currentCopperlist++) = 0xFFFE; *(currentCopperlist++) = custom_color; *(currentCopperlist++) = 0x000; - + */ } endCopperlist(currentCopperlist); - for (i = 0; i < 200; ++i) { - /* + i = 0; + + while (1) { swapCurrentScreenBuffer(&screenSetup, ¤tScreen); for (plane = 0; plane < 2; ++plane) { @@ -230,16 +192,48 @@ int main(void) { WaitBlit(); } - //renderBunFrame(i, &bunRenderer); + renderBunFrame(i, &bunRenderer); + + /* + */ + + for (plane = 0; plane < 3; ++plane) { + custom.bltcon0 = 0xca + (1 << 8) + (1 << 9) + (1 << 10) + (1 << 11); + custom.bltcon1 = 0; + custom.bltafwm = 0xffff; + custom.bltalwm = 0xffff; + custom.bltapt = MaskBitplane; + custom.bltbpt = TopazBitplanes + (plane * 32 * 256); + custom.bltcpt = currentScreen.planes[plane]; + custom.bltdpt = currentScreen.planes[plane]; + custom.bltamod = 0; + custom.bltbmod = 0; + custom.bltcmod = screenSetup.byteWidth - 32; + custom.bltdmod = screenSetup.byteWidth - 32; + custom.bltsize = 16 + (256 << 6); + + WaitBlit(); + } + + /* + *(SpriteData) = SPRPOS(250, 44); + *(SpriteData + 1) = SPRCTL(250, 44, 44 + 257); + */ updateDisplayInCopperList( &screenSetup, ¤tScreen, copperlistBitplanePointers ); - */ + WaitTOF(); + //WaitTOF(); + + if ((ciaa.ciapra >> 6) != 3) break; + + i++; + i %= FRAMES_FOR_SCREEN; } /* @@ -250,12 +244,16 @@ int main(void) { giveBackSystem(); - for (i = 10; i < 50; ++i) { - printf("%x ", copperlist[i]); - } - teardownScreen(&screenSetup); + /* + for (i = 0; i < 50; ++i) { + printf("%x %x\n", copperlist[i * 2], copperlist[i * 2 + 1]); + } +*/ + + printf("%x %x", SPRPOS(250, 44), SPRCTL(250, 44, 44 + 256)); + freeCopperlist(copperlist); teardownBunRenderer(); diff --git a/mask-bitplane b/mask-bitplane new file mode 100644 index 0000000000000000000000000000000000000000..042d777933d59556b2fbf2f2cb4ffbe39610a8d8 GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/sprite-data b/sprite-data new file mode 100644 index 0000000000000000000000000000000000000000..7ae38307bfcce8ffd6075b152fffa51283f39540 GIT binary patch literal 8256 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 literal 0 HcmV?d00001 diff --git a/topaz2.png b/topaz2.png new file mode 100644 index 0000000000000000000000000000000000000000..64e8984212142ed33dd144c167e6bdf474dc4b62 GIT binary patch literal 24267 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 O{q?krG^^BcQU3$YdHk;c literal 0 HcmV?d00001