From fd9549d1477a12b90ee0e13280fcc4e29a98b427 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Jun 2022 01:20:42 +0000 Subject: [PATCH 01/68] Bump nokogiri from 1.12.5 to 1.13.6 in /docs Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.12.5 to 1.13.6. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.12.5...v1.13.6) --- updated-dependencies: - dependency-name: nokogiri dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/Gemfile.lock | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index e4426be..3a5e748 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -24,6 +24,7 @@ GEM http_parser.rb (~> 0) ethon (0.15.0) ffi (>= 1.15.0) + eventmachine (1.2.7) eventmachine (1.2.7-x64-mingw32) execjs (2.8.1) faraday (1.10.0) @@ -49,6 +50,7 @@ GEM faraday-patron (1.0.0) faraday-rack (1.0.0) faraday-retry (1.0.3) + ffi (1.15.5) ffi (1.15.5-x64-mingw32) forwardable-extended (2.6.0) gemoji (3.0.1) @@ -224,7 +226,9 @@ GEM jekyll-seo-tag (~> 2.1) minitest (5.15.0) multipart-post (2.2.0) - nokogiri (1.12.5-x64-mingw32) + nokogiri (1.13.6-x64-mingw32) + racc (~> 1.4) + nokogiri (1.13.6-x86_64-linux) racc (~> 1.4) octokit (4.24.0) faraday (>= 1, < 3) @@ -264,12 +268,14 @@ GEM unf (0.1.4) unf_ext unf_ext (0.0.8.2) + unf_ext (0.0.8.2-x64-mingw32) unicode-display_width (1.8.0) wdm (0.1.1) zeitwerk (2.5.4) PLATFORMS x64-mingw32 + x86_64-linux DEPENDENCIES github-pages (~> 203) From 353c164f6be6117baee912b589e9a1df24fd6670 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Jul 2022 09:36:33 +0000 Subject: [PATCH 02/68] Bump tzinfo from 1.2.9 to 1.2.10 in /docs Bumps [tzinfo](https://github.com/tzinfo/tzinfo) from 1.2.9 to 1.2.10. - [Release notes](https://github.com/tzinfo/tzinfo/releases) - [Changelog](https://github.com/tzinfo/tzinfo/blob/master/CHANGES.md) - [Commits](https://github.com/tzinfo/tzinfo/compare/v1.2.9...v1.2.10) --- updated-dependencies: - dependency-name: tzinfo dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/Gemfile.lock | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index e4426be..c20b0c7 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -24,6 +24,7 @@ GEM http_parser.rb (~> 0) ethon (0.15.0) ffi (>= 1.15.0) + eventmachine (1.2.7) eventmachine (1.2.7-x64-mingw32) execjs (2.8.1) faraday (1.10.0) @@ -49,6 +50,7 @@ GEM faraday-patron (1.0.0) faraday-rack (1.0.0) faraday-retry (1.0.3) + ffi (1.15.5) ffi (1.15.5-x64-mingw32) forwardable-extended (2.6.0) gemoji (3.0.1) @@ -226,6 +228,8 @@ GEM multipart-post (2.2.0) nokogiri (1.12.5-x64-mingw32) racc (~> 1.4) + nokogiri (1.12.5-x86_64-linux) + racc (~> 1.4) octokit (4.24.0) faraday (>= 1, < 3) sawyer (~> 0.9) @@ -257,19 +261,21 @@ GEM thread_safe (0.3.6) typhoeus (1.4.0) ethon (>= 0.9.0) - tzinfo (1.2.9) + tzinfo (1.2.10) thread_safe (~> 0.1) tzinfo-data (1.2022.1) tzinfo (>= 1.0.0) unf (0.1.4) unf_ext unf_ext (0.0.8.2) + unf_ext (0.0.8.2-x64-mingw32) unicode-display_width (1.8.0) wdm (0.1.1) zeitwerk (2.5.4) PLATFORMS x64-mingw32 + x86_64-linux DEPENDENCIES github-pages (~> 203) From 9849c6bbb1da528b479fcbd5a7417e12c8137ce6 Mon Sep 17 00:00:00 2001 From: Dan Malec Date: Wed, 27 Jul 2022 17:56:27 -0400 Subject: [PATCH 03/68] Switched back slash to forward slash in assembly so Merlin32 works on OSX as well as Windows --- src/Master.s | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Master.s b/src/Master.s index 35996a8..637d4a5 100644 --- a/src/Master.s +++ b/src/Master.s @@ -11,28 +11,28 @@ ; 64KB Tile Memory - ASM static\TileData.s + ASM static/TileData.s KND #$1001 ; Type and Attributes ($10=Static,$01=Data) ALI BANK SNA TDATA ; 64KB Sprite Plane Data - ASM static\SprData.s + ASM static/SprData.s KND #$1001 ; Type and Attributes ($11=Static+Bank Relative,$01=Data) ALI BANK SNA SDATA ; 64KB Sprite Mask Data - ASM static\SprMask.s + ASM static/SprMask.s KND #$1001 ; Type and Attributes ($11=Static+Bank Relative,$01=Data) ALI BANK SNA SMASK ; 64KB Tile Store - ASM static\TileStore.s + ASM static/TileStore.s KND #$1001 ; Type and Attributes ($11=Static+Bank Relative,$01=Data) ALI BANK SNA TSTORE From e25b5b4d7f7ff50884b1c4fa21e8525ec3100f72 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Wed, 27 Jul 2022 23:42:26 -0500 Subject: [PATCH 04/68] Correctly initialize the screen size --- src/Graphics.s | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Graphics.s b/src/Graphics.s index 41e88ea..b72c087 100644 --- a/src/Graphics.s +++ b/src/Graphics.s @@ -4,13 +4,15 @@ InitGraphics jsr _ShadowOn jsr _GrafOn lda #0 - jsr _ClearToColor - lda #0 jsr _SetSCBs ldx #DefaultPalette lda #0 jsr _SetPalette + ldx #SHR_LINE_WIDTH + ldy #SHR_SCREEN_HEIGHT + jsr _SetScreenMode + jsr _InitBG0 ; Initialize the background layer lda EngineMode From f5a27362a7f8fa9945b80806f579279ccc0e7670 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 28 Jul 2022 11:56:05 -0500 Subject: [PATCH 05/68] Remove ommented out code --- src/Memory.s | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Memory.s b/src/Memory.s index c4c449d..fc52753 100644 --- a/src/Memory.s +++ b/src/Memory.s @@ -28,9 +28,7 @@ InitMemory lda EngineMode _NewHandle ; returns LONG Handle on stack plx ; base address of the new handle pla ; high address 00XX of the new handle (bank) -; _Deref -; stx Buff00 -; sta Buff00+2 + :no_bnk0_buff PushLong #0 ; space for result @@ -41,9 +39,6 @@ InitMemory lda EngineMode _NewHandle ; returns LONG Handle on stack plx ; base address of the new handle pla ; high address 00XX of the new handle (bank) -; _Deref -; stx Buff01 -; sta Buff01+2 PushLong #0 ; space for result From 0f920acd03a2e6553c146772e4d7a01a6d5b849d Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 28 Jul 2022 11:57:14 -0500 Subject: [PATCH 06/68] Eliminate redundent register loads --- src/blitter/Horz.s | 152 +++++++++++++++++------------------- src/blitter/TemplateUtils.s | 5 +- src/blitter/Vert.s | 119 +++++++++++++--------------- 3 files changed, 128 insertions(+), 148 deletions(-) diff --git a/src/blitter/Horz.s b/src/blitter/Horz.s index eb7aa5d..496956f 100644 --- a/src/blitter/Horz.s +++ b/src/blitter/Horz.s @@ -33,8 +33,8 @@ _RestoreBG0Opcodes lda LastPatchOffset ; If zero, there are no saved opcodes sta :exit_offset -:loop ldx :virt_line_x2 +:loop ldal BTableLow,x ; Get the address of the first code field line tay @@ -47,8 +47,7 @@ _RestoreBG0Opcodes txa ; lda :virt_line_x2 and #$001E eor #$FFFF - inc - clc + sec adc #32 min :lines_left_x2 sta :draw_count_x2 ; Do half of this many lines @@ -60,12 +59,13 @@ _RestoreBG0Opcodes clc adc :exit_offset ; Add some offsets to get the base address in the code field line - jsr RestoreOpcode + jsr (RestoreOpcode,x) lda :virt_line_x2 ; advance to the virtual line after the segment we just clc ; filled in adc :draw_count_x2 sta :virt_line_x2 + tax lda :lines_left_x2 ; subtract the number of lines we just completed sec @@ -113,16 +113,16 @@ _ApplyBG0XPosPre _ApplyBG0XPos -:virt_line equ tmp1 -:lines_left equ tmp2 -:draw_count equ tmp3 +:stk_save equ tmp0 +:virt_line_x2 equ tmp1 +:lines_left_x2 equ tmp2 +:draw_count_x2 equ tmp3 :exit_offset equ tmp4 :entry_offset equ tmp5 :exit_bra equ tmp6 :exit_address equ tmp7 :base_address equ tmp8 -:draw_count_x2 equ tmp9 -:opcode equ tmp0 +:opcode equ tmp9 :odd_entry_offset equ tmp10 ; If there are saved opcodes that have not been restored, do not run this routine @@ -133,10 +133,12 @@ _ApplyBG0XPos ; This code is fairly succinct. See the corresponding code in Vert.s for more detailed comments. :ok lda StartYMod208 ; This is the base line of the virtual screen - sta :virt_line ; Keep track of it + asl + sta :virt_line_x2 ; Keep track of it lda ScreenHeight - sta :lines_left + asl + sta :lines_left_x2 ; Calculate the exit and entry offsets into the code fields. This is a bit tricky, because odd-aligned ; rendering causes the left and right edges to move in a staggered fashion. @@ -280,32 +282,30 @@ _ApplyBG0XPos ; 3. Writes the JMP entry point to enter the code field phb ; Save the existing bank + tsc + sta :stk_save + :loop - lda :virt_line - asl ; This will clear the carry bit - tax + ldx :virt_line_x2 ldal BTableLow,x ; Get the address of the first code field line tay ; Save it to use as the base address + + clc adc :exit_offset ; Add some offsets to get the base address in the code field line sta :exit_address sty :base_address - sep #$20 ldal BTableHigh,x pha - plb ; This is the bank that will receive the updates - rep #$20 + plb - lda :virt_line - and #$000F + txa + and #$001E eor #$FFFF - inc - clc - adc #16 - min :lines_left + sec + adc #32 + min :lines_left_x2 - sta :draw_count ; Do this many lines - asl sta :draw_count_x2 ; First step is to set the BRA instruction to exit the code field at the proper location. There @@ -317,64 +317,63 @@ _ApplyBG0XPos ; screen ; y is already set to :base_address tax ; :draw_count_x2 - lda :exit_address ; Save from this location - jsr SaveOpcode + clc ; advance to the virtual line after the segment we just + adc :virt_line_x2 ; filled in + sta :virt_line_x2 + lda :exit_address ; Save from this location + jsr (SaveOpcode,x) ; X = :exit_address on return + + txy ; ldy :exit_address -- starting at this address ldx :draw_count_x2 ; Do this many lines lda :exit_bra ; Copy this value into all of the lines - ldy :exit_address ; starting at this address - jsr SetConst + jsr (SetConst,x) ; All registers are preserved ; Next, patch in the CODE_ENTRY value, which is the low byte of a JMP instruction. This is an ; 8-bit operation and, since the PEA code is bank aligned, we use the entry_offset value directly sep #$20 - ldx :draw_count_x2 +; ldx :draw_count_x2 lda :entry_offset ldy :base_address - jsr SetCodeEntry + jsr (SetCodeEntry,x) ; All registers are preserved ; Now, patch in the opcode - ldx :draw_count_x2 +; ldx :draw_count_x2 lda :opcode - ldy :base_address ; Y-register is preserved, this can be removed - jsr SetCodeEntryOpcode + jsr (SetCodeEntryOpcode,x) ; All registers are preserved ; If this is an odd entry, also set the odd_entry low byte and save the operand high byte lda :odd_entry_offset beq :not_odd - ldx :draw_count_x2 - ldy :base_address ; Y-register is preserved, this can be removed - jsr SetOddCodeEntry +; NOTE: SetOddCodeEntry and SaveHighOperand can probably be combined to eliminate call/return overhead - ldx :draw_count_x2 - ldy :base_address ; Y-register is preserved, this can be removed - pei :exit_address - jmp :SaveHighOperand ; Only used once, so "inline" it +; ldx :draw_count_x2 + jsr (SetOddCodeEntry,x) ; All registers are preserved + +; ldx :draw_count_x2 + jmp (:SaveHighOperand,x) ; Only used once, so "inline" it :save_high_op_rtn :not_odd - rep #$20 + rep #$21 ; clear the carry ; Do the end of the loop -- update the virtual line counter and reduce the number ; of lines left to render - lda :virt_line ; advance to the virtual line after the segment we just - clc ; filled in - adc :draw_count - sta :virt_line - - lda :lines_left ; subtract the number of lines we just completed + lda :lines_left_x2 ; subtract the number of lines we just completed sec - sbc :draw_count - sta :lines_left + sbc :draw_count_x2 + sta :lines_left_x2 jne :loop + lda :stk_save + tcs plb rts @@ -387,45 +386,43 @@ _ApplyBG0XPos ; Y = starting line * $1000 ; A = code field location * $1000 :SaveHighOperand - jmp (:tbl,x) - -:tbl da :bottom + da :bottom da :do01,:do02,:do03,:do04 da :do05,:do06,:do07,:do08 da :do09,:do10,:do11,:do12 da :do13,:do14,:do15,:do16 -:do15 plx +:do15 ldx :exit_address ; accumulator is in 8-bit mode, so can't use TAX bra :x15 -:do14 plx +:do14 ldx :exit_address bra :x14 -:do13 plx +:do13 ldx :exit_address bra :x13 -:do12 plx +:do12 ldx :exit_address bra :x12 -:do11 plx +:do11 ldx :exit_address bra :x11 -:do10 plx +:do10 ldx :exit_address bra :x10 -:do09 plx +:do09 ldx :exit_address bra :x09 -:do08 plx +:do08 ldx :exit_address bra :x08 -:do07 plx +:do07 ldx :exit_address bra :x07 -:do06 plx +:do06 ldx :exit_address bra :x06 -:do05 plx +:do05 ldx :exit_address bra :x05 -:do04 plx +:do04 ldx :exit_address bra :x04 -:do03 plx +:do03 ldx :exit_address bra :x03 -:do02 plx +:do02 ldx :exit_address bra :x02 -:do01 plx +:do01 ldx :exit_address bra :x01 -:do16 plx +:do16 ldx :exit_address :x16 lda $F002,x sta OPCODE_HIGH_SAVE+$F000,y :x15 lda $E002,x @@ -469,9 +466,7 @@ _ApplyBG0XPos ; Y = starting line * $1000 ; A = code field location * $1000 SaveOpcode - jmp (:tbl,x) - -:tbl da :bottom + da :bottom da :do01,:do02,:do03,:do04 da :do05,:do06,:do07,:do08 da :do09,:do10,:do11,:do12 @@ -550,9 +545,7 @@ SaveOpcode ; Y = starting line * $1000 ; A = code field location * $1000 RestoreOpcode - jmp (:tbl,x) - -:tbl da :bottom + da :bottom da :do01,:do02,:do03,:do04 da :do05,:do06,:do07,:do08 da :do09,:do10,:do11,:do12 @@ -631,8 +624,7 @@ RestoreOpcode ; Y = starting line * $1000 ; A = address low byte SetCodeEntry - jmp (:tbl,x) -:tbl da :bottom-00,:bottom-03,:bottom-06,:bottom-09 + da :bottom-00,:bottom-03,:bottom-06,:bottom-09 da :bottom-12,:bottom-15,:bottom-18,:bottom-21 da :bottom-24,:bottom-27,:bottom-30,:bottom-33 da :bottom-36,:bottom-39,:bottom-42,:bottom-45 @@ -663,8 +655,7 @@ SetCodeEntry ; Y = starting line * $1000 ; A = address low byte SetOddCodeEntry - jmp (:tbl,x) -:tbl da :bottom-00,:bottom-03,:bottom-06,:bottom-09 + da :bottom-00,:bottom-03,:bottom-06,:bottom-09 da :bottom-12,:bottom-15,:bottom-18,:bottom-21 da :bottom-24,:bottom-27,:bottom-30,:bottom-33 da :bottom-36,:bottom-39,:bottom-42,:bottom-45 @@ -695,8 +686,7 @@ SetOddCodeEntry ; Y = starting line * $1000 ; A = opcode value SetCodeEntryOpcode - jmp (:tbl,x) -:tbl da :bottom-00,:bottom-03,:bottom-06,:bottom-09 + da :bottom-00,:bottom-03,:bottom-06,:bottom-09 da :bottom-12,:bottom-15,:bottom-18,:bottom-21 da :bottom-24,:bottom-27,:bottom-30,:bottom-33 da :bottom-36,:bottom-39,:bottom-42,:bottom-45 diff --git a/src/blitter/TemplateUtils.s b/src/blitter/TemplateUtils.s index 1f11770..0dae3d5 100644 --- a/src/blitter/TemplateUtils.s +++ b/src/blitter/TemplateUtils.s @@ -87,9 +87,8 @@ Counter equ tmp3 ; A = value ; ; Set M to 0 or 1 -SetConst ; Need a blank line here, otherwise the :tbl local variable resolveds backwards - jmp (:tbl,x) -:tbl da :bottom-00,:bottom-03,:bottom-06,:bottom-09 +SetConst + da :bottom-00,:bottom-03,:bottom-06,:bottom-09 da :bottom-12,:bottom-15,:bottom-18,:bottom-21 da :bottom-24,:bottom-27,:bottom-30,:bottom-33 da :bottom-36,:bottom-39,:bottom-42,:bottom-45 diff --git a/src/blitter/Vert.s b/src/blitter/Vert.s index 042cce3..eafe61f 100644 --- a/src/blitter/Vert.s +++ b/src/blitter/Vert.s @@ -7,29 +7,36 @@ ; lines in the correct order _ApplyBG0YPos -:rtbl_idx equ tmp0 -:virt_line equ tmp1 -:lines_left equ tmp2 -:draw_count equ tmp3 +:rtbl_idx_x2 equ tmp0 +:virt_line_x2 equ tmp1 +:lines_left_x2 equ tmp2 +:draw_count_x2 equ tmp3 +:stk_save equ tmp4 ; First task is to fill in the STK_ADDR values by copying them from the RTable array. We ; copy from RTable[i] into BlitField[StartY+i]. As with all of this code, the difficult part ; is decomposing the update across banks - stz :rtbl_idx ; Start copying from the first entry in the table + stz :rtbl_idx_x2 ; Start copying from the first entry in the table lda StartY ; This is the base line of the virtual screen jsr Mod208 sta StartYMod208 - sta :virt_line ; Keep track of it + asl + sta :virt_line_x2 ; Keep track of it + + phb ; Save the current bank + tsc ; we intentionally leak one byte of stack in each loop + sta :stk_save ; iteration, so save the stack to repair at the end ; copy a range of address from the table into the destination bank. If we restrict ourselves to ; rectangular playfields, this can be optimized to just subtracting a constant value. See the ; Templates::SetScreenAddrs subroutine. lda ScreenHeight - sta :lines_left + asl + sta :lines_left_x2 ; This is the verbose part -- figure out how many lines to draw. We don't want to artificially limit ; the height of the visible screen (for example, doing an animated wipe while scrolling), so the screen @@ -38,62 +45,47 @@ _ApplyBG0YPos ; For larger values, we want to break things up on 16-line boundaries based on the virt_line value. So, ; ; draw_count = min(lines_left, (16 - (virt_line % 16)) -; -; Note that almost everything in this loop can be done with 8-bit operations sincc the values are -; all under 200. The one exception is the virt_line value which could exceed 256. This will be -; a later optimization and might save around 10 cycles per iteration, or up to ~120 cycles per frame -; and ~2,500 per secord. This is ~1% of our total CPU budget and is *just* enough cycles to be -; interesting.... Another 8 cycles could be removed by doing all calculatinos pre-multiplied by 2 -; to avoid several 'asl' instructions - phb + :loop - lda :virt_line - asl - tax + ldx :virt_line_x2 ldal BTableLow,x ; Get the address of the first code field line tay - sep #$20 - ldal BTableHigh,x + ldal BTableHigh,x ; Target bank in low byte, current bank in high pha - plb ; This is the bank that will receive the updates - rep #$20 - lda :virt_line - and #$000F + txa + and #$001E eor #$FFFF - inc - clc - adc #16 - min :lines_left + sec + adc #32 + min :lines_left_x2 - sta :draw_count ; Do this many lines - asl + sta :draw_count_x2 ; Do this many lines tax - lda :rtbl_idx ; Read from this location in the RTable - asl + clc ; pre-advance virt_line_2 because we have the value + adc :virt_line_x2 + sta :virt_line_x2 - jsr CopyRTableToStkAddr + plb + jsr (:CopyRTableToStkAddr,x) ; X = rtbl_idx_x2 on return - lda :virt_line ; advance to the virtual line after the segment we just - clc ; filled in - adc :draw_count - sta :virt_line + txa ; carry flag is unchanged + adc :draw_count_x2 ; advance the index into the RTable + sta :rtbl_idx_x2 - lda :rtbl_idx ; advance the index into the RTable - adc :draw_count - sta :rtbl_idx - lda :lines_left ; subtract the number of lines we just completed + lda :lines_left_x2 ; subtract the number of lines we just completed sec - sbc :draw_count - sta :lines_left + sbc :draw_count_x2 + sta :lines_left_x2 jne :loop - plb -:out + lda :stk_save + tcs + plb rts ; Unrolled copy routine to move RTable intries into STK_ADDR position. @@ -101,44 +93,43 @@ _ApplyBG0YPos ; A = intect into the RTable array (x2) ; Y = starting line * $1000 ; X = number of lines (x2) -CopyRTableToStkAddr - jmp (:tbl,x) -:tbl da :none +:CopyRTableToStkAddr + da :none da :do01,:do02,:do03,:do04 da :do05,:do06,:do07,:do08 da :do09,:do10,:do11,:do12 da :do13,:do14,:do15,:do16 -:do15 tax +:do15 ldx :rtbl_idx_x2 bra :x15 -:do14 tax +:do14 ldx :rtbl_idx_x2 bra :x14 -:do13 tax +:do13 ldx :rtbl_idx_x2 bra :x13 -:do12 tax +:do12 ldx :rtbl_idx_x2 bra :x12 -:do11 tax +:do11 ldx :rtbl_idx_x2 bra :x11 -:do10 tax +:do10 ldx :rtbl_idx_x2 bra :x10 -:do09 tax +:do09 ldx :rtbl_idx_x2 bra :x09 -:do08 tax +:do08 ldx :rtbl_idx_x2 bra :x08 -:do07 tax +:do07 ldx :rtbl_idx_x2 bra :x07 -:do06 tax +:do06 ldx :rtbl_idx_x2 bra :x06 -:do05 tax +:do05 ldx :rtbl_idx_x2 bra :x05 -:do04 tax +:do04 ldx :rtbl_idx_x2 bra :x04 -:do03 tax +:do03 ldx :rtbl_idx_x2 bra :x03 -:do02 tax +:do02 ldx :rtbl_idx_x2 bra :x02 -:do01 tax +:do01 ldx :rtbl_idx_x2 bra :x01 -:do16 tax +:do16 ldx :rtbl_idx_x2 ldal RTable+30,x sta STK_ADDR+$F000,y :x15 ldal RTable+28,x From fa731f4b2dd4f7d570ea6f43f65350b10bcfd4df Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 28 Jul 2022 12:15:00 -0500 Subject: [PATCH 07/68] Streamline restore BG0; experiment with more aggressive inlining --- src/blitter/Horz.s | 145 ++++++++++++++++++++++----------------------- 1 file changed, 70 insertions(+), 75 deletions(-) diff --git a/src/blitter/Horz.s b/src/blitter/Horz.s index 496956f..66c0f25 100644 --- a/src/blitter/Horz.s +++ b/src/blitter/Horz.s @@ -20,6 +20,7 @@ _RestoreBG0Opcodes :lines_left_x2 equ tmp2 :draw_count_x2 equ tmp3 :exit_offset equ tmp4 +:stk_save equ tmp5 phb ; Save data bank @@ -33,16 +34,17 @@ _RestoreBG0Opcodes lda LastPatchOffset ; If zero, there are no saved opcodes sta :exit_offset - ldx :virt_line_x2 + tsc + sta :stk_save + :loop + ldx :virt_line_x2 ldal BTableLow,x ; Get the address of the first code field line tay - sep #$20 - ldal BTableHigh,x + ldal BTableHigh,x ; This intentionally leaks one byte on the stack pha plb ; This is the bank that will receive the updates - rep #$20 txa ; lda :virt_line_x2 and #$001E @@ -54,18 +56,15 @@ _RestoreBG0Opcodes ; y is already set to :base_address tax ; :draw_count * 2 + clc + adc :virt_line_x2 + sta :virt_line_x2 tya - clc adc :exit_offset ; Add some offsets to get the base address in the code field line - jsr (RestoreOpcode,x) - - lda :virt_line_x2 ; advance to the virtual line after the segment we just - clc ; filled in - adc :draw_count_x2 - sta :virt_line_x2 - tax + jmp (:tgt,x) +:tgt RestoreOpcode lda :lines_left_x2 ; subtract the number of lines we just completed sec @@ -73,9 +72,11 @@ _RestoreBG0Opcodes sta :lines_left_x2 jne :loop + stz LastPatchOffset ; Clear the value once completed -:out + lda :stk_save + tcs plb rts @@ -318,7 +319,7 @@ _ApplyBG0XPos ; y is already set to :base_address tax ; :draw_count_x2 clc ; advance to the virtual line after the segment we just - adc :virt_line_x2 ; filled in + adc :virt_line_x2 ; filled in sta :virt_line_x2 lda :exit_address ; Save from this location @@ -334,14 +335,12 @@ _ApplyBG0XPos sep #$20 -; ldx :draw_count_x2 lda :entry_offset ldy :base_address jsr (SetCodeEntry,x) ; All registers are preserved ; Now, patch in the opcode -; ldx :draw_count_x2 lda :opcode jsr (SetCodeEntryOpcode,x) ; All registers are preserved @@ -350,12 +349,7 @@ _ApplyBG0XPos lda :odd_entry_offset beq :not_odd -; NOTE: SetOddCodeEntry and SaveHighOperand can probably be combined to eliminate call/return overhead - -; ldx :draw_count_x2 jsr (SetOddCodeEntry,x) ; All registers are preserved - -; ldx :draw_count_x2 jmp (:SaveHighOperand,x) ; Only used once, so "inline" it :save_high_op_rtn @@ -544,77 +538,78 @@ SaveOpcode ; X = number of lines * 2, 0 to 32 ; Y = starting line * $1000 ; A = code field location * $1000 -RestoreOpcode - da :bottom - da :do01,:do02,:do03,:do04 - da :do05,:do06,:do07,:do08 - da :do09,:do10,:do11,:do12 - da :do13,:do14,:do15,:do16 +RestoreOpcode mac + da bottom + da do01,do02,do03,do04 + da do05,do06,do07,do08 + da do09,do10,do11,do12 + da do13,do14,do15,do16 -:do15 tax - bra :x15 -:do14 tax - bra :x14 -:do13 tax - bra :x13 -:do12 tax - bra :x12 -:do11 tax - bra :x11 -:do10 tax - bra :x10 -:do09 tax - bra :x09 -:do08 tax - bra :x08 -:do07 tax - bra :x07 -:do06 tax - bra :x06 -:do05 tax - bra :x05 -:do04 tax - bra :x04 -:do03 tax - bra :x03 -:do02 tax - bra :x02 -:do01 tax - bra :x01 -:do16 tax -:x16 lda OPCODE_SAVE+$F000,y +do15 tax + bra x15 +do14 tax + bra x14 +do13 tax + bra x13 +do12 tax + bra x12 +do11 tax + bra x11 +do10 tax + bra x10 +do09 tax + bra x09 +do08 tax + bra x08 +do07 tax + bra x07 +do06 tax + bra x06 +do05 tax + bra x05 +do04 tax + bra x04 +do03 tax + bra x03 +do02 tax + bra x02 +do01 tax + bra x01 +do16 tax +x16 lda OPCODE_SAVE+$F000,y sta $F000,x -:x15 lda OPCODE_SAVE+$E000,y +x15 lda OPCODE_SAVE+$E000,y sta $E000,x -:x14 lda OPCODE_SAVE+$D000,y +x14 lda OPCODE_SAVE+$D000,y sta $D000,x -:x13 lda OPCODE_SAVE+$C000,y +x13 lda OPCODE_SAVE+$C000,y sta $C000,x -:x12 lda OPCODE_SAVE+$B000,y +x12 lda OPCODE_SAVE+$B000,y sta $B000,x -:x11 lda OPCODE_SAVE+$A000,y +x11 lda OPCODE_SAVE+$A000,y sta $A000,x -:x10 lda OPCODE_SAVE+$9000,y +x10 lda OPCODE_SAVE+$9000,y sta $9000,x -:x09 lda OPCODE_SAVE+$8000,y +x09 lda OPCODE_SAVE+$8000,y sta $8000,x -:x08 lda OPCODE_SAVE+$7000,y +x08 lda OPCODE_SAVE+$7000,y sta $7000,x -:x07 lda OPCODE_SAVE+$6000,y +x07 lda OPCODE_SAVE+$6000,y sta $6000,x -:x06 lda OPCODE_SAVE+$5000,y +x06 lda OPCODE_SAVE+$5000,y sta $5000,x -:x05 lda OPCODE_SAVE+$4000,y +x05 lda OPCODE_SAVE+$4000,y sta $4000,x -:x04 lda OPCODE_SAVE+$3000,y +x04 lda OPCODE_SAVE+$3000,y sta $3000,x -:x03 lda OPCODE_SAVE+$2000,y +x03 lda OPCODE_SAVE+$2000,y sta $2000,x -:x02 lda OPCODE_SAVE+$1000,y +x02 lda OPCODE_SAVE+$1000,y sta $1000,x -:x01 lda: OPCODE_SAVE+$0000,y +x01 lda: OPCODE_SAVE+$0000,y sta: $0000,x -:bottom rts +bottom + <<< ; SetCodeEntry ; From dedb6575462ce694e26ce7edd652c3ab57906a8e Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 28 Jul 2022 12:18:54 -0500 Subject: [PATCH 08/68] Remove redundent initialization --- demos/kfest-2022/demo-1/App.Main.s | 6 ------ 1 file changed, 6 deletions(-) diff --git a/demos/kfest-2022/demo-1/App.Main.s b/demos/kfest-2022/demo-1/App.Main.s index 63e1e6a..882b4ef 100644 --- a/demos/kfest-2022/demo-1/App.Main.s +++ b/demos/kfest-2022/demo-1/App.Main.s @@ -56,12 +56,6 @@ appTmp0 equ 28 stz StartY stz frameCount -; Initialize the graphics screen playfield - - pea #320 - pea #200 - _GTESetScreenMode - ; Load a tileset pea #^tiledata From 456744027dbd3fa080e152b88e39ebb56adfb709 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 28 Jul 2022 13:15:46 -0500 Subject: [PATCH 09/68] Inline all functions that are only called once Eliminates the JSR/RTS overhead for the copy functions. Combined with the other streamlining, we save around 60 - 70 cycles per bank, or a total savings of around 10,000 cycles per seconds when running at full screen. This doesn't really change the FPS, but just gives some cycles back to the main application logic. --- src/blitter/Horz.s | 294 ++++++++++++++++++------------------ src/blitter/TemplateUtils.s | 18 ++- src/blitter/Vert.s | 111 +++++++------- 3 files changed, 217 insertions(+), 206 deletions(-) diff --git a/src/blitter/Horz.s b/src/blitter/Horz.s index 66c0f25..75840de 100644 --- a/src/blitter/Horz.s +++ b/src/blitter/Horz.s @@ -63,8 +63,7 @@ _RestoreBG0Opcodes tya adc :exit_offset ; Add some offsets to get the base address in the code field line - jmp (:tgt,x) -:tgt RestoreOpcode + RestoreOpcode lda :lines_left_x2 ; subtract the number of lines we just completed sec @@ -323,12 +322,12 @@ _ApplyBG0XPos sta :virt_line_x2 lda :exit_address ; Save from this location - jsr (SaveOpcode,x) ; X = :exit_address on return + SaveOpcode ; X = :exit_address on return txy ; ldy :exit_address -- starting at this address ldx :draw_count_x2 ; Do this many lines lda :exit_bra ; Copy this value into all of the lines - jsr (SetConst,x) ; All registers are preserved + SetConst ; All registers are preserved ; Next, patch in the CODE_ENTRY value, which is the low byte of a JMP instruction. This is an ; 8-bit operation and, since the PEA code is bank aligned, we use the entry_offset value directly @@ -337,21 +336,20 @@ _ApplyBG0XPos lda :entry_offset ldy :base_address - jsr (SetCodeEntry,x) ; All registers are preserved + SetCodeEntry ; All registers are preserved ; Now, patch in the opcode lda :opcode - jsr (SetCodeEntryOpcode,x) ; All registers are preserved + SetCodeEntryOpcode ; All registers are preserved ; If this is an odd entry, also set the odd_entry low byte and save the operand high byte lda :odd_entry_offset - beq :not_odd + jeq :not_odd - jsr (SetOddCodeEntry,x) ; All registers are preserved - jmp (:SaveHighOperand,x) ; Only used once, so "inline" it -:save_high_op_rtn + SetOddCodeEntry ; All registers are preserved + SaveHighOperand :exit_address ; Only used once, so "inline" it :not_odd rep #$21 ; clear the carry @@ -379,77 +377,78 @@ _ApplyBG0XPos ; X = number of lines * 2, 0 to 32 ; Y = starting line * $1000 ; A = code field location * $1000 -:SaveHighOperand - da :bottom - da :do01,:do02,:do03,:do04 - da :do05,:do06,:do07,:do08 - da :do09,:do10,:do11,:do12 - da :do13,:do14,:do15,:do16 +SaveHighOperand mac + jmp (dispTbl,x) +dispTbl da bottom + da do01,do02,do03,do04 + da do05,do06,do07,do08 + da do09,do10,do11,do12 + da do13,do14,do15,do16 -:do15 ldx :exit_address ; accumulator is in 8-bit mode, so can't use TAX - bra :x15 -:do14 ldx :exit_address - bra :x14 -:do13 ldx :exit_address - bra :x13 -:do12 ldx :exit_address - bra :x12 -:do11 ldx :exit_address - bra :x11 -:do10 ldx :exit_address - bra :x10 -:do09 ldx :exit_address - bra :x09 -:do08 ldx :exit_address - bra :x08 -:do07 ldx :exit_address - bra :x07 -:do06 ldx :exit_address - bra :x06 -:do05 ldx :exit_address - bra :x05 -:do04 ldx :exit_address - bra :x04 -:do03 ldx :exit_address - bra :x03 -:do02 ldx :exit_address - bra :x02 -:do01 ldx :exit_address - bra :x01 -:do16 ldx :exit_address -:x16 lda $F002,x +do15 ldx ]1 ; accumulator is in 8-bit mode, so can't use TAX + bra x15 +do14 ldx ]1 + bra x14 +do13 ldx ]1 + bra x13 +do12 ldx ]1 + bra x12 +do11 ldx ]1 + bra x11 +do10 ldx ]1 + bra x10 +do09 ldx ]1 + bra x09 +do08 ldx ]1 + bra x08 +do07 ldx ]1 + bra x07 +do06 ldx ]1 + bra x06 +do05 ldx ]1 + bra x05 +do04 ldx ]1 + bra x04 +do03 ldx ]1 + bra x03 +do02 ldx ]1 + bra x02 +do01 ldx ]1 + bra x01 +do16 ldx ]1 +x16 lda $F002,x sta OPCODE_HIGH_SAVE+$F000,y -:x15 lda $E002,x +x15 lda $E002,x sta OPCODE_HIGH_SAVE+$E000,y -:x14 lda $D002,x +x14 lda $D002,x sta OPCODE_HIGH_SAVE+$D000,y -:x13 lda $C002,x +x13 lda $C002,x sta OPCODE_HIGH_SAVE+$C000,y -:x12 lda $B002,x +x12 lda $B002,x sta OPCODE_HIGH_SAVE+$B000,y -:x11 lda $A002,x +x11 lda $A002,x sta OPCODE_HIGH_SAVE+$A000,y -:x10 lda $9002,x +x10 lda $9002,x sta OPCODE_HIGH_SAVE+$9000,y -:x09 lda $8002,x +x09 lda $8002,x sta OPCODE_HIGH_SAVE+$8000,y -:x08 lda $7002,x +x08 lda $7002,x sta OPCODE_HIGH_SAVE+$7000,y -:x07 lda $6002,x +x07 lda $6002,x sta OPCODE_HIGH_SAVE+$6000,y -:x06 lda $5002,x +x06 lda $5002,x sta OPCODE_HIGH_SAVE+$5000,y -:x05 lda $4002,x +x05 lda $4002,x sta OPCODE_HIGH_SAVE+$4000,y -:x04 lda $3002,x +x04 lda $3002,x sta OPCODE_HIGH_SAVE+$3000,y -:x03 lda $2002,x +x03 lda $2002,x sta OPCODE_HIGH_SAVE+$2000,y -:x02 lda $1002,x +x02 lda $1002,x sta OPCODE_HIGH_SAVE+$1000,y -:x01 lda: $0002,x +x01 lda: $0002,x sta: OPCODE_HIGH_SAVE+$0000,y -:bottom jmp :save_high_op_rtn +bottom <<< ; SaveOpcode ; @@ -459,77 +458,79 @@ _ApplyBG0XPos ; X = number of lines * 2, 0 to 32 ; Y = starting line * $1000 ; A = code field location * $1000 -SaveOpcode - da :bottom - da :do01,:do02,:do03,:do04 - da :do05,:do06,:do07,:do08 - da :do09,:do10,:do11,:do12 - da :do13,:do14,:do15,:do16 +SaveOpcode mac + jmp (dispTbl,x) +dispTbl da bottom + da do01,do02,do03,do04 + da do05,do06,do07,do08 + da do09,do10,do11,do12 + da do13,do14,do15,do16 -:do15 tax - bra :x15 -:do14 tax - bra :x14 -:do13 tax - bra :x13 -:do12 tax - bra :x12 -:do11 tax - bra :x11 -:do10 tax - bra :x10 -:do09 tax - bra :x09 -:do08 tax - bra :x08 -:do07 tax - bra :x07 -:do06 tax - bra :x06 -:do05 tax - bra :x05 -:do04 tax - bra :x04 -:do03 tax - bra :x03 -:do02 tax - bra :x02 -:do01 tax - bra :x01 -:do16 tax -:x16 lda $F000,x +do15 tax + bra x15 +do14 tax + bra x14 +do13 tax + bra x13 +do12 tax + bra x12 +do11 tax + bra x11 +do10 tax + bra x10 +do09 tax + bra x09 +do08 tax + bra x08 +do07 tax + bra x07 +do06 tax + bra x06 +do05 tax + bra x05 +do04 tax + bra x04 +do03 tax + bra x03 +do02 tax + bra x02 +do01 tax + bra x01 +do16 tax +x16 lda $F000,x sta OPCODE_SAVE+$F000,y -:x15 lda $E000,x +x15 lda $E000,x sta OPCODE_SAVE+$E000,y -:x14 lda $D000,x +x14 lda $D000,x sta OPCODE_SAVE+$D000,y -:x13 lda $C000,x +x13 lda $C000,x sta OPCODE_SAVE+$C000,y -:x12 lda $B000,x +x12 lda $B000,x sta OPCODE_SAVE+$B000,y -:x11 lda $A000,x +x11 lda $A000,x sta OPCODE_SAVE+$A000,y -:x10 lda $9000,x +x10 lda $9000,x sta OPCODE_SAVE+$9000,y -:x09 lda $8000,x +x09 lda $8000,x sta OPCODE_SAVE+$8000,y -:x08 lda $7000,x +x08 lda $7000,x sta OPCODE_SAVE+$7000,y -:x07 lda $6000,x +x07 lda $6000,x sta OPCODE_SAVE+$6000,y -:x06 lda $5000,x +x06 lda $5000,x sta OPCODE_SAVE+$5000,y -:x05 lda $4000,x +x05 lda $4000,x sta OPCODE_SAVE+$4000,y -:x04 lda $3000,x +x04 lda $3000,x sta OPCODE_SAVE+$3000,y -:x03 lda $2000,x +x03 lda $2000,x sta OPCODE_SAVE+$2000,y -:x02 lda $1000,x +x02 lda $1000,x sta OPCODE_SAVE+$1000,y -:x01 lda: $0000,x +x01 lda: $0000,x sta: OPCODE_SAVE+$0000,y -:bottom rts +bottom + <<< ; RestoreOpcode ; @@ -539,7 +540,8 @@ SaveOpcode ; Y = starting line * $1000 ; A = code field location * $1000 RestoreOpcode mac - da bottom + jmp (dispTbl,x) +dispTbl da bottom da do01,do02,do03,do04 da do05,do06,do07,do08 da do09,do10,do11,do12 @@ -618,13 +620,14 @@ bottom ; X = number of lines * 2, 0 to 32 ; Y = starting line * $1000 ; A = address low byte -SetCodeEntry - da :bottom-00,:bottom-03,:bottom-06,:bottom-09 - da :bottom-12,:bottom-15,:bottom-18,:bottom-21 - da :bottom-24,:bottom-27,:bottom-30,:bottom-33 - da :bottom-36,:bottom-39,:bottom-42,:bottom-45 - da :bottom-48 -:top sta CODE_ENTRY+$F000,y +SetCodeEntry mac + jmp (dispTbl,x) +dispTbl da bottom-00,bottom-03,bottom-06,bottom-09 + da bottom-12,bottom-15,bottom-18,bottom-21 + da bottom-24,bottom-27,bottom-30,bottom-33 + da bottom-36,bottom-39,bottom-42,bottom-45 + da bottom-48 + sta CODE_ENTRY+$F000,y sta CODE_ENTRY+$E000,y sta CODE_ENTRY+$D000,y sta CODE_ENTRY+$C000,y @@ -640,7 +643,8 @@ SetCodeEntry sta CODE_ENTRY+$2000,y sta CODE_ENTRY+$1000,y sta: CODE_ENTRY+$0000,y -:bottom rts +bottom + <<< ; SetOddCodeEntry ; @@ -649,13 +653,14 @@ SetCodeEntry ; X = number of lines * 2, 0 to 32 ; Y = starting line * $1000 ; A = address low byte -SetOddCodeEntry - da :bottom-00,:bottom-03,:bottom-06,:bottom-09 - da :bottom-12,:bottom-15,:bottom-18,:bottom-21 - da :bottom-24,:bottom-27,:bottom-30,:bottom-33 - da :bottom-36,:bottom-39,:bottom-42,:bottom-45 - da :bottom-48 -:top sta ODD_ENTRY+$F000,y +SetOddCodeEntry mac + jmp (dispTbl,x) +dispTbl da bottom-00,bottom-03,bottom-06,bottom-09 + da bottom-12,bottom-15,bottom-18,bottom-21 + da bottom-24,bottom-27,bottom-30,bottom-33 + da bottom-36,bottom-39,bottom-42,bottom-45 + da bottom-48 + sta ODD_ENTRY+$F000,y sta ODD_ENTRY+$E000,y sta ODD_ENTRY+$D000,y sta ODD_ENTRY+$C000,y @@ -671,7 +676,8 @@ SetOddCodeEntry sta ODD_ENTRY+$2000,y sta ODD_ENTRY+$1000,y sta: ODD_ENTRY+$0000,y -:bottom rts +bottom + <<< ; SetCodeEntryOpcode ; @@ -680,13 +686,14 @@ SetOddCodeEntry ; X = number of lines * 2, 0 to 32 ; Y = starting line * $1000 ; A = opcode value -SetCodeEntryOpcode - da :bottom-00,:bottom-03,:bottom-06,:bottom-09 - da :bottom-12,:bottom-15,:bottom-18,:bottom-21 - da :bottom-24,:bottom-27,:bottom-30,:bottom-33 - da :bottom-36,:bottom-39,:bottom-42,:bottom-45 - da :bottom-48 -:top sta CODE_ENTRY_OPCODE+$F000,y +SetCodeEntryOpcode mac + jmp (dispTbl,x) +dispTbl da bottom-00,bottom-03,bottom-06,bottom-09 + da bottom-12,bottom-15,bottom-18,bottom-21 + da bottom-24,bottom-27,bottom-30,bottom-33 + da bottom-36,bottom-39,bottom-42,bottom-45 + da bottom-48 + sta CODE_ENTRY_OPCODE+$F000,y sta CODE_ENTRY_OPCODE+$E000,y sta CODE_ENTRY_OPCODE+$D000,y sta CODE_ENTRY_OPCODE+$C000,y @@ -702,4 +709,5 @@ SetCodeEntryOpcode sta CODE_ENTRY_OPCODE+$2000,y sta CODE_ENTRY_OPCODE+$1000,y sta: CODE_ENTRY_OPCODE+$0000,y -:bottom rts +bottom + <<< diff --git a/src/blitter/TemplateUtils.s b/src/blitter/TemplateUtils.s index 0dae3d5..534b19e 100644 --- a/src/blitter/TemplateUtils.s +++ b/src/blitter/TemplateUtils.s @@ -87,13 +87,14 @@ Counter equ tmp3 ; A = value ; ; Set M to 0 or 1 -SetConst - da :bottom-00,:bottom-03,:bottom-06,:bottom-09 - da :bottom-12,:bottom-15,:bottom-18,:bottom-21 - da :bottom-24,:bottom-27,:bottom-30,:bottom-33 - da :bottom-36,:bottom-39,:bottom-42,:bottom-45 - da :bottom-48 -:top sta $F000,y +SetConst mac + jmp (dispTbl,x) +dispTbl da bottom-00,bottom-03,bottom-06,bottom-09 + da bottom-12,bottom-15,bottom-18,bottom-21 + da bottom-24,bottom-27,bottom-30,bottom-33 + da bottom-36,bottom-39,bottom-42,bottom-45 + da bottom-48 + sta $F000,y sta $E000,y sta $D000,y sta $C000,y @@ -109,7 +110,8 @@ SetConst sta $2000,y sta $1000,y sta: $0000,y -:bottom rts +bottom + <<< ; SetDPAddrs ; diff --git a/src/blitter/Vert.s b/src/blitter/Vert.s index eafe61f..e949b73 100644 --- a/src/blitter/Vert.s +++ b/src/blitter/Vert.s @@ -69,13 +69,12 @@ _ApplyBG0YPos sta :virt_line_x2 plb - jsr (:CopyRTableToStkAddr,x) ; X = rtbl_idx_x2 on return + CopyRTableToStkAddr :rtbl_idx_x2 ; X = rtbl_idx_x2 on return txa ; carry flag is unchanged adc :draw_count_x2 ; advance the index into the RTable sta :rtbl_idx_x2 - lda :lines_left_x2 ; subtract the number of lines we just completed sec sbc :draw_count_x2 @@ -93,73 +92,75 @@ _ApplyBG0YPos ; A = intect into the RTable array (x2) ; Y = starting line * $1000 ; X = number of lines (x2) -:CopyRTableToStkAddr - da :none - da :do01,:do02,:do03,:do04 - da :do05,:do06,:do07,:do08 - da :do09,:do10,:do11,:do12 - da :do13,:do14,:do15,:do16 -:do15 ldx :rtbl_idx_x2 - bra :x15 -:do14 ldx :rtbl_idx_x2 - bra :x14 -:do13 ldx :rtbl_idx_x2 - bra :x13 -:do12 ldx :rtbl_idx_x2 - bra :x12 -:do11 ldx :rtbl_idx_x2 - bra :x11 -:do10 ldx :rtbl_idx_x2 - bra :x10 -:do09 ldx :rtbl_idx_x2 - bra :x09 -:do08 ldx :rtbl_idx_x2 - bra :x08 -:do07 ldx :rtbl_idx_x2 - bra :x07 -:do06 ldx :rtbl_idx_x2 - bra :x06 -:do05 ldx :rtbl_idx_x2 - bra :x05 -:do04 ldx :rtbl_idx_x2 - bra :x04 -:do03 ldx :rtbl_idx_x2 - bra :x03 -:do02 ldx :rtbl_idx_x2 - bra :x02 -:do01 ldx :rtbl_idx_x2 - bra :x01 -:do16 ldx :rtbl_idx_x2 +CopyRTableToStkAddr mac + jmp (dispTbl,x) +dispTbl da bottom + da do01,do02,do03,do04 + da do05,do06,do07,do08 + da do09,do10,do11,do12 + da do13,do14,do15,do16 +do15 ldx ]1 + bra x15 +do14 ldx ]1 + bra x14 +do13 ldx ]1 + bra x13 +do12 ldx ]1 + bra x12 +do11 ldx ]1 + bra x11 +do10 ldx ]1 + bra x10 +do09 ldx ]1 + bra x09 +do08 ldx ]1 + bra x08 +do07 ldx ]1 + bra x07 +do06 ldx ]1 + bra x06 +do05 ldx ]1 + bra x05 +do04 ldx ]1 + bra x04 +do03 ldx ]1 + bra x03 +do02 ldx ]1 + bra x02 +do01 ldx ]1 + bra x01 +do16 ldx ]1 ldal RTable+30,x sta STK_ADDR+$F000,y -:x15 ldal RTable+28,x +x15 ldal RTable+28,x sta STK_ADDR+$E000,y -:x14 ldal RTable+26,x +x14 ldal RTable+26,x sta STK_ADDR+$D000,y -:x13 ldal RTable+24,x +x13 ldal RTable+24,x sta STK_ADDR+$C000,y -:x12 ldal RTable+22,x +x12 ldal RTable+22,x sta STK_ADDR+$B000,y -:x11 ldal RTable+20,x +x11 ldal RTable+20,x sta STK_ADDR+$A000,y -:x10 ldal RTable+18,x +x10 ldal RTable+18,x sta STK_ADDR+$9000,y -:x09 ldal RTable+16,x +x09 ldal RTable+16,x sta STK_ADDR+$8000,y -:x08 ldal RTable+14,x +x08 ldal RTable+14,x sta STK_ADDR+$7000,y -:x07 ldal RTable+12,x +x07 ldal RTable+12,x sta STK_ADDR+$6000,y -:x06 ldal RTable+10,x +x06 ldal RTable+10,x sta STK_ADDR+$5000,y -:x05 ldal RTable+08,x +x05 ldal RTable+08,x sta STK_ADDR+$4000,y -:x04 ldal RTable+06,x +x04 ldal RTable+06,x sta STK_ADDR+$3000,y -:x03 ldal RTable+04,x +x03 ldal RTable+04,x sta STK_ADDR+$2000,y -:x02 ldal RTable+02,x +x02 ldal RTable+02,x sta STK_ADDR+$1000,y -:x01 ldal RTable+00,x +x01 ldal RTable+00,x sta: STK_ADDR+$0000,y -:none rts +bottom + <<< \ No newline at end of file From 794bc1fc09259f08764f552a700d74bbf146b752 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Sat, 30 Jul 2022 11:04:13 -0500 Subject: [PATCH 10/68] Start adding scanline variants --- src/SpriteV1.s | 226 ----------------------------------------- src/blitter/Scanline.s | 172 +++++++++++++++++++++++++++++++ 2 files changed, 172 insertions(+), 226 deletions(-) delete mode 100644 src/SpriteV1.s create mode 100644 src/blitter/Scanline.s diff --git a/src/SpriteV1.s b/src/SpriteV1.s deleted file mode 100644 index 6d24dbb..0000000 --- a/src/SpriteV1.s +++ /dev/null @@ -1,226 +0,0 @@ -; Old code the was in Version 1, but is not needed. May be adapted for Verions 2. - -; Y = _Sprites array offset -_EraseSpriteY - lda _Sprites+OLD_VBUFF_ADDR,y - beq :noerase - ldx _Sprites+SPRITE_DISP,y ; get the dispatch index for this sprite (32 values) - jmp (:do_erase,x) -:noerase rts -:do_erase dw _EraseTileSprite8x8,_EraseTileSprite8x8,_EraseTileSprite8x8,_EraseTileSprite8x8 - dw _EraseTileSprite8x16,_EraseTileSprite8x16,_EraseTileSprite8x16,_EraseTileSprite8x16 - dw _EraseTileSprite16x8,_EraseTileSprite16x8,_EraseTileSprite16x8,_EraseTileSprite16x8 - dw _EraseTileSprite16x16,_EraseTileSprite16x16,_EraseTileSprite16x16,_EraseTileSprite16x16 - dw _EraseTileSprite8x8,_EraseTileSprite8x8,_EraseTileSprite8x8,_EraseTileSprite8x8 - dw _EraseTileSprite8x16,_EraseTileSprite8x16,_EraseTileSprite8x16,_EraseTileSprite8x16 - dw _EraseTileSprite16x8,_EraseTileSprite16x8,_EraseTileSprite16x8,_EraseTileSprite16x8 - dw _EraseTileSprite16x16,_EraseTileSprite16x16,_EraseTileSprite16x16,_EraseTileSprite16x16 - -; A = bank address -_EraseTileSprite8x8 - tax - phb ; Save the bank to switch to the sprite plane - - pei SpriteBanks - plb ; pop the data bank (low byte) - -]line equ 0 - lup 8 - stz: {]line*SPRITE_PLANE_SPAN}+0,x - stz: {]line*SPRITE_PLANE_SPAN}+2,x -]line equ ]line+1 - --^ - - plb ; pop the mask bank (high byte) - lda #$FFFF -]line equ 0 - lup 8 - sta: {]line*SPRITE_PLANE_SPAN}+0,x - sta: {]line*SPRITE_PLANE_SPAN}+2,x -]line equ ]line+1 - --^ - - plb - rts - -_EraseTileSprite8x16 - tax - phb ; Save the bank to switch to the sprite plane - - pei SpriteBanks - plb ; pop the data bank (low byte) - -]line equ 0 - lup 16 - stz: {]line*SPRITE_PLANE_SPAN}+0,x - stz: {]line*SPRITE_PLANE_SPAN}+2,x -]line equ ]line+1 - --^ - - plb ; pop the mask bank (high byte) - lda #$FFFF -]line equ 0 - lup 16 - sta: {]line*SPRITE_PLANE_SPAN}+0,x - sta: {]line*SPRITE_PLANE_SPAN}+2,x -]line equ ]line+1 - --^ - - plb - rts - -_EraseTileSprite16x8 - tax - phb ; Save the bank to switch to the sprite plane - - pei SpriteBanks - plb ; pop the data bank (low byte) - -]line equ 0 - lup 8 - stz: {]line*SPRITE_PLANE_SPAN}+0,x - stz: {]line*SPRITE_PLANE_SPAN}+2,x - stz: {]line*SPRITE_PLANE_SPAN}+4,x - stz: {]line*SPRITE_PLANE_SPAN}+6,x -]line equ ]line+1 - --^ - - plb ; pop the mask bank (high byte) - lda #$FFFF -]line equ 0 - lup 8 - sta: {]line*SPRITE_PLANE_SPAN}+0,x - sta: {]line*SPRITE_PLANE_SPAN}+2,x - sta: {]line*SPRITE_PLANE_SPAN}+4,x - sta: {]line*SPRITE_PLANE_SPAN}+6,x -]line equ ]line+1 - --^ - - plb - rts - -_EraseTileSprite16x16 - tax - phb ; Save the bank to switch to the sprite plane - - pei SpriteBanks - plb ; pop the data bank (low byte) - -]line equ 0 - lup 16 - stz: {]line*SPRITE_PLANE_SPAN}+0,x - stz: {]line*SPRITE_PLANE_SPAN}+2,x - stz: {]line*SPRITE_PLANE_SPAN}+4,x - stz: {]line*SPRITE_PLANE_SPAN}+6,x -]line equ ]line+1 - --^ - - plb ; pop the mask bank (high byte) - - lda #$FFFF -]line equ 0 - lup 16 - sta: {]line*SPRITE_PLANE_SPAN}+0,x - sta: {]line*SPRITE_PLANE_SPAN}+2,x - sta: {]line*SPRITE_PLANE_SPAN}+4,x - sta: {]line*SPRITE_PLANE_SPAN}+6,x -]line equ ]line+1 - --^ - - plb - rts - - -; First, if there is only one sprite, then we can skip any overhead and do a single lda/and/ora/sta to put the -; sprite data on the screen. -; -; Second, if there are 4 or less, then we "stack" the sprite data using an unrolled loop that allows each -; sprite to just be a single and/ora pair and the final result is not written to any intermediate memory buffer. -; -; Third, if there are 5 or more sprites, then we assume that the sprites are "dense" and that there will be a -; non-trivial amount of overdraw. In this case we do a series of optimized copies of the sprite data *and* -; masks into a direct page buffer in *reverse order*. Once a mask value becomes zero, then nothing else can -; show through and that value can be skipped. Once all of the mask values are zero, then the render is terminated -; and the data buffer copied to the final destination. -; -; Note that these rendering algorithms impose a priority ordering on the sprites where lower sprite IDs are drawn -; underneath higher sprite IDs. -RenderActiveSpriteTiles - cmp #0 ; Is there only one active sprite? If so optimise - bne :many - - ldx vbuff ; load the address to the (adjusted) sprite tile - lda TileStore+TS_SCREEN_ADDR,y - tay - - lda tiledata+0,y - andl spritemask,x - oral spritedata,x - sta 00,s - - lda tiledata+2,y - andl spritemask+2,x - oral spritedata+2,x - sta 02,s - - ... - tsc - adc #320 - tcs - ... - - lda tiledata+{line*4},y - andl spritemask+{line*SPAN},x - oral spritedata+{line*SPAN},x - sta 160,s - - lda tiledata+{line*4}+2,y - andl spritemask+{line*SPAN}+2,x - oral spritedata+{line*SPAN}+2,x - sta 162,s - - rts - - -:many - lda TileStore+TS_SCREEN_ADDR,y - tcs - lda TileStore+TS_TILE_ADDR,y - tay - - ldx count - jmp (:arr,x) - lda tiledata+0,y - ldx vbuff - andl spritemask,x - oral spritedata,x - ldx vbuff+2 - andl spritemask,x - oral spritedata,x - ldx vbuff+4 - andl spritemask,x - oral spritedata,x - ... - sta 00,s - - ldx count - jmp (:arr,x) - lda tiledata+0,y - ldx vbuff - andl spritemask,x - oral spritedata,x - ldx vbuff+2 - andl spritemask,x - oral spritedata,x - ldx vbuff+4 - andl spritemask,x - oral spritedata,x - ... - sta 02,s - - sta 160,s - - sta 162,s - - tsc - adc #320 \ No newline at end of file diff --git a/src/blitter/Scanline.s b/src/blitter/Scanline.s new file mode 100644 index 0000000..dc640d5 --- /dev/null +++ b/src/blitter/Scanline.s @@ -0,0 +1,172 @@ +; This support an alternate engine mode. When in scanline mode the renderer does not use the +; global StartX and StartY parameters to set up the code field. Instead, an array of scanline +; parameters must be provided to the blitter. +; +; This is a low-level mode and it is assumed that the arrays will contain valid values. This +; process is quite a bit slower that the normal setup because it must calculate code field +; entry points for each line, instead of once for the entire frame. + +_ScanlineBG0XPos + +:stk_save equ tmp0 +:virt_line_x2 equ tmp1 +:last_line_x2 equ tmp2 +:src_bank equ tmp3 +:exit_offset equ tmp4 +:entry_offset equ tmp5 +:exit_bra equ tmp6 +:exit_address equ tmp7 +:base_address equ tmp8 +:opcode equ tmp9 +:odd_entry_offset equ tmp10 + + lda StartYMod208 ; This is the base line of the virtual screen + asl + sta :virt_line_x2 ; Keep track of it + + lda ScreenHeight + asl + clc + adc :virt_line_x2 + sta :last_line_x2 + + phb + phb + pla + and #$FF00 + sta :src_bank + +:loop + ldx :virt_line_x2 + lda StartXMod164Arr,x ; Get the offset for this line + + dec ; The exit point is one byte sooner + bpl *+5 + lda #163 + + bit #$0001 ; if odd, then original number was even + beq :odd_exit ; if even, the original number was odd + + ; This is the even code path + and #$FFFE + tay + lda CodeFieldEvenBRA,y + sta :exit_bra + lda Col2CodeOffset,y + sta :exit_offset + sta LastPatchOffsetArr,x ; Cache afor later + bra :do_entry + +; This is the odd code path +:odd_exit tay + lda CodeFieldOddBRA,y + sta :exit_bra + lda Col2CodeOffset,y + sta :exit_offset + sta LastPatchOffsetArr,x + +; Handle the entry point calculations +:do_entry + lda StartXMod164Arr,x + clc + adc ScreenWidth ; move to the right edge and back up a byte + dec ; to get the index of the first on-screen byte + + cmp #164 ; Keep the value in range + bcc *+5 + sbc #164 + +; Same logic as before + + bit #$0001 + beq :odd_entry + + and #$FFFE + tay + lda Col2CodeOffset,y + sta :entry_offset + lda #$004C ; set the entry_jmp opcode to JMP + sta :opcode + stz :odd_entry_offset ; mark as an even case + bra :prep_complete + +:odd_entry + tay + lda Col2CodeOffset,y + sta :entry_offset ; Will be used to load the data + lda Col2CodeOffset-2,y + sta :odd_entry_offset ; will the the actual location to jump to + lda #$00AF ; set the entry_jmp opcode to LDAL + sta :opcode +:prep_complete + +; Not patch in the code field line + + ldy BTableLow,x ; Get the address of the first code field line + clc + adc :exit_offset ; Add some offsets to get the base address in the code field line + sta :exit_address + sty :base_address + + lda BTableHigh,x + ora src_bank + pha + plb + +; First step is to set the BRA instruction to exit the code field at the proper location. There +; are two sub-steps to do here; we need to save the 16-bit value that exists at the location and +; then overwrite it with the branch instruction. + +; SaveOpcode + ; y is already set to :base_address + ldx :exit_address ; Save from this location + lda: $0000,x + sta: OPCODE_SAVE+$0000,y + +;SetConst + txy ; ldy :exit_address -- starting at this address + ldx :exit_bra ; Copy this value into all of the lines + sta: $0000,y + +; Next, patch in the CODE_ENTRY value, which is the low byte of a JMP instruction. This is an +; 8-bit operation and, since the PEA code is bank aligned, we use the entry_offset value directly + + sep #$20 + +; SetCodeEntry + lda :entry_offset + ldy :base_address + sta: CODE_ENTRY+$0000,y + +; SetCodeEntryOpcode + + lda :opcode + sta: CODE_ENTRY_OPCODE+$0000,y + +; If this is an odd entry, also set the odd_entry low byte and save the operand high byte + + lda :odd_entry_offset + beq :not_odd + +; SetOddCodeEntry + sta: ODD_ENTRY+$0000,y +; SaveHighOperand + ldx :exit_address + lda: $0002,x + sta: OPCODE_HIGH_SAVE+$0000,y +:not_odd + rep #$21 ; clear the carry + +; Do the end of the loop -- update the virtual line counter and reduce the number +; of lines left to render + + plb ; restore the bank + + lda :virt_line_x2 + inc + inc + sta :virt_line_x2 + cmp :last_line_x2 + jne :loop + + rts \ No newline at end of file From 0915f5e93ba0431b527a1453502a29f44b6a5b95 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Sat, 30 Jul 2022 11:05:49 -0500 Subject: [PATCH 11/68] Add note about requiring newer version of merlin32 --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b3db465..33a1c5f 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,11 @@ Each demo application has a build script that also builds the toolset and copies ## Dependencies -GTE uses the [merlin32](https://brutaldeluxe.fr/products/crossdevtools/merlin/) assembler to compile its source into GS/OS OMF files and [Cadius](https://brutaldeluxe.fr/products/crossdevtools/cadius/index.html) to copy those files onto a ProDOS disk image. The paths to these tool can be set in the `package.json` file. +* node +* merlin32 (1.1.10+) +* cadius + +GTE uses the [merlin32](https://brutaldeluxe.fr/products/crossdevtools/merlin/) 1.1.10 assembler to compile its source into GS/OS OMF files and [Cadius](https://brutaldeluxe.fr/products/crossdevtools/cadius/index.html) to copy those files onto a ProDOS disk image. The paths to these tool can be set in the `package.json` file. An empty 2MG disk image is included in `emu/Target.2mg` and is used as the default location for copying demo applications. This image can be mounted in any IIgs emulator. @@ -30,7 +34,6 @@ An empty 2MG disk image is included in `emu/Target.2mg` and is used as the defau Build of demo app in the IIgs Finder

- # Documentation Please refer to the GTE Toolbox documentation. From bc5229b52848d8050c85d6a6dd4544c021a90599 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Sat, 30 Jul 2022 11:07:03 -0500 Subject: [PATCH 12/68] Add link to merlin32 1.1.10 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 33a1c5f..bfba6ef 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Each demo application has a build script that also builds the toolset and copies * merlin32 (1.1.10+) * cadius -GTE uses the [merlin32](https://brutaldeluxe.fr/products/crossdevtools/merlin/) 1.1.10 assembler to compile its source into GS/OS OMF files and [Cadius](https://brutaldeluxe.fr/products/crossdevtools/cadius/index.html) to copy those files onto a ProDOS disk image. The paths to these tool can be set in the `package.json` file. +GTE uses the [merlin32](https://brutaldeluxe.fr/products/crossdevtools/merlin/) [1.1.10](https://github.com/digarok/merlin32/releases/tag/v1.1.10) assembler to compile its source into GS/OS OMF files and [Cadius](https://brutaldeluxe.fr/products/crossdevtools/cadius/index.html) to copy those files onto a ProDOS disk image. The paths to these tool can be set in the `package.json` file. An empty 2MG disk image is included in `emu/Target.2mg` and is used as the default location for copying demo applications. This image can be mounted in any IIgs emulator. From 7a6c4e5ff46f0fa66a9fe60a0cb316b039d572e7 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Sun, 31 Jul 2022 11:51:42 -0500 Subject: [PATCH 13/68] Break up Ypos loop into pre/loop/post segment to optimize. Saved ~5,000 cycles/sec. When applied to the other routines will save a few thousand more cycles --- src/blitter/Vert.s | 166 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 162 insertions(+), 4 deletions(-) diff --git a/src/blitter/Vert.s b/src/blitter/Vert.s index e949b73..436ae44 100644 --- a/src/blitter/Vert.s +++ b/src/blitter/Vert.s @@ -5,7 +5,7 @@ ; Based on the current value of StartY in the direct page. Set up the dispatch ; information so that the BltRange driver will render the correct code field ; lines in the correct order -_ApplyBG0YPos +_ApplyBG0YPosOld :rtbl_idx_x2 equ tmp0 :virt_line_x2 equ tmp1 @@ -51,7 +51,7 @@ _ApplyBG0YPos ldal BTableLow,x ; Get the address of the first code field line tay - ldal BTableHigh,x ; Target bank in low byte, current bank in high + ldal BTableHigh,x ; Target bank in low byte pha txa @@ -69,7 +69,8 @@ _ApplyBG0YPos sta :virt_line_x2 plb - CopyRTableToStkAddr :rtbl_idx_x2 ; X = rtbl_idx_x2 on return + jsr _CopyRTableToStkAddr +; CopyRTableToStkAddr :rtbl_idx_x2 ; X = rtbl_idx_x2 on return txa ; carry flag is unchanged adc :draw_count_x2 ; advance the index into the RTable @@ -87,6 +88,159 @@ _ApplyBG0YPos plb rts +; This is an optimized version of _ApplyBG0YPos. We pre-compute the breakdown across the bank +; boundries in order to eliminate the the minimum calculation and some loop variable updates +; from the inner loop. + +_ApplyBG0YPos + +:rtbl_idx_x2 equ tmp0 +:virt_line_x2 equ tmp1 +:lines_left_x2 equ tmp2 +:draw_count_x2 equ tmp3 +:stk_save equ tmp4 +:line_count equ tmp5 + +; First task is to fill in the STK_ADDR values by copying them from the RTable array. We +; copy from RTable[i] into BlitField[StartY+i]. As with all of this code, the difficult part +; is decomposing the update across banks + + stz :rtbl_idx_x2 ; Start copying from the first entry in the table + + lda StartY ; This is the base line of the virtual screen + jsr Mod208 + sta StartYMod208 + + asl + sta :virt_line_x2 ; Keep track of it + + phb ; Save the current bank + tsc ; we intentionally leak one byte of stack in each loop + sta :stk_save ; iteration, so save the stack to repair at the end + +; copy a range of address from the table into the destination bank. If we restrict ourselves to +; rectangular playfields, this can be optimized to just subtracting a constant value. See the +; Templates::SetScreenAddrs subroutine. + + lda ScreenHeight + asl + sta :lines_left_x2 + +; This is the verbose part -- figure out how many lines to draw. We don't want to artificially limit +; the height of the visible screen (for example, doing an animated wipe while scrolling), so the screen +; height could be anything from 1 to 200. +; +; For larger values, we want to break things up on 16-line boundaries based on the virt_line value. So, +; +; draw_count = min(lines_left, (16 - (virt_line % 16)) + +; Pre-loop: Calculate the number of lines to copy to get the loop into a bank-aligned state +; +; lines_in_bank = 16 - (virt_line % 16) +:pre + ldx :virt_line_x2 + ldal BTableLow,x ; Get the address of the first code field line + tay + + ldal BTableHigh,x ; Target bank in low byte + pha + + txa + and #$001E + eor #$FFFF + sec + adc #32 + min :lines_left_x2 + + sta :draw_count_x2 ; Do this many lines + tax + + clc ; pre-advance virt_line_2 because we have the value + adc :virt_line_x2 + sta :virt_line_x2 + + plb + jsr _CopyRTableToStkAddr + + txa ; carry flag is unchanged + adc :draw_count_x2 ; advance the index into the RTable + sta :rtbl_idx_x2 + + lda :lines_left_x2 ; subtract the number of lines we just completed + sec + sbc :draw_count_x2 + sta :lines_left_x2 + + jeq :done ; if there are no lines left, we're done! + cmp #33 + jcc :post ; if there are 16 lines or less left, jump to post + +; Now we are in the main loop. We know that the virt_line is a multiple of 16, but the number +; of remaining lines could be any number greater than 0. we test to see if the lines_left are +; less than 16. If so, we can jump straight to the post-loop update. Otherwise we caculate +; the number of 16-line iterations and but that in an auxiliary count variable and simplify +; the loop update. + + tax + and #$001E ; this is the number of lines in post + sta :lines_left_x2 + txa + lsr + lsr + lsr + lsr + lsr + sta :line_count ; single byte count, saves 9 cycles per loop iteration + +:loop + ldx :virt_line_x2 + ldal BTableLow,x ; Get the address of the first code field line + tay + + ldal BTableHigh,x ; Target bank in low byte + pha + + lda #32 ; Do this many lines (x2) + tax + + clc ; pre-advance virt_line_2 because we have the value + adc :virt_line_x2 + sta :virt_line_x2 + + plb + CopyRTableToStkAddr :rtbl_idx_x2 + + txa ; carry flag is unchanged + adc #32 ; advance the index into the RTable + sta :rtbl_idx_x2 + + dec :line_count + jne :loop + + lda :lines_left_x2 + beq :done + +; Draw some number of lines that are less that 16. No need to update loop variabls because we +; know we are in the last iteration + +:post + ldx :virt_line_x2 + ldal BTableLow,x ; Get the address of the first code field line + tay + + ldal BTableHigh,x ; Target bank in low byte + pha + + ldx :lines_left_x2 ; Do this many lines + plb + jsr _CopyRTableToStkAddr + +:done + lda :stk_save + tcs + plb + rts + ; Unrolled copy routine to move RTable intries into STK_ADDR position. ; ; A = intect into the RTable array (x2) @@ -163,4 +317,8 @@ x02 ldal RTable+02,x x01 ldal RTable+00,x sta: STK_ADDR+$0000,y bottom - <<< \ No newline at end of file + <<< + +_CopyRTableToStkAddr + CopyRTableToStkAddr tmp0 + rts \ No newline at end of file From 5883de1f71ab622c3cc6074f388c548f053ef54c Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Mon, 1 Aug 2022 21:46:00 -0500 Subject: [PATCH 14/68] Checkpoint --- src/blitter/Scanline.s | 35 ++++++++++++++++++++++++++++++++++- src/blitter/Template.s | 5 +++++ src/blitter/TemplateUtils.s | 4 ++-- 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/blitter/Scanline.s b/src/blitter/Scanline.s index dc640d5..b1ff0ac 100644 --- a/src/blitter/Scanline.s +++ b/src/blitter/Scanline.s @@ -169,4 +169,37 @@ _ScanlineBG0XPos cmp :last_line_x2 jne :loop - rts \ No newline at end of file + rts + +; Unrolled copy routine to move BankTable entries into BNK_ADDR position. This is a bit different than the +; other routines, because we don't need to put values into the code fields, but just copy one-byte values +; into an internal array in bank 00 space. The reason for this is because the code sequence +; +; lda #ADDR +; tcs +; plb +; +; Take only 9 cycles, but the alternative is slower +; +; pea #$BBBB +; plb +; plb = 13 cycles +; +; If for some reason it becimes important to preserve the accumulator, or save the 208 bytes of +; bank 00 memory, then we can change it. The advantage right now is that updating the array can +; be done 16-bits at a time and without having to chunk up the writes across multiple banks. This +; is quite a bit faster than the other routines. +CopyTableToBankBytes + + tsx ; save the stack + sei + jmp $0000 + + lda: 2,y + pha + lda: 0,y + pha +bottom + txs ; restore the stack + cli ; turn interrupts back on + rts diff --git a/src/blitter/Template.s b/src/blitter/Template.s index 332b534..8b5f612 100644 --- a/src/blitter/Template.s +++ b/src/blitter/Template.s @@ -5,10 +5,12 @@ DP_ADDR equ entry_1-base+1 ; offset to patch in the direct page for dynamic tiles BG1_ADDR equ entry_2-base+1 ; offset to patch in the Y-reg for BG1 (dp),y addressing STK_ADDR equ entry_3-base+1 ; offset to patch in the stack (SHR) right edge address +BNK_ADDR equ entry_0-base+1 ; offset to patch in the address of a Bank 0 memory location to load the bank register DP_ENTRY equ entry_1-base TWO_LYR_ENTRY equ entry_2-base ONE_LYR_ENTRY equ entry_3-base +BANK_ENTRY equ entry_0-base CODE_ENTRY_OPCODE equ entry_jmp-base CODE_ENTRY equ entry_jmp-base+1 ; low byte of the page-aligned jump address @@ -66,6 +68,9 @@ BankPatchNum equ *-BankPatches ; the code is assembled on a page boundary to help with alignment ds \,$00 ; pad to the next page boundary base +entry_0 lda #0000 ; Used to set per-scanline bank register + tcs + plb entry_1 ldx #0000 ; Used for LDA 00,x addressing (Dynamic Tiles) entry_2 ldy #0000 ; Used for LDA (00),y addressing (Second Layer; BG1) entry_3 lda #0000 ; Sets screen address (right edge) diff --git a/src/blitter/TemplateUtils.s b/src/blitter/TemplateUtils.s index 534b19e..a027127 100644 --- a/src/blitter/TemplateUtils.s +++ b/src/blitter/TemplateUtils.s @@ -245,8 +245,8 @@ BuildBank plb plb -; Change the patched value to one of DP_ENTRY, TWO_LYR_ENTRY or ONE_LYR_ENTRY based on the capabilities -; that the engine needs. +; Change the patched value to one of BANK_ENTRY, DP_ENTRY, TWO_LYR_ENTRY or ONE_LYR_ENTRY based +; on the capabilities that the engine needs. lda #DP_ENTRY sta :entryOffset From 97fa45589b24c85923c71368c924f954493e2fb4 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Mon, 1 Aug 2022 22:00:54 -0500 Subject: [PATCH 15/68] Allow GTEStartUp caller to specify whether tool is loaded as a system or user tool --- macros/GTE.Macs.s | 1 + src/Defs.s | 1 + src/Tool.s | 4 +++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/macros/GTE.Macs.s b/macros/GTE.Macs.s index e1cfcaa..4313f90 100644 --- a/macros/GTE.Macs.s +++ b/macros/GTE.Macs.s @@ -146,6 +146,7 @@ PAD_KEY_DOWN equ $0400 ENGINE_MODE_TWO_LAYER equ $0001 ENGINE_MODE_DYN_TILES equ $0002 ENGINE_MODE_BNK0_BUFF equ $0004 +ENGINE_MODE_USER_TOOL equ $8000 ; Communicate if GTE is loaded as a system tool, or a user tool ; Render flags RENDER_ALT_BG1 equ $0001 diff --git a/src/Defs.s b/src/Defs.s index 48f8d37..9457df8 100644 --- a/src/Defs.s +++ b/src/Defs.s @@ -166,6 +166,7 @@ SPRITE_VBUFF_PTR equ 224 ; 32 bytes of adjusted pointers to VBuf ENGINE_MODE_TWO_LAYER equ $0001 ENGINE_MODE_DYN_TILES equ $0002 ENGINE_MODE_BNK0_BUFF equ $0004 +ENGINE_MODE_USER_TOOL equ $8000 ; Communicate if GTE is loaded as a system tool, or a user tool ; Render flags RENDER_ALT_BG1 equ $0001 diff --git a/src/Tool.s b/src/Tool.s index 760331e..dae5db3 100644 --- a/src/Tool.s +++ b/src/Tool.s @@ -156,7 +156,9 @@ zpToUse = userId+4 ; SetWAP(userOrSystem, tsNum, waptPtr) - pea #$8000 ; $8000 = user tool set + lda EngineMode ; $0000 = system tool, $8000 = user tool set + and #$8000 + pha pei ToolNum ; Push the tool number from the direct page pea $0000 ; High word of WAP is zero (bank 0) phd ; Low word of WAP is the direct page From 273cf2572c6e250a0778023aff687297556cc183 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 4 Aug 2022 15:23:15 -0500 Subject: [PATCH 16/68] Add documentation on the GTEGetTileDataAddr function --- docs/toolboxref.html | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/toolboxref.html b/docs/toolboxref.html index ccab666..f5daec7 100644 --- a/docs/toolboxref.html +++ b/docs/toolboxref.html @@ -3023,7 +3023,7 @@ style: toolref

$24XX

GTEGetTileDataAddr

-

This API is under active development at this time.

+

Returns a pointer to the bottom of the internal tile data memory. The data for a each tile can be found at offset N * 128

Parameters
@@ -3039,6 +3039,11 @@ style: toolref + + + + + @@ -3060,6 +3065,11 @@ style: toolref + + + + + @@ -3074,6 +3084,7 @@ style: toolref
C
+

extern pascal Pointer GTEGetTileDataAddr()

From 4815254d5f3899c541894dff00fa7f500ce6451f Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 4 Aug 2022 15:25:17 -0500 Subject: [PATCH 17/68] Fix typo --- docs/toolboxref.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/toolboxref.html b/docs/toolboxref.html index f5daec7..e8070ab 100644 --- a/docs/toolboxref.html +++ b/docs/toolboxref.html @@ -3023,7 +3023,7 @@ style: toolref

$24XX

GTEGetTileDataAddr

-

Returns a pointer to the bottom of the internal tile data memory. The data for a each tile can be found at offset N * 128

+

Returns a pointer to the bottom of the internal tile data memory. The data for each tile can be found at offset N * 128

Parameters
previous contents
longspaceLong—Space for result
previous contents
tileDataPtrLong;mdash;pointer to the tile data
@@ -3068,7 +3068,7 @@ style: toolref - + From e378dc6e268a6d3d1b3214085b6794cad646b01e Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 11 Aug 2022 14:14:25 -0500 Subject: [PATCH 18/68] Checkpoint with TF4 demo framework --- .gitignore | 3 +- demos/tf4/.gitignore | 1 + demos/tf4/App.Main.s | 96 +++++++ demos/tf4/App.s | 10 + demos/tf4/GTETF4 | Bin 0 -> 688 bytes demos/tf4/README.txt | 3 + demos/tf4/_FileInformation.txt | 2 + demos/tf4/assets/tiled/Overworld.tsx | 37 +++ demos/tf4/assets/tiled/world_1-1.json | 32 +++ demos/tf4/assets/tiled/world_1-1.tmx | 41 +++ .../tf4/assets/tilesets/smb-256-128-4bpp.png | Bin 0 -> 3112 bytes demos/tf4/build-image.bat | 17 ++ demos/tf4/package.json | 44 +++ macros/GTE.Macs.s | 2 + src/Defs.s | 4 + src/FastCopies.s | 271 ++++++++++++++++++ src/Master.s | 7 + src/Render.s | 98 +++++++ src/Tool.s | 1 + src/blitter/Horz.s | 4 +- src/blitter/Scanline.s | 54 +++- src/blitter/Vert.s | 6 +- src/static/TileStore.s | 7 +- 23 files changed, 731 insertions(+), 9 deletions(-) create mode 100644 demos/tf4/.gitignore create mode 100644 demos/tf4/App.Main.s create mode 100644 demos/tf4/App.s create mode 100644 demos/tf4/GTETF4 create mode 100644 demos/tf4/README.txt create mode 100644 demos/tf4/_FileInformation.txt create mode 100644 demos/tf4/assets/tiled/Overworld.tsx create mode 100644 demos/tf4/assets/tiled/world_1-1.json create mode 100644 demos/tf4/assets/tiled/world_1-1.tmx create mode 100644 demos/tf4/assets/tilesets/smb-256-128-4bpp.png create mode 100644 demos/tf4/build-image.bat create mode 100644 demos/tf4/package.json create mode 100644 src/FastCopies.s diff --git a/.gitignore b/.gitignore index 3fd0032..b1a72d6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ emu *_Output.txt src/GTETestApp *.2mg -Tool160.SHK \ No newline at end of file +Tool160.SHK +src/Tool160 \ No newline at end of file diff --git a/demos/tf4/.gitignore b/demos/tf4/.gitignore new file mode 100644 index 0000000..6289069 --- /dev/null +++ b/demos/tf4/.gitignore @@ -0,0 +1 @@ +GTETF4 \ No newline at end of file diff --git a/demos/tf4/App.Main.s b/demos/tf4/App.Main.s new file mode 100644 index 0000000..0a1ac40 --- /dev/null +++ b/demos/tf4/App.Main.s @@ -0,0 +1,96 @@ +; Test driver to exercise graphics routines. + + REL + DSK MAINSEG + + use Locator.Macs + use Load.Macs + use Mem.Macs + use Misc.Macs + use Util.Macs + use EDS.GSOS.Macs + use GTE.Macs + + mx %00 + +tiledata EXT ; tileset buffer +;TileSetPalette EXT + +; Keycodes +LEFT_ARROW equ $08 +RIGHT_ARROW equ $15 +UP_ARROW equ $0B +DOWN_ARROW equ $0A + +; Direct page space +MyUserId equ 0 +BankLoad equ 2 +StartX equ 4 +StartY equ 6 +TileMapWidth equ 8 +TileMapHeight equ 10 +ScreenWidth equ 12 +ScreenHeight equ 14 +MaxGlobalX equ 16 +MaxGlobalY equ 18 +MaxBG0X equ 20 +MaxBG0Y equ 22 +OldOneSecondCounter equ 26 +appTmp0 equ 28 + + phk + plb + + sta MyUserId ; GS/OS passes the memory manager user ID for the application into the program + tdc + sta MyDirectPage ; Keep a copy for the overlay callback + + _MTStartUp ; GTE requires the miscellaneous toolset to be running + + lda #ENGINE_MODE_USER_TOOL+ENGINE_MODE_TWO_LAYER + jsr GTEStartUp ; Load and install the GTE User Tool + +; Initialize local variables + +; pea $0000 +; pea #^TileSetPalette +; pea #TileSetPalette +; _GTESetPalette + +; Set up our level data + + +; Set up a very specific test. First, we draw a sprite into the sprite plane, and then +; leave it alone. We are just testing the ability to merge sprite plane data into +; the play field tiles. +EvtLoop + pha + _GTEReadControl + pla + + jsr HandleKeys ; Do the generic key handlers + + pea RENDER_PER_SCANLINE ; Scanline rendering + _GTERender + + brl EvtLoop + +; Exit code +Exit + _GTEShutDown +Quit + _QuitGS qtRec + + bcs Fatal +Fatal brk $00 + +qtRec adrl $0000 + da $00 + +; Color palette +MyDirectPage ds 2 + +; Stub +SetLimits rts + + PUT ../kfest-2022/StartUp.s diff --git a/demos/tf4/App.s b/demos/tf4/App.s new file mode 100644 index 0000000..8e8c7c6 --- /dev/null +++ b/demos/tf4/App.s @@ -0,0 +1,10 @@ +; Thunder Force IV Demo + + TYP $B3 ; S16 file + DSK GTETF4 + XPL + +; Segment #1 -- Main execution block + + ASM App.Main.s + SNA Main diff --git a/demos/tf4/GTETF4 b/demos/tf4/GTETF4 new file mode 100644 index 0000000000000000000000000000000000000000..1fa8df1f4df60e034f138a6ce9414c05d4530905 GIT binary patch literal 688 zcmYjPO=uHQ5T1G4#wHSywnC#79D*njiv~eL3gQoyl`2$eK@eo4MmIDhn51A+!B7>U zVI?34f`{dSU=0hoc`BG=PVKq3oPs@xYzamrzS*SWu*^5}y>H(8_U$$Vcrncw7*QDk z!UJxQRj=YKTn73Vw^Ethp!vyz^Yz!TX59d(i6}sO6DxERbZPseW6(C~E4X2hc96UE zPG8y@SJBVVj?p!>cf&hjkPO`gkmEky$5iG2&nMtT*8vxm#LtqN04$rma@mE7Ys0QC zF)-vsFS3>a)OXdGv;`lj)SBUspIgl5v+;}P_1Ft&J%t_L<_x?_0j(;04Qh2_4W>v3m3DCCyzL@p8@%A@FOup*yBl5oWd7g~x?`{ILuUD0qbqD%ij#Lk+hX-eU*h EFUN|)o&W#< literal 0 HcmV?d00001 diff --git a/demos/tf4/README.txt b/demos/tf4/README.txt new file mode 100644 index 0000000..0894796 --- /dev/null +++ b/demos/tf4/README.txt @@ -0,0 +1,3 @@ +Basic scroller with SMB background + - q to quit; arrows to scroll, numbers to select screen size + - make sure Overlay is present \ No newline at end of file diff --git a/demos/tf4/_FileInformation.txt b/demos/tf4/_FileInformation.txt new file mode 100644 index 0000000..8d18d0b --- /dev/null +++ b/demos/tf4/_FileInformation.txt @@ -0,0 +1,2 @@ +GTEDemo1=Type(B3),AuxType(0000),VersionCreate(70),MinVersion(BE),Access(E3),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000) +GTETF4=Type(B3),AuxType(0000),VersionCreate(70),MinVersion(BE),Access(E3),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000) diff --git a/demos/tf4/assets/tiled/Overworld.tsx b/demos/tf4/assets/tiled/Overworld.tsx new file mode 100644 index 0000000..4753af2 --- /dev/null +++ b/demos/tf4/assets/tiled/Overworld.tsx @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/demos/tf4/assets/tiled/world_1-1.json b/demos/tf4/assets/tiled/world_1-1.json new file mode 100644 index 0000000..9f73813 --- /dev/null +++ b/demos/tf4/assets/tiled/world_1-1.json @@ -0,0 +1,32 @@ +{ "compressionlevel":-1, + "height":30, + "infinite":false, + "layers":[ + { + "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 153, 154, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 153, 154, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 153, 154, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 154, 153, 154, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 56, 10, 0, 0, 0, 0, 0, 153, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 186, 186, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 186, 186, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 186, 186, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 185, 186, 186, 186, 186, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 10, 0, 0, 0, 0, 185, 186, 186, 187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 156, 157, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 156, 157, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 156, 157, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155, 156, 157, 156, 157, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 155, 156, 157, 158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 188, 0, 0, 0, 0, 0, 0, 188, 188, 188, 188, 188, 188, 159, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 188, 188, 188, 188, 188, 0, 0, 0, 0, 0, 0, 0, 0, 188, 188, 159, 160, 159, 160, 188, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 191, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 191, 192, 191, 192, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 31, 32, 31, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 160, 0, 0, 0, 0, 0, 188, 188, 159, 160, 188, 188, 159, 160, 188, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 188, 159, 160, 188, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 188, 188, 188, 0, 0, 0, 0, 0, 0, 0, 0, 159, 160, 0, 0, 0, 0, 159, 160, 0, 0, 0, 0, 159, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 188, 188, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 0, 0, 0, 0, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 0, 0, 0, 0, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 188, 188, 188, 159, 160, 188, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 191, 192, 0, 0, 0, 0, 0, 26, 26, 191, 192, 26, 26, 191, 192, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 191, 192, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 191, 192, 0, 0, 0, 0, 191, 192, 0, 0, 0, 0, 191, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 0, 0, 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 0, 0, 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 191, 192, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 26, 64, 26, 26, 64, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 0, 0, 0, 0, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 26, 64, 26, 26, 64, 26, 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 0, 0, 0, 0, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 49, 50, 0, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 31, 32, 24, 25, 24, 25, 24, 25, 31, 32, 0, 0, 0, 0, 0, 48, 21, 54, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 48, 21, 54, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 21, 54, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 0, 48, 21, 54, 51, 0, 0, 0, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 12, 13, 14, 0, 0, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 0, 0, 0, 48, 21, 54, 51, 0, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 57, 58, 26, 26, 26, 26, 0, 0, 0, 0, 48, 21, 21, 21, 21, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 2147483697, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 48, 21, 21, 21, 21, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 2147483697, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 21, 21, 21, 21, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 2147483697, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 48, 21, 21, 21, 21, 51, 0, 0, 7, 8, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 49, 2147483697, 0, 0, 15, 16, 17, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 17, 18, 0, 0, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 0, 0, 48, 21, 21, 21, 21, 51, 0, 0, 0, 0, 9, 10, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 64, 64, 26, 26, 26, 26, 0, 0, 0, 48, 21, 54, 21, 21, 54, 21, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 35, 34, 35, 34, 35, 0, 0, 0, 48, 21, 54, 2147483696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 35, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, 34, 35, 34, 35, 0, 0, 0, 0, 19, 20, 21, 22, 0, 48, 21, 54, 21, 21, 54, 21, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 34, 35, 34, 35, 34, 35, 0, 0, 0, 48, 21, 54, 2147483696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 35, 34, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 21, 54, 21, 21, 54, 21, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 35, 34, 35, 34, 35, 0, 0, 0, 48, 21, 54, 2147483696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 5, 6, 34, 35, 34, 35, 5, 6, 5, 6, 5, 6, 5, 6, 0, 48, 21, 54, 21, 21, 54, 21, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 48, 21, 54, 2147483696, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 34, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 0, 48, 21, 54, 21, 21, 54, 21, 51, 0, 0, 0, 5, 6, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 64, 64, 26, 26, 26, 26, 0, 0, 48, 21, 21, 21, 21, 21, 21, 21, 21, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 37, 37, 37, 37, 37, 38, 0, 48, 21, 21, 21, 21, 2147483696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 37, 38, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 0, 0, 36, 37, 37, 37, 37, 38, 0, 0, 0, 19, 20, 21, 22, 48, 21, 21, 21, 21, 21, 21, 21, 21, 51, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 0, 36, 37, 37, 37, 37, 37, 37, 38, 0, 48, 21, 21, 21, 21, 2147483696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 37, 37, 37, 38, 0, 0, 0, 0, 0, 0, 0, 48, 21, 21, 21, 21, 21, 21, 21, 21, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 37, 37, 37, 37, 37, 38, 0, 48, 21, 21, 21, 21, 2147483696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 37, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 7, 8, 37, 37, 37, 37, 7, 8, 7, 8, 7, 8, 7, 8, 48, 21, 21, 21, 21, 21, 21, 21, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 7, 8, 7, 8, 7, 8, 7, 8, 38, 0, 48, 21, 21, 21, 21, 2147483696, 19, 20, 21, 22, 0, 0, 0, 0, 0, 36, 37, 37, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 20, 21, 22, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 0, 0, 0, 0, 48, 21, 21, 21, 21, 21, 21, 21, 21, 51, 0, 0, 7, 8, 0, 0, 0, 0, 0, 0, 26, 26, 26, 26, 64, 64, 26, 26, 26, 26, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 0, 0, 0, 0, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 0, 0, 0, 0, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4], + "height":30, + "id":1, + "name":"App.TileMapBG0", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":416, + "x":0, + "y":0 + }], + "nextlayerid":4, + "nextobjectid":2, + "orientation":"orthogonal", + "renderorder":"right-down", + "tiledversion":"1.7.2", + "tileheight":8, + "tilesets":[ + { + "firstgid":1, + "source":"Overworld.tsx" + }], + "tilewidth":8, + "type":"map", + "version":"1.6", + "width":416 +} \ No newline at end of file diff --git a/demos/tf4/assets/tiled/world_1-1.tmx b/demos/tf4/assets/tiled/world_1-1.tmx new file mode 100644 index 0000000..693a851 --- /dev/null +++ b/demos/tf4/assets/tiled/world_1-1.tmx @@ -0,0 +1,41 @@ + + + + + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,154,153,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,154,153,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,154,153,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,154,153,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,186,186,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,186,186,186,186,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,186,186,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,186,186,186,186,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,186,186,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,186,186,186,186,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,186,186,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,186,186,186,186,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,156,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,153,154,153,154,153,154,0,0,0,0,0,0,0,0,0,0,0,155,156,157,156,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,156,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,153,154,153,154,153,154,0,0,0,0,0,0,0,0,0,0,0,155,156,157,156,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,156,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,153,154,153,154,153,154,0,0,0,0,0,0,0,0,0,0,0,155,156,157,156,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,156,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,153,154,153,154,153,154,0,0,0,0,0,0,0,0,0,0,0,155,156,157,156,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55,56,10,0,0,0,0,0,153,154,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,186,186,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,186,186,186,186,186,186,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,186,186,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,186,186,186,186,186,186,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,186,186,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,186,186,186,186,186,186,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,186,186,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,185,186,186,186,186,186,186,187,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55,10,0,0,0,0,185,186,186,187,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,156,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,156,157,156,157,156,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,156,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,156,157,156,157,156,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,156,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,156,157,156,157,156,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,156,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,156,157,156,157,156,157,158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,0,0,0,0,155,156,157,158,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,159,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,188,0,0,0,0,0,0,188,188,188,188,188,188,159,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,159,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,188,188,188,188,188,188,0,0,0,0,0,0,0,0,188,188,159,160,159,160,188,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,6,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,191,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,0,0,0,0,0,0,26,26,26,26,26,26,191,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,191,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,26,26,26,26,0,0,0,0,0,0,0,0,26,26,191,192,191,192,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,8,7,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,6,5,6,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,8,7,8,7,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,6,5,6,5,6,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,8,7,8,7,8,7,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,6,5,6,5,6,5,6,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,8,7,8,7,8,7,8,7,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,0,0,0,0,0,0,0,0,31,32,31,32,31,32,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,159,160,0,0,0,0,0,188,188,159,160,188,188,159,160,188,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,12,13,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,12,13,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,188,188,159,160,188,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,188,188,0,0,0,0,0,0,0,0,0,0,188,188,188,188,0,0,0,0,0,0,0,0,159,160,0,0,0,0,159,160,0,0,0,0,159,160,0,0,0,0,0,0,0,0,0,0,188,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,188,188,188,188,0,0,0,0,0,0,0,0,0,0,0,0,5,6,0,0,0,0,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,6,5,6,0,0,0,0,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,188,188,188,188,159,160,188,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,6,5,6,5,6,5,6,5,6,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,0,0,0,0,0,0,0,0,26,26,26,26,26,26,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,191,192,0,0,0,0,0,26,26,191,192,26,26,191,192,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,17,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,17,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,191,192,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,26,26,26,26,0,0,0,0,0,0,0,0,191,192,0,0,0,0,191,192,0,0,0,0,191,192,0,0,0,0,0,0,0,0,0,0,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,26,26,0,0,0,0,0,0,0,0,0,0,0,0,7,8,0,0,0,0,7,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,8,7,8,0,0,0,0,7,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,26,26,26,191,192,26,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,8,7,8,7,8,7,8,7,8,7,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,0,0,0,0,0,0,0,0,26,64,26,26,64,26,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,12,13,14,0,0,0,0,0,0,0,0,0,0,0,0,19,20,21,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,20,21,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,6,5,6,0,0,0,0,5,6,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,6,5,6,5,6,0,0,0,0,5,6,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,6,5,6,5,6,5,6,5,6,5,6,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,0,0,0,0,0,0,0,0,26,64,26,26,64,26,0,0,0,0, +0,0,0,0,49,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,17,18,0,0,0,0,0,0,0,0,0,0,0,0,19,20,21,22,0,0,0,0,49,50,0,0,0,0,0,0,0,0,0,0,0,0,19,20,21,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,8,7,8,0,0,0,0,7,8,7,8,0,0,0,0,0,0,0,0,49,50,0,0,0,0,0,0,7,8,7,8,7,8,0,0,0,0,7,8,7,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,8,7,8,7,8,7,8,7,8,7,8,7,8,0,0,0,0,0,0,0,0,49,50,0,0,0,0,0,0,9,10,0,0,0,0,0,0,31,32,24,25,24,25,24,25,31,32,0,0, +0,0,0,48,21,54,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,12,13,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,20,21,22,0,0,0,0,0,0,0,0,0,0,0,0,19,20,21,22,0,0,0,48,21,54,51,0,0,0,0,0,0,0,0,0,0,0,19,20,21,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,21,54,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,6,5,6,5,6,0,0,0,0,5,6,5,6,5,6,0,0,0,0,0,48,21,54,51,0,0,0,5,6,5,6,5,6,5,6,0,0,0,0,5,6,5,6,5,6,0,0,0,0,0,0,0,0,0,0,11,12,13,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,12,13,14,0,0,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,0,0,0,0,0,0,0,48,21,54,51,0,0,0,0,0,9,10,0,0,0,0,0,0,26,26,26,26,57,58,26,26,26,26,0,0, +0,0,48,21,21,21,21,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,2147483697,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,17,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,20,21,22,0,0,0,0,0,0,0,0,0,0,0,0,19,20,21,22,0,0,48,21,21,21,21,51,0,0,0,0,0,0,0,0,0,0,19,20,21,22,0,0,0,0,0,0,0,0,0,0,0,0,49,2147483697,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,21,21,21,21,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,2147483697,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,8,7,8,7,8,0,0,0,0,7,8,7,8,7,8,0,0,0,0,48,21,21,21,21,51,0,0,7,8,7,8,7,8,7,8,0,0,0,0,7,8,7,8,7,8,0,0,0,0,0,0,49,2147483697,0,0,15,16,17,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,16,17,18,0,0,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,0,0,0,0,0,0,48,21,21,21,21,51,0,0,0,0,9,10,0,0,0,0,0,0,26,26,26,26,64,64,26,26,26,26,0,0, +0,48,21,54,21,21,54,21,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,35,34,35,34,35,0,0,0,48,21,54,2147483696,0,0,0,0,0,0,0,0,0,0,0,34,35,0,0,0,0,0,0,19,20,21,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,20,21,22,0,0,0,0,34,35,34,35,0,0,0,0,19,20,21,22,0,48,21,54,21,21,54,21,51,0,0,0,0,0,0,0,0,0,19,20,21,22,0,0,34,35,34,35,34,35,0,0,0,48,21,54,2147483696,0,0,0,0,0,0,0,0,0,0,0,34,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,35,34,35,0,0,0,0,0,0,0,0,0,48,21,54,21,21,54,21,51,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,35,34,35,34,35,0,0,0,48,21,54,2147483696,0,0,0,0,0,0,0,0,0,0,0,34,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,6,5,6,5,6,5,6,34,35,34,35,5,6,5,6,5,6,5,6,0,48,21,54,21,21,54,21,5,6,5,6,5,6,5,6,5,6,0,0,0,0,5,6,5,6,5,6,5,6,0,0,0,48,21,54,2147483696,0,19,20,21,22,0,0,0,0,0,0,34,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,20,21,22,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,5,6,0,0,0,0,0,48,21,54,21,21,54,21,51,0,0,0,5,6,0,0,0,0,0,0,26,26,26,26,64,64,26,26,26,26,0,0, +48,21,21,21,21,21,21,21,21,51,0,0,0,0,0,0,0,0,0,0,0,0,0,36,37,37,37,37,37,37,38,0,48,21,21,21,21,2147483696,0,0,0,0,0,0,0,0,0,36,37,37,38,0,0,0,0,0,19,20,21,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,20,21,22,0,0,0,36,37,37,37,37,38,0,0,0,19,20,21,22,48,21,21,21,21,21,21,21,21,51,0,0,0,0,0,0,0,0,19,20,21,22,0,36,37,37,37,37,37,37,38,0,48,21,21,21,21,2147483696,0,0,0,0,0,0,0,0,0,36,37,37,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,37,37,37,37,38,0,0,0,0,0,0,0,48,21,21,21,21,21,21,21,21,51,0,0,0,0,0,0,0,0,0,0,0,0,0,36,37,37,37,37,37,37,38,0,48,21,21,21,21,2147483696,0,0,0,0,0,0,0,0,0,36,37,37,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,8,7,8,7,8,7,8,37,37,37,37,7,8,7,8,7,8,7,8,48,21,21,21,21,21,21,21,7,8,7,8,7,8,7,8,7,8,0,0,0,0,7,8,7,8,7,8,7,8,38,0,48,21,21,21,21,2147483696,19,20,21,22,0,0,0,0,0,36,37,37,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,20,21,22,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,7,8,0,0,0,0,48,21,21,21,21,21,21,21,21,51,0,0,7,8,0,0,0,0,0,0,26,26,26,26,64,64,26,26,26,26,0,0, +1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,0,0,0,0,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,0,0,0,0,0,0,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,0,0,0,0,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,0,0,0,0,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,0,0,0,0,0,0,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,0,0,0,0,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4, +1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,0,0,0,0,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,0,0,0,0,0,0,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,0,0,0,0,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2, +3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,0,0,0,0,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,0,0,0,0,0,0,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,0,0,0,0,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4,3,4 + + + diff --git a/demos/tf4/assets/tilesets/smb-256-128-4bpp.png b/demos/tf4/assets/tilesets/smb-256-128-4bpp.png new file mode 100644 index 0000000000000000000000000000000000000000..82de53555a31066d76383999540a351bbc17a496 GIT binary patch literal 3112 zcmZveX*ksT8^*uC*_g4+ShBAfvJ+X)ObtfJlBOA@!blEB)L4?S^&1=%nsKrfY7|GZ z%PH-HM5T@`NgLT4YlIO0&int1`+n}vi|4wYSI>2y_w;a*z$xJX01__FR2l%#uLxii z@|VjM-m>{Mph%jNJ*auDGW82kL3ZwT0Mv8EHvG}Q*woXF?l^H&>igSz2tsUutw&o5 zpc+gs&AQQow#w|cyo=^dM6o^JcFdZlv%p4y_38kNG`Vl`*DjXj>>UY!E?(HKa%s6r;kv;Dy zMLl(#quZ-1n~ovxVxe-+>}Ni#;*Vuw8dg&XD!P6Qy1%m1K~m5A^+#`)8}(De6AwRc zOgyr37(7xJ_Mnj|pOF{1?SdD?UC0S*#kz{>jg9yXaXWHDdQV#x7Uyxx-h?{ac87d* zh*uiaSjTG@w+C4J&%1jD!|+LgE&(RO_5H=;!ebEgyG=HZK00oQ@9+@Sj`K& zEJGEjFs(oo_Ib$QBn2LrlkX_9P~~g9aC~VT2s(mZY&}3&K{rb}5Cfqqcc^R9abd$c z=x+xWw)8xyQdGsvJPTNVtWdV2txRPF3NCBeJh28#IwidN>sZJ8(k0Zhf)N+RY4qXc zZ^I&1K7y;JYAtd8^B|h%TFtKM2Jyte~qaiWhp~m65!wc z5CtL8RRaO%x{l%tjs7_imXXhq^FeG1M;w?g5 z^f6X&@{a8*54j=c9C)dAKPdOE((E2BP)iSY27b8E!vLNu1*L9aB2#ldzIA^CVAOf| z@|4wM35g}#2BQ@2x}}R(#Sj5j^_w3h#w5J}e3Ttd;BSrT+P-4da!{mVdopp!II^z$XZUrMUHbF3{$uI$a!&3@V3?erZ-t1&u- zW4f_2ss1Q!aqehkI@iiqZL9G~c$9b^Kgt~BA*}u3Ue!(~BLdcKJc?E*QB^7kZVGCHVbU zP=pB8O{LT{lh%2E9N;$u^*7yeZ)lZ&KRmL~*oDn!aQ!r$ zWPi#@cNU@qfw1v|7_9})XMCa)+^ZY=5|B}RO+sbhk=w>cs*fl+>A<$rL{PiE@dDw= zPS+ENCLiGGKV1Nh)^>~BxU?*}>yRt7FYs`@9K^pQjPM{-3krEo!$+YDj%W?7F25JI z2PMx`h5rtrj~EKRc%FrVJz(~Wb& zPy*7t#BSg*8Hi0$ld1-twm$hfS{4gez&E2df4n^?;$vL(Is|pszqrLbz%v!b$3xnG zJprg`Hl{D~G(zB&0_v{bY;HU9+zw{^{DQ=}sVCif_)n-~_fuQF&e7fF;juLh%lkL3 zHx#T1p3N?jv`2puSvM;C^=B6|R+`(;=27__wHGg*IwVjg`?uyA+#;__3t#+n#SCoP zZrE;+d|%Eq&nwN)E{+ywWMoXF6Hx!=wK%+7(?NgT3ej&h;HrFSx)0xPXy`cv-nI&d zV~lF={cSk)MMA!vR0nIF&94_0S=L2#d}?bmh@blrr*H-V&ax<& z;pRvzCCFCbN8oeS@I8KBvoph&&uJ@DiK<=){wby%k2E=zKY#6eqHD?9* zKX%^2r40Mq@eoG(Y*;ckS`5;EGch>9RH$t&0WkBlp6m3!Mk6BUDZLKtcZwqeHSd-KmuIM_TzMcr{%EvK(8 z%7fLSPWnftIM}gmo)g`FJg>Z8`W(@Lg)KfiiZcNF;+tAVhVyk}t>|o#z2{DXAQo!( z0kywQt_5U`OjhhOsH5U0SCWblA!gG#n*t^9a2+eyhCEhH07_~R7#%B;It};9L#CvM zpJ8GU;J|ucc%b6qXN)m{e{Sm*{yXCuO-dY;mrjNnT$fB1Meb|P!C<--lZeY44dgr_ z4bZ|XZDz(AU21E%#%ocH5#Q|!+7GuDB-eB4;qTPMS$@U$r6~LNuDWv_qI!hvO6}7I z!C?Y|($J0ikuspD-j!BWDV z9rm_8J?ySVqFRk4swykmBq@#ToxG}Gw39-C!aLF_ysdM*=4`tg*BKh{=IM_;1tb6I8 zd==_c*O{+ng1sc|dl<@d3xV^?%DC#^O!vtO?nnbKQ?a2EvfWbs4%(EnW;3pCRG{%i zAyBxTq12UoA1 z(R~Tw&#;X24&vscUAR80mQdMAQ@0i~wxxV3ZG8LlRe9v2JuHR4@w8VasuwTkk+hQL z8dFw70?T@||JiwUbf!LU_SDSjl(Y;{Ubu!QV)F#pd!~6a;Vtk_H+R6m=3a*GAWAK| zBRjHu*^0o-PNO)&4$U_%(K5+ttjd7sOx3wrG<@h1VH@8%+S(&);BAHVxEn_0?AH`! zrs|9OHt&cWMMPEo+v}40!Hn4ftd-%(^Pn$3UZmCi7Ozjat-f{3yh&&(juqgHek5N& z99|0tqsTOj;PJ7o8gPpUgb%*8J!ZFOaxAO%pqoEeji849jO+SnaY_Mse=$i&??};u z4cuT-mmAp3MpT`3v=ZT=*Catp0?$_!d4Ih@ZsVu790j$mL%{_9?ueYW%g8DbyS?+Iu1?7G%YQdaL;be_n?EPYKX&S;6GU{;5ZM(8erzWg zi^r=CJrJb;p-A&A6uNdyGI$vbon3zz?j3}F++ ./gen/App.TileSet.s", + "build:sys16": "%npm_package_config_merlin32% -V %npm_package_config_macros% App.s", + "build": "npm run build:tool && npm run build:sys16", + "build:tool": "%npm_package_config_merlin32% -V %npm_package_config_macros% ../../src/Master.s", + "build:image": "build-image.bat %npm_package_config_cadius%" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/lscharen/iigs-game-engine.git" + }, + "author": "Lucas Scharenbroich", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/lscharen/iigs-game-engine/issues" + }, + "homepage": "https://github.com/lscharen/iigs-game-engine#readme", + "devDependencies": { + "pngjs": "^6.0.0", + "string-builder": "^0.1.8", + "watch": "latest", + "xml2json": "^0.12.0" + } +} diff --git a/macros/GTE.Macs.s b/macros/GTE.Macs.s index 4313f90..2ce3eb8 100644 --- a/macros/GTE.Macs.s +++ b/macros/GTE.Macs.s @@ -153,6 +153,8 @@ RENDER_ALT_BG1 equ $0001 RENDER_BG1_HORZ_OFFSET equ $0002 RENDER_BG1_VERT_OFFSET equ $0004 RENDER_BG1_ROTATION equ $0008 +RENDER_PER_SCANLINE equ $0010 + ; Tile constants ; TILE_RESERVED_BIT equ $8000 diff --git a/src/Defs.s b/src/Defs.s index 9457df8..6b2e20b 100644 --- a/src/Defs.s +++ b/src/Defs.s @@ -173,6 +173,7 @@ RENDER_ALT_BG1 equ $0001 RENDER_BG1_HORZ_OFFSET equ $0002 RENDER_BG1_VERT_OFFSET equ $0004 RENDER_BG1_ROTATION equ $0008 +RENDER_PER_SCANLINE equ $0010 ; DirtyBits definitions DIRTY_BIT_BG0_X equ $0001 @@ -268,5 +269,8 @@ Overlays EXT BG1YCache EXT ScalingTables EXT +StartXMod164Arr EXT +LastPatchOffsetArr EXT + ; Tool error codes NO_TIMERS_AVAILABLE equ 10 diff --git a/src/FastCopies.s b/src/FastCopies.s new file mode 100644 index 0000000..e401540 --- /dev/null +++ b/src/FastCopies.s @@ -0,0 +1,271 @@ +; Large, unrolled loops for setting values in the code field that would be used by the Horz.s +; and Vert.s code. +; +; The utility of these functions is that they do not need to do any sort of bank switching and +; can update all of the play field lines in a single call. The downside is that they take up +; significantly more space, need large auxiliary tables, and must be patched after the code +; field memory is allocated. +; +; Probably still worth it.... + +BlitBuff EXT + +; Patch the fast copy routines with the allocated memory addresses +InitFastCopies + +; Fist, patch the cttc routine + + ldy #0 + ldx #0 + +:loop1 + lda BlitBuff+2,y ; Get the bank of each in the accumulatow low byte + + sep #$20 +]line equ 0 + lup 16 + stal cttc_start+{]line*7}+4,x + stal cttc_start+{{]line+208}*7}+4,x +]line equ ]line+1 + --^ + rep #$20 + + txa + clc + adc #7*16 + tax + + tya + clc + adc #4 + tay + + cpy #13*4 + bcs *+5 + brl :loop1 + +; Next, patch the two store routines + + ldy #0 + ldx #0 + +:loop2 + lda BlitBuff+2,y ; Get the bank of each in the accumulatow low byte + + sep #$20 +]line equ 0 + lup 16 + stal store_start+{]line*4}+1,x + stal store_start+{{]line+208}*4}+1,x +]line equ ]line+1 + --^ + rep #$20 + + txa + clc + adc #4*16 + tax + + tya + clc + adc #4 + tay + + cpy #13*4 + bcs *+5 + brl :loop2 + + rtl + + +; Function to load data from an array and store in the code field. Assume that the +; bank register is already set to the bank of the srcAddr data +srcAddr equ 0 +destOffset equ 2 + +CopyTblToCode + ldal entry_7,x ; This is the entry point + stal cttc_jump+1 + + txa ; Set the Y register to srcAddr - 2*start to compensate for the + eor #$FFFF ; offset in the code. This does mean that the array we are copying + sec ; cannot by near the beginning of the bank + adc srcAddr + tyx ; put the ending offset in X + tay + + ldal entry_7,x + tax + lda #$0060 + stal {cttc_start&$FF0000}+3,x ; patch at the next STAL instruction because the high byte is always zero + + ldx destOffset ; byte offset within each line +cttc_jump jsr $0000 + + lda #$009F ; restore the STAL opcode + stal {cttc_start&$FF0000}+3,x + + rtl + +; Define the 416 addresses for each copy +entry_7 +]line equ 0 + lup 416 + da cttc_start+{]line*7} +]line equ ]line+1 + --^ + +; Generate the code that performs the copy. +cttc_unit mac + lda: {]1*32}+{]2*2},y + stal $000000+{]2*$1000},x + <<< + +cttc_start +]bank equ 0 + lup 26 + cttc_unit ]bank;0 + cttc_unit ]bank;1 + cttc_unit ]bank;2 + cttc_unit ]bank;3 + cttc_unit ]bank;4 + cttc_unit ]bank;5 + cttc_unit ]bank;6 + cttc_unit ]bank;7 + cttc_unit ]bank;8 + cttc_unit ]bank;9 + cttc_unit ]bank;10 + cttc_unit ]bank;11 + cttc_unit ]bank;12 + cttc_unit ]bank;13 + cttc_unit ]bank;14 + cttc_unit ]bank;15 +]bank equ ]bank+1 + --^ + rts + +Store8Bits + txa + asl + adc #store_start + stal s8b_jump+1 + + tya + asl + tax + lda #$0060 + stal {store_start&$FF0000},x + + ldx destOffset ; byte offset within each line + lda srcAddr + sep #$20 +s8b_jump jsr $0000 + + lda #$9F ; restore the STAL opcode + stal {store_start&$FF0000},x + rep #$20 + + rtl + +Store16Bits + txa + asl + adc #store_start + stal s16b_jump+1 + + tya + asl + tax + lda #$0060 + stal {store_start&$FF0000},x + + ldx destOffset ; byte offset within each line + lda srcAddr +s16b_jump jsr $0000 + + lda #$009F ; restore the STAL opcode + stal {store_start&$FF0000},x + rtl + +store_start + lup 26 + stal $000000,x + stal $001000,x + stal $002000,x + stal $003000,x + stal $004000,x + stal $005000,x + stal $006000,x + stal $007000,x + stal $008000,x + stal $009000,x + stal $00A000,x + stal $00B000,x + stal $00C000,x + stal $00D000,x + stal $00E000,x + stal $00F000,x + --^ + rts + + +CodeCopy8 + txa + asl + adc #store_start + stal cc8_jump+1 + + tya + asl + tax + lda #$0060 + stal {store8_start&$FF0000},x + + ldx destOffset ; byte offset within each line + lda srcAddr +cc8_jump jsr $0000 + + lda #$009F ; restore the STAL opcode + stal {store8_start&$FF0000},x + rtl + +store8_start + lup 26 + pea $0000 + plb + plb + + lda $0000,y + stal $000000,x + lda $0000,y + stal $001000,x + lda $0000,y + stal $002000,x + lda $0000,y + stal $003000,x + lda $0000,y + stal $004000,x + lda $0000,y + stal $005000,x + lda $0000,y + stal $006000,x + lda $0000,y + stal $007000,x + lda $0000,y + stal $008000,x + lda $0000,y + stal $009000,x + lda $0000,y + stal $00A000,x + lda $0000,y + stal $00B000,x + lda $0000,y + stal $00C000,x + lda $C000,y + stal $00D000,x + lda $E000,y + stal $00E000,x + lda $F000,y + stal $00F000,x + --^ + rts \ No newline at end of file diff --git a/src/Master.s b/src/Master.s index 637d4a5..f4b7581 100644 --- a/src/Master.s +++ b/src/Master.s @@ -43,3 +43,10 @@ KND #$1001 ; Type and Attributes ($11=Static+Bank Relative,$01=Data) ALI BANK SNA ROTDATA + +; Additional code + + ASM FastCopies.s + KND #$1001 ; Type and Attributes ($11=Static+Bank Relative,$01=Data) + ALI BANK + SNA FASTCPY diff --git a/src/Render.s b/src/Render.s index 1836d9a..13eb5bd 100644 --- a/src/Render.s +++ b/src/Render.s @@ -32,6 +32,14 @@ _Render stz SpriteRemovedFlag ; If we remove a sprite, then we need to flag a rebuild for the next frame +; If we are doing per-scanline rendering, use the alternate renderer + + lda #RENDER_PER_SCANLINE + bit RenderFlags + beq *+5 + jmp _RenderScanlines ; Do the scanline-based renderer + + jsr _ApplyBG0YPos ; Set stack addresses for the virtual lines to the physical screen lda #RENDER_BG1_ROTATION @@ -147,6 +155,96 @@ _DoOverlay :disp jsl $000000 rts +; Use the per-scanline tables to set the screen. This is really meant to be used without the built-in tilemap +; support and is more of a low-level way to control the background rendering +_RenderScanlines + + jsr _ApplyBG0YPos ; Set stack addresses for the virtual lines to the physical screen +; jsr _ApplyBG1YPos ; Set the y-register values of the blitter + +; _ApplyBG0Xpos need to be split because we have to set the offsets, then draw in any updated tiles, and +; finally patch out the code field. Right now, the BRA operand is getting overwritten by tile data. + + jsr _ApplyBG0XPosPre +; jsr _ApplyBG1XPosPre + +; jsr _RenderSprites ; Once the BG0 X and Y positions are committed, update sprite data + +; jsr _ApplyTiles ; This function actually draws the new tiles into the code field + + jsr _ScanlineBG0XPos ; Patch the code field instructions with exit BRA opcode +; jsr _ApplyBG1XPos ; Update the direct page value based on the horizontal position + +; The code fields are locked in now and ready to be rendered. See if there is an overlay or any +; other reason to render with shadowing off. Otherwise, just do things quickly. + + lda Overlays + beq :no_ovrly + + jsr _ShadowOff + +; Shadowing is turned off. Render all of the scan lines that need a second pass. One +; optimization that can be done here is that the lines can be rendered in any order +; since it is not shown on-screen yet. + + ldx Overlays+2 ; Blit the full virtual buffer to the screen + ldy Overlays+4 + jsr _BltRange + +; Turn shadowing back on + + jsr _ShadowOn + +; Now render all of the remaining lines in top-to-bottom (or bottom-to-top) order + + ldx #0 + ldy Overlays+2 + beq :skip + jsr _BltRange +:skip + jsr _DoOverlay + + ldx Overlays+4 + cpx ScreenHeight + beq :done + ldy ScreenHeight + jsr _BltRange + bra :done + +:no_ovrly + ldx #0 ; Blit the full virtual buffer to the screen + ldy ScreenHeight + jsr _BltRange +:done + + ldx #0 + ldy ScreenHeight + jsr _BltSCB + + lda StartYMod208 ; Restore the fields back to their original state + ldx ScreenHeight + jsr _RestoreScanlineBG0Opcodes + + lda StartY + sta OldStartY + lda StartX + sta OldStartX + + lda BG1StartY + sta OldBG1StartY + lda BG1StartX + sta OldBG1StartX + + stz DirtyBits + stz LastRender ; Mark that a full render was just performed + + lda SpriteRemovedFlag ; If any sprite was removed, set the rebuild flag + beq :no_removal + lda #DIRTY_BIT_SPRITE_ARRAY + sta DirtyBits +:no_removal + rts + ; Run through all of the tiles on the DirtyTile list and render them _ApplyTiles ldx DirtyTileCount diff --git a/src/Tool.s b/src/Tool.s index dae5db3..77e1d50 100644 --- a/src/Tool.s +++ b/src/Tool.s @@ -819,6 +819,7 @@ _TSSetBG1Scale put Sprite2.s put SpriteRender.s put Render.s + put blitter/Scanline.s put render/Render.s put render/Fast.s put render/Slow.s diff --git a/src/blitter/Horz.s b/src/blitter/Horz.s index 75840de..76fbccd 100644 --- a/src/blitter/Horz.s +++ b/src/blitter/Horz.s @@ -321,7 +321,7 @@ _ApplyBG0XPos adc :virt_line_x2 ; filled in sta :virt_line_x2 - lda :exit_address ; Save from this location + lda :exit_address ; Save from this location (not needed in fast mode) SaveOpcode ; X = :exit_address on return txy ; ldy :exit_address -- starting at this address @@ -336,7 +336,7 @@ _ApplyBG0XPos lda :entry_offset ldy :base_address - SetCodeEntry ; All registers are preserved + SetCodeEntry ; All registers are preserved ; Now, patch in the opcode diff --git a/src/blitter/Scanline.s b/src/blitter/Scanline.s index b1ff0ac..fed8f62 100644 --- a/src/blitter/Scanline.s +++ b/src/blitter/Scanline.s @@ -109,7 +109,7 @@ _ScanlineBG0XPos sty :base_address lda BTableHigh,x - ora src_bank + ora :src_bank pha plb @@ -171,6 +171,56 @@ _ScanlineBG0XPos rts + +_RestoreScanlineBG0Opcodes + +:virt_line_x2 equ tmp1 +:lines_left_x2 equ tmp2 +:src_bank equ tmp6 + + asl + sta :virt_line_x2 ; Keep track of it + + phb + phb + pla + and #$FF00 + sta :src_bank + + txa + asl + sta :lines_left_x2 + +:loop + ldx :virt_line_x2 + ldy BTableLow,x ; Get the address of the first code field line + + lda BTableHigh,x + ora :src_bank + pha + + lda LastPatchOffsetArr,x + tax + + plb + lda OPCODE_SAVE+$0000,y + sta $0000,x + +; Do the end of the loop -- update the virtual line counter and reduce the number +; of lines left to render + + plb ; restore the bank + + lda :virt_line_x2 + inc + inc + sta :virt_line_x2 + cmp :last_line_x2 + jne :loop + + stz LastPatchOffset ; Clear the value once completed + rts + ; Unrolled copy routine to move BankTable entries into BNK_ADDR position. This is a bit different than the ; other routines, because we don't need to put values into the code fields, but just copy one-byte values ; into an internal array in bank 00 space. The reason for this is because the code sequence @@ -185,7 +235,7 @@ _ScanlineBG0XPos ; plb ; plb = 13 cycles ; -; If for some reason it becimes important to preserve the accumulator, or save the 208 bytes of +; If for some reason it becomes important to preserve the accumulator, or save the 208 bytes of ; bank 00 memory, then we can change it. The advantage right now is that updating the array can ; be done 16-bits at a time and without having to chunk up the writes across multiple banks. This ; is quite a bit faster than the other routines. diff --git a/src/blitter/Vert.s b/src/blitter/Vert.s index 436ae44..b31f2f6 100644 --- a/src/blitter/Vert.s +++ b/src/blitter/Vert.s @@ -243,7 +243,7 @@ _ApplyBG0YPos ; Unrolled copy routine to move RTable intries into STK_ADDR position. ; -; A = intect into the RTable array (x2) +; A = index into the RTable array (x2) ; Y = starting line * $1000 ; X = number of lines (x2) CopyRTableToStkAddr mac @@ -320,5 +320,5 @@ bottom <<< _CopyRTableToStkAddr - CopyRTableToStkAddr tmp0 - rts \ No newline at end of file + CopyRTableToStkAddr tmp0 + rts \ No newline at end of file diff --git a/src/static/TileStore.s b/src/static/TileStore.s index 6783380..74e733b 100644 --- a/src/static/TileStore.s +++ b/src/static/TileStore.s @@ -535,4 +535,9 @@ Scale14 dw $0038,$003A,$003A,$003A,$003C,$003C,$003C,$003C,$003E,$003E,$003E,$ Scale15 dw $003C,$003C,$003C,$003E,$003E,$003E,$003E,$0040,$0040,$0040,$0040,$0042,$0042,$0042,$0042,$0044,$0044,$0044,$0044,$0046,$0046,$0046,$0046,$0048,$0048,$0048,$0048,$004A,$004A,$004A,$004A,$004C,$004C,$004C,$004C,$004E,$004E,$004E,$004E,$0050,$0050,$0050,$0050,$0052,$0052,$0052,$0052,$0054,$0054,$0054,$0054,$0056,$0056,$0056,$0056,$0058,$0058,$0058,$0058,$005A,$005A,$005A,$005A,$005C,$005C,$005C,$005C,$005E,$005E,$005E,$005E,$0060,$0060,$0060,$0060,$0062,$0062,$0062,$0062,$0064,$0064,$0064 blt_return -stk_save \ No newline at end of file +stk_save + +StartXMod164Arr ENT + ds 416*2 +LastPatchOffsetArr ENT + ds 416*2 From 3fce46872d2783ff20fcfe4476d5b8c7fbe92289 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Sun, 14 Aug 2022 07:45:58 -0500 Subject: [PATCH 19/68] Checkpoint; blitter failing --- demos/kfest-2022/demo-1/App.Main.s | 2 ++ demos/tf4/App.Main.s | 44 +++++++++++++++++++++---- demos/tf4/build-image.bat | 4 +-- macros/GTE.Macs.s | 5 +++ src/CoreImpl.s | 10 ++++++ src/Defs.s | 3 ++ src/Render.s | 53 +++++++++++++++--------------- src/Tiles.s | 29 ++++++++++------ src/Tool.s | 45 +++++++++++++++++++++---- src/blitter/Blitter.s | 6 ++-- src/blitter/Horz.s | 5 ++- src/blitter/Scanline.s | 28 ++++++++-------- src/blitter/Template.s | 10 +++--- 13 files changed, 170 insertions(+), 74 deletions(-) diff --git a/demos/kfest-2022/demo-1/App.Main.s b/demos/kfest-2022/demo-1/App.Main.s index 882b4ef..947eef9 100644 --- a/demos/kfest-2022/demo-1/App.Main.s +++ b/demos/kfest-2022/demo-1/App.Main.s @@ -58,6 +58,8 @@ appTmp0 equ 28 ; Load a tileset + pea 0 + pea 256 pea #^tiledata pea #tiledata _GTELoadTileSet diff --git a/demos/tf4/App.Main.s b/demos/tf4/App.Main.s index 0a1ac40..1b530b0 100644 --- a/demos/tf4/App.Main.s +++ b/demos/tf4/App.Main.s @@ -37,6 +37,8 @@ MaxBG0X equ 20 MaxBG0Y equ 22 OldOneSecondCounter equ 26 appTmp0 equ 28 +appTmp1 equ 30 +appTmp2 equ 32 phk plb @@ -50,15 +52,39 @@ appTmp0 equ 28 lda #ENGINE_MODE_USER_TOOL+ENGINE_MODE_TWO_LAYER jsr GTEStartUp ; Load and install the GTE User Tool -; Initialize local variables + pea $0000 ; Set the first two tiles + pea $0002 + pea #^TileData + pea #TileData + _GTELoadTileSet -; pea $0000 -; pea #^TileSetPalette -; pea #TileSetPalette -; _GTESetPalette + pea $0000 + pea #^TileSetPalette + pea #TileSetPalette + _GTESetPalette -; Set up our level data +; Fill in the field with a checkboard pattern + stz appTmp1 + +:tloop0 stz appTmp0 +:tloop1 lda appTmp0 ; X + pha + pei appTmp1 ; Y + eor appTmp1 + and #$0001 + pha ; tile ID + _GTESetTile + + inc appTmp0 + lda #40 + cmp appTmp0 + bcs :tloop1 + + inc appTmp1 + lda #25 + cmp appTmp1 + bcs :tloop0 ; Set up a very specific test. First, we draw a sprite into the sprite plane, and then ; leave it alone. We are just testing the ability to merge sprite plane data into @@ -70,7 +96,8 @@ EvtLoop jsr HandleKeys ; Do the generic key handlers - pea RENDER_PER_SCANLINE ; Scanline rendering + pea #RENDER_PER_SCANLINE ; Scanline rendering +; pea $0000 _GTERender brl EvtLoop @@ -88,9 +115,12 @@ qtRec adrl $0000 da $00 ; Color palette +TileSetPalette dw $0000,$0FFF,$0FFF,$0FFF,$0FFF,$0FFF,$0FFF,$0FFF,$0FFF,$0FFF,$0FFF,$0FFF,$0FFF,$0FFF,$0FFF,$0FFF + MyDirectPage ds 2 ; Stub SetLimits rts PUT ../kfest-2022/StartUp.s + PUT Tiles.s diff --git a/demos/tf4/build-image.bat b/demos/tf4/build-image.bat index 720514f..99b8d70 100644 --- a/demos/tf4/build-image.bat +++ b/demos/tf4/build-image.bat @@ -5,7 +5,7 @@ REM REM Pass the path of the Cadius tool as the first argument (%1) set CADIUS="%1" -set IMAGE="..\\..\\..\\emu\\Target.2mg" +set IMAGE="..\\..\\emu\\Target.2mg" set FOLDER="/GTEDEV/TF4" REM Cadius does not overwrite files, so clear the root folder first @@ -14,4 +14,4 @@ REM Cadius does not overwrite files, so clear the root folder first REM Now copy files and folders as needed %CADIUS% ADDFILE %IMAGE% %FOLDER% .\GTETF4 -%CADIUS% ADDFILE %IMAGE% %FOLDER% ..\src\Tool160 +%CADIUS% ADDFILE %IMAGE% %FOLDER% ..\..\src\Tool160 diff --git a/macros/GTE.Macs.s b/macros/GTE.Macs.s index 2ce3eb8..f217d4f 100644 --- a/macros/GTE.Macs.s +++ b/macros/GTE.Macs.s @@ -126,6 +126,9 @@ _GTEClearBG1Buffer MAC _GTESetBG1Scale MAC UserTool $2B00+GTEToolNum <<< +_GTEGetAddress MAC + UserTool $2C00+GTEToolNum + <<< ; EngineMode definitions ; Script definition @@ -155,6 +158,8 @@ RENDER_BG1_VERT_OFFSET equ $0004 RENDER_BG1_ROTATION equ $0008 RENDER_PER_SCANLINE equ $0010 +; GetAddress table IDs +scanlineHorzOffset equ $0001 ; Tile constants ; TILE_RESERVED_BIT equ $8000 diff --git a/src/CoreImpl.s b/src/CoreImpl.s index 537c836..ff6651f 100644 --- a/src/CoreImpl.s +++ b/src/CoreImpl.s @@ -233,6 +233,7 @@ EngineReset sta tmp15 stz tmp14 +; Rebuild all of the bank blitters :loop ldx #BlitBuff lda #^BlitBuff @@ -247,6 +248,15 @@ EngineReset dec tmp15 bne :loop +; Set the scanline tables to reasonable default values + ldx #{416*2}-2 + lda #0 +:sxm_loop + sta StartXMod164Arr,x + dex + dex + bpl :sxm_loop + rts diff --git a/src/Defs.s b/src/Defs.s index 6b2e20b..5297648 100644 --- a/src/Defs.s +++ b/src/Defs.s @@ -184,6 +184,9 @@ DIRTY_BIT_BG0_REFRESH equ $0010 DIRTY_BIT_BG1_REFRESH equ $0020 DIRTY_BIT_SPRITE_ARRAY equ $0040 +; GetAddress table IDs +scanlineHorzOffset equ $0001 ; table of 416 wors, a double-array of scanline offset values. Must be 0, 163 + ; Script definition YIELD equ $8000 JUMP equ $4000 diff --git a/src/Render.s b/src/Render.s index 13eb5bd..6b76427 100644 --- a/src/Render.s +++ b/src/Render.s @@ -39,7 +39,6 @@ _Render beq *+5 jmp _RenderScanlines ; Do the scanline-based renderer - jsr _ApplyBG0YPos ; Set stack addresses for the virtual lines to the physical screen lda #RENDER_BG1_ROTATION @@ -57,7 +56,7 @@ _Render jsr _RenderSprites ; Once the BG0 X and Y positions are committed, update sprite data jsr _UpdateBG0TileMap ; and the tile maps. These subroutines build up a list of tiles -; jsr _UpdateBG1TileMap ; that need to be updated in the code field + jsr _UpdateBG1TileMap ; that need to be updated in the code field jsr _ApplyTiles ; This function actually draws the new tiles into the code field @@ -155,61 +154,63 @@ _DoOverlay :disp jsl $000000 rts + ; Use the per-scanline tables to set the screen. This is really meant to be used without the built-in tilemap ; support and is more of a low-level way to control the background rendering _RenderScanlines jsr _ApplyBG0YPos ; Set stack addresses for the virtual lines to the physical screen -; jsr _ApplyBG1YPos ; Set the y-register values of the blitter + jsr _ApplyBG1YPos ; Set the y-register values of the blitter ; _ApplyBG0Xpos need to be split because we have to set the offsets, then draw in any updated tiles, and ; finally patch out the code field. Right now, the BRA operand is getting overwritten by tile data. jsr _ApplyBG0XPosPre -; jsr _ApplyBG1XPosPre + jsr _ApplyBG1XPosPre ; jsr _RenderSprites ; Once the BG0 X and Y positions are committed, update sprite data ; jsr _ApplyTiles ; This function actually draws the new tiles into the code field - jsr _ScanlineBG0XPos ; Patch the code field instructions with exit BRA opcode + jsr _ScanlineBG0XPos ; Patch the code field instructions with exit BRA opcode + ; jsr _ApplyBG1XPos ; Update the direct page value based on the horizontal position ; The code fields are locked in now and ready to be rendered. See if there is an overlay or any ; other reason to render with shadowing off. Otherwise, just do things quickly. - lda Overlays - beq :no_ovrly +; lda Overlays +; beq :no_ovrly - jsr _ShadowOff +; jsr _ShadowOff ; Shadowing is turned off. Render all of the scan lines that need a second pass. One ; optimization that can be done here is that the lines can be rendered in any order ; since it is not shown on-screen yet. - ldx Overlays+2 ; Blit the full virtual buffer to the screen - ldy Overlays+4 - jsr _BltRange +; ldx Overlays+2 ; Blit the full virtual buffer to the screen +; ldy Overlays+4 +; jsr _BltRange ; Turn shadowing back on - jsr _ShadowOn +; jsr _ShadowOn ; Now render all of the remaining lines in top-to-bottom (or bottom-to-top) order - ldx #0 - ldy Overlays+2 - beq :skip - jsr _BltRange +; ldx #0 +; ldy Overlays+2 +; beq :skip +; jsr _BltRange :skip - jsr _DoOverlay +; jsr _DoOverlay - ldx Overlays+4 - cpx ScreenHeight - beq :done - ldy ScreenHeight - jsr _BltRange - bra :done +; ldx Overlays+4 +; cpx ScreenHeight +; beq :done +; ldy ScreenHeight +; jsr _BltRange +; bra :done :no_ovrly ldx #0 ; Blit the full virtual buffer to the screen @@ -217,9 +218,9 @@ _RenderScanlines jsr _BltRange :done - ldx #0 - ldy ScreenHeight - jsr _BltSCB +; ldx #0 +; ldy ScreenHeight +; jsr _BltSCB lda StartYMod208 ; Restore the fields back to their original state ldx ScreenHeight diff --git a/src/Tiles.s b/src/Tiles.s index f5ec35d..741720e 100644 --- a/src/Tiles.s +++ b/src/Tiles.s @@ -1,20 +1,29 @@ ; Basic tile functions ; Copy tileset data from a pointer in memory to the tiledata back -; X = high word -; A = low word +; +; tmp0 = Pointer to tile data +; X = first tile +; Y = last tile +; +; To copy in three tiles starting at tile 5, for example, X = 5 and Y = 9 _LoadTileSet - sta tmp0 - stx tmp1 + txa + _Mul128 ; Jump to the target location + tax + tya + _Mul128 + sta tmp2 ; This is the terminating byte + ldy #0 - tyx :loop lda [tmp0],y stal tiledata,x - dex - dex - dey - dey - bne :loop + inx + inx + iny + iny + cpx tmp2 + bne :loop ; Use BNE so when Y=512 => $0000, we wait for wrap-around rts diff --git a/src/Tool.s b/src/Tool.s index 77e1d50..741f674 100644 --- a/src/Tool.s +++ b/src/Tool.s @@ -96,6 +96,7 @@ _CallTable adrl _TSClearBG1Buffer-1 adrl _TSSetBG1Scale-1 + adrl _TSGetAddress-1 _CTEnd _GTEAddSprite MAC UserTool $1000+GTEToolNum @@ -183,7 +184,9 @@ _TSShutDown jsr _CoreShutDown ; Shut down the library plb - pea $8000 + lda EngineMode ; $0000 = system tool, $8000 = user tool set + and #$8000 + pha pei ToolNum pea $0000 ; Set WAP to null pea $0000 @@ -303,18 +306,27 @@ _TSRenderDirty jsr _RenderDirty _TSExit #0;#2 -; LoadTileSet(Pointer) +; LoadTileSet(Start, Finish, Pointer) _TSLoadTileSet -TSPtr equ FirstParam +:TSPtr equ FirstParam +:finish equ FirstParam+4 +:start equ FirstParam+6 _TSEntry - lda TSPtr+2,s + lda :TSPtr+2,s ; stuff the pointer in the direct page + sta tmp1 + lda :TSPtr,s + sta tmp0 + + lda :start,s ; put the range in the registers tax - lda TSPtr,s + lda :finish,s + tay + jsr _LoadTileSet - _TSExit #0;#4 + _TSExit #0;#8 ; CreateSpriteStamp(spriteDescriptor: Word, vbuffAddr: Word) _TSCreateSpriteStamp @@ -805,6 +817,27 @@ _TSSetBG1Scale sta BG1Scaling _TSExit #0;#2 +_TSGetAddress +:output equ FirstParam+0 +:tblId equ FirstParam+4 + + _TSEntry + lda #0 + sta :output,s + sta :output+2,s + + lda :value,s + cmp #scanlineHorzOffset + bne :out + + lda #StartXMod164Arr + sta :output,s + lda #^StartXMod164Arr + sta :output+2,s + +:out + _TSExit #0;#2 + ; Insert the GTE code put Math.s diff --git a/src/blitter/Blitter.s b/src/blitter/Blitter.s index b71c0b3..c005369 100644 --- a/src/blitter/Blitter.s +++ b/src/blitter/Blitter.s @@ -57,7 +57,9 @@ _BltRange lda EngineMode bit #ENGINE_MODE_TWO_LAYER beq :skip_bank - + +; TODO: Switch to loading the selected BG1 bank. No special "Alt" bank + lda RenderFlags bit #RENDER_ALT_BG1 beq :primary @@ -81,7 +83,7 @@ _BltRange _R0W1 tsc ; save the stack pointer stal stk_save+1 - + blt_entry jml $000000 ; Jump into the blitter code $XX/YY00 blt_return _R0W0 diff --git a/src/blitter/Horz.s b/src/blitter/Horz.s index 76fbccd..55384fc 100644 --- a/src/blitter/Horz.s +++ b/src/blitter/Horz.s @@ -205,9 +205,8 @@ _ApplyBG0XPos ; where the exit will be patched in dec ; (a - 1) % 164 - bpl :hop1 + bpl *+5 lda #163 -:hop1 ; If the exit byte is odd, then the left edge is even-aligned and we round down and exit at at ; that word. @@ -243,7 +242,7 @@ _ApplyBG0XPos dec ; to get the index of the first on-screen byte cmp #164 ; Keep the value in range - bcc :hop2 + bcc *+5 sbc #164 :hop2 diff --git a/src/blitter/Scanline.s b/src/blitter/Scanline.s index fed8f62..15f0ed1 100644 --- a/src/blitter/Scanline.s +++ b/src/blitter/Scanline.s @@ -19,7 +19,8 @@ _ScanlineBG0XPos :base_address equ tmp8 :opcode equ tmp9 :odd_entry_offset equ tmp10 - + + brk $AB lda StartYMod208 ; This is the base line of the virtual screen asl sta :virt_line_x2 ; Keep track of it @@ -38,8 +39,8 @@ _ScanlineBG0XPos :loop ldx :virt_line_x2 - lda StartXMod164Arr,x ; Get the offset for this line + lda StartXMod164Arr,x ; Get the offset for this line dec ; The exit point is one byte sooner bpl *+5 lda #163 @@ -100,7 +101,7 @@ _ScanlineBG0XPos sta :opcode :prep_complete -; Not patch in the code field line +; Now patch in the code field line ldy BTableLow,x ; Get the address of the first code field line clc @@ -124,9 +125,9 @@ _ScanlineBG0XPos sta: OPCODE_SAVE+$0000,y ;SetConst - txy ; ldy :exit_address -- starting at this address - ldx :exit_bra ; Copy this value into all of the lines - sta: $0000,y +; txy ; ldy :exit_address -- starting at this address + lda :exit_bra ; Copy this value into all of the lines + sta: $0000,x ; Next, patch in the CODE_ENTRY value, which is the low byte of a JMP instruction. This is an ; 8-bit operation and, since the PEA code is bank aligned, we use the entry_offset value directly @@ -135,7 +136,7 @@ _ScanlineBG0XPos ; SetCodeEntry lda :entry_offset - ldy :base_address +; ldy :base_address sta: CODE_ENTRY+$0000,y ; SetCodeEntryOpcode @@ -151,11 +152,11 @@ _ScanlineBG0XPos ; SetOddCodeEntry sta: ODD_ENTRY+$0000,y ; SaveHighOperand - ldx :exit_address +; ldx :exit_address lda: $0002,x sta: OPCODE_HIGH_SAVE+$0000,y :not_odd - rep #$21 ; clear the carry + rep #$20 ; clear the carry ; Do the end of the loop -- update the virtual line counter and reduce the number ; of lines left to render @@ -193,18 +194,19 @@ _RestoreScanlineBG0Opcodes :loop ldx :virt_line_x2 - ldy BTableLow,x ; Get the address of the first code field line lda BTableHigh,x ora :src_bank pha - lda LastPatchOffsetArr,x + lda BTableLow,x ; Get the address of the first code field line + clc + adc LastPatchOffsetArr,x tax plb - lda OPCODE_SAVE+$0000,y - sta $0000,x + lda: OPCODE_SAVE+$0000,y + sta: $0000,x ; Do the end of the loop -- update the virtual line counter and reduce the number ; of lines left to render diff --git a/src/blitter/Template.s b/src/blitter/Template.s index 8b5f612..427249e 100644 --- a/src/blitter/Template.s +++ b/src/blitter/Template.s @@ -5,12 +5,12 @@ DP_ADDR equ entry_1-base+1 ; offset to patch in the direct page for dynamic tiles BG1_ADDR equ entry_2-base+1 ; offset to patch in the Y-reg for BG1 (dp),y addressing STK_ADDR equ entry_3-base+1 ; offset to patch in the stack (SHR) right edge address -BNK_ADDR equ entry_0-base+1 ; offset to patch in the address of a Bank 0 memory location to load the bank register +; BNK_ADDR equ entry_0-base+1 ; offset to patch in the address of a Bank 0 memory location to load the bank register DP_ENTRY equ entry_1-base TWO_LYR_ENTRY equ entry_2-base ONE_LYR_ENTRY equ entry_3-base -BANK_ENTRY equ entry_0-base +; BANK_ENTRY equ entry_0-base CODE_ENTRY_OPCODE equ entry_jmp-base CODE_ENTRY equ entry_jmp-base+1 ; low byte of the page-aligned jump address @@ -68,9 +68,9 @@ BankPatchNum equ *-BankPatches ; the code is assembled on a page boundary to help with alignment ds \,$00 ; pad to the next page boundary base -entry_0 lda #0000 ; Used to set per-scanline bank register - tcs - plb +;entry_0 lda #0000 ; Used to set per-scanline bank register +; tcs +; plb entry_1 ldx #0000 ; Used for LDA 00,x addressing (Dynamic Tiles) entry_2 ldy #0000 ; Used for LDA (00),y addressing (Second Layer; BG1) entry_3 lda #0000 ; Sets screen address (right edge) From bd1de7f83cda7dc7bfea5c67e761177681d9c955 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Tue, 16 Aug 2022 19:47:19 -0500 Subject: [PATCH 20/68] Checkpoint --- demos/tf4/Tiles.s | 41 +++++++++++++++++++++++++++++++++++++++++ src/Render.s | 2 +- 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 demos/tf4/Tiles.s diff --git a/demos/tf4/Tiles.s b/demos/tf4/Tiles.s new file mode 100644 index 0000000..6030d7d --- /dev/null +++ b/demos/tf4/Tiles.s @@ -0,0 +1,41 @@ + +TileData +; Reserved space (tile 0 is special... + ds 128 +; Tile ID 1 +; From image coordinates 0, 0 + hex ffffffff + hex ffffffff + hex ffffffff + hex ffffffff + hex ffffffff + hex ffffffff + hex ffffffff + hex ffffffff + + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + + hex ffffffff + hex ffffffff + hex ffffffff + hex ffffffff + hex ffffffff + hex ffffffff + hex ffffffff + hex ffffffff + + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 \ No newline at end of file diff --git a/src/Render.s b/src/Render.s index 6b76427..289fd7f 100644 --- a/src/Render.s +++ b/src/Render.s @@ -56,7 +56,7 @@ _Render jsr _RenderSprites ; Once the BG0 X and Y positions are committed, update sprite data jsr _UpdateBG0TileMap ; and the tile maps. These subroutines build up a list of tiles - jsr _UpdateBG1TileMap ; that need to be updated in the code field +; jsr _UpdateBG1TileMap ; that need to be updated in the code field jsr _ApplyTiles ; This function actually draws the new tiles into the code field From 3fa0f94aaf7d17c80d0d2ceceb57f221811ad034 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Tue, 16 Aug 2022 19:48:26 -0500 Subject: [PATCH 21/68] Commit TF4 demo changes --- demos/kfest-2022/demo-1/App.Main.s | 10 +++++----- demos/tf4/README.txt | 2 +- demos/tf4/_FileInformation.txt | 1 - 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/demos/kfest-2022/demo-1/App.Main.s b/demos/kfest-2022/demo-1/App.Main.s index 947eef9..6231ef1 100644 --- a/demos/kfest-2022/demo-1/App.Main.s +++ b/demos/kfest-2022/demo-1/App.Main.s @@ -58,11 +58,11 @@ appTmp0 equ 28 ; Load a tileset - pea 0 - pea 256 - pea #^tiledata - pea #tiledata - _GTELoadTileSet +; pea 0 +; pea 256 +; pea #^tiledata +; pea #tiledata +; _GTELoadTileSet pea $0000 pea #^TileSetPalette diff --git a/demos/tf4/README.txt b/demos/tf4/README.txt index 0894796..8319771 100644 --- a/demos/tf4/README.txt +++ b/demos/tf4/README.txt @@ -1,3 +1,3 @@ -Basic scroller with SMB background +Thunder Force IV scanline demo - q to quit; arrows to scroll, numbers to select screen size - make sure Overlay is present \ No newline at end of file diff --git a/demos/tf4/_FileInformation.txt b/demos/tf4/_FileInformation.txt index 8d18d0b..85f69d9 100644 --- a/demos/tf4/_FileInformation.txt +++ b/demos/tf4/_FileInformation.txt @@ -1,2 +1 @@ -GTEDemo1=Type(B3),AuxType(0000),VersionCreate(70),MinVersion(BE),Access(E3),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000) GTETF4=Type(B3),AuxType(0000),VersionCreate(70),MinVersion(BE),Access(E3),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000) From 1a7fe4bd1a7dc1eaaf63e2762e5d641269dc0925 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Sat, 27 Aug 2022 14:06:35 -0500 Subject: [PATCH 22/68] Add ORCA/C output support to png2iigs tool --- tools/png2iigs.js | 162 ++++++++++++++++++++++++++++------------------ 1 file changed, 100 insertions(+), 62 deletions(-) diff --git a/tools/png2iigs.js b/tools/png2iigs.js index a4350bf..223d59a 100644 --- a/tools/png2iigs.js +++ b/tools/png2iigs.js @@ -146,6 +146,8 @@ function getOptions(argv) { options.targetPalette = getArg(argv, '--palette', x => x.split(',').map(c => hexStringToPalette(c)), null); options.forceMatch = getArg(argv, '--force-color-match', x => true, false); options.forceWordAlignment = getArg(argv, '--force-word-alignment', x => true, false); + options.format = getArg(argv, '--format', x => x, 'asm65816'); // asm65816 or orcac or rez + options.varName = getArg(argv, '--var-name', x => x, 'tiles'); // language-specific label to reference tile data return options; } @@ -222,25 +224,60 @@ function getPaletteMap(options, png) { }; } +function writeComment(options, message, logger=console.log) { + switch (options.format) { + case 'orcac': + logger(`/* ${message} */`); + break; + default: + logger(`; ${message}`); + } +} + +function writePaletteArray(options, palette, logger=console.log) { + switch (options.format) { + case 'orcac': { + const hexCodes = palette.map(c => '0x' + paletteToIIgs(c)); + if (options.backgroundColor !== null) { + hexCodes[0] = '0x' + paletteToIIgs(hexStringToPalette(options.backgroundColor)); + } + logger('#include '); + logger(''); + logger(`Word ${options.varName}Palette[16] = {`); + logger(` ${hexCodes.join(',')}`); + logger(`};`); + break; + } + default: { + const hexCodes = palette.map(c => '$' + paletteToIIgs(c)); + // The transparent color is always mapped into color 0, so if a background color is set it goes into index 0 + if (options.backgroundColor !== null) { + hexCodes[0] = '$' + paletteToIIgs(hexStringToPalette(options.backgroundColor)); + } + logger('TileSetPalette ENT'); + logger(' dw ', hexCodes.join(',')); + } + } +} + async function main(argv) { // try { const png = await readPNG(argv[0]); const options = getOptions(argv); - - console.info(`; startIndex = ${options.startIndex}`); + writeComment(options, `startIndex = ${options.startIndex}`); if (png.colorType !== 3) { - console.warn('; PNG must be in palette color type'); + writeComment(options, `PNG must be in palette color type`, logger.warn); return; } if (png.palette.length > 16) { - console.warn('; Too many colors. Must be 16 or less'); + writeComment(options, `Too many colors. Must be 16 or less`, logger.warn); return; } if (options.palette && options.palette.length > 16) { - console.warn('; Too many colors on command line. Must be 16 or less'); + writeComment(options, `Too many colors on command line. Must be 16 or less`, logger.warn); return; } @@ -249,22 +286,16 @@ async function main(argv) { options.paletteMap = paletteMap; // Dump the palette in IIgs hex format - console.log('; Palette'); - const hexCodes = targetPalette.map(c => '$' + paletteToIIgs(c)); - - // The transparent color is always mapped into color 0, so if a background color is set it goes into index 0 - if (options.backgroundColor !== null) { - hexCodes[0] = '$' + paletteToIIgs(hexStringToPalette(options.backgroundColor)); - } - console.log('TileSetPalette ENT'); - console.log(' dw ', hexCodes.join(',')); + writeComment(options, `Palette`); + writePaletteArray(options, targetPalette); // Just convert a paletted PNG to IIgs memory format. We make sure that only a few widths // are supported let buff = null; let mask = null; - console.log('; Converting to BG0 format...'); + console.log(''); + writeComment(options, `Converting to BG0 format...`); [buff, mask] = pngToIIgsBuff(options, png); if (buff && argv[1]) { @@ -272,7 +303,7 @@ async function main(argv) { writeToTileDataSource(options, buff, mask, png.width / 2); } else { - console.log(`; Writing to output file ${argv[1]}`); + writeComment(options, `Writing to output file ${argv[1]}`); await writeBinayOutput(options, argv[1], buff); } } @@ -429,21 +460,66 @@ function writeTileToStream(stream, data) { } } +function writeTileToStreamORCAC(stream, data) { + // Output the tile data + for (const row of data) { + const hex = row.map(d => toHex(d)).join(''); + stream.write(' 0x' + hex + ',\n'); + } +} + function writeTilesToStream(options, stream, tiles, label='tiledata') { - stream.write(`${label} ENT\n`); + switch (options.format) { + case 'orcac': + writeTilesToStreamORCAC(options, stream, tiles, label); + break; + + case 'asm65816': + writeTilesToStreamASM65816(options, stream, tiles, label); + break; + + default: + throw `Unknown output format: ${options.format}`; + } +} + +function writeTilesToStreamORCAC(options, stream, tiles, label='tiledata') { + stream.write(`long ${options.varName}[] = {\n`); + stream.write('/* Reserved space (tile 0 is special...) */\n'); + for (let i = 0; i < 8; i += 1) { + stream.write(' 0x00000000L,0x00000000L,0x00000000L,0x00000000L,\n'); + } + stream.write('\n'); + + let count = 0; + for (const tile of tiles.slice(0, options.maxTiles)) { + stream.write(`/* Tile ID ${count + 1}, isSolid: ${tile.isSolid} */\n`); + writeTileToStreamORCAC(stream, tile.normal.data); + writeTileToStreamORCAC(stream, tile.normal.mask); + writeTileToStreamORCAC(stream, tile.flipped.data); + writeTileToStreamORCAC(stream, tile.flipped.mask); + stream.write('\n'); + + count += 1; + } + stream.write('};\n'); + stream.write('\n'); +} + +function writeTilesToStreamASM65816(options, stream, tiles, label='tiledata') { + stream.write(`${options.varName} ENT\n`); stream.write(''); stream.write('; Reserved space (tile 0 is special...)\n'); stream.write(' ds 128\n'); let count = 0; for (const tile of tiles.slice(0, options.maxTiles)) { - console.log(`Writing tile ${count + 1}`); stream.write(`; Tile ID ${count + 1}, isSolid: ${tile.isSolid}\n`); writeTileToStream(stream, tile.normal.data); writeTileToStream(stream, tile.normal.mask); writeTileToStream(stream, tile.flipped.data); writeTileToStream(stream, tile.flipped.mask); - stream.write(''); + stream.write('\n'); count += 1; } @@ -485,51 +561,13 @@ function buildMerlinCodeForTiles(options, tiles, label='tiledata') { } function writeToTileDataSource(options, buff, mask, width) { - console.log('tiledata ENT'); - console.log(); - console.log('; Reserved space (tile 0 is special...'); - console.log(' ds 128'); + const stream = process.stdout; - let count = 0; - for (let y = 0; ; y += 8) { - for (let x = 0; x < width; x += 4, count += 1) { - if (count >= options.maxTiles) { - return; - } - console.log('; Tile ID ' + (count + 1)); - console.log('; From image coordinates ' + (x * 2) + ', ' + y); + // Build the tiles + const tiles = buildTiles(options, buff, mask, width); - const tile = buildTile(options, buff, mask, width, x, y); - - // Output the tile data - for (const row of tile.normal.data) { - const hex = row.map(d => toHex(d)).join(''); - console.log(' hex ' + hex); - } - console.log(); - - // Output the tile mask - for (const row of tile.normal.mask) { - const hex = row.map(d => toHex(d)).join(''); - console.log(' hex ' + hex); - } - console.log(); - - // Output the flipped tile data - for (const row of tile.flipped.data) { - const hex = row.map(d => toHex(d)).join(''); - console.log(' hex ' + hex); - } - console.log(); - - // Output the flipped tile data - for (const row of tile.flipped.mask) { - const hex = row.map(d => toHex(d)).join(''); - console.log(' hex ' + hex); - } - console.log(); - } - } + // Write them to the default output stream + writeTilesToStream(options, stream, tiles, options.varName); } async function writeBinayOutput(options, filename, buff) { From 10729c59a9bf5a398176c3f639ac181ddbe7688a Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Sat, 27 Aug 2022 15:53:02 -0500 Subject: [PATCH 23/68] Work on ChrisV C demo --- demos/chrisv/.gitignore | 5 + demos/chrisv/_FileInformation.txt | 1 + demos/chrisv/assets/tileset.png | Bin 0 -> 992 bytes demos/chrisv/build-image.bat | 17 + demos/chrisv/gte.h | 122 ++ demos/chrisv/package.json | 21 + demos/chrisv/test.c | 117 ++ demos/chrisv/tileData.c | 1874 +++++++++++++++++++++++++++++ src/Tool.s | 4 +- 9 files changed, 2160 insertions(+), 1 deletion(-) create mode 100644 demos/chrisv/.gitignore create mode 100644 demos/chrisv/_FileInformation.txt create mode 100644 demos/chrisv/assets/tileset.png create mode 100644 demos/chrisv/build-image.bat create mode 100644 demos/chrisv/gte.h create mode 100644 demos/chrisv/package.json create mode 100644 demos/chrisv/test.c create mode 100644 demos/chrisv/tileData.c diff --git a/demos/chrisv/.gitignore b/demos/chrisv/.gitignore new file mode 100644 index 0000000..1d083a2 --- /dev/null +++ b/demos/chrisv/.gitignore @@ -0,0 +1,5 @@ +App +main +*.root +*.sym +*.a \ No newline at end of file diff --git a/demos/chrisv/_FileInformation.txt b/demos/chrisv/_FileInformation.txt new file mode 100644 index 0000000..73c1cca --- /dev/null +++ b/demos/chrisv/_FileInformation.txt @@ -0,0 +1 @@ +App=Type(B3),AuxType(0000),VersionCreate(70),MinVersion(BE),Access(E3) \ No newline at end of file diff --git a/demos/chrisv/assets/tileset.png b/demos/chrisv/assets/tileset.png new file mode 100644 index 0000000000000000000000000000000000000000..0825ec291c5f5159331b92af23ad394f019d59ff GIT binary patch literal 992 zcmeAS@N?(olHy`uVBq!ia0y~yU~~YoPp~ip$!smv89<7$ILO_JVcj{Imp~3nx}&cn z1H;CC?mvmFK)ykMPlzj!c64;S%fQg*&iTKbfuVze;T^;Or40Z7Gn6ZxVPNF!Z)fb!y>B4U z+TZ9cR0$abySJD1pmt_&@{mF0W&du{FO3<0y)>uJkRp4(Q{GTD7*(e3YF_bztqI6vpf z$xp_6SKg|;ZIG4sd!L-ORLc_IKTIE$w=s)ZUzxSk<6~`nwtMr2e;)tWOy3FA!5c3; z({IcD(?-54efC=cowV!wgR(<)({d~CZ4249UY6IX=EEBH(?y5sqMOd^9@LlRee}X{ zXLa50>3bR9Pn-6jzmH8(Y}$RpQ=gt~k62=K_pR}YgJ0xyzTOp#=9e>;n3wS0@n`L! zDW?sarFv3yuVz1e&iTLg%mTLL@3FbI6@DAOKCm#}@%@42!D9X_gX5nQEbretXS?Fy zo^KDnc7lYIeqS!O!!IGnsL%dESGcVc(Os?^-Nx3grD3U;CY(+uc6P zV69hFQ@w2-Z?N%Y_6&nfwGC{CSpsJ$a0$C4Hfi_>v~n&oa1>GNID{cM|AswOjxI literal 0 HcmV?d00001 diff --git a/demos/chrisv/build-image.bat b/demos/chrisv/build-image.bat new file mode 100644 index 0000000..7f043ec --- /dev/null +++ b/demos/chrisv/build-image.bat @@ -0,0 +1,17 @@ +echo off + +REM Copy all of the assets into the ProDOS image for emulator testing +REM +REM Pass the path of the Cadius tool as the first argument (%1) + +set CADIUS="%1" +set IMAGE="..\\..\\emu\\Target.2mg" +set FOLDER="/GTEDEV/ChrisV" + +REM Cadius does not overwrite files, so clear the root folder first +%CADIUS% DELETEFOLDER %IMAGE% %FOLDER% +%CADIUS% CREATEFOLDER %IMAGE% %FOLDER% + +REM Now copy files and folders as needed +%CADIUS% ADDFILE %IMAGE% %FOLDER% .\App +%CADIUS% ADDFILE %IMAGE% %FOLDER% ..\..\src\Tool160 \ No newline at end of file diff --git a/demos/chrisv/gte.h b/demos/chrisv/gte.h new file mode 100644 index 0000000..a83f30c --- /dev/null +++ b/demos/chrisv/gte.h @@ -0,0 +1,122 @@ +/* ******************************************************************** + + GTE is copyright Lucas Scharenbroich and licensed under the Apache-2.0 + License. + + The following GTE function definitions are taken from the GTE Toolbox + documentation: + https://lscharen.github.io/iigs-game-engine/toolboxref.html + + And from the GTE Macros: + https://github.com/lscharen/iigs-game-engine/blob/d7be9f1be44748b0180c930b1f90b144cda661ea/macros/GTE.Macs.s + + The contents of this file are a derivite work from GTE intended to + ease the process of calling GTE / Tool 160 from ORCA/C and are believed + to be permitted under the terms of the Apache-2.0 License. + + ********************************************************************* */ + +#ifndef _GTE_HEADER_INCLUDE_ +#define _GTE_HEADER_INCLUDE_ + +#include + +/* + GTE_IS_SYSTEM_TOOLS_INSTALL is a boolean toggle for controlling what the application assumes about the location of the GTE tool. + + If GTE is installed in System:Tools, GTE_IS_SYSTEM_TOOLS_INSTALL must be defined. + Otherwise, GTE_IS_SYSTEM_TOOLS_INSTALL must be undefined. + + This will control which header file is used as well as the calls used to load the tool during application startup. +*/ +// #define GTE_IS_SYSTEM_TOOLS_INSTALL 1 + +#ifdef GTE_IS_SYSTEM_TOOLS_INSTALL +#define tool_dispatcher dispatcher +#else +#define tool_dispatcher 0xE10008L +#endif // GTE_IS_SYSTEM_TOOLS_INSTALL + +/* GTE Housekeeping Routines */ +extern pascal void GTEBootInit(void) inline(0x01A0, tool_dispatcher); +extern pascal void GTEStartUp(Word dPageAddr, Word capFlags, Word userID) inline(0x02A0, tool_dispatcher); +extern pascal void GTEShutDown(void) inline(0x03A0, tool_dispatcher); +extern pascal Word GTEVersion(void) inline(0x04A0, tool_dispatcher); +extern pascal void GTEReset(void) inline(0x05A0, tool_dispatcher); +extern pascal Word GTEStatus(void) inline(0x06A0, tool_dispatcher); + + +/* GTE Sprite Routines */ +extern pascal void GTECreateSpriteStamp(Word spriteDescriptor, Word vBuffAddr) inline(0x0FA0, tool_dispatcher); +extern pascal void GTEAddSprite(Word spriteSlot, Word spriteFlags, Word vBuffAddr, Word x, Word y) inline(0x10A0, tool_dispatcher); +extern pascal void GTEMoveSprite(Word spriteSlot, Word x, Word y) inline(0x11A0, tool_dispatcher); +extern pascal void GTEUpdateSprite(Word spriteSlot, Word spriteFlags, Word vBuffAddr) inline(0x12A0, tool_dispatcher); +extern pascal void GTERemoveSprite(Word spriteSlot) inline(0x13A0, tool_dispatcher); + + +/* GTE Tile Routines */ +extern pascal void GTELoadTileSet(Pointer tileSetPtr) inline(0x0EA0, tool_dispatcher); +extern pascal void GTEFillTileStore(Word tileID) inline(0x25A0, tool_dispatcher); +extern pascal void GTESetTile(Word xTile, Word yTile, Word tileID) inline(0x0BA0, tool_dispatcher); + +/* GTE Primary Background Routines */ +extern pascal void GTESetBG0Origin(Word x, Word y) inline(0x0CA0, tool_dispatcher); +extern pascal void GTERender(Word flags) inline(0x0DA0, tool_dispatcher); + + +/* GTE Global State Functions */ +extern pascal void GTESetScreenMode(Word width, Word height) inline(0x0AA0, tool_dispatcher); +extern pascal void GTESetPalette(Word palNum, Pointer palettePtr) inline(0x16A0, tool_dispatcher); + + +/* GTE Misc. Functions */ +extern pascal Word GTEReadControl(void) inline(0x09A0, tool_dispatcher); +extern pascal Word GTEGetSeconds(void) inline(0x14A0, tool_dispatcher); + +/* ReadControl return value bits */ +#define PAD_BUTTON_B 0x0100 +#define PAD_BUTTON_A 0x0200 +#define PAD_KEY_DOWN 0x0400 + +/* GTE EngineMode definitions */ +#define ENGINE_MODE_TWO_LAYER 0x0001 +#define ENGINE_MODE_DYN_TILES 0x0002 +#define ENGINE_MODE_BNK0_BUFF 0x0004 +#define ENGINE_MODE_USER_TOOL 0x8000 /* Communicate if GTE is loaded as a system tool, or a user tool */ + +/* GTE Render Flags */ +#define RENDER_ALT_BG1 0x0001 +#define RENDER_BG1_HORZ_OFFSET 0x0002 +#define RENDER_BG1_VERT_OFFSET 0x0004 +#define RENDER_BG1_ROTATION 0x0008 + +/* GTE Tile Constants */ +#define TILE_PRIORITY_BIT 0x4000 /* Put tile on top of sprite */ +#define TILE_FRINGE_BIT 0x2000 /* Unused */ +#define TILE_SOLID_BIT 0x1000 /* Hint bit used in TWO_LAYER_MODE to optimize rendering */ +#define TILE_DYN_BIT 0x0800 /* Is this a Dynamic Tile? */ +#define TILE_VFLIP_BIT 0x0400 +#define TILE_HFLIP_BIT 0x0200 +#define TILE_ID_MASK 0x01FF +#define TILE_CTRL_MASK 0xFE00 + +/* GTE Sprite Constants */ +#define GTE_SPRITE_HIDE 0x2000 +#define GTE_SPRITE_16X16 0x1800 +#define GTE_SPRITE_16X8 0x1000 +#define GTE_SPRITE_8X16 0x0800 +#define GTE_SPRITE_8X8 0x0000 +#define GTE_SPRITE_VFLIP 0x0400 +#define GTE_SPRITE_HFLIP 0x0200 + + +/* GTE Sprint Stamp Storage Parameters */ +#define GTE_VBUFF_STRIDE_BYTES (12 * 4) /* Each line has 4 slots of 16 pixels + 8 buffer pixels */ +#define GTE_VBUFF_TILE_ROW_BYTES (8 * GTE_VBUFF_STRIDE_BYTES) /* Each row is comprised of 8 lines */ +#define GTE_VBUFF_TILE_COL_BYTES (4) +#define GTE_VBUFF_SPRITE_STEP (GTE_VBUFF_TILE_ROW_BYTES*3) /* Allocate space for 16 rows + 8 rows of buffer */ +#define GTE_VBUFF_SPRITE_START (GTE_VBUFF_TILE_ROW_BYTES+4) /* Start at an offset so $0000 can be used as an empty value */ +#define GTE_VBUFF_SLOT_COUNT (48) /* Have space for this many stamps */ + + +#endif /* _GTE_HEADER_INCLUDE_ */ \ No newline at end of file diff --git a/demos/chrisv/package.json b/demos/chrisv/package.json new file mode 100644 index 0000000..6ed1a9d --- /dev/null +++ b/demos/chrisv/package.json @@ -0,0 +1,21 @@ +{ + "name": "chrisv-c-demo", + "version": "1.0.0", + "description": "Using GTE from C", + "main": "index.js", + "config": { + "merlin32": "C:\\Programs\\IIgsXDev\\bin\\Merlin32-1.1.10.exe", + "cadius": "C:\\Programs\\IIgsXDev\\bin\\Cadius.exe", + "gsport": "C:\\Programs\\gsport\\gsport_0.31\\GSPort.exe", + "macros": "../../macros", + "crossrunner": "C:\\Programs\\Crossrunner\\Crossrunner.exe" + }, + "scripts": { + "gsport": "%npm_package_config_gsport%", + "test": "npm run build && build-image.bat %npm_package_config_cadius% && %npm_package_config_gsport%", + "build": "npm run build:tool && npm run build:sys16", + "build:sys16": "iix compile tileData.c test.c && iix -DKeepType=S16 link test tileData keep=App", + "build:tool": "%npm_package_config_merlin32% -V %npm_package_config_macros% ../../src/Master.s", + "debug": "%npm_package_config_crossrunner% ./App -Debug -CompatibilityLayer" + } + } \ No newline at end of file diff --git a/demos/chrisv/test.c b/demos/chrisv/test.c new file mode 100644 index 0000000..08e8b65 --- /dev/null +++ b/demos/chrisv/test.c @@ -0,0 +1,117 @@ +#include +#include +#include +#include +#include +#include + +/* #define GTE_IS_SYSTEM_TOOLS_INSTALL 1 */ +#include "gte.h" + +#ifdef GTE_IS_SYSTEM_TOOLS_INSTALL +#define ENGINE_STARTUP_MODE 0x0000 +#else +#define ENGINE_STARTUP_MODE ENGINE_MODE_USER_TOOL +#endif + +/* toolbox fail handler */ +#define TOOLFAIL(string) if (toolerror()) SysFailMgr(toolerror(), "\p" string "\n\r Error Code -> $"); + +/* path to the local GTE toolset */ +Str32 toolPath = {9, "1/Tool160" }; + +/* Helper function to load GTE as a user tool or system tool */ +#ifdef GTE_IS_SYSTEM_TOOLS_INSTALL +void LoadGTEToolSet(Word unused) { + LoadOneTool(160, 0); + TOOLFAIL("Unable to load GTE toolset"); +} +#else +void LoadGTEToolSet(Word userId) { + InitialLoadOutputRec loadRec; + + // Load the tool from the local directory + loadRec = InitialLoad(userId, (Pointer) (&toolPath), 1); + TOOLFAIL("Unable to load Tool160 from local path"); + + // Install the tool using the user tool vector + SetTSPtr(0x8000, 160, loadRec.startAddr); + TOOLFAIL("Could not install tool"); +} +#endif // GTE_IS_SYSTEM_TOOLS_INSTALL + +#ifdef GTE_IS_SYSTEM_TOOLS_INSTALL +void UnloadGTEToolSet() { + UnloadOneTool(160); + TOOLFAIL("Unable to unload GTE toolset"); +} +#else +void UnloadGTEToolSet() { +} +#endif // GTE_IS_SYSTEM_TOOLS_INSTALL + +void main(void) { + char i; + Word userId; + Word controlMask, keyPress; + Handle dpHandle; + Word dpAddr; + extern Pointer tiles; + extern Pointer tilesPalette; + int a, b; + + TLStartUp(); + /* Get the program memory ID */ + userId = MMStartUp(); + MTStartUp(); + + dpHandle = NewHandle(0x200L, userId, attrBank + attrPage + attrFixed + attrLocked + attrNoCross, 0); + TOOLFAIL("Could not allocate direct page memory for GTE"); + dpAddr = (Word) (*dpHandle); + + printf("dpAddr: %x\n", (int)dpAddr); + printf("engineMode: %x", (int)ENGINE_STARTUP_MODE); + + GTEStartUp(dpAddr, (Word) ENGINE_STARTUP_MODE, userId); + goto out; + /* + GTESetScreenMode(160, 200); + GTESetPalette(0, tilesPalette); + GTELoadTileSet(tiles); + + GTEFillTileStore(1); + GTERender(0); + + for (a = 3; a < 18; a++) { + GTESetTile(5, a, a); + } + GTESetTile(1, 0, 34); + GTESetTile(2, 0, 33); + GTERender(0); + + GTESetTile(0, 3, 3); + GTESetTile(0, 4, 4); + for (b = 4; b < 6; b++) { + for (a = 1; a < 10; a++) { + GTESetBG0Origin(a, b); + i = (((b - 1) * 10) + a) | TILE_SOLID_BIT | TILE_HFLIP_BIT; + GTESetTile(a, b, i); + GTERender(0); + } + } + */ + + do { + controlMask = GTEReadControl(); + keyPress = controlMask & 0x007F; + } while (toupper(keyPress) != 'Q'); + +out: + GTEShutDown(); + UnloadGTEToolSet(); + + DisposeHandle(dpHandle); + MTShutDown(); + MMShutDown(userId); + TLShutDown(); +} diff --git a/demos/chrisv/tileData.c b/demos/chrisv/tileData.c new file mode 100644 index 0000000..322fb82 --- /dev/null +++ b/demos/chrisv/tileData.c @@ -0,0 +1,1874 @@ +/* startIndex = 0 */ +/* Palette */ +#include + +Word tilesPalette[16] = { + 0x0000,0x0CCC,0x0841,0x04DF,0x072C,0x000F,0x0080,0x0F70,0x0D00,0x0940,0x0FA9,0x0FF0,0x00E0,0x0DAF,0x078F,0x0FFF + //0x0000,0x0000,0x0FFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 + //0x068F,0x0456,0x0E30,0x0870,0x0E51,0x00A0,0x02E3,0x0F93,0x0BF1,0x0FA4,0x0FD7,0x0F59,0x0000,0x01CE,0x0EDA,0x0EEE +}; + +long tiles[] = { +/* Reserved space (tile 0 is special...) */ + 0x00000000L,0x00000000L,0x00000000L,0x00000000L, + 0x00000000L,0x00000000L,0x00000000L,0x00000000L, + 0x00000000L,0x00000000L,0x00000000L,0x00000000L, + 0x00000000L,0x00000000L,0x00000000L,0x00000000L, + 0x00000000L,0x00000000L,0x00000000L,0x00000000L, + 0x00000000L,0x00000000L,0x00000000L,0x00000000L, + 0x00000000L,0x00000000L,0x00000000L,0x00000000L, + 0x00000000L,0x00000000L,0x00000000L,0x00000000L, + +/* Tile ID 1 - From image coordinates 0, 0*/ + 0x00000000, + 0x01012010, + 0x01001000, + 0x02101210, + 0x00002200, + 0x01010120, + 0x02120010, + 0x00110200, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00000000, + 0x01021010, + 0x00010010, + 0x01210120, + 0x00220000, + 0x02101010, + 0x01002120, + 0x00201100, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 2 - From image coordinates 8, 0*/ + 0x00000000, + 0x01011010, + 0x03000103, + 0x00130001, + 0x01001103, + 0x00013103, + 0x01010301, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00000000, + 0x01011010, + 0x30100030, + 0x10003100, + 0x30110010, + 0x30131000, + 0x10301010, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 3 - From image coordinates 16, 0*/ + 0x00000000, + 0x01010310, + 0x01010000, + 0x00030131, + 0x31010110, + 0x01310010, + 0x00030100, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00000000, + 0x01301010, + 0x00001010, + 0x13103000, + 0x01101013, + 0x01001310, + 0x00103000, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 4 - From image coordinates 24, 0*/ + 0x00000000, + 0x10101031, + 0x10303000, + 0x10001010, + 0x00103030, + 0x30311010, + 0x10100010, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00000000, + 0x13010101, + 0x00030301, + 0x01010001, + 0x03030100, + 0x01011303, + 0x01000101, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 5 - From image coordinates 32, 0*/ + 0x00000000, + 0x01010130, + 0x03030000, + 0x11010313, + 0x31010100, + 0x00030103, + 0x13101001, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00000000, + 0x03101010, + 0x00003030, + 0x31301011, + 0x00101013, + 0x30103000, + 0x10010131, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 6 - From image coordinates 40, 0*/ + 0x00000000, + 0x10101030, + 0x10000100, + 0x10100310, + 0x00030100, + 0x10110100, + 0x00300030, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00000000, + 0x03010101, + 0x00100001, + 0x01300101, + 0x00103000, + 0x00101101, + 0x03000300, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 7 - From image coordinates 48, 0*/ + 0x00000000, + 0x01013010, + 0x01001000, + 0x03101310, + 0x00003300, + 0x01010130, + 0x03130010, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00000000, + 0x01031010, + 0x00010010, + 0x01310130, + 0x00330000, + 0x03101010, + 0x01003130, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 8 - From image coordinates 56, 0*/ + 0x00000000, + 0x01013010, + 0x01001000, + 0x03101310, + 0x00003300, + 0x01010130, + 0x03130010, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00000000, + 0x01031010, + 0x00010010, + 0x01310130, + 0x00330000, + 0x03101010, + 0x01003130, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 9 - From image coordinates 64, 0*/ + 0x00000000, + 0x00000000, + 0x22222222, + 0x44444444, + 0x55555555, + 0x66666666, + 0x77777777, + 0x88888888, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x22222222, + 0x44444444, + 0x55555555, + 0x66666666, + 0x77777777, + 0x88888888, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 10 - From image coordinates 72, 0*/ + 0x00000000, + 0x00000000, + 0x22222222, + 0x44444444, + 0x55555555, + 0x66666666, + 0x77777777, + 0x88888888, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x22222222, + 0x44444444, + 0x55555555, + 0x66666666, + 0x77777777, + 0x88888888, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 11 - From image coordinates 0, 8*/ + 0x02210100, + 0x01102010, + 0x00101000, + 0x02101210, + 0x00010000, + 0x01010130, + 0x02120010, + 0x01113010, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00101220, + 0x01020110, + 0x00010100, + 0x01210120, + 0x00001000, + 0x03101010, + 0x01002120, + 0x01031110, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 12 - From image coordinates 8, 8*/ + 0x00000000, + 0x01011010, + 0x03000130, + 0x00130000, + 0x01001030, + 0x00013010, + 0x01010300, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00000000, + 0x01011010, + 0x03100030, + 0x00003100, + 0x03010010, + 0x01031000, + 0x00301010, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 13 - From image coordinates 16, 8*/ + 0x31313131, + 0x13131313, + 0x22222222, + 0x27722772, + 0x22277227, + 0x22222222, + 0x31313131, + 0x13131313, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x13131313, + 0x31313131, + 0x22222222, + 0x27722772, + 0x72277222, + 0x22222222, + 0x13131313, + 0x31313131, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 14 - From image coordinates 24, 8*/ + 0x31313131, + 0x13131313, + 0x22222222, + 0x27722772, + 0x72277227, + 0x22222222, + 0x31313131, + 0x13131313, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x13131313, + 0x31313131, + 0x22222222, + 0x27722772, + 0x72277227, + 0x22222222, + 0x13131313, + 0x31313131, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 15 - From image coordinates 32, 8*/ + 0x31313131, + 0x13131313, + 0x22222222, + 0x27722772, + 0x72277222, + 0x22222222, + 0x31313131, + 0x13131313, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x13131313, + 0x31313131, + 0x22222222, + 0x27722772, + 0x22277227, + 0x22222222, + 0x13131313, + 0x31313131, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 16 - From image coordinates 40, 8*/ + 0x00000000, + 0x01101030, + 0x03000100, + 0x01100310, + 0x00030000, + 0x03110100, + 0x01300030, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00000000, + 0x03010110, + 0x00100030, + 0x01300110, + 0x00003000, + 0x00101130, + 0x03000310, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 17 - From image coordinates 48, 8*/ + 0x31999931, + 0x13997913, + 0x31997931, + 0x13979913, + 0x31979931, + 0x13997913, + 0x31997931, + 0x13979913, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x13999913, + 0x31979931, + 0x13979913, + 0x31997931, + 0x13997913, + 0x31979931, + 0x13979913, + 0x31997931, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 18 - From image coordinates 56, 8*/ + 0x31033031, + 0x13033013, + 0x31033031, + 0x13033013, + 0x31033031, + 0x13033013, + 0x31033031, + 0x13033013, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x13033013, + 0x31033031, + 0x13033013, + 0x31033031, + 0x13033013, + 0x31033031, + 0x13033013, + 0x31033031, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 19 - From image coordinates 64, 8*/ + 0xaaaaaaaa, + 0xbbbbbbbb, + 0xcccccccc, + 0x33333333, + 0xdddddddd, + 0xeeeeeeee, + 0x11111111, + 0xffffffff, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0xaaaaaaaa, + 0xbbbbbbbb, + 0xcccccccc, + 0x33333333, + 0xdddddddd, + 0xeeeeeeee, + 0x11111111, + 0xffffffff, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 20 - From image coordinates 72, 8*/ + 0xaaaaaaaa, + 0xbbbbbbbb, + 0xcccccccc, + 0x33333333, + 0xdddddddd, + 0xeeeeeeee, + 0x11111111, + 0xffffffff, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0xaaaaaaaa, + 0xbbbbbbbb, + 0xcccccccc, + 0x33333333, + 0xdddddddd, + 0xeeeeeeee, + 0x11111111, + 0xffffffff, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 21 - From image coordinates 0, 16*/ + 0x00031100, + 0x01013010, + 0x01001000, + 0x03101310, + 0x00000100, + 0x01010130, + 0x03130110, + 0x01101300, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00113000, + 0x01031010, + 0x00010010, + 0x01310130, + 0x00100000, + 0x03101010, + 0x01103130, + 0x00310110, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 22 - From image coordinates 8, 16*/ + 0x00000000, + 0x01011010, + 0x03000130, + 0x00130000, + 0x01001030, + 0x00013010, + 0x01010300, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00000000, + 0x01011010, + 0x03100030, + 0x00003100, + 0x03010010, + 0x01031000, + 0x00301010, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 23 - From image coordinates 16, 16*/ + 0x31313131, + 0x13131313, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x31313131, + 0x13131313, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x13131313, + 0x31313131, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x13131313, + 0x31313131, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 24 - From image coordinates 24, 16*/ + 0x31313131, + 0x13131313, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x31313131, + 0x13131313, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x13131313, + 0x31313131, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x13131313, + 0x31313131, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 25 - From image coordinates 32, 16*/ + 0x31313131, + 0x13131313, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x31313131, + 0x13131313, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x13131313, + 0x31313131, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x13131313, + 0x31313131, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 26 - From image coordinates 40, 16*/ + 0x00000000, + 0x01101030, + 0x03000100, + 0x01100310, + 0x00030000, + 0x03110100, + 0x01300030, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00000000, + 0x03010110, + 0x00100030, + 0x01300110, + 0x00003000, + 0x00101130, + 0x03000310, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 27 - From image coordinates 48, 16*/ + 0x31979931, + 0x13997913, + 0x31997931, + 0x13979913, + 0x31979931, + 0x13997913, + 0x31997931, + 0x13979913, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x13997913, + 0x31979931, + 0x13979913, + 0x31997931, + 0x13997913, + 0x31979931, + 0x13979913, + 0x31997931, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 28 - From image coordinates 56, 16*/ + 0x31033031, + 0x13033013, + 0x31033031, + 0x13033013, + 0x31033031, + 0x13033013, + 0x31033031, + 0x13033013, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x13033013, + 0x31033031, + 0x13033013, + 0x31033031, + 0x13033013, + 0x31033031, + 0x13033013, + 0x31033031, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 29 - From image coordinates 64, 16*/ + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 30 - From image coordinates 72, 16*/ + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 31 - From image coordinates 0, 24*/ + 0x00011010, + 0x01013010, + 0x01001000, + 0x03101310, + 0x00100000, + 0x01010130, + 0x03130010, + 0x01010300, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x01011000, + 0x01031010, + 0x00010010, + 0x01310130, + 0x00000100, + 0x03101010, + 0x01003130, + 0x00301010, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 32 - From image coordinates 8, 24*/ + 0x00000000, + 0x01013010, + 0x01001000, + 0x03101310, + 0x00003300, + 0x01010130, + 0x03130010, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00000000, + 0x01031010, + 0x00010010, + 0x01310130, + 0x00330000, + 0x03101010, + 0x01003130, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 33 - From image coordinates 16, 24*/ + 0x00000077, + 0x00007776, + 0x00077666, + 0x00776666, + 0x07766676, + 0x07766676, + 0x77766666, + 0x77776666, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x77000000, + 0x67770000, + 0x66677000, + 0x66667700, + 0x67666770, + 0x67666770, + 0x66666777, + 0x66667777, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 34 - From image coordinates 24, 24*/ + 0x77000000, + 0x77770000, + 0x66777000, + 0x66667700, + 0x76667770, + 0x77777770, + 0x77777777, + 0x66777777, + + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + + 0x00000077, + 0x00007777, + 0x00077766, + 0x00776666, + 0x07776667, + 0x07777777, + 0x77777777, + 0x77777766, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 35 - From image coordinates 32, 24*/ + 0x00000088, + 0x00008888, + 0x000888ff, + 0x00888fff, + 0x0888fff8, + 0x0888fff8, + 0x88888888, + 0x8888888f, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x88000000, + 0x88880000, + 0xff888000, + 0xfff88800, + 0x8fff8880, + 0x8fff8880, + 0x88888888, + 0xf8888888, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 36 - From image coordinates 40, 24*/ + 0x88000000, + 0x88880000, + 0xff888000, + 0xfff88800, + 0x8fff8880, + 0x8fff8880, + 0xffff8888, + 0xfff88888, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00000088, + 0x00008888, + 0x000888ff, + 0x00888fff, + 0x0888fff8, + 0x0888fff8, + 0x8888ffff, + 0x88888fff, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 37 - From image coordinates 48, 24*/ + 0x31979931, + 0x13997913, + 0x31997931, + 0x13979913, + 0x31979931, + 0x13997913, + 0x31997931, + 0x13999913, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x13997913, + 0x31979931, + 0x13979913, + 0x31997931, + 0x13997913, + 0x31979931, + 0x13979913, + 0x31999931, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 38 - From image coordinates 56, 24*/ + 0x31033031, + 0x13033013, + 0x31033031, + 0x13033013, + 0x31033031, + 0x13033013, + 0x31033031, + 0x13033013, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x13033013, + 0x31033031, + 0x13033013, + 0x31033031, + 0x13033013, + 0x31033031, + 0x13033013, + 0x31033031, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 39 - From image coordinates 64, 24*/ + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 40 - From image coordinates 72, 24*/ + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 41 - From image coordinates 0, 32*/ + 0x00310110, + 0x01013010, + 0x01001000, + 0x03101310, + 0x03030100, + 0x01010130, + 0x03130010, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x01101300, + 0x01031010, + 0x00010010, + 0x01310130, + 0x00103030, + 0x03101010, + 0x01003130, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 42 - From image coordinates 8, 32*/ + 0x31313131, + 0x13131313, + 0x31313131, + 0x13131313, + 0x31313131, + 0x13131313, + 0x31313131, + 0x13131313, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x13131313, + 0x31313131, + 0x13131313, + 0x31313131, + 0x13131313, + 0x31313131, + 0x13131313, + 0x31313131, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 43 - From image coordinates 16, 32*/ + 0x77777666, + 0x77777776, + 0x07777776, + 0x07766676, + 0x00776666, + 0x00077666, + 0x00007776, + 0x00000077, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x66677777, + 0x67777777, + 0x67777770, + 0x67666770, + 0x66667700, + 0x66677000, + 0x67770000, + 0x77000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 44 - From image coordinates 24, 32*/ + 0x66677777, + 0x66667777, + 0x76667770, + 0x76667770, + 0x66677700, + 0x66777000, + 0x77770000, + 0x77000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x77777666, + 0x77776666, + 0x07776667, + 0x07776667, + 0x00777666, + 0x00077766, + 0x00007777, + 0x00000077, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 45 - From image coordinates 32, 32*/ + 0x888888ff, + 0x888888ff, + 0x08888888, + 0x088888ff, + 0x008888ff, + 0x000888ff, + 0x00008888, + 0x00000088, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0xff888888, + 0xff888888, + 0x88888880, + 0xff888880, + 0xff888800, + 0xff888000, + 0x88880000, + 0x88000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 46 - From image coordinates 40, 32*/ + 0xff888888, + 0xf8888888, + 0x88888880, + 0xf8888880, + 0xf8888800, + 0xf8888000, + 0x88880000, + 0x88000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x888888ff, + 0x8888888f, + 0x08888888, + 0x0888888f, + 0x0088888f, + 0x0008888f, + 0x00008888, + 0x00000088, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 47 - From image coordinates 48, 32*/ + 0x00000000, + 0x01013010, + 0x01001000, + 0x03101310, + 0x03030100, + 0x01010130, + 0x03130010, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00000000, + 0x01031010, + 0x00010010, + 0x01310130, + 0x00103030, + 0x03101010, + 0x01003130, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 48 - From image coordinates 56, 32*/ + 0x00000000, + 0x01013010, + 0x01001000, + 0x03101310, + 0x03030100, + 0x01010130, + 0x03130010, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0x00000000, + 0x01031010, + 0x00010010, + 0x01310130, + 0x00103030, + 0x03101010, + 0x01003130, + 0x00000000, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 49 - From image coordinates 64, 32*/ + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +/* Tile ID 50 - From image coordinates 72, 32*/ + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + 0xffffffff, + + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + 0x00000000, + +}; + + diff --git a/src/Tool.s b/src/Tool.s index dae5db3..548783d 100644 --- a/src/Tool.s +++ b/src/Tool.s @@ -183,7 +183,9 @@ _TSShutDown jsr _CoreShutDown ; Shut down the library plb - pea $8000 + lda EngineMode + and #$8000 + pha pei ToolNum pea $0000 ; Set WAP to null pea $0000 From 700a3124fd5104f4b2fc8bac089a640946cd20ae Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Sat, 27 Aug 2022 15:53:48 -0500 Subject: [PATCH 24/68] Fix demo-1 init --- demos/kfest-2022/demo-1/App.Main.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demos/kfest-2022/demo-1/App.Main.s b/demos/kfest-2022/demo-1/App.Main.s index 882b4ef..2f76025 100644 --- a/demos/kfest-2022/demo-1/App.Main.s +++ b/demos/kfest-2022/demo-1/App.Main.s @@ -47,7 +47,7 @@ appTmp0 equ 28 _MTStartUp ; GTE requires the miscellaneous toolset to be running - lda #0 ; Engine in Fast Mode + lda #ENGINE_MODE_USER_TOOL ; Engine in Fast Mode as a User Tool jsr GTEStartUp ; Load and install the GTE User Tool ; Initialize local variables From 6bb2c437e3f167422cfb31511a9dbc95ac9a6c77 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Sat, 27 Aug 2022 19:23:17 -0500 Subject: [PATCH 25/68] Add C header file --- ORCACDefs/gte.h | 165 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 ORCACDefs/gte.h diff --git a/ORCACDefs/gte.h b/ORCACDefs/gte.h new file mode 100644 index 0000000..d152cf8 --- /dev/null +++ b/ORCACDefs/gte.h @@ -0,0 +1,165 @@ +/* ******************************************************************** + + GTE is copyright Lucas Scharenbroich and licensed under the Apache-2.0 + License. + + The following GTE function definitions are taken from the GTE Toolbox + documentation: + https://lscharen.github.io/iigs-game-engine/toolboxref.html + + And from the GTE Macros: + https://github.com/lscharen/iigs-game-engine/blob/d7be9f1be44748b0180c930b1f90b144cda661ea/macros/GTE.Macs.s + + The contents of this file are a derivite work from GTE intended to + ease the process of calling GTE / Tool 160 from ORCA/C and are believed + to be permitted under the terms of the Apache-2.0 License. + + ********************************************************************* */ + +#ifndef _GTE_HEADER_INCLUDE_ +#define _GTE_HEADER_INCLUDE_ + +#include + +/* + GTE_IS_SYSTEM_TOOLS_INSTALL is a boolean toggle for controlling what the application assumes about the location of the GTE tool. + + If GTE is installed in System:Tools, GTE_IS_SYSTEM_TOOLS_INSTALL must be defined. + Otherwise, GTE_IS_SYSTEM_TOOLS_INSTALL must be undefined. + + This will control which header file is used as well as the calls used to load the tool during application startup. +*/ +// #define GTE_IS_SYSTEM_TOOLS_INSTALL 1 + +#ifdef GTE_IS_SYSTEM_TOOLS_INSTALL +#define tool_dispatcher dispatcher +#else +#define tool_dispatcher 0xE10008L +#endif // GTE_IS_SYSTEM_TOOLS_INSTALL + +typedef struct TileMapInfo { + Word width; + Word height; + Pointer tileMapPtr; +} TileMapInfo; + +typedef struct ScreenInfo { + Word x; + Word y; + Word width; + Word height; +} ScreenInfo; + +/* GTE Housekeeping Routines */ +extern pascal void GTEBootInit(void) inline(0x01A0, tool_dispatcher); +extern pascal void GTEStartUp(Word dPageAddr, Word capFlags, Word userID) inline(0x02A0, tool_dispatcher); +extern pascal void GTEShutDown(void) inline(0x03A0, tool_dispatcher); +extern pascal Word GTEVersion(void) inline(0x04A0, tool_dispatcher); +extern pascal void GTEReset(void) inline(0x05A0, tool_dispatcher); +extern pascal Word GTEStatus(void) inline(0x06A0, tool_dispatcher); + + +/* GTE Sprite Routines */ +extern pascal void GTECreateSpriteStamp(Word spriteDescriptor, Word vBuffAddr) inline(0x0FA0, tool_dispatcher); +extern pascal void GTEAddSprite(Word spriteSlot, Word spriteFlags, Word vBuffAddr, Word x, Word y) inline(0x10A0, tool_dispatcher); +extern pascal void GTEMoveSprite(Word spriteSlot, Word x, Word y) inline(0x11A0, tool_dispatcher); +extern pascal void GTEUpdateSprite(Word spriteSlot, Word spriteFlags, Word vBuffAddr) inline(0x12A0, tool_dispatcher); +extern pascal void GTERemoveSprite(Word spriteSlot) inline(0x13A0, tool_dispatcher); + + +/* GTE Tile Routines */ +extern pascal void GTELoadTileSet(Word start, Word finish, Pointer tileSetPtr) inline(0x0EA0, tool_dispatcher); +extern pascal void GTEFillTileStore(Word tileID) inline(0x25A0, tool_dispatcher); +extern pascal void GTESetTile(Word xTile, Word yTile, Word tileID) inline(0x0BA0, tool_dispatcher); +extern pascal void GTECopyTileToDynamic(Word tileID, Word dynID) inline(0x15A0, tool_dispatcher); +extern pascal Word GTEGetTileAt(Word x, Word y) inline(0x1CA0, tool_dispatcher); +extern pascal Pointer GTEGetTileDataAddr() inline(0x24A0, tool_dispatcher); + + +/* GTE Primary Background Routines */ +extern pascal void GTESetBG0Origin(Word x, Word y) inline(0x0CA0, tool_dispatcher); +extern pascal void GTERender(Word flags) inline(0x0DA0, tool_dispatcher); +extern pascal void GTERefresh() inline(0x26A0, tool_dispatcher); +extern pascal struct TileMapInfo GTEGetBG0TileMapInfo() inline(0x19A0, tool_dispatcher); +extern pascal void GTESetBG0TileMapInfo(Word width, Word height, Pointer tileMapPtr) inline(0x1DA0, tool_dispatcher); + + +/* GTE Secondary Background Routines */ +extern pascal void GTESetBG1Origin(Word x, Word y) inline(0x1BA0, tool_dispatcher); +extern pascal void GTECopyPicToBG1(Word width, Word height, Word stride, Pointer picPtr) inline(0x17A0, tool_dispatcher); +extern pascal void GTESetBG1TileMapInfo(Word width, Word height, Pointer tileMapPtr) inline(0x1EA0, tool_dispatcher); + + +/* GTE Global State Functions */ +extern pascal void GTESetScreenMode(Word width, Word height) inline(0x0AA0, tool_dispatcher); +extern pascal void GTESetPalette(Word palNum, Pointer palettePtr) inline(0x16A0, tool_dispatcher); +extern pascal void GTEBindSCBArray(Pointer scbPtr) inline(0x18A0, tool_dispatcher); +extern pascal struct ScreenInfo GTEGetScreenInfo() inline(0x1AA0, tool_dispatcher); +extern pascal void GTESetBG1Displacement(Word offset) inline(0x27A0, tool_dispatcher); +extern pascal void GTESetBG1Rotation(Word rotIndex) inline(0x28A0, tool_dispatcher); +extern pascal void GTEClearBG1Buffer(Word value) inline(0x29A0, tool_dispatcher); + + +/* GTE Misc. Functions */ +extern pascal Word GTEReadControl(void) inline(0x09A0, tool_dispatcher); +extern pascal Word GTEGetSeconds(void) inline(0x14A0, tool_dispatcher); + + +/* GTE Timer Functions */ +extern pascal Word GTEAddTimer(Word numTicks, Pointer callback, Word flags) inline(0x1FA0, tool_dispatcher); +extern pascal Word GTERemoveTimer(Word timerID) inline(0x20A0, tool_dispatcher); +extern pascal Word GTEStartScript(Word numTicks, Pointer scriptAddr) inline(0x21A0, tool_dispatcher); + + +/* GTE Overlay Functions */ +extern pascal Word GTESetOverlay(Word top, Word bottom, Pointer procPtr) inline(0x22A0, tool_dispatcher); +extern pascal Word GTEClearOverlay() inline(0x23A0, tool_dispatcher); + + +/* ReadControl return value bits */ +#define PAD_BUTTON_B 0x0100 +#define PAD_BUTTON_A 0x0200 +#define PAD_KEY_DOWN 0x0400 + +/* GTE EngineMode definitions */ +#define ENGINE_MODE_TWO_LAYER 0x0001 +#define ENGINE_MODE_DYN_TILES 0x0002 +#define ENGINE_MODE_BNK0_BUFF 0x0004 +#define ENGINE_MODE_USER_TOOL 0x8000 /* Communicate if GTE is loaded as a system tool, or a user tool */ + +/* GTE Render Flags */ +#define RENDER_ALT_BG1 0x0001 +#define RENDER_BG1_HORZ_OFFSET 0x0002 +#define RENDER_BG1_VERT_OFFSET 0x0004 +#define RENDER_BG1_ROTATION 0x0008 + +/* GTE Tile Constants */ +#define TILE_PRIORITY_BIT 0x4000 /* Put tile on top of sprite */ +#define TILE_FRINGE_BIT 0x2000 /* Unused */ +#define TILE_SOLID_BIT 0x1000 /* Hint bit used in TWO_LAYER_MODE to optimize rendering */ +#define TILE_DYN_BIT 0x0800 /* Is this a Dynamic Tile? */ +#define TILE_VFLIP_BIT 0x0400 +#define TILE_HFLIP_BIT 0x0200 +#define TILE_ID_MASK 0x01FF +#define TILE_CTRL_MASK 0xFE00 + +/* GTE Sprite Constants */ +#define GTE_SPRITE_HIDE 0x2000 +#define GTE_SPRITE_16X16 0x1800 +#define GTE_SPRITE_16X8 0x1000 +#define GTE_SPRITE_8X16 0x0800 +#define GTE_SPRITE_8X8 0x0000 +#define GTE_SPRITE_VFLIP 0x0400 +#define GTE_SPRITE_HFLIP 0x0200 + + +/* GTE Sprint Stamp Storage Parameters */ +#define GTE_VBUFF_STRIDE_BYTES (12 * 4) /* Each line has 4 slots of 16 pixels + 8 buffer pixels */ +#define GTE_VBUFF_TILE_ROW_BYTES (8 * GTE_VBUFF_STRIDE_BYTES) /* Each row is comprised of 8 lines */ +#define GTE_VBUFF_TILE_COL_BYTES (4) +#define GTE_VBUFF_SPRITE_STEP (GTE_VBUFF_TILE_ROW_BYTES*3) /* Allocate space for 16 rows + 8 rows of buffer */ +#define GTE_VBUFF_SPRITE_START (GTE_VBUFF_TILE_ROW_BYTES+4) /* Start at an offset so $0000 can be used as an empty value */ +#define GTE_VBUFF_SLOT_COUNT (48) /* Have space for this many stamps */ + + +#endif /* _GTE_HEADER_INCLUDE_ */ \ No newline at end of file From 0b31e9ead2da158d171addf454a129466bbeec83 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Sat, 27 Aug 2022 19:24:07 -0500 Subject: [PATCH 26/68] Addtweaked files --- demos/chrisv/gte.h | 45 ++++++++++++++++++++++++++++++++++++++++++++- demos/chrisv/test.c | 40 ++++++++++++++++++++-------------------- 2 files changed, 64 insertions(+), 21 deletions(-) diff --git a/demos/chrisv/gte.h b/demos/chrisv/gte.h index a83f30c..d152cf8 100644 --- a/demos/chrisv/gte.h +++ b/demos/chrisv/gte.h @@ -37,6 +37,19 @@ #define tool_dispatcher 0xE10008L #endif // GTE_IS_SYSTEM_TOOLS_INSTALL +typedef struct TileMapInfo { + Word width; + Word height; + Pointer tileMapPtr; +} TileMapInfo; + +typedef struct ScreenInfo { + Word x; + Word y; + Word width; + Word height; +} ScreenInfo; + /* GTE Housekeeping Routines */ extern pascal void GTEBootInit(void) inline(0x01A0, tool_dispatcher); extern pascal void GTEStartUp(Word dPageAddr, Word capFlags, Word userID) inline(0x02A0, tool_dispatcher); @@ -55,24 +68,54 @@ extern pascal void GTERemoveSprite(Word spriteSlot) inline(0x13A0, tool_dispatch /* GTE Tile Routines */ -extern pascal void GTELoadTileSet(Pointer tileSetPtr) inline(0x0EA0, tool_dispatcher); +extern pascal void GTELoadTileSet(Word start, Word finish, Pointer tileSetPtr) inline(0x0EA0, tool_dispatcher); extern pascal void GTEFillTileStore(Word tileID) inline(0x25A0, tool_dispatcher); extern pascal void GTESetTile(Word xTile, Word yTile, Word tileID) inline(0x0BA0, tool_dispatcher); +extern pascal void GTECopyTileToDynamic(Word tileID, Word dynID) inline(0x15A0, tool_dispatcher); +extern pascal Word GTEGetTileAt(Word x, Word y) inline(0x1CA0, tool_dispatcher); +extern pascal Pointer GTEGetTileDataAddr() inline(0x24A0, tool_dispatcher); + /* GTE Primary Background Routines */ extern pascal void GTESetBG0Origin(Word x, Word y) inline(0x0CA0, tool_dispatcher); extern pascal void GTERender(Word flags) inline(0x0DA0, tool_dispatcher); +extern pascal void GTERefresh() inline(0x26A0, tool_dispatcher); +extern pascal struct TileMapInfo GTEGetBG0TileMapInfo() inline(0x19A0, tool_dispatcher); +extern pascal void GTESetBG0TileMapInfo(Word width, Word height, Pointer tileMapPtr) inline(0x1DA0, tool_dispatcher); + + +/* GTE Secondary Background Routines */ +extern pascal void GTESetBG1Origin(Word x, Word y) inline(0x1BA0, tool_dispatcher); +extern pascal void GTECopyPicToBG1(Word width, Word height, Word stride, Pointer picPtr) inline(0x17A0, tool_dispatcher); +extern pascal void GTESetBG1TileMapInfo(Word width, Word height, Pointer tileMapPtr) inline(0x1EA0, tool_dispatcher); /* GTE Global State Functions */ extern pascal void GTESetScreenMode(Word width, Word height) inline(0x0AA0, tool_dispatcher); extern pascal void GTESetPalette(Word palNum, Pointer palettePtr) inline(0x16A0, tool_dispatcher); +extern pascal void GTEBindSCBArray(Pointer scbPtr) inline(0x18A0, tool_dispatcher); +extern pascal struct ScreenInfo GTEGetScreenInfo() inline(0x1AA0, tool_dispatcher); +extern pascal void GTESetBG1Displacement(Word offset) inline(0x27A0, tool_dispatcher); +extern pascal void GTESetBG1Rotation(Word rotIndex) inline(0x28A0, tool_dispatcher); +extern pascal void GTEClearBG1Buffer(Word value) inline(0x29A0, tool_dispatcher); /* GTE Misc. Functions */ extern pascal Word GTEReadControl(void) inline(0x09A0, tool_dispatcher); extern pascal Word GTEGetSeconds(void) inline(0x14A0, tool_dispatcher); + +/* GTE Timer Functions */ +extern pascal Word GTEAddTimer(Word numTicks, Pointer callback, Word flags) inline(0x1FA0, tool_dispatcher); +extern pascal Word GTERemoveTimer(Word timerID) inline(0x20A0, tool_dispatcher); +extern pascal Word GTEStartScript(Word numTicks, Pointer scriptAddr) inline(0x21A0, tool_dispatcher); + + +/* GTE Overlay Functions */ +extern pascal Word GTESetOverlay(Word top, Word bottom, Pointer procPtr) inline(0x22A0, tool_dispatcher); +extern pascal Word GTEClearOverlay() inline(0x23A0, tool_dispatcher); + + /* ReadControl return value bits */ #define PAD_BUTTON_B 0x0100 #define PAD_BUTTON_A 0x0200 diff --git a/demos/chrisv/test.c b/demos/chrisv/test.c index 08e8b65..6583f89 100644 --- a/demos/chrisv/test.c +++ b/demos/chrisv/test.c @@ -1,7 +1,6 @@ -#include -#include #include #include +#include #include #include @@ -29,7 +28,7 @@ void LoadGTEToolSet(Word unused) { #else void LoadGTEToolSet(Word userId) { InitialLoadOutputRec loadRec; - + // Load the tool from the local directory loadRec = InitialLoad(userId, (Pointer) (&toolPath), 1); TOOLFAIL("Unable to load Tool160 from local path"); @@ -50,34 +49,37 @@ void UnloadGTEToolSet() { } #endif // GTE_IS_SYSTEM_TOOLS_INSTALL +extern Byte tiles[]; +extern Word tilesPalette[16]; + void main(void) { - char i; Word userId; + Word tileId; Word controlMask, keyPress; Handle dpHandle; Word dpAddr; - extern Pointer tiles; - extern Pointer tilesPalette; int a, b; TLStartUp(); - /* Get the program memory ID */ + TOOLFAIL("Unable to start tool locator"); + userId = MMStartUp(); + TOOLFAIL("Unable to start memory manager"); + MTStartUp(); + TOOLFAIL("Unable to start misc tools"); + + LoadGTEToolSet(userId); dpHandle = NewHandle(0x200L, userId, attrBank + attrPage + attrFixed + attrLocked + attrNoCross, 0); TOOLFAIL("Could not allocate direct page memory for GTE"); dpAddr = (Word) (*dpHandle); - printf("dpAddr: %x\n", (int)dpAddr); - printf("engineMode: %x", (int)ENGINE_STARTUP_MODE); - GTEStartUp(dpAddr, (Word) ENGINE_STARTUP_MODE, userId); - goto out; - /* - GTESetScreenMode(160, 200); - GTESetPalette(0, tilesPalette); - GTELoadTileSet(tiles); + + /* GTESetScreenMode(160, 200); /* 160x200 is the default screen mode */ + GTESetPalette(0, (Pointer)tilesPalette); + GTELoadTileSet(0, 50, tiles); /* Load in 50 tiles */ GTEFillTileStore(1); GTERender(0); @@ -94,19 +96,17 @@ void main(void) { for (b = 4; b < 6; b++) { for (a = 1; a < 10; a++) { GTESetBG0Origin(a, b); - i = (((b - 1) * 10) + a) | TILE_SOLID_BIT | TILE_HFLIP_BIT; - GTESetTile(a, b, i); + tileId = (((b - 1) * 10) + a) | TILE_SOLID_BIT | TILE_HFLIP_BIT; + GTESetTile(a, b, tileId); GTERender(0); } } - */ do { controlMask = GTEReadControl(); keyPress = controlMask & 0x007F; - } while (toupper(keyPress) != 'Q'); + } while (keyPress != 'Q'); -out: GTEShutDown(); UnloadGTEToolSet(); From 33da3d4a97e42529537e0f7bc495924429739005 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Sat, 27 Aug 2022 19:51:31 -0500 Subject: [PATCH 27/68] Final clean up --- demos/chrisv/assets/tileset.png | Bin 992 -> 847 bytes demos/chrisv/package.json | 10 +- demos/chrisv/test.c | 6 +- demos/chrisv/tileData.c | 7981 +++++++++++++++++++++++-------- tools/png2iigs.js | 17 +- 5 files changed, 6138 insertions(+), 1876 deletions(-) diff --git a/demos/chrisv/assets/tileset.png b/demos/chrisv/assets/tileset.png index 0825ec291c5f5159331b92af23ad394f019d59ff..a3e01ee28caaf34581b292f3b64c8591e032b6cd 100644 GIT binary patch delta 749 zcmaFBex6OSGr-TCmrII^fq{Y7)59f*fq@aoWN2Vv29jd4S6NO}EU0H%;pyTSQgQ3; zjE#lTh61kQa;?%0mQ3eN4?HO9YfffQ;(q5~yMuN61F<m%em?J{_c8)m-V4NE@uK~xVj63Ci!$6DYf%56f@*xeRRM_#W0BDSA6=; zI6el=r;MRV81HC5?vP&n9ipj7U0`eaFlEWbHl ze!u?Yxkc_4PwQ)&V>?gsD5N+sFJg&e2)f*=8Fa+v*rgP<1@HbB|MmqM8}(;bz^jn? z&n=e8}oKS2J#y#$2+ee$RhH zp$8V>>~*Fy8DC6yeRT9^?cYe2J_oL{bB(NS+{a7E3`bY@a@53)eB$wZ!rhYbN}j)bTBrdk@dVN1Dnsa{oH#P z6`1P_#3QC{S#K8AL?*_wz19hj_s~Pr+UjMBy z>w~0Y2;(c8Hn8lMz?!QX_dXqzVUXN#uj75ZTeRH_<}2m)GCw|8$!+7ktZu}9V*Ux4 x1F{9|cNojDP>r9Q6D%8;Er>w}ni;)*a?4p9JAN|S{39qKd%F6$taD0e0s!TXH{t*Q literal 992 zcmeAS@N?(olHy`uVBq!ia0y~yU~~YoPp~ip$!smv89<7$ILO_JVcj{Imp~3nx}&cn z1H;CC?mvmFK)ykMPlzj!c64;S%fQg*&iTKbfuVze;T^;Or40Z7Gn6ZxVPNF!Z)fb!y>B4U z+TZ9cR0$abySJD1pmt_&@{mF0W&du{FO3<0y)>uJkRp4(Q{GTD7*(e3YF_bztqI6vpf z$xp_6SKg|;ZIG4sd!L-ORLc_IKTIE$w=s)ZUzxSk<6~`nwtMr2e;)tWOy3FA!5c3; z({IcD(?-54efC=cowV!wgR(<)({d~CZ4249UY6IX=EEBH(?y5sqMOd^9@LlRee}X{ zXLa50>3bR9Pn-6jzmH8(Y}$RpQ=gt~k62=K_pR}YgJ0xyzTOp#=9e>;n3wS0@n`L! zDW?sarFv3yuVz1e&iTLg%mTLL@3FbI6@DAOKCm#}@%@42!D9X_gX5nQEbretXS?Fy zo^KDnc7lYIeqS!O!!IGnsL%dESGcVc(Os?^-Nx3grD3U;CY(+uc6P zV69hFQ@w2-Z?N%Y_6&nfwGC{CSpsJ$a0$C4Hfi_>v~n&oa1>GNID{cM|AswOjxI diff --git a/demos/chrisv/package.json b/demos/chrisv/package.json index 6ed1a9d..82132a4 100644 --- a/demos/chrisv/package.json +++ b/demos/chrisv/package.json @@ -8,13 +8,17 @@ "cadius": "C:\\Programs\\IIgsXDev\\bin\\Cadius.exe", "gsport": "C:\\Programs\\gsport\\gsport_0.31\\GSPort.exe", "macros": "../../macros", - "crossrunner": "C:\\Programs\\Crossrunner\\Crossrunner.exe" + "crossrunner": "C:\\Programs\\Crossrunner\\Crossrunner.exe", + "png2iigs": "../../tools/png2iigs.js" }, "scripts": { "gsport": "%npm_package_config_gsport%", - "test": "npm run build && build-image.bat %npm_package_config_cadius% && %npm_package_config_gsport%", + "test:all": "npm run build && npm run build:image && %npm_package_config_gsport%", "build": "npm run build:tool && npm run build:sys16", - "build:sys16": "iix compile tileData.c test.c && iix -DKeepType=S16 link test tileData keep=App", + "test": "npm run build:sys16 && npm run build:image && %npm_package_config_gsport%", + "build:image": "build-image.bat %npm_package_config_cadius%", + "build:sys16": "iix compile foo.c test.c && iix -DKeepType=S16 link test foo keep=App", + "build:tiles": "node %npm_package_config_png2iigs% ./assets/tileset.png --format orcac --max-tiles 160 --as-tile-data --verbose > tileData.c", "build:tool": "%npm_package_config_merlin32% -V %npm_package_config_macros% ../../src/Master.s", "debug": "%npm_package_config_crossrunner% ./App -Debug -CompatibilityLayer" } diff --git a/demos/chrisv/test.c b/demos/chrisv/test.c index 6583f89..aeaf668 100644 --- a/demos/chrisv/test.c +++ b/demos/chrisv/test.c @@ -79,13 +79,13 @@ void main(void) { /* GTESetScreenMode(160, 200); /* 160x200 is the default screen mode */ GTESetPalette(0, (Pointer)tilesPalette); - GTELoadTileSet(0, 50, tiles); /* Load in 50 tiles */ + GTELoadTileSet(0, 160, tiles); /* Load in the tiles */ GTEFillTileStore(1); GTERender(0); for (a = 3; a < 18; a++) { - GTESetTile(5, a, a); + GTESetTile(a, a, 5); } GTESetTile(1, 0, 34); GTESetTile(2, 0, 33); @@ -96,7 +96,7 @@ void main(void) { for (b = 4; b < 6; b++) { for (a = 1; a < 10; a++) { GTESetBG0Origin(a, b); - tileId = (((b - 1) * 10) + a) | TILE_SOLID_BIT | TILE_HFLIP_BIT; + tileId = (((b - 1) * 32) + a) | TILE_SOLID_BIT | TILE_HFLIP_BIT; GTESetTile(a, b, tileId); GTERender(0); } diff --git a/demos/chrisv/tileData.c b/demos/chrisv/tileData.c index 322fb82..73633ba 100644 --- a/demos/chrisv/tileData.c +++ b/demos/chrisv/tileData.c @@ -3,1872 +3,6127 @@ #include Word tilesPalette[16] = { - 0x0000,0x0CCC,0x0841,0x04DF,0x072C,0x000F,0x0080,0x0F70,0x0D00,0x0940,0x0FA9,0x0FF0,0x00E0,0x0DAF,0x078F,0x0FFF - //0x0000,0x0000,0x0FFF,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000 - //0x068F,0x0456,0x0E30,0x0870,0x0E51,0x00A0,0x02E3,0x0F93,0x0BF1,0x0FA4,0x0FD7,0x0F59,0x0000,0x01CE,0x0EDA,0x0EEE + 0x0000,0x0444,0x0D00,0x0841,0x0F70,0x0080,0x00E0,0x0FA0,0x0FF0,0x072C,0x000F,0x06BF,0x0888,0x0FA9,0x0DC8,0x0DFF }; -long tiles[] = { +/* Converting to BG0 format... */ +Byte tiles[] = { /* Reserved space (tile 0 is special...) */ - 0x00000000L,0x00000000L,0x00000000L,0x00000000L, - 0x00000000L,0x00000000L,0x00000000L,0x00000000L, - 0x00000000L,0x00000000L,0x00000000L,0x00000000L, - 0x00000000L,0x00000000L,0x00000000L,0x00000000L, - 0x00000000L,0x00000000L,0x00000000L,0x00000000L, - 0x00000000L,0x00000000L,0x00000000L,0x00000000L, - 0x00000000L,0x00000000L,0x00000000L,0x00000000L, - 0x00000000L,0x00000000L,0x00000000L,0x00000000L, - -/* Tile ID 1 - From image coordinates 0, 0*/ - 0x00000000, - 0x01012010, - 0x01001000, - 0x02101210, - 0x00002200, - 0x01010120, - 0x02120010, - 0x00110200, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00000000, - 0x01021010, - 0x00010010, - 0x01210120, - 0x00220000, - 0x02101010, - 0x01002120, - 0x00201100, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 2 - From image coordinates 8, 0*/ - 0x00000000, - 0x01011010, - 0x03000103, - 0x00130001, - 0x01001103, - 0x00013103, - 0x01010301, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00000000, - 0x01011010, - 0x30100030, - 0x10003100, - 0x30110010, - 0x30131000, - 0x10301010, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 3 - From image coordinates 16, 0*/ - 0x00000000, - 0x01010310, - 0x01010000, - 0x00030131, - 0x31010110, - 0x01310010, - 0x00030100, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00000000, - 0x01301010, - 0x00001010, - 0x13103000, - 0x01101013, - 0x01001310, - 0x00103000, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 4 - From image coordinates 24, 0*/ - 0x00000000, - 0x10101031, - 0x10303000, - 0x10001010, - 0x00103030, - 0x30311010, - 0x10100010, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00000000, - 0x13010101, - 0x00030301, - 0x01010001, - 0x03030100, - 0x01011303, - 0x01000101, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 5 - From image coordinates 32, 0*/ - 0x00000000, - 0x01010130, - 0x03030000, - 0x11010313, - 0x31010100, - 0x00030103, - 0x13101001, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00000000, - 0x03101010, - 0x00003030, - 0x31301011, - 0x00101013, - 0x30103000, - 0x10010131, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 6 - From image coordinates 40, 0*/ - 0x00000000, - 0x10101030, - 0x10000100, - 0x10100310, - 0x00030100, - 0x10110100, - 0x00300030, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00000000, - 0x03010101, - 0x00100001, - 0x01300101, - 0x00103000, - 0x00101101, - 0x03000300, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 7 - From image coordinates 48, 0*/ - 0x00000000, - 0x01013010, - 0x01001000, - 0x03101310, - 0x00003300, - 0x01010130, - 0x03130010, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00000000, - 0x01031010, - 0x00010010, - 0x01310130, - 0x00330000, - 0x03101010, - 0x01003130, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 8 - From image coordinates 56, 0*/ - 0x00000000, - 0x01013010, - 0x01001000, - 0x03101310, - 0x00003300, - 0x01010130, - 0x03130010, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00000000, - 0x01031010, - 0x00010010, - 0x01310130, - 0x00330000, - 0x03101010, - 0x01003130, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 9 - From image coordinates 64, 0*/ - 0x00000000, - 0x00000000, - 0x22222222, - 0x44444444, - 0x55555555, - 0x66666666, - 0x77777777, - 0x88888888, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x22222222, - 0x44444444, - 0x55555555, - 0x66666666, - 0x77777777, - 0x88888888, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 10 - From image coordinates 72, 0*/ - 0x00000000, - 0x00000000, - 0x22222222, - 0x44444444, - 0x55555555, - 0x66666666, - 0x77777777, - 0x88888888, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x22222222, - 0x44444444, - 0x55555555, - 0x66666666, - 0x77777777, - 0x88888888, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 11 - From image coordinates 0, 8*/ - 0x02210100, - 0x01102010, - 0x00101000, - 0x02101210, - 0x00010000, - 0x01010130, - 0x02120010, - 0x01113010, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00101220, - 0x01020110, - 0x00010100, - 0x01210120, - 0x00001000, - 0x03101010, - 0x01002120, - 0x01031110, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 12 - From image coordinates 8, 8*/ - 0x00000000, - 0x01011010, - 0x03000130, - 0x00130000, - 0x01001030, - 0x00013010, - 0x01010300, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00000000, - 0x01011010, - 0x03100030, - 0x00003100, - 0x03010010, - 0x01031000, - 0x00301010, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 13 - From image coordinates 16, 8*/ - 0x31313131, - 0x13131313, - 0x22222222, - 0x27722772, - 0x22277227, - 0x22222222, - 0x31313131, - 0x13131313, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x13131313, - 0x31313131, - 0x22222222, - 0x27722772, - 0x72277222, - 0x22222222, - 0x13131313, - 0x31313131, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 14 - From image coordinates 24, 8*/ - 0x31313131, - 0x13131313, - 0x22222222, - 0x27722772, - 0x72277227, - 0x22222222, - 0x31313131, - 0x13131313, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x13131313, - 0x31313131, - 0x22222222, - 0x27722772, - 0x72277227, - 0x22222222, - 0x13131313, - 0x31313131, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 15 - From image coordinates 32, 8*/ - 0x31313131, - 0x13131313, - 0x22222222, - 0x27722772, - 0x72277222, - 0x22222222, - 0x31313131, - 0x13131313, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x13131313, - 0x31313131, - 0x22222222, - 0x27722772, - 0x22277227, - 0x22222222, - 0x13131313, - 0x31313131, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 16 - From image coordinates 40, 8*/ - 0x00000000, - 0x01101030, - 0x03000100, - 0x01100310, - 0x00030000, - 0x03110100, - 0x01300030, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00000000, - 0x03010110, - 0x00100030, - 0x01300110, - 0x00003000, - 0x00101130, - 0x03000310, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 17 - From image coordinates 48, 8*/ - 0x31999931, - 0x13997913, - 0x31997931, - 0x13979913, - 0x31979931, - 0x13997913, - 0x31997931, - 0x13979913, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x13999913, - 0x31979931, - 0x13979913, - 0x31997931, - 0x13997913, - 0x31979931, - 0x13979913, - 0x31997931, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 18 - From image coordinates 56, 8*/ - 0x31033031, - 0x13033013, - 0x31033031, - 0x13033013, - 0x31033031, - 0x13033013, - 0x31033031, - 0x13033013, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x13033013, - 0x31033031, - 0x13033013, - 0x31033031, - 0x13033013, - 0x31033031, - 0x13033013, - 0x31033031, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 19 - From image coordinates 64, 8*/ - 0xaaaaaaaa, - 0xbbbbbbbb, - 0xcccccccc, - 0x33333333, - 0xdddddddd, - 0xeeeeeeee, - 0x11111111, - 0xffffffff, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0xaaaaaaaa, - 0xbbbbbbbb, - 0xcccccccc, - 0x33333333, - 0xdddddddd, - 0xeeeeeeee, - 0x11111111, - 0xffffffff, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 20 - From image coordinates 72, 8*/ - 0xaaaaaaaa, - 0xbbbbbbbb, - 0xcccccccc, - 0x33333333, - 0xdddddddd, - 0xeeeeeeee, - 0x11111111, - 0xffffffff, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0xaaaaaaaa, - 0xbbbbbbbb, - 0xcccccccc, - 0x33333333, - 0xdddddddd, - 0xeeeeeeee, - 0x11111111, - 0xffffffff, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 21 - From image coordinates 0, 16*/ - 0x00031100, - 0x01013010, - 0x01001000, - 0x03101310, - 0x00000100, - 0x01010130, - 0x03130110, - 0x01101300, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00113000, - 0x01031010, - 0x00010010, - 0x01310130, - 0x00100000, - 0x03101010, - 0x01103130, - 0x00310110, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 22 - From image coordinates 8, 16*/ - 0x00000000, - 0x01011010, - 0x03000130, - 0x00130000, - 0x01001030, - 0x00013010, - 0x01010300, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00000000, - 0x01011010, - 0x03100030, - 0x00003100, - 0x03010010, - 0x01031000, - 0x00301010, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 23 - From image coordinates 16, 16*/ - 0x31313131, - 0x13131313, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x31313131, - 0x13131313, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x13131313, - 0x31313131, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x13131313, - 0x31313131, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 24 - From image coordinates 24, 16*/ - 0x31313131, - 0x13131313, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x31313131, - 0x13131313, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x13131313, - 0x31313131, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x13131313, - 0x31313131, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 25 - From image coordinates 32, 16*/ - 0x31313131, - 0x13131313, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x31313131, - 0x13131313, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x13131313, - 0x31313131, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x13131313, - 0x31313131, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 26 - From image coordinates 40, 16*/ - 0x00000000, - 0x01101030, - 0x03000100, - 0x01100310, - 0x00030000, - 0x03110100, - 0x01300030, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00000000, - 0x03010110, - 0x00100030, - 0x01300110, - 0x00003000, - 0x00101130, - 0x03000310, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 27 - From image coordinates 48, 16*/ - 0x31979931, - 0x13997913, - 0x31997931, - 0x13979913, - 0x31979931, - 0x13997913, - 0x31997931, - 0x13979913, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x13997913, - 0x31979931, - 0x13979913, - 0x31997931, - 0x13997913, - 0x31979931, - 0x13979913, - 0x31997931, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 28 - From image coordinates 56, 16*/ - 0x31033031, - 0x13033013, - 0x31033031, - 0x13033013, - 0x31033031, - 0x13033013, - 0x31033031, - 0x13033013, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x13033013, - 0x31033031, - 0x13033013, - 0x31033031, - 0x13033013, - 0x31033031, - 0x13033013, - 0x31033031, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 29 - From image coordinates 64, 16*/ - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 30 - From image coordinates 72, 16*/ - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 31 - From image coordinates 0, 24*/ - 0x00011010, - 0x01013010, - 0x01001000, - 0x03101310, - 0x00100000, - 0x01010130, - 0x03130010, - 0x01010300, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x01011000, - 0x01031010, - 0x00010010, - 0x01310130, - 0x00000100, - 0x03101010, - 0x01003130, - 0x00301010, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 32 - From image coordinates 8, 24*/ - 0x00000000, - 0x01013010, - 0x01001000, - 0x03101310, - 0x00003300, - 0x01010130, - 0x03130010, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00000000, - 0x01031010, - 0x00010010, - 0x01310130, - 0x00330000, - 0x03101010, - 0x01003130, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 33 - From image coordinates 16, 24*/ - 0x00000077, - 0x00007776, - 0x00077666, - 0x00776666, - 0x07766676, - 0x07766676, - 0x77766666, - 0x77776666, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x77000000, - 0x67770000, - 0x66677000, - 0x66667700, - 0x67666770, - 0x67666770, - 0x66666777, - 0x66667777, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 34 - From image coordinates 24, 24*/ - 0x77000000, - 0x77770000, - 0x66777000, - 0x66667700, - 0x76667770, - 0x77777770, - 0x77777777, - 0x66777777, - - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - - 0x00000077, - 0x00007777, - 0x00077766, - 0x00776666, - 0x07776667, - 0x07777777, - 0x77777777, - 0x77777766, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 35 - From image coordinates 32, 24*/ - 0x00000088, - 0x00008888, - 0x000888ff, - 0x00888fff, - 0x0888fff8, - 0x0888fff8, - 0x88888888, - 0x8888888f, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x88000000, - 0x88880000, - 0xff888000, - 0xfff88800, - 0x8fff8880, - 0x8fff8880, - 0x88888888, - 0xf8888888, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 36 - From image coordinates 40, 24*/ - 0x88000000, - 0x88880000, - 0xff888000, - 0xfff88800, - 0x8fff8880, - 0x8fff8880, - 0xffff8888, - 0xfff88888, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00000088, - 0x00008888, - 0x000888ff, - 0x00888fff, - 0x0888fff8, - 0x0888fff8, - 0x8888ffff, - 0x88888fff, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 37 - From image coordinates 48, 24*/ - 0x31979931, - 0x13997913, - 0x31997931, - 0x13979913, - 0x31979931, - 0x13997913, - 0x31997931, - 0x13999913, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x13997913, - 0x31979931, - 0x13979913, - 0x31997931, - 0x13997913, - 0x31979931, - 0x13979913, - 0x31999931, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 38 - From image coordinates 56, 24*/ - 0x31033031, - 0x13033013, - 0x31033031, - 0x13033013, - 0x31033031, - 0x13033013, - 0x31033031, - 0x13033013, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x13033013, - 0x31033031, - 0x13033013, - 0x31033031, - 0x13033013, - 0x31033031, - 0x13033013, - 0x31033031, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 39 - From image coordinates 64, 24*/ - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 40 - From image coordinates 72, 24*/ - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 41 - From image coordinates 0, 32*/ - 0x00310110, - 0x01013010, - 0x01001000, - 0x03101310, - 0x03030100, - 0x01010130, - 0x03130010, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x01101300, - 0x01031010, - 0x00010010, - 0x01310130, - 0x00103030, - 0x03101010, - 0x01003130, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 42 - From image coordinates 8, 32*/ - 0x31313131, - 0x13131313, - 0x31313131, - 0x13131313, - 0x31313131, - 0x13131313, - 0x31313131, - 0x13131313, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x13131313, - 0x31313131, - 0x13131313, - 0x31313131, - 0x13131313, - 0x31313131, - 0x13131313, - 0x31313131, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 43 - From image coordinates 16, 32*/ - 0x77777666, - 0x77777776, - 0x07777776, - 0x07766676, - 0x00776666, - 0x00077666, - 0x00007776, - 0x00000077, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x66677777, - 0x67777777, - 0x67777770, - 0x67666770, - 0x66667700, - 0x66677000, - 0x67770000, - 0x77000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 44 - From image coordinates 24, 32*/ - 0x66677777, - 0x66667777, - 0x76667770, - 0x76667770, - 0x66677700, - 0x66777000, - 0x77770000, - 0x77000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x77777666, - 0x77776666, - 0x07776667, - 0x07776667, - 0x00777666, - 0x00077766, - 0x00007777, - 0x00000077, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 45 - From image coordinates 32, 32*/ - 0x888888ff, - 0x888888ff, - 0x08888888, - 0x088888ff, - 0x008888ff, - 0x000888ff, - 0x00008888, - 0x00000088, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0xff888888, - 0xff888888, - 0x88888880, - 0xff888880, - 0xff888800, - 0xff888000, - 0x88880000, - 0x88000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 46 - From image coordinates 40, 32*/ - 0xff888888, - 0xf8888888, - 0x88888880, - 0xf8888880, - 0xf8888800, - 0xf8888000, - 0x88880000, - 0x88000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x888888ff, - 0x8888888f, - 0x08888888, - 0x0888888f, - 0x0088888f, - 0x0008888f, - 0x00008888, - 0x00000088, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 47 - From image coordinates 48, 32*/ - 0x00000000, - 0x01013010, - 0x01001000, - 0x03101310, - 0x03030100, - 0x01010130, - 0x03130010, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00000000, - 0x01031010, - 0x00010010, - 0x01310130, - 0x00103030, - 0x03101010, - 0x01003130, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 48 - From image coordinates 56, 32*/ - 0x00000000, - 0x01013010, - 0x01001000, - 0x03101310, - 0x03030100, - 0x01010130, - 0x03130010, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0x00000000, - 0x01031010, - 0x00010010, - 0x01310130, - 0x00103030, - 0x03101010, - 0x01003130, - 0x00000000, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 49 - From image coordinates 64, 32*/ - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - -/* Tile ID 50 - From image coordinates 72, 32*/ - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - 0xffffffff, - - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, - 0x00000000, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + +/* Tile ID 1, isSolid: true */ + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x0C, 0x10, 0xC0, + 0x0C, 0x00, 0xC0, 0x00, + 0x01, 0xC0, 0xC1, 0xC0, + 0x00, 0x00, 0x11, 0x00, + 0x0C, 0x0C, 0x0C, 0x10, + 0x01, 0xC1, 0x00, 0xC0, + 0x00, 0xCC, 0x01, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x01, 0xC0, 0xC0, + 0x00, 0x0C, 0x00, 0xC0, + 0x0C, 0x1C, 0x0C, 0x10, + 0x00, 0x11, 0x00, 0x00, + 0x01, 0xC0, 0xC0, 0xC0, + 0x0C, 0x00, 0x1C, 0x10, + 0x00, 0x10, 0xCC, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 2, isSolid: true */ + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x0C, 0xC0, 0xC0, + 0x01, 0x00, 0x0C, 0x01, + 0x00, 0xC1, 0x00, 0x0C, + 0x0C, 0x00, 0xCC, 0x01, + 0x00, 0x0C, 0x1C, 0x01, + 0x0C, 0x0C, 0x01, 0x0C, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x0C, 0xC0, 0xC0, + 0x10, 0xC0, 0x00, 0x10, + 0xC0, 0x00, 0x1C, 0x00, + 0x10, 0xCC, 0x00, 0xC0, + 0x10, 0xC1, 0xC0, 0x00, + 0xC0, 0x10, 0xC0, 0xC0, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 3, isSolid: true */ + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x0C, 0x01, 0xC0, + 0x0C, 0x0C, 0x00, 0x00, + 0x00, 0x01, 0x0C, 0x1C, + 0x1C, 0x0C, 0x0C, 0xC0, + 0x0C, 0x1C, 0x00, 0xC0, + 0x00, 0x01, 0x0C, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x10, 0xC0, 0xC0, + 0x00, 0x00, 0xC0, 0xC0, + 0xC1, 0xC0, 0x10, 0x00, + 0x0C, 0xC0, 0xC0, 0xC1, + 0x0C, 0x00, 0xC1, 0xC0, + 0x00, 0xC0, 0x10, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 4, isSolid: true */ + 0x00, 0x00, 0x00, 0x00, + 0xC0, 0xC0, 0xC0, 0x1C, + 0xC0, 0x10, 0x10, 0x00, + 0xC0, 0x00, 0xC0, 0xC0, + 0x00, 0xC0, 0x10, 0x10, + 0x10, 0x1C, 0xC0, 0xC0, + 0xC0, 0xC0, 0x00, 0xC0, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0xC1, 0x0C, 0x0C, 0x0C, + 0x00, 0x01, 0x01, 0x0C, + 0x0C, 0x0C, 0x00, 0x0C, + 0x01, 0x01, 0x0C, 0x00, + 0x0C, 0x0C, 0xC1, 0x01, + 0x0C, 0x00, 0x0C, 0x0C, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 5, isSolid: true */ + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x0C, 0x0C, 0x10, + 0x01, 0x01, 0x00, 0x00, + 0xCC, 0x0C, 0x01, 0xC1, + 0x1C, 0x0C, 0x0C, 0x00, + 0x00, 0x01, 0x0C, 0x01, + 0xC1, 0xC0, 0xC0, 0x0C, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x01, 0xC0, 0xC0, 0xC0, + 0x00, 0x00, 0x10, 0x10, + 0x1C, 0x10, 0xC0, 0xCC, + 0x00, 0xC0, 0xC0, 0xC1, + 0x10, 0xC0, 0x10, 0x00, + 0xC0, 0x0C, 0x0C, 0x1C, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 6, isSolid: true */ + 0x00, 0x00, 0x00, 0x00, + 0xC0, 0xC0, 0xC0, 0x10, + 0xC0, 0x00, 0x0C, 0x00, + 0xC0, 0xC0, 0x01, 0xC0, + 0x00, 0x01, 0x0C, 0x00, + 0xC0, 0xCC, 0x0C, 0x00, + 0x00, 0x10, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x01, 0x0C, 0x0C, 0x0C, + 0x00, 0xC0, 0x00, 0x0C, + 0x0C, 0x10, 0x0C, 0x0C, + 0x00, 0xC0, 0x10, 0x00, + 0x00, 0xC0, 0xCC, 0x0C, + 0x01, 0x00, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 7, isSolid: true */ + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x0C, 0x10, 0xC0, + 0x0C, 0x00, 0xC0, 0x00, + 0x01, 0xC0, 0xC1, 0xC0, + 0x00, 0x00, 0x11, 0x00, + 0x0C, 0x0C, 0x0C, 0x10, + 0x01, 0xC1, 0x00, 0xC0, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x01, 0xC0, 0xC0, + 0x00, 0x0C, 0x00, 0xC0, + 0x0C, 0x1C, 0x0C, 0x10, + 0x00, 0x11, 0x00, 0x00, + 0x01, 0xC0, 0xC0, 0xC0, + 0x0C, 0x00, 0x1C, 0x10, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 8, isSolid: true */ + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x0C, 0x10, 0xC0, + 0x0C, 0x00, 0xC0, 0x00, + 0x01, 0xC0, 0xC1, 0xC0, + 0x00, 0x00, 0x11, 0x00, + 0x0C, 0x0C, 0x0C, 0x10, + 0x01, 0xC1, 0x00, 0xC0, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x01, 0xC0, 0xC0, + 0x00, 0x0C, 0x00, 0xC0, + 0x0C, 0x1C, 0x0C, 0x10, + 0x00, 0x11, 0x00, 0x00, + 0x01, 0xC0, 0xC0, 0xC0, + 0x0C, 0x00, 0x1C, 0x10, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 9, isSolid: true */ + 0x00, 0x00, 0x00, 0x00, + 0xCC, 0xCC, 0xCC, 0xCC, + 0x33, 0x33, 0x33, 0x33, + 0x99, 0x99, 0x99, 0x99, + 0xAA, 0xAA, 0xAA, 0xAA, + 0x55, 0x55, 0x55, 0x55, + 0x44, 0x44, 0x44, 0x44, + 0x22, 0x22, 0x22, 0x22, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0xCC, 0xCC, 0xCC, 0xCC, + 0x33, 0x33, 0x33, 0x33, + 0x99, 0x99, 0x99, 0x99, + 0xAA, 0xAA, 0xAA, 0xAA, + 0x55, 0x55, 0x55, 0x55, + 0x44, 0x44, 0x44, 0x44, + 0x22, 0x22, 0x22, 0x22, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 10, isSolid: true */ + 0x00, 0x00, 0x00, 0x00, + 0xCC, 0xCC, 0xCC, 0xCC, + 0x33, 0x33, 0x33, 0x33, + 0x99, 0x99, 0x99, 0x99, + 0xAA, 0xAA, 0xAA, 0xAA, + 0x55, 0x55, 0x55, 0x55, + 0x44, 0x44, 0x44, 0x44, + 0x22, 0x22, 0x22, 0x22, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0xCC, 0xCC, 0xCC, 0xCC, + 0x33, 0x33, 0x33, 0x33, + 0x99, 0x99, 0x99, 0x99, + 0xAA, 0xAA, 0xAA, 0xAA, + 0x55, 0x55, 0x55, 0x55, + 0x44, 0x44, 0x44, 0x44, + 0x22, 0x22, 0x22, 0x22, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 11, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 12, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 13, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 14, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 15, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 16, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 17, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 18, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 19, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 20, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 21, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 22, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 23, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 24, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 25, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 26, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 27, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 28, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 29, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 30, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 31, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 32, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 33, isSolid: true */ + 0x01, 0x1C, 0x0C, 0x00, + 0x0C, 0xC0, 0x10, 0xC0, + 0x00, 0xC0, 0xC0, 0x00, + 0x01, 0xC0, 0xC1, 0xC0, + 0x00, 0x0C, 0x00, 0x00, + 0x0C, 0x0C, 0x0C, 0x10, + 0x01, 0xC1, 0x00, 0xC0, + 0x0C, 0xCC, 0x10, 0xC0, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0xC0, 0xC1, 0x10, + 0x0C, 0x01, 0x0C, 0xC0, + 0x00, 0x0C, 0x0C, 0x00, + 0x0C, 0x1C, 0x0C, 0x10, + 0x00, 0x00, 0xC0, 0x00, + 0x01, 0xC0, 0xC0, 0xC0, + 0x0C, 0x00, 0x1C, 0x10, + 0x0C, 0x01, 0xCC, 0xC0, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 34, isSolid: true */ + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x0C, 0xC0, 0xC0, + 0x01, 0x00, 0x0C, 0x10, + 0x00, 0xC1, 0x00, 0x00, + 0x0C, 0x00, 0xC0, 0x10, + 0x00, 0x0C, 0x10, 0xC0, + 0x0C, 0x0C, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x0C, 0xC0, 0xC0, + 0x01, 0xC0, 0x00, 0x10, + 0x00, 0x00, 0x1C, 0x00, + 0x01, 0x0C, 0x00, 0xC0, + 0x0C, 0x01, 0xC0, 0x00, + 0x00, 0x10, 0xC0, 0xC0, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 35, isSolid: true */ + 0x1C, 0x1C, 0x1C, 0x1C, + 0xC1, 0xC1, 0xC1, 0xC1, + 0x33, 0x33, 0x33, 0x33, + 0x3E, 0xE3, 0x3E, 0xE3, + 0x33, 0x3E, 0xE3, 0x3E, + 0x33, 0x33, 0x33, 0x33, + 0xFC, 0xFC, 0xFC, 0xFC, + 0xCF, 0xCF, 0xCF, 0xCF, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xC1, 0xC1, 0xC1, 0xC1, + 0x1C, 0x1C, 0x1C, 0x1C, + 0x33, 0x33, 0x33, 0x33, + 0x3E, 0xE3, 0x3E, 0xE3, + 0xE3, 0x3E, 0xE3, 0x33, + 0x33, 0x33, 0x33, 0x33, + 0xCF, 0xCF, 0xCF, 0xCF, + 0xFC, 0xFC, 0xFC, 0xFC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 36, isSolid: true */ + 0x1C, 0x1C, 0x1C, 0x1C, + 0xC1, 0xC1, 0xC1, 0xC1, + 0x33, 0x33, 0x33, 0x33, + 0x3E, 0xE3, 0x3E, 0xE3, + 0xE3, 0x3E, 0xE3, 0x3E, + 0x33, 0x33, 0x33, 0x33, + 0xFC, 0xFC, 0xFC, 0xFC, + 0xCF, 0xCF, 0xCF, 0xCF, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xC1, 0xC1, 0xC1, 0xC1, + 0x1C, 0x1C, 0x1C, 0x1C, + 0x33, 0x33, 0x33, 0x33, + 0x3E, 0xE3, 0x3E, 0xE3, + 0xE3, 0x3E, 0xE3, 0x3E, + 0x33, 0x33, 0x33, 0x33, + 0xCF, 0xCF, 0xCF, 0xCF, + 0xFC, 0xFC, 0xFC, 0xFC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 37, isSolid: true */ + 0x1C, 0x1C, 0x1C, 0x1C, + 0xC1, 0xC1, 0xC1, 0xC1, + 0x33, 0x33, 0x33, 0x33, + 0x3E, 0xE3, 0x3E, 0xE3, + 0xE3, 0x3E, 0xE3, 0x33, + 0x33, 0x33, 0x33, 0x33, + 0xFC, 0xFC, 0xFC, 0xFC, + 0xCF, 0xCF, 0xCF, 0xCF, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xC1, 0xC1, 0xC1, 0xC1, + 0x1C, 0x1C, 0x1C, 0x1C, + 0x33, 0x33, 0x33, 0x33, + 0x3E, 0xE3, 0x3E, 0xE3, + 0x33, 0x3E, 0xE3, 0x3E, + 0x33, 0x33, 0x33, 0x33, + 0xCF, 0xCF, 0xCF, 0xCF, + 0xFC, 0xFC, 0xFC, 0xFC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 38, isSolid: true */ + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0xC0, 0xC0, 0x10, + 0x01, 0x00, 0x0C, 0x00, + 0x0C, 0xC0, 0x01, 0xC0, + 0x00, 0x01, 0x00, 0x00, + 0x01, 0xCC, 0x0C, 0x00, + 0x0C, 0x10, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x01, 0x0C, 0x0C, 0xC0, + 0x00, 0xC0, 0x00, 0x10, + 0x0C, 0x10, 0x0C, 0xC0, + 0x00, 0x00, 0x10, 0x00, + 0x00, 0xC0, 0xCC, 0x10, + 0x01, 0x00, 0x01, 0xC0, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 39, isSolid: true */ + 0x1C, 0x33, 0x33, 0x1C, + 0xC1, 0x33, 0xE3, 0xC1, + 0x1C, 0x33, 0xE3, 0x1C, + 0xC1, 0x3E, 0x33, 0xC1, + 0x1C, 0x3E, 0x33, 0x1C, + 0xC1, 0x33, 0xE3, 0xC1, + 0x1C, 0x33, 0xE3, 0x1C, + 0xC1, 0x3E, 0x33, 0xC1, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xC1, 0x33, 0x33, 0xC1, + 0x1C, 0x3E, 0x33, 0x1C, + 0xC1, 0x3E, 0x33, 0xC1, + 0x1C, 0x33, 0xE3, 0x1C, + 0xC1, 0x33, 0xE3, 0xC1, + 0x1C, 0x3E, 0x33, 0x1C, + 0xC1, 0x3E, 0x33, 0xC1, + 0x1C, 0x33, 0xE3, 0x1C, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 40, isSolid: true */ + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 41, isSolid: true */ + 0xDD, 0xDD, 0xDD, 0xDD, + 0x88, 0x88, 0x88, 0x88, + 0x66, 0x66, 0x66, 0x66, + 0xBB, 0xBB, 0xBB, 0xBB, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xBB, 0xBB, 0xBB, 0xBB, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xDD, 0xDD, 0xDD, 0xDD, + 0x88, 0x88, 0x88, 0x88, + 0x66, 0x66, 0x66, 0x66, + 0xBB, 0xBB, 0xBB, 0xBB, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xBB, 0xBB, 0xBB, 0xBB, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 42, isSolid: true */ + 0xDD, 0xDD, 0xDD, 0xDD, + 0x88, 0x88, 0x88, 0x88, + 0x66, 0x66, 0x66, 0x66, + 0xBB, 0xBB, 0xBB, 0xBB, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xBB, 0xBB, 0xBB, 0xBB, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xDD, 0xDD, 0xDD, 0xDD, + 0x88, 0x88, 0x88, 0x88, + 0x66, 0x66, 0x66, 0x66, + 0xBB, 0xBB, 0xBB, 0xBB, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xBB, 0xBB, 0xBB, 0xBB, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 43, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 44, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 45, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 46, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 47, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 48, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 49, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 50, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 51, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 52, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 53, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 54, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 55, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 56, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 57, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 58, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 59, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 60, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 61, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 62, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 63, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 64, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 65, isSolid: true */ + 0x00, 0x01, 0xCC, 0x00, + 0x0C, 0x0C, 0x10, 0xC0, + 0x0C, 0x00, 0xC0, 0x00, + 0x01, 0xC0, 0xC1, 0xC0, + 0x00, 0x00, 0x0C, 0x00, + 0x0C, 0x0C, 0x0C, 0x10, + 0x01, 0xC1, 0x0C, 0xC0, + 0x0C, 0xC0, 0xC1, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0xCC, 0x10, 0x00, + 0x0C, 0x01, 0xC0, 0xC0, + 0x00, 0x0C, 0x00, 0xC0, + 0x0C, 0x1C, 0x0C, 0x10, + 0x00, 0xC0, 0x00, 0x00, + 0x01, 0xC0, 0xC0, 0xC0, + 0x0C, 0xC0, 0x1C, 0x10, + 0x00, 0x1C, 0x0C, 0xC0, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 66, isSolid: true */ + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x0C, 0xC0, 0xC0, + 0x01, 0x00, 0x0C, 0x10, + 0x00, 0xC1, 0x00, 0x00, + 0x0C, 0x00, 0xC0, 0x10, + 0x00, 0x0C, 0x10, 0xC0, + 0x0C, 0x0C, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x0C, 0xC0, 0xC0, + 0x01, 0xC0, 0x00, 0x10, + 0x00, 0x00, 0x1C, 0x00, + 0x01, 0x0C, 0x00, 0xC0, + 0x0C, 0x01, 0xC0, 0x00, + 0x00, 0x10, 0xC0, 0xC0, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 67, isSolid: true */ + 0xFC, 0xFC, 0xFC, 0xFC, + 0xCF, 0xCF, 0xCF, 0xCF, + 0x00, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x00, 0x00, 0x00, 0x00, + 0xFC, 0xFC, 0xFC, 0xFC, + 0xCF, 0xCF, 0xCF, 0xCF, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCF, 0xCF, 0xCF, 0xCF, + 0xFC, 0xFC, 0xFC, 0xFC, + 0x00, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x00, 0x00, 0x00, 0x00, + 0xCF, 0xCF, 0xCF, 0xCF, + 0xFC, 0xFC, 0xFC, 0xFC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 68, isSolid: true */ + 0xFC, 0xFC, 0xFC, 0xFC, + 0xCF, 0xCF, 0xCF, 0xCF, + 0x00, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x00, 0x00, 0x00, 0x00, + 0xFC, 0xFC, 0xFC, 0xFC, + 0xCF, 0xCF, 0xCF, 0xCF, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCF, 0xCF, 0xCF, 0xCF, + 0xFC, 0xFC, 0xFC, 0xFC, + 0x00, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x00, 0x00, 0x00, 0x00, + 0xCF, 0xCF, 0xCF, 0xCF, + 0xFC, 0xFC, 0xFC, 0xFC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 69, isSolid: true */ + 0xFC, 0xFC, 0xFC, 0xFC, + 0xCF, 0xCF, 0xCF, 0xCF, + 0x00, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x00, 0x00, 0x00, 0x00, + 0xFC, 0xFC, 0xFC, 0xFC, + 0xCF, 0xCF, 0xCF, 0xC1, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCF, 0xCF, 0xCF, 0xCF, + 0xFC, 0xFC, 0xFC, 0xFC, + 0x00, 0x00, 0x00, 0x00, + 0x11, 0x11, 0x11, 0x11, + 0x11, 0x11, 0x11, 0x11, + 0x00, 0x00, 0x00, 0x00, + 0xCF, 0xCF, 0xCF, 0xCF, + 0x1C, 0xFC, 0xFC, 0xFC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 70, isSolid: true */ + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0xC0, 0xC0, 0x10, + 0x01, 0x00, 0x0C, 0x00, + 0x0C, 0xC0, 0x01, 0xC0, + 0x00, 0x01, 0x00, 0x00, + 0x01, 0xCC, 0x0C, 0x00, + 0x0C, 0x10, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x01, 0x0C, 0x0C, 0xC0, + 0x00, 0xC0, 0x00, 0x10, + 0x0C, 0x10, 0x0C, 0xC0, + 0x00, 0x00, 0x10, 0x00, + 0x00, 0xC0, 0xCC, 0x10, + 0x01, 0x00, 0x01, 0xC0, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 71, isSolid: true */ + 0x1C, 0x3E, 0x33, 0x1C, + 0xC1, 0x33, 0xE3, 0xC1, + 0x1C, 0x33, 0xE3, 0x1C, + 0xC1, 0x3E, 0x33, 0xC1, + 0x1C, 0x3E, 0x33, 0x1C, + 0xC1, 0x33, 0xE3, 0xC1, + 0x1C, 0x33, 0xE3, 0x1C, + 0xC1, 0x3E, 0x33, 0xC1, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xC1, 0x33, 0xE3, 0xC1, + 0x1C, 0x3E, 0x33, 0x1C, + 0xC1, 0x3E, 0x33, 0xC1, + 0x1C, 0x33, 0xE3, 0x1C, + 0xC1, 0x33, 0xE3, 0xC1, + 0x1C, 0x3E, 0x33, 0x1C, + 0xC1, 0x3E, 0x33, 0xC1, + 0x1C, 0x33, 0xE3, 0x1C, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 72, isSolid: true */ + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 73, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 74, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 75, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 76, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 77, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 78, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 79, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 80, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 81, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 82, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 83, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 84, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 85, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 86, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 87, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 88, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 89, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 90, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 91, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 92, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 93, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 94, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 95, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 96, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 97, isSolid: true */ + 0x00, 0x0C, 0xC0, 0xC0, + 0x0C, 0x0C, 0x10, 0xC0, + 0x0C, 0x00, 0xC0, 0x00, + 0x01, 0xC0, 0xC1, 0xC0, + 0x00, 0xC0, 0x00, 0x00, + 0x0C, 0x0C, 0x0C, 0x10, + 0x01, 0xC1, 0x00, 0xC0, + 0x0C, 0x0C, 0x01, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x0C, 0x0C, 0xC0, 0x00, + 0x0C, 0x01, 0xC0, 0xC0, + 0x00, 0x0C, 0x00, 0xC0, + 0x0C, 0x1C, 0x0C, 0x10, + 0x00, 0x00, 0x0C, 0x00, + 0x01, 0xC0, 0xC0, 0xC0, + 0x0C, 0x00, 0x1C, 0x10, + 0x00, 0x10, 0xC0, 0xC0, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 98, isSolid: true */ + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x0C, 0x10, 0xC0, + 0x0C, 0x00, 0xC0, 0x00, + 0x01, 0xC0, 0xC1, 0xC0, + 0x00, 0x00, 0x11, 0x00, + 0x0C, 0x0C, 0x0C, 0x10, + 0x01, 0xC1, 0x00, 0xC0, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x01, 0xC0, 0xC0, + 0x00, 0x0C, 0x00, 0xC0, + 0x0C, 0x1C, 0x0C, 0x10, + 0x00, 0x11, 0x00, 0x00, + 0x01, 0xC0, 0xC0, 0xC0, + 0x0C, 0x00, 0x1C, 0x10, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 99, isSolid: true */ + 0x00, 0x00, 0x00, 0x44, + 0x00, 0x00, 0x44, 0x45, + 0x00, 0x04, 0x45, 0x55, + 0x00, 0x44, 0x55, 0x55, + 0x04, 0x45, 0x55, 0x75, + 0x04, 0x45, 0x55, 0x75, + 0x44, 0x45, 0x55, 0x55, + 0x44, 0x44, 0x55, 0x55, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x44, 0x00, 0x00, 0x00, + 0x54, 0x44, 0x00, 0x00, + 0x55, 0x54, 0x40, 0x00, + 0x55, 0x55, 0x44, 0x00, + 0x57, 0x55, 0x54, 0x40, + 0x57, 0x55, 0x54, 0x40, + 0x55, 0x55, 0x54, 0x44, + 0x55, 0x55, 0x44, 0x44, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 100, isSolid: true */ + 0x44, 0x00, 0x00, 0x00, + 0x44, 0x44, 0x00, 0x00, + 0x55, 0x44, 0x40, 0x00, + 0x55, 0x55, 0x44, 0x00, + 0x45, 0x55, 0x44, 0x40, + 0x44, 0x44, 0x44, 0x40, + 0x44, 0x44, 0x44, 0x44, + 0x55, 0x44, 0x44, 0x44, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x44, + 0x00, 0x00, 0x44, 0x44, + 0x00, 0x04, 0x44, 0x55, + 0x00, 0x44, 0x55, 0x55, + 0x04, 0x44, 0x55, 0x54, + 0x04, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x55, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 101, isSolid: true */ + 0x00, 0x00, 0x00, 0x22, + 0x00, 0x00, 0x22, 0x22, + 0x00, 0x02, 0x22, 0xFF, + 0x00, 0x22, 0x2F, 0xFF, + 0x02, 0x22, 0xFF, 0xF2, + 0x02, 0x22, 0xFF, 0xF2, + 0x22, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x2F, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x22, 0x00, 0x00, 0x00, + 0x22, 0x22, 0x00, 0x00, + 0xFF, 0x22, 0x20, 0x00, + 0xFF, 0xF2, 0x22, 0x00, + 0x2F, 0xFF, 0x22, 0x20, + 0x2F, 0xFF, 0x22, 0x20, + 0x22, 0x22, 0x22, 0x22, + 0xF2, 0x22, 0x22, 0x22, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 102, isSolid: true */ + 0x22, 0x00, 0x00, 0x00, + 0x22, 0x22, 0x00, 0x00, + 0xFF, 0x22, 0x20, 0x00, + 0xFF, 0xF2, 0x22, 0x00, + 0x2F, 0xFF, 0x22, 0x20, + 0x2F, 0xFF, 0x22, 0x20, + 0xFF, 0xFF, 0x22, 0x22, + 0xFF, 0xF2, 0x22, 0x22, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x22, + 0x00, 0x00, 0x22, 0x22, + 0x00, 0x02, 0x22, 0xFF, + 0x00, 0x22, 0x2F, 0xFF, + 0x02, 0x22, 0xFF, 0xF2, + 0x02, 0x22, 0xFF, 0xF2, + 0x22, 0x22, 0xFF, 0xFF, + 0x22, 0x22, 0x2F, 0xFF, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 103, isSolid: true */ + 0x1C, 0x3E, 0x33, 0x1C, + 0xC1, 0x33, 0xE3, 0xC1, + 0x1C, 0x33, 0xE3, 0x1C, + 0xC1, 0x3E, 0x33, 0xC1, + 0x1C, 0x3E, 0x33, 0x1C, + 0xC1, 0x33, 0xE3, 0xC1, + 0x1C, 0x33, 0xE3, 0x1C, + 0xC1, 0x33, 0x33, 0xC1, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xC1, 0x33, 0xE3, 0xC1, + 0x1C, 0x3E, 0x33, 0x1C, + 0xC1, 0x3E, 0x33, 0xC1, + 0x1C, 0x33, 0xE3, 0x1C, + 0xC1, 0x33, 0xE3, 0xC1, + 0x1C, 0x3E, 0x33, 0x1C, + 0xC1, 0x3E, 0x33, 0xC1, + 0x1C, 0x33, 0x33, 0x1C, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 104, isSolid: true */ + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + 0xC1, 0x01, 0x10, 0xC1, + 0x1C, 0x01, 0x10, 0x1C, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 105, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 106, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 107, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 108, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 109, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 110, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 111, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 112, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 113, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 114, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 115, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 116, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 117, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 118, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 119, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 120, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 121, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 122, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 123, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 124, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 125, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 126, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 127, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 128, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 129, isSolid: true */ + 0x00, 0x1C, 0x0C, 0xC0, + 0x0C, 0x0C, 0x10, 0xC0, + 0x0C, 0x00, 0xC0, 0x00, + 0x01, 0xC0, 0xC1, 0xC0, + 0x01, 0x01, 0x0C, 0x00, + 0x0C, 0x0C, 0x0C, 0x10, + 0x01, 0xC1, 0x00, 0xC0, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x0C, 0xC0, 0xC1, 0x00, + 0x0C, 0x01, 0xC0, 0xC0, + 0x00, 0x0C, 0x00, 0xC0, + 0x0C, 0x1C, 0x0C, 0x10, + 0x00, 0xC0, 0x10, 0x10, + 0x01, 0xC0, 0xC0, 0xC0, + 0x0C, 0x00, 0x1C, 0x10, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 130, isSolid: true */ + 0x1C, 0x1C, 0x1C, 0x1C, + 0xC1, 0xC1, 0xC1, 0xC1, + 0x1C, 0x1C, 0x1C, 0x1C, + 0xC1, 0xC1, 0xC1, 0xC1, + 0x1C, 0x1C, 0x1C, 0x1C, + 0xC1, 0xC1, 0xC1, 0xC1, + 0x1C, 0x1C, 0x1C, 0x1C, + 0xC1, 0xC1, 0xC1, 0xC1, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xC1, 0xC1, 0xC1, 0xC1, + 0x1C, 0x1C, 0x1C, 0x1C, + 0xC1, 0xC1, 0xC1, 0xC1, + 0x1C, 0x1C, 0x1C, 0x1C, + 0xC1, 0xC1, 0xC1, 0xC1, + 0x1C, 0x1C, 0x1C, 0x1C, + 0xC1, 0xC1, 0xC1, 0xC1, + 0x1C, 0x1C, 0x1C, 0x1C, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 131, isSolid: true */ + 0x44, 0x44, 0x45, 0x55, + 0x44, 0x44, 0x44, 0x45, + 0x04, 0x44, 0x44, 0x45, + 0x04, 0x45, 0x55, 0x45, + 0x00, 0x44, 0x55, 0x55, + 0x00, 0x04, 0x45, 0x55, + 0x00, 0x00, 0x44, 0x45, + 0x00, 0x00, 0x00, 0x44, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x55, 0x54, 0x44, 0x44, + 0x54, 0x44, 0x44, 0x44, + 0x54, 0x44, 0x44, 0x40, + 0x54, 0x55, 0x54, 0x40, + 0x55, 0x55, 0x44, 0x00, + 0x55, 0x54, 0x40, 0x00, + 0x54, 0x44, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 132, isSolid: true */ + 0x55, 0x54, 0x44, 0x44, + 0x55, 0x55, 0x44, 0x44, + 0x75, 0x55, 0x44, 0x40, + 0x75, 0x55, 0x44, 0x40, + 0x55, 0x54, 0x44, 0x00, + 0x55, 0x44, 0x40, 0x00, + 0x44, 0x44, 0x00, 0x00, + 0x44, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x44, 0x44, 0x45, 0x55, + 0x44, 0x44, 0x55, 0x55, + 0x04, 0x44, 0x55, 0x57, + 0x04, 0x44, 0x55, 0x57, + 0x00, 0x44, 0x45, 0x55, + 0x00, 0x04, 0x44, 0x55, + 0x00, 0x00, 0x44, 0x44, + 0x00, 0x00, 0x00, 0x44, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 133, isSolid: true */ + 0x22, 0x22, 0x22, 0xFF, + 0x22, 0x22, 0x22, 0xFF, + 0x02, 0x22, 0x22, 0x22, + 0x02, 0x22, 0x22, 0xFF, + 0x00, 0x22, 0x22, 0xFF, + 0x00, 0x02, 0x22, 0xFF, + 0x00, 0x00, 0x22, 0x22, + 0x00, 0x00, 0x00, 0x22, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xFF, 0x22, 0x22, 0x22, + 0xFF, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x20, + 0xFF, 0x22, 0x22, 0x20, + 0xFF, 0x22, 0x22, 0x00, + 0xFF, 0x22, 0x20, 0x00, + 0x22, 0x22, 0x00, 0x00, + 0x22, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 134, isSolid: true */ + 0xFF, 0x22, 0x22, 0x22, + 0xF2, 0x22, 0x22, 0x22, + 0x22, 0x22, 0x22, 0x20, + 0xF2, 0x22, 0x22, 0x20, + 0xF2, 0x22, 0x22, 0x00, + 0xF2, 0x22, 0x20, 0x00, + 0x22, 0x22, 0x00, 0x00, + 0x22, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x22, 0x22, 0x22, 0xFF, + 0x22, 0x22, 0x22, 0x2F, + 0x02, 0x22, 0x22, 0x22, + 0x02, 0x22, 0x22, 0x2F, + 0x00, 0x22, 0x22, 0x2F, + 0x00, 0x02, 0x22, 0x2F, + 0x00, 0x00, 0x22, 0x22, + 0x00, 0x00, 0x00, 0x22, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 135, isSolid: true */ + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x0C, 0x10, 0xC0, + 0x0C, 0x00, 0xC0, 0x00, + 0x01, 0xC0, 0xC1, 0xC0, + 0x01, 0x01, 0x0C, 0x00, + 0x0C, 0x0C, 0x0C, 0x10, + 0x01, 0xC1, 0x00, 0xC0, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x01, 0xC0, 0xC0, + 0x00, 0x0C, 0x00, 0xC0, + 0x0C, 0x1C, 0x0C, 0x10, + 0x00, 0xC0, 0x10, 0x10, + 0x01, 0xC0, 0xC0, 0xC0, + 0x0C, 0x00, 0x1C, 0x10, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 136, isSolid: true */ + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x0C, 0x10, 0xC0, + 0x0C, 0x00, 0xC0, 0x00, + 0x01, 0xC0, 0xC1, 0xC0, + 0x01, 0x01, 0x0C, 0x00, + 0x0C, 0x0C, 0x0C, 0x10, + 0x01, 0xC1, 0x00, 0xC0, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x0C, 0x01, 0xC0, 0xC0, + 0x00, 0x0C, 0x00, 0xC0, + 0x0C, 0x1C, 0x0C, 0x10, + 0x00, 0xC0, 0x10, 0x10, + 0x01, 0xC0, 0xC0, 0xC0, + 0x0C, 0x00, 0x1C, 0x10, + 0x00, 0x00, 0x00, 0x00, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 137, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 138, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 139, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 140, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 141, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 142, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 143, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 144, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 145, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 146, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 147, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 148, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 149, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 150, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 151, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 152, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 153, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 154, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 155, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 156, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 157, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 158, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 159, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + +/* Tile ID 160, isSolid: true */ + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + 0xCC, 0xCC, 0xCC, 0xCC, + + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + }; - diff --git a/tools/png2iigs.js b/tools/png2iigs.js index 223d59a..c888fc6 100644 --- a/tools/png2iigs.js +++ b/tools/png2iigs.js @@ -319,7 +319,7 @@ function reverse(str) { } function toHex(h) { - return h.toString(16).padStart(2, '0'); + return h.toString(16).padStart(2, '0').toUpperCase(); } function swap(hex) { @@ -463,9 +463,10 @@ function writeTileToStream(stream, data) { function writeTileToStreamORCAC(stream, data) { // Output the tile data for (const row of data) { - const hex = row.map(d => toHex(d)).join(''); - stream.write(' 0x' + hex + ',\n'); + const hex = row.map(d => '0x' + toHex(d)).join(', '); + stream.write(' ' + hex + ',\n'); } + stream.write('\n'); } function writeTilesToStream(options, stream, tiles, label='tiledata') { @@ -484,12 +485,14 @@ function writeTilesToStream(options, stream, tiles, label='tiledata') { } function writeTilesToStreamORCAC(options, stream, tiles, label='tiledata') { - stream.write(`long ${options.varName}[] = {\n`); + stream.write(`Byte ${options.varName}[] = {\n`); stream.write('/* Reserved space (tile 0 is special...) */\n'); - for (let i = 0; i < 8; i += 1) { - stream.write(' 0x00000000L,0x00000000L,0x00000000L,0x00000000L,\n'); + for (let j = 0; j < 4; j += 1) { + for (let i = 0; i < 8; i += 1) { + stream.write(' 0x00, 0x00, 0x00, 0x00,\n'); + } + stream.write('\n'); } - stream.write('\n'); let count = 0; for (const tile of tiles.slice(0, options.maxTiles)) { From 217a1176a93d917ec8c4dceb67923bc16e5947b1 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Fri, 2 Sep 2022 20:37:26 -0500 Subject: [PATCH 28/68] Remove obsolete blitter routines --- src/Core.s | 126 ----------------------- src/blitter/Tiles00000.s | 52 ---------- src/blitter/Tiles00001.s | 104 ------------------- src/blitter/Tiles00010.s | 131 ------------------------ src/blitter/Tiles00011.s | 122 ---------------------- src/blitter/Tiles01000.s | 6 -- src/blitter/Tiles01001.s | 6 -- src/blitter/Tiles01010.s | 19 ---- src/blitter/Tiles10000.s | 99 ------------------ src/blitter/Tiles10001.s | 211 --------------------------------------- src/blitter/Tiles10010.s | 88 ---------------- src/blitter/Tiles10011.s | 134 ------------------------- src/blitter/Tiles11000.s | 50 ---------- src/blitter/Tiles11001.s | 92 ----------------- src/blitter/Tiles11010.s | 63 ------------ src/blitter/Tiles11011.s | 123 ----------------------- 16 files changed, 1426 deletions(-) delete mode 100644 src/Core.s delete mode 100644 src/blitter/Tiles00000.s delete mode 100644 src/blitter/Tiles00001.s delete mode 100644 src/blitter/Tiles00010.s delete mode 100644 src/blitter/Tiles00011.s delete mode 100644 src/blitter/Tiles01000.s delete mode 100644 src/blitter/Tiles01001.s delete mode 100644 src/blitter/Tiles01010.s delete mode 100644 src/blitter/Tiles10000.s delete mode 100644 src/blitter/Tiles10001.s delete mode 100644 src/blitter/Tiles10010.s delete mode 100644 src/blitter/Tiles10011.s delete mode 100644 src/blitter/Tiles11000.s delete mode 100644 src/blitter/Tiles11001.s delete mode 100644 src/blitter/Tiles11010.s delete mode 100644 src/blitter/Tiles11011.s diff --git a/src/Core.s b/src/Core.s deleted file mode 100644 index f102699..0000000 --- a/src/Core.s +++ /dev/null @@ -1,126 +0,0 @@ - use Util.Macs.s - use Load.Macs.s - use Locator.Macs.s - use Mem.Macs.s - use Misc.Macs.s - use Tool222.MACS.s - use Core.MACS.s - - use .\Defs.s - -EngineStartUp ENT - phb - phk - plb - - jsr ToolStartUp ; Start up the toolbox tools we rely on - jsr _CoreStartUp - jsr SoundStartUp ; Start up any sound/music tools - - plb - rtl - -EngineShutDown ENT - phb - phk - plb - - jsr SoundShutDown - jsr _CoreShutDown - jsr ToolShutDown - - plb - rtl - -ToolStartUp - _TLStartUp ; normal tool initialization - pha - _MMStartUp - _Err ; should never happen - pla - sta MasterId ; our master handle references the memory allocated to us - ora #$0100 ; set auxID = $01 (valid values $01-0f) - sta UserId ; any memory we request must use our own id - - _MTStartUp - rts - -MasterId ds 2 - -; Fatal error handler invoked by the _Err macro -PgmDeath tax - pla - inc - phx - phk - pha - bra ContDeath -PgmDeath0 pha - pea $0000 - pea $0000 -ContDeath ldx #$1503 - jsl $E10000 - -; Use Tool222 (NinjaTrackerPlus) for music playback -SoundStartUp - lda #NO_MUSIC - bne :no_music - - pea $00DE - pea $0000 - _LoadOneTool - _Err - - lda UserId - pha - _NTPStartUp -:no_music - rts - -SoundShutDown - lda #NO_MUSIC - bne :no_music - _NTPShutDown -:no_music - rts - -ToolShutDown - rts - - put CoreImpl.s - put blitter/Template.s - - put Memory.s - put Graphics.s - put Sprite.s - put blitter/Tiles.s - put Sprite2.s - put SpriteRender.s - put Render.s - put Timer.s - put Script.s - put blitter/Blitter.s - put blitter/Horz.s - put blitter/PEISlammer.s - put blitter/Tables.s - put blitter/Tiles00000.s ; normal tiles - put blitter/Tiles00001.s ; dynamic tiles - put blitter/Tiles00010.s ; normal masked tiles - put blitter/Tiles00011.s ; dynamic masked tiles - - put blitter/Tiles10000.s ; normal tiles + sprites - put blitter/Tiles10001.s ; dynamic tiles + sprites - put blitter/Tiles10010.s ; normal masked tiles + sprites - put blitter/Tiles10011.s ; dynamic masked tiles + sprites - - put blitter/Tiles11000.s ; normal high priority tiles + sprites - put blitter/Tiles11001.s ; dynamic high priority tiles + sprites - put blitter/Tiles11010.s ; normal high priority masked tiles + sprites - put blitter/Tiles11011.s ; dynamic high priority masked tiles + sprites - - put blitter/TilesBG1.s - put blitter/Vert.s - put blitter/BG0.s - put blitter/BG1.s - put blitter/SCB.s - put TileMap.s diff --git a/src/blitter/Tiles00000.s b/src/blitter/Tiles00000.s deleted file mode 100644 index cbb579e..0000000 --- a/src/blitter/Tiles00000.s +++ /dev/null @@ -1,52 +0,0 @@ -; _TBSolidTile -; -; Define the addresses of the subroutines that draw the normal and flipped variants of the tiles, both -; in the optimized (no second background) and normal cases. -; -; On entry, the following register values need to be set -; -; X : address of base tile in the tiledata bank (tileId * 128) -; Y : address of the top-left corder of the tile location in the code field -; B : set to the code field bank - -_TBSolidTile_00 - jsr _TBCopyData - jmp _TBFillPEAOpcode - -_TBSolidTile_0H - jsr _TBCopyData - jmp _TBFillPEAOpcode - -_TBSolidTile_V0 - jsr _TBCopyDataV - jmp _TBFillPEAOpcode - -_TBSolidTile_VH - jsr _TBCopyDataV - jmp _TBFillPEAOpcode - -; Old routines -_TBCopyData -]line equ 0 - lup 8 - ldal tiledata+{]line*4},x - sta: $0004+{]line*$1000},y - ldal tiledata+{]line*4}+2,x - sta: $0001+{]line*$1000},y -]line equ ]line+1 - --^ - rts - -_TBCopyDataV -]src equ 7 -]dest equ 0 - lup 8 - ldal tiledata+{]src*4},x - sta: $0004+{]dest*$1000},y - ldal tiledata+{]src*4}+2,x - sta: $0001+{]dest*$1000},y -]src equ ]src-1 -]dest equ ]dest+1 - --^ - rts - diff --git a/src/blitter/Tiles00001.s b/src/blitter/Tiles00001.s deleted file mode 100644 index f44aefa..0000000 --- a/src/blitter/Tiles00001.s +++ /dev/null @@ -1,104 +0,0 @@ -; _TBDynamicTile -; -; These subroutines fill in the code field with the instructions to render data from the dynamic -; code buffer. This is a bit different, because no tile data is manipulated. It is the -; responsibiliy of the user of the API to use the CopyTileToDyn subroutine to get data -; into the correct location. -; -; This tile type does not explicitly support horizontal or vertical flipping. An appropriate tile -; descriptor should be passed into CopyTileToDyn to put the horizontally or vertically flipped source -; data into the dynamic tile buffer -_TBDynamicTile_00 - jsr _TBDynamicData - jmp _TBFillLdaDpOpcode - -_TBDynamic - ldal TileStore+TS_TILE_ID,x - and #$007F - ora #$4800 - -]line equ 0 ; render the first column - lup 8 - sta: $0004+{]line*$1000},y -]line equ ]line+1 - --^ - - inc ; advance to the next word - inc - -]line equ 0 ; render the second column - lup 8 - sta: $0001+{]line*$1000},y -]line equ ]line+1 - --^ - - sep #$20 - lda #$B5 - sta: $0000,y - sta: $0003,y - sta $1000,y - sta $1003,y - sta $2000,y - sta $2003,y - sta $3000,y - sta $3003,y - sta $4000,y - sta $4003,y - sta $5000,y - sta $5003,y - sta $6000,y - sta $6003,y - sta $7000,y - sta $7003,y - rep #$20 - - plb - rts -; Primitive to render a dynamic tile -; -; LDA 00,x / PHA where the operand is fixed when the tile is rendered -; $B5 $00 $48 -_TBDynamicData - lda _TILE_ID ; Get the original tile descriptor - and #$007F ; clamp to < (32 * 4) - ora #$4800 ; insert the PHA instruction - -]line equ 0 ; render the first column - lup 8 - sta: $0004+{]line*$1000},y -]line equ ]line+1 - --^ - - inc ; advance to the next word - inc - -]line equ 0 ; render the second column - lup 8 - sta: $0001+{]line*$1000},y -]line equ ]line+1 - --^ - - rts - -; A simple helper function that fill in all of the opcodes of a tile with the LDA dp,x opcode. -_TBFillLdaDpOpcode - sep #$20 - lda #$B5 - sta: $0000,y - sta: $0003,y - sta $1000,y - sta $1003,y - sta $2000,y - sta $2003,y - sta $3000,y - sta $3003,y - sta $4000,y - sta $4003,y - sta $5000,y - sta $5003,y - sta $6000,y - sta $6003,y - sta $7000,y - sta $7003,y - rep #$20 - rts diff --git a/src/blitter/Tiles00010.s b/src/blitter/Tiles00010.s deleted file mode 100644 index 5e5f486..0000000 --- a/src/blitter/Tiles00010.s +++ /dev/null @@ -1,131 +0,0 @@ -; _TBMaskedTile -; -; These tile renderes are for "normal" tiles that also apply their mask data. If the case of the second -; background being disabled, the optimized variants are the same as Tile00000 -; -; Y register = address of code field tile -; X register = tile address -; Accumulator = logical word offset of the tile (0, 2, 4, ..., 82) -; -; Need to slightly remap these register inputs to save into the direct page cached values -_TBMaskedTile_00 -_TBMaskedTile_0H - sta _X_REG ; Save these values as we will need to reload them - sty _Y_REG ; at certain points - stx _T_PTR - -; Do the left column first - - CopyMaskedWord tiledata+0;tiledata+32+0;$0003 - CopyMaskedWord tiledata+4;tiledata+32+4;$1003 - CopyMaskedWord tiledata+8;tiledata+32+8;$2003 - CopyMaskedWord tiledata+12;tiledata+32+12;$3003 - CopyMaskedWord tiledata+16;tiledata+32+16;$4003 - CopyMaskedWord tiledata+20;tiledata+32+20;$5003 - CopyMaskedWord tiledata+24;tiledata+32+24;$6003 - CopyMaskedWord tiledata+28;tiledata+32+28;$7003 - -; Move the index for the JTableOffset array. This is the same index used for transparent words, -; so, if _X_REG is zero, then we would be patching out the last word in the code field with LDA (0),y -; and then increment _X_REG by two to patch the next-to-last word in the code field with LDA (2),y - - inc _X_REG - inc _X_REG - -; Do the right column - - CopyMaskedWord tiledata+2;tiledata+32+2;$0000 - CopyMaskedWord tiledata+6;tiledata+32+6;$1000 - CopyMaskedWord tiledata+10;tiledata+32+10;$2000 - CopyMaskedWord tiledata+14;tiledata+32+14;$3000 - CopyMaskedWord tiledata+18;tiledata+32+18;$4000 - CopyMaskedWord tiledata+22;tiledata+32+22;$5000 - CopyMaskedWord tiledata+26;tiledata+32+26;$6000 - CopyMaskedWord tiledata+30;tiledata+32+30;$7000 - - rts - -;_TBMaskedTile_0H -; sta _X_REG -; sty _Y_REG -; stx _T_PTR -; -; CopyMaskedWord tiledata+64+0;tiledata+64+32+0;$0003 -; CopyMaskedWord tiledata+64+4;tiledata+64+32+4;$1003 -; CopyMaskedWord tiledata+64+8;tiledata+64+32+8;$2003 -; CopyMaskedWord tiledata+64+12;tiledata+64+32+12;$3003 -; CopyMaskedWord tiledata+64+16;tiledata+64+32+16;$4003 -; CopyMaskedWord tiledata+64+20;tiledata+64+32+20;$5003 -; CopyMaskedWord tiledata+64+24;tiledata+64+32+24;$6003 -; CopyMaskedWord tiledata+64+28;tiledata+64+32+28;$7003 -; -; inc _X_REG -; inc _X_REG -; -; CopyMaskedWord tiledata+64+2;tiledata+64+32+2;$0000 -; CopyMaskedWord tiledata+64+6;tiledata+64+32+6;$1000 -; CopyMaskedWord tiledata+64+10;tiledata+64+32+10;$2000 -; CopyMaskedWord tiledata+64+14;tiledata+64+32+14;$3000 -; CopyMaskedWord tiledata+64+18;tiledata+64+32+18;$4000 -; CopyMaskedWord tiledata+64+22;tiledata+64+32+22;$5000 -; CopyMaskedWord tiledata+64+26;tiledata+64+32+26;$6000 -; CopyMaskedWord tiledata+64+30;tiledata+64+32+30;$7000 -; -; rts - -_TBMaskedTile_V0 -_TBMaskedTile_VH - sta _X_REG - sty _Y_REG - stx _T_PTR - - CopyMaskedWord tiledata+0;tiledata+32+0;$7003 - CopyMaskedWord tiledata+4;tiledata+32+4;$6003 - CopyMaskedWord tiledata+8;tiledata+32+8;$5003 - CopyMaskedWord tiledata+12;tiledata+32+12;$4003 - CopyMaskedWord tiledata+16;tiledata+32+16;$3003 - CopyMaskedWord tiledata+20;tiledata+32+20;$2003 - CopyMaskedWord tiledata+24;tiledata+32+24;$1003 - CopyMaskedWord tiledata+28;tiledata+32+28;$0003 - - inc _X_REG - inc _X_REG - - CopyMaskedWord tiledata+2;tiledata+32+2;$7000 - CopyMaskedWord tiledata+6;tiledata+32+6;$6000 - CopyMaskedWord tiledata+10;tiledata+32+10;$5000 - CopyMaskedWord tiledata+14;tiledata+32+14;$4000 - CopyMaskedWord tiledata+18;tiledata+32+18;$3000 - CopyMaskedWord tiledata+22;tiledata+32+22;$2000 - CopyMaskedWord tiledata+26;tiledata+32+26;$1000 - CopyMaskedWord tiledata+30;tiledata+32+30;$0000 - - rts - -;_TBMaskedTile_VH -; sta _X_REG -; sty _Y_REG -; stx _T_PTR -; -; CopyMaskedWord tiledata+64+0;tiledata+64+32+0;$7003 -; CopyMaskedWord tiledata+64+4;tiledata+64+32+4;$6003 -; CopyMaskedWord tiledata+64+8;tiledata+64+32+8;$5003 -; CopyMaskedWord tiledata+64+12;tiledata+64+32+12;$4003 -; CopyMaskedWord tiledata+64+16;tiledata+64+32+16;$3003 -; CopyMaskedWord tiledata+64+20;tiledata+64+32+20;$2003 -; CopyMaskedWord tiledata+64+24;tiledata+64+32+24;$1003 -; CopyMaskedWord tiledata+64+28;tiledata+64+32+28;$0003 -; -; inc _X_REG -; inc _X_REG -; -; CopyMaskedWord tiledata+64+2;tiledata+64+32+2;$7000 -; CopyMaskedWord tiledata+64+6;tiledata+64+32+6;$6000 -; CopyMaskedWord tiledata+64+10;tiledata+64+32+10;$5000 -; CopyMaskedWord tiledata+64+14;tiledata+64+32+14;$4000 -; CopyMaskedWord tiledata+64+18;tiledata+64+32+18;$3000 -; CopyMaskedWord tiledata+64+22;tiledata+64+32+22;$2000 -; CopyMaskedWord tiledata+64+26;tiledata+64+32+26;$1000 -; CopyMaskedWord tiledata+64+30;tiledata+64+32+30;$0000 -; -; rts diff --git a/src/blitter/Tiles00011.s b/src/blitter/Tiles00011.s deleted file mode 100644 index 4a9d7b4..0000000 --- a/src/blitter/Tiles00011.s +++ /dev/null @@ -1,122 +0,0 @@ -; _TBDynamicMaskTile -; -; Insert a code sequence to mask the dynamic tile against the background. This is quite a slow process because -; every word needs to be handled with a JMP exception; but it looks good! -_TBDynamicMaskTile_00 - jsr _TBDynamicDataAndMask - jmp _TBFillJMPOpcode - -; A = dynamic tile id (must be <32) -_TBDynamicDataAndMask - sta _X_REG ; Cache some column values derived from _X_REG - tax - ora #$B100 ; Pre-calc the LDA (dp),y opcode + operand - xba - sta _OP_CACHE - - clc - ldal JTableOffset,x ; Get the address offset and add to the base address - adc _BASE_ADDR ; of the current code field line - sta _JTBL_CACHE - -; We need to do an AND dp|$80,x / ORA dp,x. The opcode values are $35 and $15, respectively. -; We pre-calculate the AND opcode with the high bit of the operand set and then, in the macro -; perform and EOR #$2080 to covert the opcode and operand in one instruction - - lda _TILE_ID ; Get the original tile descriptor - and #$007F ; clamp to < (32 * 4) - ora #$3580 ; Pre-calc the AND $80,x opcode + operand - xba - sta _T_PTR ; This is an op to load the dynamic tile data - - CopyMaskedDWord $0003 - CopyMaskedDWord $1003 - CopyMaskedDWord $2003 - CopyMaskedDWord $3003 - CopyMaskedDWord $4003 - CopyMaskedDWord $5003 - CopyMaskedDWord $6003 - CopyMaskedDWord $7003 - - ldx _X_REG - clc - ldal JTableOffset+2,x ; Get the address offset and add to the base address - adc _BASE_ADDR ; of the current code field line - sta _JTBL_CACHE - - lda _OP_CACHE - adc #$0200 - sta _OP_CACHE - lda _T_PTR - adc #$0200 - sta _T_PTR - - CopyMaskedDWord $0000 - CopyMaskedDWord $1000 - CopyMaskedDWord $2000 - CopyMaskedDWord $3000 - CopyMaskedDWord $4000 - CopyMaskedDWord $5000 - CopyMaskedDWord $6000 - CopyMaskedDWord $7000 - - rts - -; A simple helper function that fill in all of the opcodes of a tile with the JMP opcode. -_TBFillJMPOpcode - sep #$20 - lda #$4C - sta: $0000,y - sta: $0003,y - sta $1000,y - sta $1003,y - sta $2000,y - sta $2003,y - sta $3000,y - sta $3003,y - sta $4000,y - sta $4003,y - sta $5000,y - sta $5003,y - sta $6000,y - sta $6003,y - sta $7000,y - sta $7003,y - rep #$20 - rts - - -; Masked renderer for a dynamic tile. What's interesting about this renderer is that the mask -; value is not used directly, but simply indicates if we can use a LDA 0,x / PHA sequence, -; a LDA (00),y / PHA, or a JMP to a blended render -; -; If a dynamic tile is animated, there is the possibility to create a special mask that marks -; words of the tile that a front / back / mixed across all frames. -; -; ]1 : code field offset -; -; This macro does not set the opcode since they will all be JMP instructions, they can be -; filled more efficiently in a separate routine. -CopyMaskedDWord MAC - -; Need to fill in the first 6 bytes of the JMP handler with the following code sequence -; -; lda (00),y -; and $80,x -; ora $00,x -; bra *+17 - - lda _JTBL_CACHE - ora #{]1&$F000} ; adjust for the current row offset - sta: ]1+1,y - - tax ; This becomes the new address that we use to patch in - lda _OP_CACHE - sta: $0000,x ; LDA (00),y - lda _T_PTR - sta: $0002,x ; AND $80,x - eor #$8020 ; Switch the opcode to an ORA and remove the high bit of the operand - sta: $0004,x ; ORA $00,x - lda #$0F80 ; branch to the prologue (BRA *+17) - sta: $0006,x - eom \ No newline at end of file diff --git a/src/blitter/Tiles01000.s b/src/blitter/Tiles01000.s deleted file mode 100644 index c723a94..0000000 --- a/src/blitter/Tiles01000.s +++ /dev/null @@ -1,6 +0,0 @@ -; _TBPriorityTile -; -; The priority bit allows the tile to be rendered in front of sprites. If there's no sprite -; in this tile area, then just fallback to the Tile00000.s implementation -_TBPriorityTile dw _TBSolidTile_00,_TBSolidTile_0H,_TBSolidTile_V0,_TBSolidTile_VH - dw _TBCopyData,_TBCopyDataH,_TBCopyDataV,_TBCopyDataVH diff --git a/src/blitter/Tiles01001.s b/src/blitter/Tiles01001.s deleted file mode 100644 index 8c26050..0000000 --- a/src/blitter/Tiles01001.s +++ /dev/null @@ -1,6 +0,0 @@ -; _TBPriorityDynamicTile -; -; The priority bit allows the tile to be rendered in front of sprites. If there's no sprite -; in this tile area, then just fallback to the Tile00001.s implementation -_TBPriorityDynamicTile dw _TBDynamicTile_00,_TBDynamicTile_00,_TBDynamicTile_00,_TBDynamicTile_00 - dw _TBDynamicTile_00,_TBDynamicTile_00,_TBDynamicTile_00,_TBDynamicTile_00 diff --git a/src/blitter/Tiles01010.s b/src/blitter/Tiles01010.s deleted file mode 100644 index 53dbbdf..0000000 --- a/src/blitter/Tiles01010.s +++ /dev/null @@ -1,19 +0,0 @@ -; _TBMaskedPriorityTile -; -; The priority bit allows the tile to be rendered in front of sprites. If there's no sprite -; in this tile area, then just fallback to the Tile00000.s implementation -_TBMaskedPriorityTile dw _TBMaskedTile_00,_TBMaskedTile_0H,_TBMaskedTile_V0,_TBMaskedTile_VH - dw _TBCopyData,_TBCopyDataH,_TBCopyDataV,_TBCopyDataVH - -; NOTE: Eventually, we want a way to support this use-case -; -; When the high-priority bit is set for a tile, then the BG0 tile will be rendered behind the BG1 data. In -; order to support this, the optional BG1 mask buffer needs to be enabled and *every* word in the tile -; becomes a JMP handler (similar to masked dynamic tiles) -; -; The 8 bytes of code that is generated in the JMP handler is -; -; lda #tiledata -; and [dp],y -; ora (dp),y -; nop diff --git a/src/blitter/Tiles10000.s b/src/blitter/Tiles10000.s deleted file mode 100644 index d56861a..0000000 --- a/src/blitter/Tiles10000.s +++ /dev/null @@ -1,99 +0,0 @@ -; _TBSolidSpriteTile -; -; Renders solid tiles with sprites layered on top of the tile data. Because we need to combine -; data from the sprite plane, tile data and write to the code field (which are all in different banks), -; there is no way to do everything inline, so a composite tile is created on the fly and written to -; a direct page buffer. This direct page buffer is then used to render the tile. -_TBSolidSpriteTile_00 -_TBSolidSpriteTile_0H - jsr _TBCopyTileDataToCBuff ; Copy the tile into the compositing buffer (using correct x-register) - jsr _TBApplySpriteData ; Overlay the data from the sprite plane (and copy into the code field) - jmp _TBFillPEAOpcode ; Fill in the code field opcodes - -_TBSolidSpriteTile_V0 -_TBSolidSpriteTile_VH - jsr _TBCopyTileDataToCBuffV - jsr _TBApplySpriteData - jmp _TBFillPEAOpcode - -; Fast variation that does not need to set the opcode -_TBFastSpriteTile_00 -_TBFastSpriteTile_0H - jsr _TBCopyTileDataToCBuff ; Copy the tile into the compositing buffer - jmp _TBApplySpriteData ; Overlay the data form the sprite plane (and copy into the code field) - -_TBFastSpriteTile_V0 -_TBFastSpriteTile_VH - jsr _TBCopyTileDataToCBuffV - jmp _TBApplySpriteData - -; Need to update the X-register before calling this -_TBApplySpriteData - ldx _SPR_X_REG ; set to the unaligned tile block address in the sprite plane -]line equ 0 - lup 8 - lda blttmp+{]line*4} - andl spritemask+{]line*SPRITE_PLANE_SPAN},x - oral spritedata+{]line*SPRITE_PLANE_SPAN},x - sta: $0004+{]line*$1000},y - - lda blttmp+{]line*4}+2 - andl spritemask+{]line*SPRITE_PLANE_SPAN}+2,x - oral spritedata+{]line*SPRITE_PLANE_SPAN}+2,x - sta: $0001+{]line*$1000},y -]line equ ]line+1 - --^ - rts - -_TBApplySpriteDataOne - ldx spriteIdx -]line equ 0 - lup 8 - lda blttmp+{]line*4} - andl spritemask+{]line*SPRITE_PLANE_SPAN},x - oral spritedata+{]line*SPRITE_PLANE_SPAN},x - sta: $0004+{]line*$1000},y - - lda blttmp+{]line*4}+2 - andl spritemask+{]line*SPRITE_PLANE_SPAN}+2,x - oral spritedata+{]line*SPRITE_PLANE_SPAN}+2,x - sta: $0001+{]line*$1000},y -]line equ ]line+1 - --^ - rts - -_TBApplySpriteDataTwo -]line equ 0 - lup 8 - lda blttmp+{]line*4} - ldx spriteIdx+2 - andl spritemask+{]line*SPRITE_PLANE_SPAN},x - oral spritedata+{]line*SPRITE_PLANE_SPAN},x - ldx spriteIdx - andl spritemask+{]line*SPRITE_PLANE_SPAN},x - oral spritedata+{]line*SPRITE_PLANE_SPAN},x - sta: $0004+{]line*$1000},y - - lda blttmp+{]line*4}+2 - ldx spriteIdx+2 - andl spritemask+{]line*SPRITE_PLANE_SPAN}+2,x - oral spritedata+{]line*SPRITE_PLANE_SPAN}+2,x - ldx spriteIdx - andl spritemask+{]line*SPRITE_PLANE_SPAN}+2,x - oral spritedata+{]line*SPRITE_PLANE_SPAN}+2,x - sta: $0001+{]line*$1000},y -]line equ ]line+1 - --^ - rts - -; Copy just the data into the code field from the composite buffer -_TBSolidComposite -]line equ 0 - lup 8 - lda blttmp+{]line*4} - sta: $0004+{]line*$1000},y - lda blttmp+{]line*4}+2 - sta: $0001+{]line*$1000},y -]line equ ]line+1 - --^ - rts diff --git a/src/blitter/Tiles10001.s b/src/blitter/Tiles10001.s deleted file mode 100644 index 54adc98..0000000 --- a/src/blitter/Tiles10001.s +++ /dev/null @@ -1,211 +0,0 @@ -; _TBDynamicSpriteTile -; -; This tile type does not explicitly support horizontal or vertical flipping. An appropriate tile -; descriptor should be passed into CopyTileToDyn to put the horizontally or vertically flipped source -; data into the dynamic tile buffer -_TBDynamicSpriteTile - sta _X_REG - ldal TileStore+TS_JMP_ADDR,x ; Get the address of the exception handler - sta _JTBL_CACHE - - ldal TileStore+TS_TILE_ID,x ; Get the original tile descriptor - and #$007F ; clamp to < (32 * 4) - ora #$B500 - xba - sta _OP_CACHE ; This is the 2-byte opcode for to load the data - - CopyDynWord 0;$0003 - CopyDynWord 4;$1003 - CopyDynWord 8;$2003 - CopyDynWord 12;$3003 - CopyDynWord 16;$4003 - CopyDynWord 20;$5003 - CopyDynWord 24;$6003 - CopyDynWord 28;$7003 - - clc - lda _JTBL_CACHE - adc #32 ; All the snippets are 32 bytes wide and, since we're - sta _JTBL_CACHE ; within one tile, the second column is consecutive - - lda _OP_CACHE - adc #$0200 ; Advance to the next word - sta _OP_CACHE - - CopyDynWord 2;$0000 - CopyDynWord 6;$1000 - CopyDynWord 10;$2000 - CopyDynWord 14;$3000 - CopyDynWord 18;$4000 - CopyDynWord 22;$5000 - CopyDynWord 26;$6000 - CopyDynWord 30;$7000 - - plb - rts - - -_TBDynamicSpriteTile_00 - sty _Y_REG ; This is restored in the macro - - sta _X_REG ; Cache some column values derived from _X_REG - tax - clc - ldal JTableOffset,x ; Get the address offset and add to the base address - adc _BASE_ADDR ; of the current code field line - sta _JTBL_CACHE - - lda _TILE_ID ; Get the original tile descriptor - and #$007F ; clamp to < (32 * 4) - ora #$B500 - xba - sta _OP_CACHE ; This is the 2-byte opcode for to load the data - - ldx _SPR_X_REG - - CopyDynSpriteWord {0*SPRITE_PLANE_SPAN};$0003 - CopyDynSpriteWord {1*SPRITE_PLANE_SPAN};$1003 - CopyDynSpriteWord {2*SPRITE_PLANE_SPAN};$2003 - CopyDynSpriteWord {3*SPRITE_PLANE_SPAN};$3003 - CopyDynSpriteWord {4*SPRITE_PLANE_SPAN};$4003 - CopyDynSpriteWord {5*SPRITE_PLANE_SPAN};$5003 - CopyDynSpriteWord {6*SPRITE_PLANE_SPAN};$6003 - CopyDynSpriteWord {7*SPRITE_PLANE_SPAN};$7003 - - ldx _X_REG - clc - ldal JTableOffset+2,x ; Get the address offset and add to the base address - adc _BASE_ADDR ; of the current code field line - sta _JTBL_CACHE - - lda _OP_CACHE - adc #$0200 - sta _OP_CACHE - - ldx _SPR_X_REG - - CopyDynSpriteWord {0*SPRITE_PLANE_SPAN}+2;$0000 - CopyDynSpriteWord {1*SPRITE_PLANE_SPAN}+2;$1000 - CopyDynSpriteWord {2*SPRITE_PLANE_SPAN}+2;$2000 - CopyDynSpriteWord {3*SPRITE_PLANE_SPAN}+2;$3000 - CopyDynSpriteWord {4*SPRITE_PLANE_SPAN}+2;$4000 - CopyDynSpriteWord {5*SPRITE_PLANE_SPAN}+2;$5000 - CopyDynSpriteWord {6*SPRITE_PLANE_SPAN}+2;$6000 - CopyDynSpriteWord {7*SPRITE_PLANE_SPAN}+2;$7000 - - rts - -; Create a masked render based on data in the direct page temporary buffer -; -; ]1 : sprite buffer offset -; ]2 : code field offset -CopyDynWord mac - lda tmp_sprite_mask+{]1} ; load the mask value - bne mixed ; a non-zero value may be mixed - -; This is a solid word - lda #$00F4 ; PEA instruction - sta: ]2,y - lda tmp_sprite_data+{]1} ; load the sprite data - sta: ]2+1,y ; PEA operand - bra next - -mixed cmp #$FFFF ; All 1's in the mask is a fully transparent sprite word - beq transparent - - lda #$004C ; JMP to handler - sta: {]2},y - lda _JTBL_CACHE ; Get the offset to the exception handler for this column - ora #{]2&$F000} ; adjust for the current row offset - sta: {]2}+1,y - tax ; This becomes the new address that we use to patch in - - lda _OP_CACHE ; Get the LDA dp,x instruction for this column - sta: $0000,x - - lda #$0029 ; AND #SPRITE_MASK - sta: $0002,x - lda tmp_sprite_mask+{]1} - sta: $0003,x - - lda #$0009 ; ORA #SPRITE_DATA - sta: $0005,x - lda tmp_sprite_data+{]1} - sta: $0006,x - - lda #$0D80 ; branch to the prologue (BRA *+15) - sta: $0008,x - bra next - -; This is a transparent word, so just show the dynamic data -transparent - lda #$4800 ; Put the PHA in the third byte - sta: {]2}+1,y - lda _OP_CACHE ; Store the LDA dp,x instruction with operand - sta: {]2},y -next - <<< - -; Masked renderer for a dynamic tile with sprite data overlaid. -; -; ]1 : sprite plane offset -; ]2 : code field offset -CopyDynSpriteWord MAC - -; Need to fill in the first 10 bytes of the JMP handler with the following code sequence where -; the data and mask from from the sprite plane -; -; lda $00,x -; and #MASK -; ora #DATA -; bra *+15 -; -; If MASK == 0, then we can do a PEA. If MASK == $FFFF, then fall back to the simple Dynamic Tile -; code. - ldal spritemask+{]1},x ; load the mask value - bne mixed ; a non-zero value may be mixed - -; This is a solid word - lda #$00F4 ; PEA instruction - sta: ]2,y - ldal spritedata+{]1},x ; load the sprite data - sta: ]2+1,y ; PEA operand - bra next - -mixed cmp #$FFFF ; All 1's in the mask is a fully transparent sprite word - beq transparent - - lda #$004C ; JMP to handler - sta: ]2,y - lda _JTBL_CACHE ; Get the offset to the exception handler for this column - ora #{]2&$F000} ; adjust for the current row offset - sta: ]2+1,y - tay ; This becomes the new address that we use to patch in - - lda _OP_CACHE ; Get the LDA dp,x instruction for this column - sta: $0000,y - - lda #$0029 ; AND #SPRITE_MASK - sta: $0002,y - ldal spritemask+{]1},x - sta: $0003,y - - lda #$0009 ; ORA #SPRITE_DATA - sta: $0005,y - ldal spritedata+{]1},x - sta: $0006,y - - lda #$0D80 ; branch to the prologue (BRA *+15) - sta: $0008,y - - ldy _Y_REG ; restore original y-register value and move on - bra next - -; This is a transparent word, so just show the dynamic data -transparent - lda #$4800 ; Put the PHA in the third byte - sta: ]2+1,y - lda _OP_CACHE ; Store the LDA dp,x instruction with operand - sta: ]2,y -next - eom \ No newline at end of file diff --git a/src/blitter/Tiles10010.s b/src/blitter/Tiles10010.s deleted file mode 100644 index ef69047..0000000 --- a/src/blitter/Tiles10010.s +++ /dev/null @@ -1,88 +0,0 @@ -; _TBMaskedSpriteTile -; -; Renders a composited tile with masking to the code field. -_TBMaskedSpriteTile_00 -_TBMaskedSpriteTile_0H - sta _X_REG ; Immedately stash the parameters - sty _Y_REG - - jsr _TBCopyTileDataToCBuff ; Copy the tile data into the compositing buffer (using correct x-register) - jsr _TBCopyTileMaskToCBuff ; Copy the tile mask into the compositing buffer (using correct x-register) - jsr _TBMergeSpriteDataAndMask ; Overlay the data and mask from the sprite plane into the compositing buffer - jmp _TBMaskedCBuff ; Render the masked tile from the compositing buffer into the code field - -;_TBMaskedSpriteTile_0H -; sta _X_REG -; sty _Y_REG -; jsr _TBCopyTileDataToCBuffH -; jsr _TBCopyTileMaskToCBuffH -; jsr _TBMergeSpriteDataAndMask -; jmp _TBMaskedCBuff - -_TBMaskedSpriteTile_V0 -_TBMaskedSpriteTile_VH - sta _X_REG - sty _Y_REG - jsr _TBCopyTileDataToCBuffV - jsr _TBCopyTileMaskToCBuffV - jsr _TBMergeSpriteDataAndMask - jmp _TBMaskedCBuff - -;_TBMaskedSpriteTile_VH -; sta _X_REG -; sty _Y_REG -; jsr _TBCopyTileDataToCBuffVH -; jsr _TBCopyTileMaskToCBuffVH -; jsr _TBMergeSpriteDataAndMask -; jmp _TBMaskedCBuff - -_TBMergeSpriteDataAndMask - ldx _SPR_X_REG ; set to the unaligned tile block address in the sprite plane - -]line equ 0 - lup 8 - lda blttmp+{]line*4} - andl spritemask+{]line*SPRITE_PLANE_SPAN},x - oral spritedata+{]line*SPRITE_PLANE_SPAN},x - sta blttmp+{]line*4} - - ldal spritemask+{]line*SPRITE_PLANE_SPAN},x - and blttmp+{]line*4}+32 - sta blttmp+{]line*4}+32 - - lda blttmp+{]line*4}+2 - andl spritemask+{]line*SPRITE_PLANE_SPAN}+2,x - oral spritedata+{]line*SPRITE_PLANE_SPAN}+2,x - sta blttmp+{]line*4}+2 - - ldal spritemask+{]line*SPRITE_PLANE_SPAN}+2,x - and blttmp+{]line*4}+32+2 - sta blttmp+{]line*4}+32+2 -]line equ ]line+1 - --^ - rts - -; See the Tiles00010.s blitter for additional details -_TBMaskedCBuff - CopyMaskedWordD blttmp+0;$0003 - CopyMaskedWordD blttmp+4;$1003 - CopyMaskedWordD blttmp+8;$2003 - CopyMaskedWordD blttmp+12;$3003 - CopyMaskedWordD blttmp+16;$4003 - CopyMaskedWordD blttmp+20;$5003 - CopyMaskedWordD blttmp+24;$6003 - CopyMaskedWordD blttmp+28;$7003 - - inc _X_REG - inc _X_REG - - CopyMaskedWordD blttmp+2;$0000 - CopyMaskedWordD blttmp+6;$1000 - CopyMaskedWordD blttmp+10;$2000 - CopyMaskedWordD blttmp+14;$3000 - CopyMaskedWordD blttmp+18;$4000 - CopyMaskedWordD blttmp+22;$5000 - CopyMaskedWordD blttmp+26;$6000 - CopyMaskedWordD blttmp+30;$7000 - - rts diff --git a/src/blitter/Tiles10011.s b/src/blitter/Tiles10011.s deleted file mode 100644 index 9778560..0000000 --- a/src/blitter/Tiles10011.s +++ /dev/null @@ -1,134 +0,0 @@ -; _TBDynamicMaskedSpriteTile -; -; This tile type does not explicitly support horizontal or vertical flipping. An appropriate tile -; descriptor should be passed into CopyTileToDyn to put the horizontally or vertically flipped source -; data into the dynamic tile buffer -; -; When rendering, the background, via lda (dp),y, is shown behind the animate sprite -_TBDynamicMaskedSpriteTile_00 - sty _Y_REG ; This is restored in the macro - - sta _X_REG ; Cache some column values derived from _X_REG - tax - ora #$B100 ; Pre-calc the LDA (dp),y opcode + operand - xba - sta _OP_CACHE - - clc - ldal JTableOffset,x ; Get the address offset and add to the base address - adc _BASE_ADDR ; of the current code field line - sta _JTBL_CACHE - - lda _TILE_ID ; Get the original tile descriptor - and #$007F ; clamp to < (32 * 4) - ora #$3580 ; Pre-calc the AND $80,x opcode + operand - xba - sta _T_PTR ; This is an op to load the dynamic tile data - - ldx _SPR_X_REG - - CopyDynMaskedSpriteWord {0*SPRITE_PLANE_SPAN};$0003 - CopyDynMaskedSpriteWord {1*SPRITE_PLANE_SPAN};$1003 - CopyDynMaskedSpriteWord {2*SPRITE_PLANE_SPAN};$2003 - CopyDynMaskedSpriteWord {3*SPRITE_PLANE_SPAN};$3003 - CopyDynMaskedSpriteWord {4*SPRITE_PLANE_SPAN};$4003 - CopyDynMaskedSpriteWord {5*SPRITE_PLANE_SPAN};$5003 - CopyDynMaskedSpriteWord {6*SPRITE_PLANE_SPAN};$6003 - CopyDynMaskedSpriteWord {7*SPRITE_PLANE_SPAN};$7003 - - ldx _X_REG - clc - ldal JTableOffset+2,x ; Get the address offset and add to the base address - adc _BASE_ADDR ; of the current code field line - sta _JTBL_CACHE - - lda _OP_CACHE - adc #$0200 - sta _OP_CACHE - lda _T_PTR - adc #$0200 - sta _T_PTR - - ldx _SPR_X_REG - - CopyDynMaskedSpriteWord {0*SPRITE_PLANE_SPAN}+2;$0000 - CopyDynMaskedSpriteWord {1*SPRITE_PLANE_SPAN}+2;$1000 - CopyDynMaskedSpriteWord {2*SPRITE_PLANE_SPAN}+2;$2000 - CopyDynMaskedSpriteWord {3*SPRITE_PLANE_SPAN}+2;$3000 - CopyDynMaskedSpriteWord {4*SPRITE_PLANE_SPAN}+2;$4000 - CopyDynMaskedSpriteWord {5*SPRITE_PLANE_SPAN}+2;$5000 - CopyDynMaskedSpriteWord {6*SPRITE_PLANE_SPAN}+2;$6000 - CopyDynMaskedSpriteWord {7*SPRITE_PLANE_SPAN}+2;$7000 - - rts - - -; Masked renderer for a masked dynamic tile with sprite data overlaid. -; -; ]1 : sprite plane offset -; ]2 : code field offset -CopyDynMaskedSpriteWord MAC - -; Need to fill in the first 14 bytes of the JMP handler with the following code sequence where -; the data and mask from from the sprite plane -; -; lda ($00),y -; and $80,x -; ora $00,x -; and #MASK -; ora #DATA -; bra *+15 -; -; If MASK == 0, then we can do a PEA. If MASK == $FFFF, then fall back to the simple Dynamic Tile -; code and eliminate the constanct AND/ORA instructions. - - ldal spritemask+{]1},x ; load the mask value - bne mixed ; a non-zero value may be mixed - -; This is a solid word - lda #$00F4 ; PEA instruction - sta: ]2,y - ldal spritedata+{]1},x ; load the sprite data - sta: ]2+1,y ; PEA operand - bra next - -; We will always do a JMP to the eception handler, so set that up, then check for sprite -; transparency -mixed - lda #$004C ; JMP to handler - sta: ]2,y - lda _JTBL_CACHE ; Get the offset to the exception handler for this column - ora #{]2&$F000} ; adjust for the current row offset - sta: {]2}+1,y - tay ; This becomes the new address that we use to patch in - - lda _OP_CACHE - sta: $0000,y ; LDA (00),y - lda _T_PTR - sta: $0002,y ; AND $80,x - eor #$8020 ; Switch the opcode to an ORA and remove the high bit of the operand - sta: $0004,y ; ORA $00,x - - lda #$0029 ; AND #SPRITE_MASK - sta: $0006,y - ldal spritemask+{]1},x - cmp #$FFFF ; All 1's in the mask is a fully transparent sprite word - beq transparent ; so we can use the Tile00011 method - sta: $0007,y - - lda #$0009 ; ORA #SPRITE_DATA - sta: $0009,y - ldal spritedata+{]1},x - sta: $000A,y - - lda #$0980 ; branch to the prologue (BRA *+11) - sta: $000C,y - bra next - -; This is a transparent word, so just show the dynamic data -transparent - lda #$0F80 ; branch to the epilogue (BRA *+17) - sta: $0006,y -next - ldy _Y_REG ; restore original y-register value and move on - eom \ No newline at end of file diff --git a/src/blitter/Tiles11000.s b/src/blitter/Tiles11000.s deleted file mode 100644 index 1fdf0fc..0000000 --- a/src/blitter/Tiles11000.s +++ /dev/null @@ -1,50 +0,0 @@ -; _TBSolidPrioritySpriteTile -; -; When the sprite is composited with the tile data, the tile mask is used to place the tile data on top of -; any sprite data -_TBSolidPrioritySpriteTile_00 -_TBSolidPrioritySpriteTile_0H - jsr _TBCopyTileDataToCBuff ; Copy the tile data into the compositing buffer (using correct x-register) - jsr _TBCopyTileMaskToCBuff ; Copy the tile mask into the compositing buffer (using correct x-register) - jsr _TBApplyPrioritySpriteData ; Underlay the data fromthe sprite plane (and copy into the code field) - jmp _TBFillPEAOpcode ; Fill in the code field opcodes - -;_TBSolidPrioritySpriteTile_0H -; jsr _TBCopyTileDataToCBuffH -; jsr _TBCopyTileMaskToCBuffH -; jsr _TBApplyPrioritySpriteData -; jmp _TBFillPEAOpcode - -_TBSolidPrioritySpriteTile_V0 -_TBSolidPrioritySpriteTile_VH - jsr _TBCopyTileDataToCBuffV - jsr _TBCopyTileMaskToCBuffV - jsr _TBApplyPrioritySpriteData - jmp _TBFillPEAOpcode - -;_TBSolidPrioritySpriteTile_VH -; jsr _TBCopyTileDataToCBuffVH -; jsr _TBCopyTileMaskToCBuffVH -; jsr _TBApplyPrioritySpriteData -; jmp _TBFillPEAOpcode - -; Need to update the X-register before calling this -_TBApplyPrioritySpriteData - ldx _SPR_X_REG ; set to the unaligned tile block address in the sprite plane - -]line equ 0 - lup 8 - ldal spritedata+{]line*SPRITE_PLANE_SPAN},x - and blttmp+{]line*4}+32 - ora blttmp+{]line*4} - sta: $0004+{]line*$1000},y - - ldal spritedata+{]line*SPRITE_PLANE_SPAN}+2,x - and blttmp+{]line*4}+32+2 - ora blttmp+{]line*4}+2 - sta: $0001+{]line*$1000},y -]line equ ]line+1 - --^ - - ldx _X_REG ; restore the original value - rts \ No newline at end of file diff --git a/src/blitter/Tiles11001.s b/src/blitter/Tiles11001.s deleted file mode 100644 index eafc342..0000000 --- a/src/blitter/Tiles11001.s +++ /dev/null @@ -1,92 +0,0 @@ -; _TBDynamicPrioritySpriteTile -; -; Variant of _TBDynamicSpriteTile (Tile10001), but draw the sprite data behind the dynamic tile -_TBDynamicPrioritySpriteTile_00 - jsr _TBDynamicPriorityDataAndMask - jmp _TBFillJMPOpcode - -_TBDynamicPriorityDataAndMask - sty _Y_REG ; This is restored in the macro - - sta _X_REG ; Cache some column values derived from _X_REG - tax - clc - ldal JTableOffset,x ; Get the address offset and add to the base address - adc _BASE_ADDR ; of the current code field line - sta _JTBL_CACHE - - lda _TILE_ID ; Get the original tile descriptor - and #$007F ; clamp to < (32 * 4) - ora #$3580 ; Pre-calc the AND $80,x opcode + operand - xba - sta _OP_CACHE ; This is an op to load the dynamic tile data - - ldx _SPR_X_REG - - CopyDynPriSpriteWord {0*SPRITE_PLANE_SPAN};$0003 - CopyDynPriSpriteWord {1*SPRITE_PLANE_SPAN};$1003 - CopyDynPriSpriteWord {2*SPRITE_PLANE_SPAN};$2003 - CopyDynPriSpriteWord {3*SPRITE_PLANE_SPAN};$3003 - CopyDynPriSpriteWord {4*SPRITE_PLANE_SPAN};$4003 - CopyDynPriSpriteWord {5*SPRITE_PLANE_SPAN};$5003 - CopyDynPriSpriteWord {6*SPRITE_PLANE_SPAN};$6003 - CopyDynPriSpriteWord {7*SPRITE_PLANE_SPAN};$7003 - - ldx _X_REG - clc - ldal JTableOffset+2,x ; Get the address offset and add to the base address - adc _BASE_ADDR ; of the current code field line - sta _JTBL_CACHE - - lda _OP_CACHE - adc #$0200 - sta _OP_CACHE - - ldx _SPR_X_REG - - CopyDynPriSpriteWord {0*SPRITE_PLANE_SPAN}+2;$0000 - CopyDynPriSpriteWord {1*SPRITE_PLANE_SPAN}+2;$1000 - CopyDynPriSpriteWord {2*SPRITE_PLANE_SPAN}+2;$2000 - CopyDynPriSpriteWord {3*SPRITE_PLANE_SPAN}+2;$3000 - CopyDynPriSpriteWord {4*SPRITE_PLANE_SPAN}+2;$4000 - CopyDynPriSpriteWord {5*SPRITE_PLANE_SPAN}+2;$5000 - CopyDynPriSpriteWord {6*SPRITE_PLANE_SPAN}+2;$6000 - CopyDynPriSpriteWord {7*SPRITE_PLANE_SPAN}+2;$7000 - - rts - - -; Masked renderer for a dynamic tile with sprite data overlaid. -; -; ]1 : sprite plane offset -; ]2 : code field offset -CopyDynPriSpriteWord MAC - -; Need to fill in the first 9 bytes of the JMP handler with the following code sequence where -; the data and mask from from the sprite plane -; -; lda #DATA -; and $80,x -; ora $00,x -; bra *+16 - - lda _JTBL_CACHE ; Get the offset to the exception handler for this column - ora #{]2&$F000} ; adjust for the current row offset - sta: ]2+1,y - tay ; This becomes the new address that we use to patch in - - lda #$00A9 ; LDA #DATA - sta: $0000,y - ldal spritedata+{]1},x - sta: $0001,y - - lda _OP_CACHE - sta: $0003,y ; AND $80,x - eor #$8020 ; Switch the opcode to an ORA and remove the high bit of the operand - sta: $0005,y ; ORA $00,x - - lda #$0E80 ; branch to the prologue (BRA *+16) - sta: $0007,y - - ldy _Y_REG ; restore original y-register value and move on - eom \ No newline at end of file diff --git a/src/blitter/Tiles11010.s b/src/blitter/Tiles11010.s deleted file mode 100644 index ad6ee20..0000000 --- a/src/blitter/Tiles11010.s +++ /dev/null @@ -1,63 +0,0 @@ -; _TBMaskedPrioritySpriteTile -; -; Renders a composited tile with masking to the code field. The sprite is underlaid -_TBMaskedPrioritySpriteTile_00 -_TBMaskedPrioritySpriteTile_0H - sta _X_REG ; Immedately stash the parameters - sty _Y_REG - - jsr _TBCopyTileDataToCBuff ; Copy the tile data into the compositing buffer (using correct x-register) - jsr _TBCopyTileMaskToCBuff ; Copy the tile mask into the compositing buffer (using correct x-register) - jsr _TBUnderlaySpriteDataAndMask ; Underlay the data and mask from the sprite plane into the compositing buffer - jmp _TBMaskedCBuff ; Render the masked tile from the compositing buffer into the code field - -;_TBMaskedPrioritySpriteTile_0H -; sta _X_REG -; sty _Y_REG -; jsr _TBCopyTileDataToCBuffH -; jsr _TBCopyTileMaskToCBuffH -; jsr _TBUnderlaySpriteDataAndMask -; jmp _TBMaskedCBuff - -_TBMaskedPrioritySpriteTile_V0 -_TBMaskedPrioritySpriteTile_VH - sta _X_REG - sty _Y_REG - jsr _TBCopyTileDataToCBuffV - jsr _TBCopyTileMaskToCBuffV - jsr _TBUnderlaySpriteDataAndMask - jmp _TBMaskedCBuff - -;_TBMaskedPrioritySpriteTile_VH -; sta _X_REG -; sty _Y_REG -; jsr _TBCopyTileDataToCBuffVH -; jsr _TBCopyTileMaskToCBuffVH -; jsr _TBUnderlaySpriteDataAndMask -; jmp _TBMaskedCBuff - -_TBUnderlaySpriteDataAndMask - ldx _SPR_X_REG ; set to the unaligned tile block address in the sprite plane - -]line equ 0 - lup 8 - ldal spritedata+{]line*SPRITE_PLANE_SPAN},x - and blttmp+{]line*4}+32 - ora blttmp+{]line*4} ; Maybe this can be a TSB??? - sta blttmp+{]line*4} - - ldal spritemask+{]line*SPRITE_PLANE_SPAN},x - and blttmp+{]line*4}+32 - sta blttmp+{]line*4}+32 - - ldal spritedata+{]line*SPRITE_PLANE_SPAN}+2,x - and blttmp+{]line*4}+32+2 - ora blttmp+{]line*4}+2 - sta blttmp+{]line*4}+2 - - ldal spritemask+{]line*SPRITE_PLANE_SPAN}+2,x - and blttmp+{]line*4}+32+2 - sta blttmp+{]line*4}+32+2 -]line equ ]line+1 - --^ - rts diff --git a/src/blitter/Tiles11011.s b/src/blitter/Tiles11011.s deleted file mode 100644 index 1d0eacf..0000000 --- a/src/blitter/Tiles11011.s +++ /dev/null @@ -1,123 +0,0 @@ -; _TBDynamicMaskedPrioritySpriteTile -; -; This tile type does not explicitly support horizontal or vertical flipping. An appropriate tile -; descriptor should be passed into CopyTileToDyn to put the horizontally or vertically flipped source -; data into the dynamic tile buffer -_TBDynamicMaskedPrioritySpriteTile_00 - sty _Y_REG ; This is restored in the macro - - sta _X_REG ; Cache some column values derived from _X_REG - tax - ora #$B100 ; Pre-calc the LDA (dp),y opcode + operand - xba - sta _OP_CACHE - - clc - ldal JTableOffset,x ; Get the address offset and add to the base address - adc _BASE_ADDR ; of the current code field line - sta _JTBL_CACHE - - lda _TILE_ID ; Get the original tile descriptor - and #$007F ; clamp to < (32 * 4) - ora #$3580 ; Pre-calc the AND $80,x opcode + operand - xba - sta _T_PTR ; This is an op to load the dynamic tile data - - ldx _SPR_X_REG - - CopyDynPrioMaskedSpriteWord {0*SPRITE_PLANE_SPAN};$0003 - CopyDynPrioMaskedSpriteWord {1*SPRITE_PLANE_SPAN};$1003 - CopyDynPrioMaskedSpriteWord {2*SPRITE_PLANE_SPAN};$2003 - CopyDynPrioMaskedSpriteWord {3*SPRITE_PLANE_SPAN};$3003 - CopyDynPrioMaskedSpriteWord {4*SPRITE_PLANE_SPAN};$4003 - CopyDynPrioMaskedSpriteWord {5*SPRITE_PLANE_SPAN};$5003 - CopyDynPrioMaskedSpriteWord {6*SPRITE_PLANE_SPAN};$6003 - CopyDynPrioMaskedSpriteWord {7*SPRITE_PLANE_SPAN};$7003 - - ldx _X_REG - clc - ldal JTableOffset+2,x ; Get the address offset and add to the base address - adc _BASE_ADDR ; of the current code field line - sta _JTBL_CACHE - - lda _OP_CACHE - adc #$0200 - sta _OP_CACHE - lda _T_PTR - adc #$0200 - sta _T_PTR - - ldx _SPR_X_REG - - CopyDynPrioMaskedSpriteWord {0*SPRITE_PLANE_SPAN}+2;$0000 - CopyDynPrioMaskedSpriteWord {1*SPRITE_PLANE_SPAN}+2;$1000 - CopyDynPrioMaskedSpriteWord {2*SPRITE_PLANE_SPAN}+2;$2000 - CopyDynPrioMaskedSpriteWord {3*SPRITE_PLANE_SPAN}+2;$3000 - CopyDynPrioMaskedSpriteWord {4*SPRITE_PLANE_SPAN}+2;$4000 - CopyDynPrioMaskedSpriteWord {5*SPRITE_PLANE_SPAN}+2;$5000 - CopyDynPrioMaskedSpriteWord {6*SPRITE_PLANE_SPAN}+2;$6000 - CopyDynPrioMaskedSpriteWord {7*SPRITE_PLANE_SPAN}+2;$7000 - - rts - - -; Masked renderer for a masked dynamic tile with sprite data underlaid. -; -; ]1 : sprite plane offset -; ]2 : code field offset -CopyDynPrioMaskedSpriteWord MAC - -; Need to fill in the first 14 bytes of the JMP handler with the following code sequence where -; the data and mask from from the sprite plane -; -; lda ($00),y -; and #MASK -; ora #DATA -; and $80,x -; ora $00,x -; bra *+15 - - lda #$004C ; JMP to handler - sta: ]2,y - lda _JTBL_CACHE ; Get the offset to the exception handler for this column - ora #{]2&$F000} ; adjust for the current row offset - sta: ]2+1,y - tay ; This becomes the new address that we use to patch in - - lda _OP_CACHE - sta: $0000,y ; LDA (00),y - - lda #$0029 ; AND #SPRITE_MASK - sta: $0002,y - - ldal spritemask+{]1},x - cmp #$FFFF ; All 1's in the mask is a fully transparent sprite word - beq transparent ; so we can use the Tile00011 method - sta: $0003,y - - lda #$0009 ; ORA #SPRITE_DATA - sta: $0005,y - ldal spritedata+{]1},x - sta: $0006,y - - lda _T_PTR - sta: $0008,y ; AND $80,x - eor #$8020 ; Switch the opcode to an ORA and remove the high bit of the operand - sta: $000A,y ; ORA $00,x - - lda #$0980 ; branch to the prologue (BRA *+11) - sta: $000C,y - bra next - -; This is a transparent word, so just show the dynamic data -transparent - lda _T_PTR - sta: $0002,y ; AND $80,x - eor #$8020 ; Switch the opcode to an ORA and remove the high bit of the operand - sta: $0004,y ; ORA $00,x - - lda #$0F80 ; branch to the epilogue (BRA *+17) - sta: $0006,y -next - ldy _Y_REG ; restore original y-register value and move on - eom From eaedee546e3b4baa5765b57bbc8b7695803a9b6d Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Fri, 2 Sep 2022 20:38:10 -0500 Subject: [PATCH 29/68] Remove dead / obsolete code --- src/blitter/TileProcs.s | 121 ---------------------------------------- 1 file changed, 121 deletions(-) delete mode 100644 src/blitter/TileProcs.s diff --git a/src/blitter/TileProcs.s b/src/blitter/TileProcs.s deleted file mode 100644 index b5c77db..0000000 --- a/src/blitter/TileProcs.s +++ /dev/null @@ -1,121 +0,0 @@ -; A simple helper function that fills in all of the opcodes of a tile with the PEA opcode. This is -; a separate functino because we can often just update the tile data if we know the opcodes are already -; set. When we have to fill the opcodes, this function is used -_TBFillPEAOpcode - sep #$20 - lda #$F4 -]line equ 0 - lup 8 - sta: $0000+{]line*$1000},y - sta: $0003+{]line*$1000},y -]line equ ]line+1 - --^ - rep #$20 - rts - -; Copy tile data into the direct page compositing buffer. The main reason to do this in full passes is -; because we can avoid needing to use both the X and Y registers during the compositing process and -; reserve Y to hold the code field address. -; -; Also, we can get away with not setting the bank register, this is a wash in terms of speed, but results -; in simpler, more composable subroutines -_TBCopyTileDataAndMaskToCBuff - jsr _TBCopyTileDataToCBuff - jmp _TBCopyTileMaskToCBuff - -_TBCopyTileDataAndMaskToCBuffV - jsr _TBCopyTileDataToCBuffV - jmp _TBCopyTileMaskToCBuffV - -_TBCopyTileDataToCBuff -]line equ 0 - lup 8 - ldal tiledata+{]line*4},x - sta blttmp+{]line*4} - - ldal tiledata+{]line*4}+2,x - sta blttmp+{]line*4}+2 -]line equ ]line+1 - --^ - rts - -_TBCopyTileDataToCBuffV -]src equ 7 -]dest equ 0 - lup 8 - ldal tiledata+{]src*4},x - sta blttmp+{]dest*4} - - ldal tiledata+{]src*4}+2,x - sta blttmp+{]dest*4}+2 -]src equ ]src-1 -]dest equ ]dest+1 - --^ - rts - -; Copy tile mask data into the direct page compositing buffer. -_TBCopyTileMaskToCBuff -]line equ 0 - lup 8 - ldal tiledata+{]line*4}+32,x - sta blttmp+{]line*4}+32 - - ldal tiledata+{]line*4}+32+2,x - sta blttmp+{]line*4}+32+2 -]line equ ]line+1 - --^ - rts - -_TBCopyTileMaskToCBuffV -]src equ 7 -]dest equ 0 - lup 8 - ldal tiledata+{]src*4}+32,x - sta blttmp+{]dest*4}+32 - - ldal tiledata+{]src*4}+32+2,x - sta blttmp+{]dest*4}+32+2 -]src equ ]src-1 -]dest equ ]dest+1 - --^ - rts - -; Tile 0 specializations -; _TBConstTile -; -; A specialized routine that fills in a tile with a single constant value. It's intended to be used to -; fill in solid colors, so there are no specialized horizontal or verical flipped variants -_TBConstTileX - lda #0 - sta: $0001,y - sta: $0004,y - sta $1001,y - sta $1004,y - sta $2001,y - sta $2004,y - sta $3001,y - sta $3004,y - sta $4001,y - sta $4004,y - sta $5001,y - sta $5004,y - sta $6001,y - sta $6004,y - sta $7001,y - sta $7004,y - plb - rts - -_TBConstTileSlow0 - tax - jsr _TBFillPEAOpcode - jmp _TBConstTileX - -_TBConstTileDataToDP2 -]line equ 0 - lup 8 - stz tmp_tile_data+{]line*4} - stz tmp_tile_data+{]line*4}+2 -]line equ ]line+1 - --^ - rts From b8a764130745b1a9661893a3348a909bae1ba16b Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 8 Sep 2022 21:51:00 -0500 Subject: [PATCH 30/68] Add in all linked list operations --- src/Defs.s | 1 + src/Sprite.s | 275 ++++++++++++++++++++++++++++++++++++- src/blitter/Scanline.s | 3 +- src/static/TileStore.s | 7 + src/static/TileStoreDefs.s | 4 +- 5 files changed, 281 insertions(+), 9 deletions(-) diff --git a/src/Defs.s b/src/Defs.s index 5297648..2a2d6bd 100644 --- a/src/Defs.s +++ b/src/Defs.s @@ -275,5 +275,6 @@ ScalingTables EXT StartXMod164Arr EXT LastPatchOffsetArr EXT +_SortedHead EXT ; Tool error codes NO_TIMERS_AVAILABLE equ 10 diff --git a/src/Sprite.s b/src/Sprite.s index 0bf2353..c76888e 100644 --- a/src/Sprite.s +++ b/src/Sprite.s @@ -397,8 +397,6 @@ _AddSprite and #$00FF sta _Sprites+SPRITE_X,x ; X coordinate - jsr _PrecalcAllSpriteInfo ; Cache sprite property values (simple stuff) - ; Mark the dirty bit to indicate that the active sprite list needs to be rebuilt in the next ; render call @@ -408,7 +406,266 @@ _AddSprite lda _SpriteBits,x ; Get the bit flag for this sprite slot tsb SpriteMap ; Mark it in the sprite map bit field - rts + jmp _PrecalcAllSpriteInfo ; Cache sprite property values + +; _SortSprite +; +; Given a sprite's index, i, update the sprite permutation array such that p[j] = i where +; the sprite is the j.th sprite ordered by the SPRITE_CLIP_TOP value. It is important to +; note that the sorted sprite order does not impact rendering order (that is determined by +; the sprite index position), but is only used to calculate region of the screen to update +; and, in the future, may be useful for isometric perspectives where sorting order *is* +; determined by y-position +; +; X = current sprite index +; +; The sorting strategy is to +; +; a) check if the corrent slot's y-pos is greater than the next item. If yes, then search forward +; b) check if the current slot's y-pos is less than the prev item. If yes, then search in reverse +; c) sprite is in the correct location +; +; The heuristic in play here is that, usually sprites will only move one position in the sorted order +; between frames, if at all. +_SortSprite + lda _Sprites+SPRITE_CLIP_TOP,x + + ldy _Sprites+SORTED_PREV,x + bmi :chk_fwd + cmp _Sprites+SPRITE_CLIP_TOP,y + bcc :chk_bkwd ; The current node needs to move to an lower position + +:chk_fwd + ldy _Sprites+SORTED_NEXT,x ; If there is nothing ahead of the current node, we're done + bmi :early_out + cmp _Sprites+SPRITE_CLIP_TOP,y ; If the current node is <= the next node, we're done + bcc :early_out + bne :scan_fwd + +:early_out + rts + +; Look to move the sprite into a later position +:scan_fwd + lda _Sprites+SORTED_NEXT,y ; Need to step forward; if we're at the end, then insert here + bmi :insert_end + tay + lda _Sprites+SPRITE_CLIP_TOP,y ; Check against the next node. If it's less that current, keep going + cmp _Sprites+SPRITE_CLIP_TOP,x + bcc :scan_fwd + +; Put X before Y +; +; Change +; a <=> x <=> b +; c <=> y <=> d +; +; Into +; a <=> b and c <=> x <=> y <=> d +:insert_before + jsr _OrphanNode + + tya + sta _Sprites+SORTED_NEXT,x ; Link X to Y + + lda _Sprites+SORTED_PREV,y + sta _Sprites+SORTED_PREV,x ; Link X to C + + txa ; Link Y to X + sta _Sprites+SORTED_PREV,y + + ldy _Sprites+SORTED_PREV,x ; Link C to X + sta _Sprites+SORTED_NEXT,y + rts + +; Move X to the end of the list. Y point to the last element +; +; ; Change +; a <=> x <=> b +; y -> nil +; +; Into +; a <=> b and y <=> x -> nil +:insert_end + jsr _OrphanNode + + lda #$FFFF + sta _Sprites+SORTED_NEXT,x + tya + sta _Sprites+SORTED_PREV,x + txa + sta _Sprites+SORTED_NEXT,y + rts + +:chk_bkwd + ldy _Sprites+SORTED_PREV,x ; If there is nothing behind the current node, we're done + bmi :done + cmp _Sprites+SPRITE_CLIP_TOP,y ; If the current node is >= the previous node, we're done + bcs :done + +; Look to move the sprite into an earlier position +:scan_bkwd + lda _Sprites+SORTED_PREV,y ; Need to step backward; if we're at the beginning, then insert here + bmi :insert_front + tay + lda _Sprites+SPRITE_CLIP_TOP,x ; Check against the next node. If it's less that current, keep going + cmp _Sprites+SPRITE_CLIP_TOP,y + bcc :scan_bkwd + +; Put X after Y +; +; Change +; a <=> x <=> b +; c <=> y <=> d +; +; Into +; a <=> b and c <=> y <=> x <=> d +:insert_after + jsr _OrphanNode + + tya + sta _Sprites+SORTED_NEXT,x ; Link X to Y + + lda _Sprites+SORTED_PREV,y + sta _Sprites+SORTED_PREV,x ; Link X to C + + txa ; Link Y to X + sta _Sprites+SORTED_PREV,y + + ldy _Sprites+SORTED_PREV,x ; Link C to X + sta _Sprites+SORTED_NEXT,y + rts + +; Move X to the front of the list. Y points to the first element +; +; ; Change +; a <=> x <=> b +; head -> y +; +; Into +; a <=> b and head -> x <=> y +:insert_front + jsr _OrphanNode + + stx _SortedHead + txa + sta _Sprites+SORTED_PREV,y + lda #$FFFF + sta _Sprites+SORTED_PREV,x + tya + sta _Sprites+SORTED_NEXT,x + rts + +:done + rts + +; Take the node pointed at X and remove it from the doubly-linked list. Assumes it is not +; at the beginning or end of the list +_OrphanNode + phy + ldy _Sprites+SORTED_PREV,x ; Remove X from between A and B + lda _Sprites+SORTED_NEXT,x + sta _Sprites+SORTED_NEXT,y + tay + lda _Sprites+SORTED_PREV,x + sta _Sprites+SORTED_PREV,y + ply + rts + +; Add a new sprite into the sorted double-linked list +_InsertSprite + lda _SortedHead ; If the list is empty, just insert the sprite index + bmi :empty + + tay ; Check the first item + lda _Sprites+SPRITE_CLIP_TOP,x + cmp _Sprites+SPRITE_CLIP_TOP,y + bcc :insert_head + +:next + lda _Sprites+SORTED_NEXT,y + bmi :insert_tail + + tay + lda _Sprites+SPRITE_CLIP_TOP,x + cmp _Sprites+SPRITE_CLIP_TOP,y + bcs :next + +:insert + lda _Sprites+SORTED_PREV,y + sta _Sprites+SORTED_PREV,x ; [p] <-- [c] [n] + + tya + sta _Sprites+SORTED_NEXT,x ; [p] <-- [c] --> [n] + + txa + sta _Sprites+SORTED_PREV,y ; [p] <-- [c] <=> [n] + + ldy _Sprites+SORTED_PREV,x + sta _Sprites+SORTED_NEXT,y ; [p] <=> [c] <=> [n] + + rts + +:insert_head + stx _SortedHead + lda #$FFFF + sta _Sprites+SORTED_PREV,x + tya + sta _Sprites+SORTED_NEXT,x + txa + sta _Sprites+SORTED_PREV,y + rts + +:insert_tail + txa + sta _Sprites+SORTED_NEXT,y + tya + sta _Sprites+SORTED_PREV,x + lda #$FFFF + sta _Sprites+SORTED_NEXT,x + rts + +:empty + sta _Sprites+SORTED_NEXT,x + sta _Sprites+SORTED_PREV,x + stx _SortedHead + rts + +; Remove a sprite from the double-linked list +_DeleteSprite + ldy _Sprites+SORTED_NEXT,x + bmi :remove_tail + + cpx _SortedHead + beq :remove_head + + lda _Sprites+SORTED_PREV,x + sta _Sprites+SORTED_PREV,y + + tay + lda _Sprites+SORTED_NEXT,x + sta _Sprites+SORTED_NEXT,y + rts + +:remove_head + sty _SortedHead + lda #$FFFF + sta _Sprites+SORTED_PREV,y + rts + +:remove_tail + ldy _Sprites+SORTED_PREV,x + bmi :make_empty + + lda #$FFFF + sta _Sprites+SORTED_NEXT,y + rts + +:make_empty + lda #$FFFF + sta _SortedHead + rts + ; Macro to make the unrolled loop more concise ; @@ -651,6 +908,10 @@ _CacheSpriteBanks ; ; X = sprite index _PrecalcAllSpriteInfo + jsr _PrecalcSpriteState + jmp _PrecalcSpritePos + +_PrecalcSpriteState lda _Sprites+SPRITE_ID,x ; and #$3E00 xba @@ -681,10 +942,11 @@ _PrecalcAllSpriteInfo lda #16 sta _Sprites+SPRITE_HEIGHT,x :height_8 + rts ; Clip the sprite's bounding box to the play field size and also set a flag if the sprite ; is fully off-screen or not - +_PrecalcSpritePos lda _Sprites+SPRITE_X,x bpl :pos_x lda #0 @@ -813,7 +1075,7 @@ _UpdateSprite ora #SPRITE_STATUS_UPDATED sta _Sprites+SPRITE_STATUS,x - jmp _PrecalcAllSpriteInfo ; Cache stuff and return + jmp _PrecalcSpriteState ; Cache stuff and return ; Move a sprite to a new location. If the tile ID of the sprite needs to be changed, then ; a full remove/add cycle needs to happen @@ -849,4 +1111,5 @@ _MoveSprite ora #SPRITE_STATUS_MOVED sta _Sprites+SPRITE_STATUS,x - jmp _PrecalcAllSpriteInfo ; Can be specialized to only update (x,y) values + jsr _PrecalcSpritePos ; Can be specialized to only update (x,y) values + jmp _SortSprite ; UPdate the sprite's sorted position diff --git a/src/blitter/Scanline.s b/src/blitter/Scanline.s index 15f0ed1..fea90e8 100644 --- a/src/blitter/Scanline.s +++ b/src/blitter/Scanline.s @@ -19,8 +19,7 @@ _ScanlineBG0XPos :base_address equ tmp8 :opcode equ tmp9 :odd_entry_offset equ tmp10 - - brk $AB + lda StartYMod208 ; This is the base line of the virtual screen asl sta :virt_line_x2 ; Keep track of it diff --git a/src/static/TileStore.s b/src/static/TileStore.s index 74e733b..79daea1 100644 --- a/src/static/TileStore.s +++ b/src/static/TileStore.s @@ -503,6 +503,13 @@ _SpriteBits ENT _SpriteBitsNot ENT dw $FFFE,$FFFD,$FFFB,$FFF7,$FFEF,$FFDF,$FFBF,$FF7F,$FEFF,$FDFF,$FBFF,$F7FF,$EFFF,$DFFF,$BFFF,$7FFF +; Doubly linked list that allows the sprites to be traversed in SPRITE_CLIP_TOP order. The prev/next +; index links are stored in the parallel _Sprites structure; just the extra head and tail index values +; are stored here. A negative value is used as a setinel +_SortedHead ENT + dw $FFFF +;_SortedTail dw $FFFF + ; Steps to the different sprite stamps _stamp_step ENT dw 0,12,24,36 diff --git a/src/static/TileStoreDefs.s b/src/static/TileStoreDefs.s index 1b18986..356e355 100644 --- a/src/static/TileStoreDefs.s +++ b/src/static/TileStoreDefs.s @@ -62,7 +62,9 @@ SPRITE_HEIGHT equ {MAX_SPRITES*28} SPRITE_CLIP_WIDTH equ {MAX_SPRITES*30} SPRITE_CLIP_HEIGHT equ {MAX_SPRITES*32} TS_VBUFF_BASE equ {MAX_SPRITES*34} ; Finalized VBUFF address based on the sprite position and tile offsets -VBUFF_ARRAY_ADDR equ {MAX_SPRITES*36} ; Fixed address where this sprite's VBUFF addresses are stores. The array is the same shape as TileStore, but much smaller +;VBUFF_ARRAY_ADDR equ {MAX_SPRITES*36} ; Fixed address where this sprite's VBUFF addresses are stores. The array is the same shape as TileStore, but much smaller +SORTED_PREV equ {MAX_SPRITES*36} +SORTED_NEXT equ {MAX_SPRITES*38} ; 52 rows by 82 columns + 2 extra rows and columns for sprite sizes ; From f0110acd846168066e1f7159bb27bf54b57631bd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Oct 2022 03:42:50 +0000 Subject: [PATCH 31/68] Bump nokogiri from 1.12.5 to 1.13.9 in /docs Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.12.5 to 1.13.9. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.12.5...v1.13.9) --- updated-dependencies: - dependency-name: nokogiri dependency-type: indirect ... Signed-off-by: dependabot[bot] --- docs/Gemfile.lock | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index 09f2155..d9f1111 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -220,17 +220,15 @@ GEM rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.3.6) + mini_portile2 (2.8.0) minima (2.5.1) jekyll (>= 3.5, < 5.0) jekyll-feed (~> 0.9) jekyll-seo-tag (~> 2.1) minitest (5.15.0) multipart-post (2.2.0) - nokogiri (1.13.6-x64-mingw32) - racc (~> 1.4) - nokogiri (1.13.6-x86_64-linux) - racc (~> 1.4) - nokogiri (1.12.5-x86_64-linux) + nokogiri (1.13.9) + mini_portile2 (~> 2.8.0) racc (~> 1.4) octokit (4.24.0) faraday (>= 1, < 3) @@ -270,7 +268,6 @@ GEM unf (0.1.4) unf_ext unf_ext (0.0.8.2) - unf_ext (0.0.8.2-x64-mingw32) unicode-display_width (1.8.0) wdm (0.1.1) zeitwerk (2.5.4) From ff542c9575e6be4ce74f28c9bd5379a51853fbf9 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 24 Nov 2022 09:26:26 -0600 Subject: [PATCH 32/68] Update docs for GTELoadTileSet --- docs/toolboxref.html | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/docs/toolboxref.html b/docs/toolboxref.html index e8070ab..988b373 100644 --- a/docs/toolboxref.html +++ b/docs/toolboxref.html @@ -1234,9 +1234,18 @@ style: toolref

A tile set is an array of (up to) 512 tile definitions and each tile definition is 128 bytes. The tile definition - is comprised of four, 32-byte tiles; a normal tile, its mask, a horizontally flipped versio of the tile and its mask. + is comprised of four, 32-byte tiles; a normal tile, its mask, a horizontally flipped version of the tile and its mask. The first 128 bytes of a tileset must be set to zero.

+

+ The start and finish parameters define a subset of tiles to be copied into the GTE memory + buffer. This is most commonly used to load a small number of tiles to avoid needing to store a full set of 512 + tiles that are mostly unushed. For eample, loading in 16 tiles can be performed as GTELoadTileSet(0, 17, tilePtr). +

+

+ This function can also be used to swap out subsets of tiles on the fly. Any tiles that are replaced which may + be on-screen are not automatically refreshed. +

Parameters
tileDataPtr Long;mdash;pointer to the tile dataLongpointer to the tile data
@@ -1252,6 +1261,16 @@ style: toolref + + + + + + + + + + @@ -1292,7 +1311,9 @@ style: toolref
C
-

extern pascal void GTELoadTileSet(tileSetPtr)

+

extern pascal void GTELoadTileSet(start, finish, tileSetPtr)

+

Word start;

+

Word finish;

Pointer tileSetPtr;

From 4b50fa8318d6de3e1546520434a504e22532efbc Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Mon, 2 Jan 2023 11:04:26 -0600 Subject: [PATCH 33/68] checkpoint --- _FileInformation.txt | 2 + demos/kfest-2022/demo-5/App.Main.s | 71 ++++++----- macros/GTE.Macs.s | 7 ++ src/Defs.s | 16 ++- src/Render.s | 190 ++++++++++++++++++++++++++--- src/Sprite.s | 18 +-- src/Tiles.s | 14 ++- src/Tool.s | 17 ++- src/static/TileStore.s | 2 +- 9 files changed, 266 insertions(+), 71 deletions(-) diff --git a/_FileInformation.txt b/_FileInformation.txt index 74bd862..07f7fc1 100644 --- a/_FileInformation.txt +++ b/_FileInformation.txt @@ -1,2 +1,4 @@ GTETool.SHK=Type(E0),AuxType(8002),VersionCreate(00),MinVersion(87),Access(E3),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000) Tool160.SHK=Type(E0),AuxType(8002),VersionCreate(00),MinVersion(B8),Access(E3),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000) +CCode.SHK=Type(E0),AuxType(8002),VersionCreate(00),MinVersion(9C),Access(E3),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000) +ChrisV.SHK=Type(E0),AuxType(8002),VersionCreate(00),MinVersion(BC),Access(E3),FolderInfo1(000000000000000000000000000000000000),FolderInfo2(000000000000000000000000000000000000) diff --git a/demos/kfest-2022/demo-5/App.Main.s b/demos/kfest-2022/demo-5/App.Main.s index 2a68015..ea64999 100644 --- a/demos/kfest-2022/demo-5/App.Main.s +++ b/demos/kfest-2022/demo-5/App.Main.s @@ -81,6 +81,8 @@ SpriteCount equ 50 ; Load a tileset + pea #0 + pea #511 pea #^tiledata pea #tiledata _GTELoadTileSet @@ -131,28 +133,31 @@ HERO_FRAME_4 equ HERO_SIZE+151 HERO_VBUFF_4 equ VBUFF_SPRITE_START+3*VBUFF_SPRITE_STEP HERO_SLOT equ 1 - pea HERO_FRAME_1 - pea HERO_VBUFF_1 - _GTECreateSpriteStamp +; pea HERO_FRAME_1 +; pea HERO_VBUFF_1 +; _GTECreateSpriteStamp - pea HERO_FRAME_2 - pea HERO_VBUFF_2 - _GTECreateSpriteStamp +; pea HERO_FRAME_2 +; pea HERO_VBUFF_2 +; _GTECreateSpriteStamp - pea HERO_FRAME_3 - pea HERO_VBUFF_3 - _GTECreateSpriteStamp +; pea HERO_FRAME_3 +; pea HERO_VBUFF_3 +; _GTECreateSpriteStamp - pea HERO_FRAME_4 - pea HERO_VBUFF_4 - _GTECreateSpriteStamp +; pea HERO_FRAME_4 +; pea HERO_VBUFF_4 +; _GTECreateSpriteStamp - pea HERO_SLOT ; Put the player in slot 1 - pea HERO_FLAGS - pea HERO_VBUFF_1 ; and use this stamp - pei PlayerX - pei PlayerY - _GTEAddSprite +; pea HERO_SLOT ; Put the player in slot 1 +; pea HERO_FLAGS +; pea HERO_VBUFF_1 ; and use this stamp +; pei PlayerX +; pei PlayerY +; _GTEAddSprite + + pea $0000 + _GTERender EvtLoop pha @@ -202,13 +207,13 @@ do_render jsr ApplyCollisions ; Check if we run into things jsr UpdateCameraPos ; Moves the screen - pea HERO_SLOT - pei PlayerX - pei PlayerY - _GTEMoveSprite ; Move the sprite to this local position +; pea HERO_SLOT +; pei PlayerX +; pei PlayerY +; _GTEMoveSprite ; Move the sprite to this local position - pea $0000 - _GTERender +; pea $0000 +; _GTERender ; Update the performance counters @@ -216,11 +221,11 @@ do_render pha _GTEGetSeconds pla - cmp OldOneSecondCounter - beq :noudt - sta OldOneSecondCounter - jsr UdtOverlay - stz frameCount +; cmp OldOneSecondCounter +; beq :noudt +; sta OldOneSecondCounter +; jsr UdtOverlay +; stz frameCount :noudt brl EvtLoop @@ -468,10 +473,10 @@ ApplyCollisions tax :frame - pea HERO_SLOT - pei LastHFlip - phx - _GTEUpdateSprite +; pea HERO_SLOT +; pei LastHFlip +; phx +; _GTEUpdateSprite rts diff --git a/macros/GTE.Macs.s b/macros/GTE.Macs.s index f217d4f..b24a999 100644 --- a/macros/GTE.Macs.s +++ b/macros/GTE.Macs.s @@ -157,6 +157,13 @@ RENDER_BG1_HORZ_OFFSET equ $0002 RENDER_BG1_VERT_OFFSET equ $0004 RENDER_BG1_ROTATION equ $0008 RENDER_PER_SCANLINE equ $0010 +RENDER_WITH_SHADOWING equ $0020 + +; Overlay flags +OVERLAY_MASKED equ $0000 ; Overlay has a mask, so the background must be draw first +OVERLAY_SOLID equ $8000 ; Overlay covers the scan line and is fully opaque +OVERLAY_ABOVE equ $0000 ; Overlay is drawn above scanline sprites +OVERLAY_BELOW equ $4000 ; Overlay is drawn below scanline sprites ; GetAddress table IDs scanlineHorzOffset equ $0001 diff --git a/src/Defs.s b/src/Defs.s index 2a2d6bd..cbdbb87 100644 --- a/src/Defs.s +++ b/src/Defs.s @@ -174,6 +174,20 @@ RENDER_BG1_HORZ_OFFSET equ $0002 RENDER_BG1_VERT_OFFSET equ $0004 RENDER_BG1_ROTATION equ $0008 RENDER_PER_SCANLINE equ $0010 +RENDER_WITH_SHADOWING equ $0020 + +; Overlay flags +OVERLAY_MASKED equ $0000 ; Overlay has a mask, so the background must be draw first +OVERLAY_SOLID equ $8000 ; Overlay covers the scan line and is fully opaque +OVERLAY_ABOVE equ $0000 ; Overlay is drawn above scanline sprites +OVERLAY_BELOW equ $4000 ; Overlay is drawn below scanline sprites + +OVERLAY_BASE equ 2 ; 2 bytes for the number of overlays +OVERLAY_REC_SIZE equ 10 ; Size of an overlay record (10 bytes) +OVERLAY_FLAGS equ {OVERLAY_BASE+0} +OVERLAY_TOP equ {OVERLAY_BASE+2} +OVERLAY_BOTTOM equ {OVERLAY_BASE+4} +OVERLAY_PROC equ {OVERLAY_BASE+6} ; DirtyBits definitions DIRTY_BIT_BG0_X equ $0001 @@ -185,7 +199,7 @@ DIRTY_BIT_BG1_REFRESH equ $0020 DIRTY_BIT_SPRITE_ARRAY equ $0040 ; GetAddress table IDs -scanlineHorzOffset equ $0001 ; table of 416 wors, a double-array of scanline offset values. Must be 0, 163 +scanlineHorzOffset equ $0001 ; table of 416 words, a double-array of scanline offset values. Must be 0, 163 ; Script definition YIELD equ $8000 diff --git a/src/Render.s b/src/Render.s index 289fd7f..5ed15af 100644 --- a/src/Render.s +++ b/src/Render.s @@ -8,8 +8,15 @@ ; and internal data structure to properly render the play field. Then the update pipeline is ; executed. ; -; Everything is composited into the tiles in the playfield and then the screen is rendered in -; a single pass. +; There are two major rendering modes: a composited mode and a scanline mode. The composited mode +; will render all of the sprites into the playfield tiles, and then perform a single blit to update +; the entire playfield. The scanline mode utilized shadowing and blits the background scanlines +; on sprite lines first, then draws the sprites and finally exposes the updated scanlines. +; +; The composited mode has the advantages of being able to render sprites behind tile data as well +; as avoiding most overdraw. The scanline mode is able to draw sprites correctly even when scanline +; effect are used on the background and has lower overhead, which can make it faster in some cases, +; even with the additional overdraw. ; ; TODO -- actually check the dirty bits and be selective on what gets updated. For example, if ; only the Y position changes, then we should only need to set new values on the @@ -32,13 +39,6 @@ _Render stz SpriteRemovedFlag ; If we remove a sprite, then we need to flag a rebuild for the next frame -; If we are doing per-scanline rendering, use the alternate renderer - - lda #RENDER_PER_SCANLINE - bit RenderFlags - beq *+5 - jmp _RenderScanlines ; Do the scanline-based renderer - jsr _ApplyBG0YPos ; Set stack addresses for the virtual lines to the physical screen lda #RENDER_BG1_ROTATION @@ -61,6 +61,7 @@ _Render jsr _ApplyTiles ; This function actually draws the new tiles into the code field jsr _ApplyBG0XPos ; Patch the code field instructions with exit BRA opcode + lda #RENDER_BG1_ROTATION bit RenderFlags bne :skip_bg1_x @@ -79,8 +80,8 @@ _Render ; optimization that can be done here is that the lines can be rendered in any order ; since it is not shown on-screen yet. - ldx Overlays+2 ; Blit the full virtual buffer to the screen - ldy Overlays+4 + ldx Overlays+OVERLAY_TOP ; Blit the full virtual buffer to the screen + ldy Overlays+OVERLAY_BOTTOM jsr _BltRange ; Turn shadowing back on @@ -89,14 +90,9 @@ _Render ; Now render all of the remaining lines in top-to-bottom (or bottom-to-top) order - ldx #0 - ldy Overlays+2 - beq :skip - jsr _BltRange -:skip jsr _DoOverlay - ldx Overlays+4 + ldx Overlays+OVERLAY_BOTTOM cpx ScreenHeight beq :done ldy ScreenHeight @@ -138,14 +134,14 @@ _Render rts _DoOverlay - lda Overlays+6 + lda Overlays+OVERLAY_PROC stal :disp+1 - lda Overlays+7 + lda Overlays+OVERLAY_PROC+1 stal :disp+2 lda ScreenY0 ; pass the address of the first line of the overlay clc - adc Overlays+2 + adc Overlays+OVERLAY_TOP asl tax lda ScreenAddr,x @@ -312,3 +308,157 @@ _ApplyDirtyTiles stz DirtyTileCount ; Reset the dirty tile count rts +; This rendering mode turns off shadowing and draws all of the relevant background lines and then +; draws sprites on top of the background before turning shadowing on and exposing the lines to the +; screen. Even though entire lines are drawn twice, it's so efficient that it is often faster +; than using all of the logic to draw/erase tiles in the TileBuffer, even though less visible words +; are touched. +; +; This mode is also necessary if per-scanling rendering it used since spritge would not look correct +; if each line had independent offsets. +_RenderWithShadowing + sta RenderFlags + jsr _DoTimers ; Run any pending timer tasks + + jsr _ApplyBG0YPos ; Set stack addresses for the virtual lines to the physical screen + jsr _ApplyBG1YPos ; Set the y-register values of the blitter + +; _ApplyBG0Xpos need to be split because we have to set the offsets, then draw in any updated tiles, and +; finally patch out the code field. Right now, the BRA operand is getting overwritten by tile data. + + jsr _ApplyBG0XPosPre + jsr _ApplyBG1XPosPre + + jsr _UpdateBG0TileMap ; and the tile maps. These subroutines build up a list of tiles + jsr _UpdateBG1TileMap ; that need to be updated in the code field + + jsr _ApplyTiles ; This function actually draws the new tiles into the code field + + jsr _ApplyBG0XPos ; Patch the code field instructions with exit BRA opcode + jsr _ApplyBG1XPos ; Update the direct page value based on the horizontal position + +; At this point, everything in the background has been rendered into the code field. Next, we need +; to create priority lists of scanline ranges. +; +; The objects that need to be reasoned about are +; +; 1. Sprites +; 2. Overlays +; a. Solid High Priority +; b. Solid Low Priority +; c. Masked High Priority +; d. Masked Low Priority +; 3. Background +; +; Notes: +; +; A High Priority overlay is rendered above the sprites +; A Low Priority overlay is rendered below the sprites +; A Solid High Priority overlay obscured everything and if the only thing drawn on the scanline +; +; The order of draw oprations is: +; +; 1. Turn off shadowing +; 2. Draw the background for scanlines with (Sprites OR a Masked Low Priority overlay) AND NOT a Solid Low Priority overlay +; 3. Draw the Solid Low Priority overlays +; 4. Draw the Sprites +; 5. Draw the Masked Low Priority overlays +; 6. Turn on shadowing +; 7. Draw, in top-to-bottom order +; a. Background lines not drawn yet +; b. PEI Slam lines with (Sprites OR a Masked Low Priority Overlay) AND NOT a High Priority overlay +; c. High Priority overlays +; +; The work of this routine is to quickly build a sorted list of scanline ranges that can the appropriate +; sub-renderer + +; jsr BuildShadowSegments +; +; The trick is to create a bit-field mapping for the different actions to define + + lda Overlays + beq :no_ovrly + + jsr _ShadowOff + +; Shadowing is turned off. Render all of the scan lines that need a second pass. One +; optimization that can be done here is that the lines can be rendered in any order +; since it is not shown on-screen yet. + + ldx Overlays+OVERLAY_TOP ; Blit the full virtual buffer to the screen + ldy Overlays+OVERLAY_BOTTOM + jsr _BltRange + +; Turn shadowing back on + + jsr _ShadowOn + +; Now render all of the remaining lines in top-to-bottom (or bottom-to-top) order + + ldx #0 + ldy Overlays+OVERLAY_TOP + beq :skip + jsr _BltRange +:skip + jsr _DoOverlay + + ldx Overlays+OVERLAY_BOTTOM + cpx ScreenHeight + beq :done + ldy ScreenHeight + jsr _BltRange + bra :done + +:no_ovrly + ldx #0 ; Blit the full virtual buffer to the screen + ldy ScreenHeight + jsr _BltRange +:done + + ldx #0 + ldy ScreenHeight + jsr _BltSCB + + lda StartYMod208 ; Restore the fields back to their original state + ldx ScreenHeight + jsr _RestoreBG0Opcodes + + lda StartY + sta OldStartY + lda StartX + sta OldStartX + + lda BG1StartY + sta OldBG1StartY + lda BG1StartX + sta OldBG1StartX + + stz DirtyBits + stz LastRender ; Mark that a full render was just performed + + lda SpriteRemovedFlag ; If any sprite was removed, set the rebuild flag + beq :no_removal + lda #DIRTY_BIT_SPRITE_ARRAY + sta DirtyBits +:no_removal + rts + +; Look at the overlay list and the sprite list and figure out which scaneline ranges need to be +; blitted in what order. We try to build all of the scan line segments lists because that +; saves the work of re-scanning the lists. +; +; The semgent list definitions are: +; +; BLIT_W_SHADOW_OF +BuildShadowSegments +; ldx _SortedHead +; bmi :no_sprite +;:loop +; lda _Sprites+CLIP_TOP,x +; lda _Sprites+SORTED_NEXT,x +; tax +; bpl :loop +; +; lda #0 ; Start at the top of the + + rts diff --git a/src/Sprite.s b/src/Sprite.s index c76888e..d8501a5 100644 --- a/src/Sprite.s +++ b/src/Sprite.s @@ -223,10 +223,11 @@ _DoPhase1 trb SpriteMap lda #SPRITE_STATUS_EMPTY ; Mark as empty so no error if we try to Add a sprite here again sta _Sprites+SPRITE_STATUS,y - jmp _ClearSpriteFromTileStore ; Clear the tile flags, add to the dirty tile list and done - + tyx + jsr _DeleteSprite ; Remove sprite from linked list + txy ; Restore y-register :hidden - jmp _ClearSpriteFromTileStore + jmp _ClearSpriteFromTileStore ; Clear the tile flags, add to the dirty tile list and done :no_clear @@ -406,7 +407,8 @@ _AddSprite lda _SpriteBits,x ; Get the bit flag for this sprite slot tsb SpriteMap ; Mark it in the sprite map bit field - jmp _PrecalcAllSpriteInfo ; Cache sprite property values + jsr _PrecalcAllSpriteInfo ; Cache sprite property values + jmp _InsertSprite ; Insert it into the sorted list ; _SortSprite ; @@ -419,9 +421,9 @@ _AddSprite ; ; X = current sprite index ; -; The sorting strategy is to +; The sorting strategy is to ; -; a) check if the corrent slot's y-pos is greater than the next item. If yes, then search forward +; a) check if the current slot's y-pos is greater than the next item. If yes, then search forward ; b) check if the current slot's y-pos is less than the prev item. If yes, then search in reverse ; c) sprite is in the correct location ; @@ -1022,7 +1024,7 @@ _RemoveSprite ora #SPRITE_STATUS_REMOVED sta _Sprites+SPRITE_STATUS,x - rts + rts ; The _DeleteSprite call is made in _DoPhase1 during the next render ; Update the sprite's flags. We do not allow the size of a sprite to be changed. That requires ; the sprite to be removed and re-added. @@ -1112,4 +1114,4 @@ _MoveSprite sta _Sprites+SPRITE_STATUS,x jsr _PrecalcSpritePos ; Can be specialized to only update (x,y) values - jmp _SortSprite ; UPdate the sprite's sorted position + jmp _SortSprite ; Update the sprite's sorted position diff --git a/src/Tiles.s b/src/Tiles.s index 741720e..6acf6f2 100644 --- a/src/Tiles.s +++ b/src/Tiles.s @@ -445,16 +445,16 @@ _SetTileProcs ; TileProcTables ; ; Tables of tuples used to populate the K_TS_* dispatch arrays for different combinations. This is -; easier to maintain than a bunch of conditional code. Each etry hold three addresses. +; easier to maintain than a bunch of conditional code. Each entry holds three addresses. ; ; First address: Draw a tile directly into the code buffer (no sprites) ; Second address: Draw a tile merged with sprite data from the direct page ; Third address: Specialize routine to draw a tile merged with one sprite ; ; There are unique tuples of routines for all of the different combinations of tile properties -; and engine modes. This is an extesive number of combinations, but it simplified the development -; and maintainence of the rendering subroutines. Also, the difference subroutines can be written -; in any way and can make use of their on subroutines to reduce code size. +; and engine modes. This is an extensive number of combinations, but it simplifies the development +; and maintainence of the rendering subroutines. Also, the different subroutines can be written +; in any way and can make use of their own subroutines to reduce code size. ; ; Properties: ; @@ -506,6 +506,12 @@ DynUnder dw CopyDynamicTile,DynamicUnder,OneSpriteDynamicUnder ; the TILE_SOLID_BIT hint bit can be set to indicate that a tile ; has no transparency. This allows one of the faster routines ; to be selected from the other Proc tables +; +; FUTURE: An optimization that can be done is to have the snippets +; code layout fixed based on the EngineFlags and then the Two Layer +; routines should only need to update the DATA and MASK operands in +; the snippet at a fixed location rather than rebuild the ~20 bytes +; of data. TwoLyrProcs TwoLyrOverZA dw Tile0TwoLyr,SpriteOver0TwoLyr,OneSpriteOver0TwoLyr TwoLyrOverZV dw Tile0TwoLyr,SpriteOver0TwoLyr,OneSpriteOver0TwoLyr diff --git a/src/Tool.s b/src/Tool.s index 741f674..2fc7ec1 100644 --- a/src/Tool.s +++ b/src/Tool.s @@ -293,7 +293,15 @@ _TSRender _TSEntry lda :flags,s + bit #RENDER_WITH_SHADOWING + beq :no_shadowing + jsr _RenderWithShadowing + bra :done + +:no_shadowing jsr _Render + +:done _TSExit #0;#2 @@ -696,14 +704,15 @@ _TSSetOverlay lda #1 sta Overlays + stz Overlays+OVERLAY_FLAGS lda :top,s - sta Overlays+2 + sta Overlays+OVERLAY_TOP lda :bottom,s - sta Overlays+4 + sta Overlays+OVERLAY_BOTTOM lda :proc,s - sta Overlays+6 + sta Overlays+OVERLAY_PROC lda :proc+2,s - sta Overlays+8 + sta Overlays+OVERLAY_PROC+2 _TSExit #0;#8 diff --git a/src/static/TileStore.s b/src/static/TileStore.s index 79daea1..3170f7c 100644 --- a/src/static/TileStore.s +++ b/src/static/TileStore.s @@ -391,7 +391,7 @@ Timers ENT ds TIMER_REC_SIZE*MAX_TIMERS Overlays ENT dw 0 ; count - ds 8 ; only support one or now (start_line, end_line, function call) + ds 10 ; only support one for now (flags, start_line, end_line, function call) ; From the IIgs ref DefaultPalette ENT From 50930af3624d89282b87fdd229cf3838c8e0a576 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Mon, 2 Jan 2023 20:39:40 -0600 Subject: [PATCH 34/68] Re-add tile load --- demos/kfest-2022/demo-1/App.Main.s | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/demos/kfest-2022/demo-1/App.Main.s b/demos/kfest-2022/demo-1/App.Main.s index d4d740f..6ad1f60 100644 --- a/demos/kfest-2022/demo-1/App.Main.s +++ b/demos/kfest-2022/demo-1/App.Main.s @@ -58,11 +58,11 @@ appTmp0 equ 28 ; Load a tileset -; pea 0 -; pea 256 -; pea #^tiledata -; pea #tiledata -; _GTELoadTileSet + pea 0 + pea 256 + pea #^tiledata + pea #tiledata + _GTELoadTileSet pea $0000 pea #^TileSetPalette From 48bf7145d87169e3a8b76784091453ba2e2aa4f5 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Mon, 2 Jan 2023 20:40:09 -0600 Subject: [PATCH 35/68] Fix parameters to startup and tile init --- demos/kfest-2022/demo-5/App.Main.s | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/demos/kfest-2022/demo-5/App.Main.s b/demos/kfest-2022/demo-5/App.Main.s index 2a68015..30db407 100644 --- a/demos/kfest-2022/demo-5/App.Main.s +++ b/demos/kfest-2022/demo-5/App.Main.s @@ -59,8 +59,9 @@ SpriteCount equ 50 _MTStartUp ; GTE requires the miscellaneous toolset to be running - lda #0 ; Engine in Fast Mode + lda #ENGINE_MODE_USER_TOOL ; Engine in Fast Mode jsr GTEStartUp ; Load and install the GTE User Tool + jsr SoundStartUp jsr StartMusic @@ -81,6 +82,8 @@ SpriteCount equ 50 ; Load a tileset + pea #0 + pea #512 pea #^tiledata pea #tiledata _GTELoadTileSet From 2af4dddb8e23f95337274279b0efebd7e03c9967 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Mon, 2 Jan 2023 20:44:40 -0600 Subject: [PATCH 36/68] Fix common init functions --- demos/kfest-2022/demo-10/App.Main.s | 2 +- demos/kfest-2022/demo-2/App.Main.s | 2 +- demos/kfest-2022/demo-3/App.Main.s | 2 +- demos/kfest-2022/demo-4/App.Main.s | 2 +- demos/kfest-2022/demo-8/App.Main.s | 2 +- demos/kfest-2022/demo-9/App.Main.s | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/demos/kfest-2022/demo-10/App.Main.s b/demos/kfest-2022/demo-10/App.Main.s index e6dc8d1..5dc4b55 100644 --- a/demos/kfest-2022/demo-10/App.Main.s +++ b/demos/kfest-2022/demo-10/App.Main.s @@ -61,7 +61,7 @@ Scale equ 56 _MTStartUp ; GTE requires the miscellaneous toolset to be running - lda #ENGINE_MODE_TWO_LAYER+ENGINE_MODE_DYN_TILES + lda #ENGINE_MODE_USER_TOOL+ENGINE_MODE_TWO_LAYER+ENGINE_MODE_DYN_TILES jsr GTEStartUp ; Load and install the GTE User Tool ; Initialize local variables diff --git a/demos/kfest-2022/demo-2/App.Main.s b/demos/kfest-2022/demo-2/App.Main.s index 76d17e3..62a7edb 100644 --- a/demos/kfest-2022/demo-2/App.Main.s +++ b/demos/kfest-2022/demo-2/App.Main.s @@ -47,7 +47,7 @@ appTmp0 equ 28 _MTStartUp ; GTE requires the miscellaneous toolset to be running - lda #ENGINE_MODE_DYN_TILES ; Engine in Fast Mode + lda #ENGINE_MODE_USER_TOOL+ENGINE_MODE_DYN_TILES ; Engine in Fast Mode jsr GTEStartUp ; Load and install the GTE User Tool ; Initialize local variables diff --git a/demos/kfest-2022/demo-3/App.Main.s b/demos/kfest-2022/demo-3/App.Main.s index 2be006a..7337c1d 100644 --- a/demos/kfest-2022/demo-3/App.Main.s +++ b/demos/kfest-2022/demo-3/App.Main.s @@ -56,7 +56,7 @@ appTmp2 equ 32 _MTStartUp ; GTE requires the miscellaneous toolset to be running - lda #ENGINE_MODE_DYN_TILES ; Engine in Fast Mode + lda #ENGINE_MODE_USER_TOOL+ENGINE_MODE_DYN_TILES ; Engine in Fast Mode jsr GTEStartUp ; Load and install the GTE User Tool ; Initialize local variables diff --git a/demos/kfest-2022/demo-4/App.Main.s b/demos/kfest-2022/demo-4/App.Main.s index 6c1b398..a605933 100644 --- a/demos/kfest-2022/demo-4/App.Main.s +++ b/demos/kfest-2022/demo-4/App.Main.s @@ -49,7 +49,7 @@ appTmp2 equ 32 _MTStartUp ; GTE requires the miscellaneous toolset to be running - lda #ENGINE_MODE_TWO_LAYER+ENGINE_MODE_DYN_TILES + lda #ENGINE_MODE_USER_TOOL+ENGINE_MODE_TWO_LAYER+ENGINE_MODE_DYN_TILES jsr GTEStartUp ; Load and install the GTE User Tool ; Initialize local variables diff --git a/demos/kfest-2022/demo-8/App.Main.s b/demos/kfest-2022/demo-8/App.Main.s index fe1cdc2..941f4f8 100644 --- a/demos/kfest-2022/demo-8/App.Main.s +++ b/demos/kfest-2022/demo-8/App.Main.s @@ -49,7 +49,7 @@ appTmp2 equ 32 _MTStartUp ; GTE requires the miscellaneous toolset to be running - lda #ENGINE_MODE_TWO_LAYER+ENGINE_MODE_DYN_TILES + lda #ENGINE_MODE_USER_TOOL+ENGINE_MODE_TWO_LAYER+ENGINE_MODE_DYN_TILES jsr GTEStartUp ; Load and install the GTE User Tool ; Initialize local variables diff --git a/demos/kfest-2022/demo-9/App.Main.s b/demos/kfest-2022/demo-9/App.Main.s index df58655..fd5231c 100644 --- a/demos/kfest-2022/demo-9/App.Main.s +++ b/demos/kfest-2022/demo-9/App.Main.s @@ -60,7 +60,7 @@ SpriteCount equ 54 _MTStartUp ; GTE requires the miscellaneous toolset to be running - lda #ENGINE_MODE_TWO_LAYER+ENGINE_MODE_DYN_TILES + lda #ENGINE_MODE_USER_TOOL+ENGINE_MODE_TWO_LAYER+ENGINE_MODE_DYN_TILES jsr GTEStartUp ; Load and install the GTE User Tool ; Initialize local variables From 31ca627c14e739db9694766177802fdc25b3ad14 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Sun, 8 Jan 2023 01:30:51 -0600 Subject: [PATCH 37/68] Make sprite pre-calc rotines more specific and fix x,y argument ordering in AddSprite --- src/Sprite.s | 29 ++++++++++++----------------- src/Tool.s | 10 +++++----- 2 files changed, 17 insertions(+), 22 deletions(-) diff --git a/src/Sprite.s b/src/Sprite.s index d8501a5..aca2037 100644 --- a/src/Sprite.s +++ b/src/Sprite.s @@ -150,7 +150,7 @@ ROW_BYTES equ 384 ; VBUFF_TILE_ROW_BYTES ; a. If it is not marked in the DirtyTile list ; * Clear its bit from the TileStore's TS_SPRITE_FLAG ; * Add the tile to the DirtyTile list -;t +; ; 2. If a sprite is marked as SPRITE_STATUS_REMOVED, then ; A. Clear its bit from the SpriteBits bitmap ; B. For each tile the sprite overlaps with: @@ -384,7 +384,7 @@ _AddSprite sta _Sprites+SPRITE_ID,x ; Keep a copy of the full descriptor - lda #SPRITE_STATUS_ADDED + lda #SPRITE_STATUS_ADDED ; Used to initialize the SPRITE_STATUS sta _Sprites+SPRITE_STATUS,x stz _Sprites+VBUFF_ADDR,x ; Clear the VBUFF address, just to initialize it @@ -407,8 +407,10 @@ _AddSprite lda _SpriteBits,x ; Get the bit flag for this sprite slot tsb SpriteMap ; Mark it in the sprite map bit field - jsr _PrecalcAllSpriteInfo ; Cache sprite property values - jmp _InsertSprite ; Insert it into the sorted list + jsr _PrecalcSpriteSize ; Cache sprite property values + jsr _PrecalcSpriteBounds + + jmp _InsertSprite ; Insert it into the sorted list ; _SortSprite ; @@ -905,26 +907,19 @@ _CacheSpriteBanks ; Precalculate some cached values for a sprite. These are *only* to make other part of code, ; specifically the draw/erase routines more efficient. ; -; There are variations of this routine based on whether we are adding a new sprite, updating -; it's tile information, or changing its position. -; ; X = sprite index -_PrecalcAllSpriteInfo - jsr _PrecalcSpriteState - jmp _PrecalcSpritePos - -_PrecalcSpriteState +_PrecalcSpriteVBuff lda _Sprites+SPRITE_ID,x -; and #$3E00 xba and #$0006 - tay lda _Sprites+VBUFF_ADDR,x clc adc _stamp_step,y sta _Sprites+SPRITE_DISP,x + rts +_PrecalcSpriteSize ; Set the sprite's width and height lda #4 sta _Sprites+SPRITE_WIDTH,x @@ -948,7 +943,7 @@ _PrecalcSpriteState ; Clip the sprite's bounding box to the play field size and also set a flag if the sprite ; is fully off-screen or not -_PrecalcSpritePos +_PrecalcSpriteBounds lda _Sprites+SPRITE_X,x bpl :pos_x lda #0 @@ -1077,7 +1072,7 @@ _UpdateSprite ora #SPRITE_STATUS_UPDATED sta _Sprites+SPRITE_STATUS,x - jmp _PrecalcSpriteState ; Cache stuff and return + jmp _PrecalcSpriteVBuff ; Cache stuff and return ; Move a sprite to a new location. If the tile ID of the sprite needs to be changed, then ; a full remove/add cycle needs to happen @@ -1113,5 +1108,5 @@ _MoveSprite ora #SPRITE_STATUS_MOVED sta _Sprites+SPRITE_STATUS,x - jsr _PrecalcSpritePos ; Can be specialized to only update (x,y) values + jsr _PrecalcSpriteBounds ; Can be specialized to only update (x,y) values jmp _SortSprite ; Update the sprite's sorted position diff --git a/src/Tool.s b/src/Tool.s index 2fc7ec1..0530b7b 100644 --- a/src/Tool.s +++ b/src/Tool.s @@ -360,13 +360,13 @@ _TSAddSprite _TSEntry - lda :spriteY,s - and #$00FF - xba - sta :spriteY,s lda :spriteX,s and #$00FF - ora :spriteY,s + xba + sta :spriteX,s + lda :spriteY,s + and #$00FF + ora :spriteX,s tay lda :spriteSlot,s From 46a88b1d22825a85d399b37d23126a9258224a26 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 23 Feb 2023 19:23:03 -0600 Subject: [PATCH 38/68] Sync old code --- demos/kfest-2022/demo-5/App.Main.s | 92 +++++++++++++++++++++--------- 1 file changed, 66 insertions(+), 26 deletions(-) diff --git a/demos/kfest-2022/demo-5/App.Main.s b/demos/kfest-2022/demo-5/App.Main.s index 0a8d54b..53b2cd7 100644 --- a/demos/kfest-2022/demo-5/App.Main.s +++ b/demos/kfest-2022/demo-5/App.Main.s @@ -114,12 +114,20 @@ SpriteCount equ 50 lda MaxGlobalY sec sbc #48 ; 32 for tiles, 16 for sprite + lda #48 ; 32 for tiles, 16 for sprite sta PlayerGlobalY sta PlayerY stz PlayerXVel stz PlayerYVel +; Set the screen to the bottom-left + + pea $0000 + lda MaxBG0Y + pha + _GTESetBG0Origin + ; Create the sprites HERO_SIZE equ {SPRITE_16X16} @@ -134,28 +142,46 @@ HERO_FRAME_4 equ HERO_SIZE+151 HERO_VBUFF_4 equ VBUFF_SPRITE_START+3*VBUFF_SPRITE_STEP HERO_SLOT equ 1 -; pea HERO_FRAME_1 -; pea HERO_VBUFF_1 -; _GTECreateSpriteStamp + pea HERO_FRAME_1 + pea HERO_VBUFF_1 + _GTECreateSpriteStamp -; pea HERO_FRAME_2 -; pea HERO_VBUFF_2 -; _GTECreateSpriteStamp + pea HERO_FRAME_2 + pea HERO_VBUFF_2 + _GTECreateSpriteStamp -; pea HERO_FRAME_3 -; pea HERO_VBUFF_3 -; _GTECreateSpriteStamp + pea HERO_FRAME_3 + pea HERO_VBUFF_3 + _GTECreateSpriteStamp -; pea HERO_FRAME_4 -; pea HERO_VBUFF_4 -; _GTECreateSpriteStamp + pea HERO_FRAME_4 + pea HERO_VBUFF_4 + _GTECreateSpriteStamp -; pea HERO_SLOT ; Put the player in slot 1 -; pea HERO_FLAGS -; pea HERO_VBUFF_1 ; and use this stamp -; pei PlayerX -; pei PlayerY -; _GTEAddSprite + pea HERO_SLOT ; Put the player in slot 1 + pea HERO_FLAGS + pea HERO_VBUFF_1 ; and use this stamp + pei PlayerX + pei PlayerY + _GTEAddSprite + + pea HERO_SLOT+1 ; Put the player in slot 1 + pea HERO_FLAGS + pea HERO_VBUFF_1 ; and use this stamp + lda PlayerX + adc #4 + pha + pei PlayerY + _GTEAddSprite + + pea HERO_SLOT+2 ; Put the player in slot 1 + pea HERO_FLAGS + pea HERO_VBUFF_1 ; and use this stamp + lda PlayerX + adc #8 + pha + pei PlayerY + _GTEAddSprite pea $0000 _GTERender @@ -204,15 +230,29 @@ EvtLoop stz PlayerXVel do_render - jsr UpdatePlayerPos ; Apply forces - jsr ApplyCollisions ; Check if we run into things - jsr UpdateCameraPos ; Moves the screen +; jsr UpdatePlayerPos ; Apply forces +; jsr ApplyCollisions ; Check if we run into things +; jsr UpdateCameraPos ; Moves the screen ; pea HERO_SLOT ; pei PlayerX ; pei PlayerY ; _GTEMoveSprite ; Move the sprite to this local position +; pea HERO_SLOT+1 +; lda PlayerX +; adc #4 +; pha +; pei PlayerY +; _GTEMoveSprite ; Move the sprite to this local position + +; pea HERO_SLOT+2 +; lda PlayerX +; adc #8 +; pha +; pei PlayerY +; _GTEMoveSprite ; Move the sprite to this local position + ; pea $0000 ; _GTERender @@ -222,11 +262,11 @@ do_render pha _GTEGetSeconds pla -; cmp OldOneSecondCounter -; beq :noudt -; sta OldOneSecondCounter -; jsr UdtOverlay -; stz frameCount + cmp OldOneSecondCounter + beq :noudt + sta OldOneSecondCounter + jsr UdtOverlay + stz frameCount :noudt brl EvtLoop From af6e0224545528bd31fda371c7f1d0e1a2b73e63 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 23 Feb 2023 19:24:09 -0600 Subject: [PATCH 39/68] WIP for working through scanline algos --- tools/scanline-test.py | 105 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 tools/scanline-test.py diff --git a/tools/scanline-test.py b/tools/scanline-test.py new file mode 100644 index 0000000..396e06e --- /dev/null +++ b/tools/scanline-test.py @@ -0,0 +1,105 @@ +# Playground for working through scanline decomposition algorithm + +# 1. Shadow Off +# 2. Draw Playfield (sprite OR overlay) AND NOT solid_overlay +# 3. Draw sprites + +sprites = [ + { 'top': 10, 'bottom': 17 }, + { 'top': 14, 'bottom': 29 } +] + +overlays = [ + { 'top': 0, 'bottom': 7 } +] + +MAX_HEIGHT = 199 + +# Combine a list on ranges into a minimal list by merging overlapping ranges +def simplify(a): + b = [] + if len(a) > 0: + last = a[0] + start = last['top'] + for r in a[1:]: + if r['top'] <= last['bottom']: + last = r + continue + + b.append([start, last['bottom']]) + last = r + start = r['top'] + + b.append([start, last['bottom']]) + + return b + +# Given two sorted lists, merge them together into a minimal set of ranges. This could +# be done as a list merge nd then a combine step, but we want to be more efficient and +# do the merge-and-compbine at the same time +def merge(a, b): + if len(a) == 0: + return simplify(b) + + if len(b) == 0: + return simplify(a) + + c = [] + i = j = 0 + + while i < len(a) and j < len(b): + if a[i]['top'] <= b[j]['top']: + c.append(a[i]) + i += 1 + else: + c.append(b[j]) + j += 1 + + if i < len(a): + c.extend(a[i:]) + + if j < len(b): + c.extend(b[j:]) + + return simplify(c) + +# Find the lines that need to be drawn with shadowing off +def get_shadow_off_bg(sprites): + ranges = [] + + if len(sprites) > 0: + last = sprites[0] + start = last['top'] + + for sprite in sprites[1:]: + if sprite['top'] <= last['bottom']: + last = sprite + continue + + ranges.push([start, last['bottom']]) + start = sprite['top'] + last = sprite + + ranges.append([start, last['bottom']]) + + return ranges + +def complement(ranges): + comp = [] + if len(ranges) > 0: + if ranges[0][0] > 0: + comp.append([0, ranges[0][0]]) + for i in range(1, len(ranges)): + comp.append([ranges[i-1][1]+1, ranges[i][0]]) + last = ranges[len(ranges)-1] + if last[1] < MAX_HEIGHT: + comp.append([last[1]+1, MAX_HEIGHT]) + return comp + else: + return [0, MAX_HEIGHT] + +r = get_shadow_off_bg(sprites) +print(r) +print(complement(r)) + +print(merge(sprites, overlays)) \ No newline at end of file From 981182592ef1fc001c40822d2f7b82b85057cdd7 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Mon, 27 Feb 2023 15:30:56 -0600 Subject: [PATCH 40/68] Shadow based rendering working in demo-5 --- demos/kfest-2022/demo-5/App.Main.s | 8 +- macros/CORE.MACS.S | 2 +- src/Defs.s | 8 + src/Render.s | 258 +++++++++++++++++++++++++---- src/Sprite.s | 2 +- src/SpriteRender.s | 102 ++++++++++++ src/Tool.s | 1 + src/blitter/PEISlammer.s | 14 +- src/blitter/Template.s | 15 ++ src/static/TileStore.s | 18 +- src/static/TileStoreDefs.s | 2 - 11 files changed, 389 insertions(+), 41 deletions(-) diff --git a/demos/kfest-2022/demo-5/App.Main.s b/demos/kfest-2022/demo-5/App.Main.s index 53b2cd7..6a33765 100644 --- a/demos/kfest-2022/demo-5/App.Main.s +++ b/demos/kfest-2022/demo-5/App.Main.s @@ -62,8 +62,8 @@ SpriteCount equ 50 lda #ENGINE_MODE_USER_TOOL ; Engine in Fast Mode jsr GTEStartUp ; Load and install the GTE User Tool - jsr SoundStartUp - jsr StartMusic +; jsr SoundStartUp +; jsr StartMusic ; Initialize local variables @@ -183,7 +183,7 @@ HERO_SLOT equ 1 pei PlayerY _GTEAddSprite - pea $0000 + pea #RENDER_WITH_SHADOWING _GTERender EvtLoop @@ -272,7 +272,7 @@ do_render ; Exit code Exit - jsr SoundShutDown +; jsr SoundShutDown _GTEShutDown Quit _QuitGS qtRec diff --git a/macros/CORE.MACS.S b/macros/CORE.MACS.S index 29fe055..e939015 100644 --- a/macros/CORE.MACS.S +++ b/macros/CORE.MACS.S @@ -3,7 +3,7 @@ **************************************** _Err mac bcc NoErr - do ]0 ; (DO if true) + do ]0 ; (DO if true) Mu jsr PgmDeath ; this is conditionally compiled if str ]1 ; we pass in an error statement else ; (ELSE) diff --git a/src/Defs.s b/src/Defs.s index cbdbb87..884fcda 100644 --- a/src/Defs.s +++ b/src/Defs.s @@ -290,5 +290,13 @@ StartXMod164Arr EXT LastPatchOffsetArr EXT _SortedHead EXT +_ShadowListCount EXT +_ShadowListTop EXT +_ShadowListBottom EXT +_DirectListCount EXT +_DirectListTop EXT +_DirectListBottom EXT + + ; Tool error codes NO_TIMERS_AVAILABLE equ 10 diff --git a/src/Render.s b/src/Render.s index 5ed15af..fbcf56b 100644 --- a/src/Render.s +++ b/src/Render.s @@ -314,7 +314,7 @@ _ApplyDirtyTiles ; than using all of the logic to draw/erase tiles in the TileBuffer, even though less visible words ; are touched. ; -; This mode is also necessary if per-scanling rendering it used since spritge would not look correct +; This mode is also necessary if per-scanling rendering it used since sprites would not look correct ; if each line had independent offsets. _RenderWithShadowing sta RenderFlags @@ -330,7 +330,7 @@ _RenderWithShadowing jsr _ApplyBG1XPosPre jsr _UpdateBG0TileMap ; and the tile maps. These subroutines build up a list of tiles - jsr _UpdateBG1TileMap ; that need to be updated in the code field +; jsr _UpdateBG1TileMap ; that need to be updated in the code field jsr _ApplyTiles ; This function actually draws the new tiles into the code field @@ -339,6 +339,17 @@ _RenderWithShadowing ; At this point, everything in the background has been rendered into the code field. Next, we need ; to create priority lists of scanline ranges. + + jsr _BuildShadowList ; Create the rages based on the sorted sprite y-values + jsr _ComplementList ; Create the complement to identify non-sprite scanlines + + jsr _ShadowOff ; Turn off shadowing and draw all the scanlines with sprites on them + jsr _DrawShadowList + jsr _DrawDirectSprites ; Draw the sprites directly to the Bank $01 graphics buffer (skipping the render-to-tile step) + + jsr _ShadowOn ; Turn shadowing back on + jsr _DrawComplementList ; Alternate drawing scanlines and PEI slam to expose the full fram + ; ; The objects that need to be reasoned about are ; @@ -376,48 +387,50 @@ _RenderWithShadowing ; ; The trick is to create a bit-field mapping for the different actions to define - lda Overlays - beq :no_ovrly - - jsr _ShadowOff +; lda Overlays +; beq :no_ovrly +; +; jsr _ShadowOff ; Shadowing is turned off. Render all of the scan lines that need a second pass. One ; optimization that can be done here is that the lines can be rendered in any order ; since it is not shown on-screen yet. - ldx Overlays+OVERLAY_TOP ; Blit the full virtual buffer to the screen - ldy Overlays+OVERLAY_BOTTOM - jsr _BltRange +; ldx Overlays+OVERLAY_TOP ; Blit the full virtual buffer to the screen +; ldy Overlays+OVERLAY_BOTTOM +; jsr _BltRange ; Turn shadowing back on - jsr _ShadowOn +; jsr _ShadowOn ; Now render all of the remaining lines in top-to-bottom (or bottom-to-top) order - ldx #0 - ldy Overlays+OVERLAY_TOP - beq :skip - jsr _BltRange -:skip - jsr _DoOverlay +; ldx #0 +; ldy Overlays+OVERLAY_TOP +; beq :skip +; jsr _BltRange +;:skip +; jsr _DoOverlay - ldx Overlays+OVERLAY_BOTTOM - cpx ScreenHeight - beq :done - ldy ScreenHeight - jsr _BltRange - bra :done +; ldx Overlays+OVERLAY_BOTTOM +; cpx ScreenHeight +; beq :done +; ldy ScreenHeight +; jsr _BltRange +; bra :done -:no_ovrly - ldx #0 ; Blit the full virtual buffer to the screen - ldy ScreenHeight - jsr _BltRange -:done +;:no_ovrly - ldx #0 - ldy ScreenHeight - jsr _BltSCB +; ldx #0 ; Blit the full virtual buffer to the screen +; ldy ScreenHeight +; jsr _BltRange + +;:done + + ; ldx #0 + ; ldy ScreenHeight + ; jsr _BltSCB lda StartYMod208 ; Restore the fields back to their original state ldx ScreenHeight @@ -443,7 +456,7 @@ _RenderWithShadowing :no_removal rts -; Look at the overlay list and the sprite list and figure out which scaneline ranges need to be +; Look at the overlay list and the sprite list and figure out which scanline ranges need to be ; blitted in what order. We try to build all of the scan line segments lists because that ; saves the work of re-scanning the lists. ; @@ -462,3 +475,186 @@ BuildShadowSegments ; lda #0 ; Start at the top of the rts + +; Function to iterate through the sprite list and build a merged scanline list of sprites. Once this is +; done, we re-scan the list to build the complement for scanlines that do not need shadowing. +_BuildShadowList + + ldy #0 ; This is the index into the list of shadow segments + + ldx _SortedHead + bmi :empty + bra :insert + +; Start of loop +:advance + iny + iny + +:insert + lda _Sprites+SPRITE_CLIP_TOP,x ; Load the sprite's top line + sta _ShadowListTop,y ; Set the top entry of the list to the sprite top + + lda _Sprites+SPRITE_CLIP_BOTTOM,x ; Optimistically set the end of the segment to the bottom of this sprite + inc + +:replace + sta _ShadowListBottom,y +:skip + lda _Sprites+SORTED_NEXT,x ; If there another sprite in the list? + bmi :no_more_sprites ; If not, we can finish up + + tax + lda _ShadowListBottom,y ; If the bottom of the current sprite is _less than_ the top of the next + cmp _Sprites+SPRITE_CLIP_TOP,x ; sprite, then there is a gap and we create a new entry + bcc :advance + + lda _Sprites+SPRITE_CLIP_BOTTOM,x ; Get the bottom value of the next sprite. + inc + cmp _ShadowListBottom,y ; If it extends the segment then replace the value, otherwise skip + bcc :skip + bra :replace + +:no_more_sprites + iny ; Set the list count to N * 2 + iny +:empty + sty _ShadowListCount + rts + +; Run through the shadow list and make a complementary list, e.g +; [[0, 7], [12, 19]] -> [[7, 12], [19, end]] +; [[2, 10], [20, 40]] -> [[0, 2], [10, 20], [40, end]] + +_ComplementList + ldy #0 + tyx + + lda _ShadowListCount + beq :empty_list + + lda _ShadowListTop + beq :loop + + stz _DirectListTop + sta _DirectListBottom + + inx + inx + +:loop + lda _ShadowListBottom,y + sta _DirectListTop,x + + iny ; Move to the next shadow list record + iny + cpy _ShadowListCount ; Are there any other segments to process + bcs :eol + + lda _ShadowListTop,y + sta _DirectListBottom,x ; Finish the direct list entry + + inx + inx + bra :loop + +:eol + lda ScreenHeight + sta _DirectListBottom,x + + inx ; Set the count to N * 2 + inx + stx _DirectListCount + rts + +:empty_list + lda #1 + sta _DirectListCount + stz _DirectListTop + lda ScreenHeight + sta _DirectListBottom + rts + +; Iterate through the shadow list and call _BltRange on each +_DrawShadowList + ldx #0 + bra :start + +:loop + phx ; Save the index + lda _ShadowListTop,x + ldy _ShadowListBottom,x + tax + jsr _BltRange + + plx + inx + inx +:start + cpx _ShadowListCount + bcc :loop + + rts + +; Run through the list of sprites that are not IS_OFFSCREEN and draw them directly to the graphics screen. We can use +; compiled sprites here, with limitations. +_DrawDirectSprites + ldx _SortedHead + bmi :empty + +:loop + phx + jsr _DrawStampToScreen + plx + + lda _Sprites+SORTED_NEXT,x ; If there another sprite in the list? + tax + bpl :loop + +:empty + rts + +; Run through the complement list and alternate between calling _PEISlam and _BltRange to show to full screen +_DrawComplementList + + ldx #0 + + lda _DirectListCount ; Skip empty lists + beq :out + + lda _DirectListTop ; If the first segment starts at 0, begin with _BltRange + beq :blt_range + + lda #0 + bra :pei_first + +:blt_range + phx + lda _DirectListTop,x + ldy _DirectListBottom,x + tax + jsr _BltRange + plx + + lda _DirectListBottom,x ; Grab a copy of the bottom of the blit range + inx + inx ; Advance to the next entry + cpx _DirectListCount + bcs :last ; Done, so check if there is any remaining part of the screen to slam + +:pei_first + phx + ldy _DirectListTop,x + tax + jsr _PEISlam + plx + bra :blt_range + +:last + cmp ScreenHeight ; If the bottom on the last segment didn't come to the bottom of the + bcs :out ; screen, then expose that range + tax + ldy ScreenHeight + jsr _PEISlam +:out + rts \ No newline at end of file diff --git a/src/Sprite.s b/src/Sprite.s index aca2037..db02ce5 100644 --- a/src/Sprite.s +++ b/src/Sprite.s @@ -904,7 +904,7 @@ _CacheSpriteBanks rts -; Precalculate some cached values for a sprite. These are *only* to make other part of code, +; Precalculate some cached values for a sprite. These are *only* to make other parts of code, ; specifically the draw/erase routines more efficient. ; ; X = sprite index diff --git a/src/SpriteRender.s b/src/SpriteRender.s index 2f001a1..c0a5d37 100644 --- a/src/SpriteRender.s +++ b/src/SpriteRender.s @@ -1,3 +1,105 @@ +; Draw a sprite directly to the graphics screen. No clipping / bounds checking is performed +; +; X = sprite record index +_DrawStampToScreen + clc + lda _Sprites+SPRITE_Y,x + adc ScreenY0 + asl + asl + asl + asl + asl + sta tmp0 + asl + asl + clc + adc tmp0 + clc + adc #$2000 + clc + adc ScreenX0 + adc _Sprites+SPRITE_X,x ; Move to the horizontal address + tay ; This is the on-screen address + + lda _Sprites+SPRITE_HEIGHT,x + sta tmp0 + +; Sprite is either 8 or 16 pixels wide, so select the entry point + lda _Sprites+SPRITE_WIDTH,x + cmp #4 + beq :skinny + + lda _Sprites+SPRITE_DISP,x ; This is the VBUFF address with the correct sprite frame + tax + phb + pea $0101 + plb + plb + bra :entry16 +:loop16 + clc + txa + adc #SPRITE_PLANE_SPAN + tax + tya + adc #SHR_LINE_WIDTH + tay +:entry16 + lda: 6,y + andl spritemask+6,x + oral spritedata+6,x + sta: 6,y + lda: 4,y + andl spritemask+4,x + oral spritedata+4,x + sta: 4,y + lda: 2,y + andl spritemask+2,x + oral spritedata+2,x + sta: 2,y + lda: 0,y + andl spritemask+0,x + oral spritedata+0,x + sta: 0,y + + dec tmp0 + bne :loop16 + + plb + rts + +:skinny + lda _Sprites+SPRITE_DISP,x ; This is the VBUFF address with the correct sprite frame + tax + phb + pea $0101 + plb + plb + bra :entry8 +:loop8 + clc + txa + adc #SPRITE_PLANE_SPAN + tax + tya + adc #SHR_LINE_WIDTH + tay +:entry8 + lda: 2,y + andl spritemask+2,x + oral spritedata+2,x + sta: 2,y + lda: 0,y + andl spritemask+0,x + oral spritedata+0,x + sta: 0,y + + dec tmp0 + bne :loop8 + + plb + rts ; Alternate entry point that takes arguments in registers instead of using a _Sprite ; record ; diff --git a/src/Tool.s b/src/Tool.s index 0530b7b..76fc809 100644 --- a/src/Tool.s +++ b/src/Tool.s @@ -880,3 +880,4 @@ _TSGetAddress put blitter/Template.s put blitter/TemplateUtils.s put blitter/Blitter.s + put blitter/PEISlammer.s diff --git a/src/blitter/PEISlammer.s b/src/blitter/PEISlammer.s index 888335d..a01a437 100644 --- a/src/blitter/PEISlammer.s +++ b/src/blitter/PEISlammer.s @@ -6,13 +6,20 @@ ; slammer, note that page-aligned addresses repeat every 8 scan lines and some lines would need ; to be split into two slams to keep the direct page aligned. ; -; At best, this saves 1 cycles per word, or 80 cycles for a full screen -- which is only about +; At best, this saves 1 cycles per word, or 80 cycles for a full scanline -- which is only about ; 12 additional instructions, so this is an optimization that is unlikely to lead to a net ; improvement. ; ; X = first line (inclusive), valid range of 0 to 199 ; Y = last line (exclusive), valid range >X up to 200 _PEISlam + cpx #201 + bcc *+4 + brk $A9 + cpy #201 + bcc *+4 + brk $A8 + lda ScreenWidth dec stal :screen_width_1 ; save the width-1 outside of the direct page @@ -31,6 +38,11 @@ _PEISlam tay ; get the number of lines in the y register txa + clc + adc ScreenY0 ; Adjust for the origin + cmp #201 + bcc *+4 + brk $A7 asl tax lda RTable,x ; This is the right visible byte, so add one to get the diff --git a/src/blitter/Template.s b/src/blitter/Template.s index 427249e..2c1c335 100644 --- a/src/blitter/Template.s +++ b/src/blitter/Template.s @@ -232,6 +232,21 @@ epilogue_1 tsc ; its passed state, because having the carry bit clear prevents evaluation of ; the V bit. ; +; The snippet code is fixed to allow fast updates and the entry point is chosen based on the +; EngineMode during initializations +; +; _snippet +; lda (00),y ; Entry point for mixed dyn & bg1. Set opcode below. +; and 80,x +; lda (00),y ; Entry point for BG1 or Dyn. Change opcode. +; and #MASK +; ora #DATA +; _2 bcs _alt +; pha +; jmp NEXT +; _alt jmp RTN +; + ; Snippet Samples: ; ; Standard Two-level Mix (23 bytes) diff --git a/src/static/TileStore.s b/src/static/TileStore.s index 3170f7c..5951097 100644 --- a/src/static/TileStore.s +++ b/src/static/TileStore.s @@ -508,7 +508,23 @@ _SpriteBitsNot ENT ; are stored here. A negative value is used as a setinel _SortedHead ENT dw $FFFF -;_SortedTail dw $FFFF + +; Array of screen ranges covered by the sprites. Adjacent sprites are merged. Used in the shadowing renderer +_ShadowListCount ENT + ds 2 +_ShadowListTop ENT + ds {2*{MAX_SPRITES+1}} ; space for all of the sprites + overlay range +_ShadowListBottom ENT + ds {2*{MAX_SPRITES+1}} + +; Complement of the Shadow List. Can have one more segment than that list +_DirectListCount ENT + ds 2 +_DirectListTop ENT + ds {2*{MAX_SPRITES+2}} +_DirectListBottom ENT + ds {2*{MAX_SPRITES+2}} + ; Steps to the different sprite stamps _stamp_step ENT diff --git a/src/static/TileStoreDefs.s b/src/static/TileStoreDefs.s index 356e355..6de5d4b 100644 --- a/src/static/TileStoreDefs.s +++ b/src/static/TileStoreDefs.s @@ -12,7 +12,6 @@ TS_TILE_ADDR equ {TILE_STORE_SIZE*3} ; cached value, the address TS_CODE_ADDR_LOW equ {TILE_STORE_SIZE*4} ; const value, address of this tile in the code fields TS_CODE_ADDR_HIGH equ {TILE_STORE_SIZE*5} TS_WORD_OFFSET equ {TILE_STORE_SIZE*6} ; const value, word offset value for this tile if LDA (dp),y instructions re used -;TS_BASE_ADDR equ {TILE_STORE_SIZE*7} ; const value, because there are two rows of tiles per bank, this is set to $0000 or $8000. TS_JMP_ADDR equ {TILE_STORE_SIZE*7} ; const value, address of the 32-byte snippet space for this tile TS_SCREEN_ADDR equ {TILE_STORE_SIZE*8} ; cached value of on-screen location of tile. Used for DirtyRender. @@ -62,7 +61,6 @@ SPRITE_HEIGHT equ {MAX_SPRITES*28} SPRITE_CLIP_WIDTH equ {MAX_SPRITES*30} SPRITE_CLIP_HEIGHT equ {MAX_SPRITES*32} TS_VBUFF_BASE equ {MAX_SPRITES*34} ; Finalized VBUFF address based on the sprite position and tile offsets -;VBUFF_ARRAY_ADDR equ {MAX_SPRITES*36} ; Fixed address where this sprite's VBUFF addresses are stores. The array is the same shape as TileStore, but much smaller SORTED_PREV equ {MAX_SPRITES*36} SORTED_NEXT equ {MAX_SPRITES*38} From e2e30dfcf4a240c7f8e4c86670d1a64e7ddd1fb5 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Tue, 28 Feb 2023 11:17:43 -0600 Subject: [PATCH 41/68] Checkpoint for initial framing for compiled sprite support --- src/Defs.s | 7 ++- src/Render.s | 71 ++++++++++++++++++--- src/SpriteRender.s | 124 ++++++++++++++++++++++++++++++++++++- src/static/TileStoreDefs.s | 2 +- 4 files changed, 190 insertions(+), 14 deletions(-) diff --git a/src/Defs.s b/src/Defs.s index 884fcda..e886f8a 100644 --- a/src/Defs.s +++ b/src/Defs.s @@ -228,13 +228,14 @@ TILE_CTRL_MASK equ $FE00 ; TILE_PROC_MASK equ $F800 ; Select tile proc for rendering ; Sprite constants -SPRITE_HIDE equ $2000 +SPRITE_COMPILED equ $4000 ; This is a compiled sprite (SPRITE_DISP points to a routine in the compiled cache bank) +SPRITE_HIDE equ $2000 ; Do not render the sprite SPRITE_16X16 equ $1800 ; 16 pixels wide x 16 pixels tall SPRITE_16X8 equ $1000 ; 16 pixels wide x 8 pixels tall SPRITE_8X16 equ $0800 ; 8 pixels wide x 16 pixels tall SPRITE_8X8 equ $0000 ; 8 pixels wide x 8 pixels tall -SPRITE_VFLIP equ $0400 -SPRITE_HFLIP equ $0200 +SPRITE_VFLIP equ $0400 ; Flip the sprite vertically +SPRITE_HFLIP equ $0200 ; Flip the sprite horizontally ; Stamp storage parameters VBUFF_STRIDE_BYTES equ {12*4} ; Each line has 4 slots of 16 pixels + 8 buffer pixels diff --git a/src/Render.s b/src/Render.s index fbcf56b..757517c 100644 --- a/src/Render.s +++ b/src/Render.s @@ -341,7 +341,9 @@ _RenderWithShadowing ; to create priority lists of scanline ranges. jsr _BuildShadowList ; Create the rages based on the sorted sprite y-values - jsr _ComplementList ; Create the complement to identify non-sprite scanlines +; jsr _MergeOverlay ; Add the overlay range into the shadow list (treat it as a sprite) + + jsr _ComplementList ; Create the complement to identify non-sprite / non-overlay scanlines jsr _ShadowOff ; Turn off shadowing and draw all the scanlines with sprites on them jsr _DrawShadowList @@ -484,7 +486,7 @@ _BuildShadowList ldx _SortedHead bmi :empty - bra :insert + bra :insert ; Start of loop :advance @@ -496,7 +498,7 @@ _BuildShadowList sta _ShadowListTop,y ; Set the top entry of the list to the sprite top lda _Sprites+SPRITE_CLIP_BOTTOM,x ; Optimistically set the end of the segment to the bottom of this sprite - inc + inc ; Clip values are on the scanline, so add one to make it a proper interval :replace sta _ShadowListBottom,y @@ -603,13 +605,25 @@ _DrawDirectSprites bmi :empty :loop - phx - jsr _DrawStampToScreen - plx + lda _Sprites+SPRITE_STATUS,x + bit #SPRITE_STATUS_HIDDEN + bne :next - lda _Sprites+SORTED_NEXT,x ; If there another sprite in the list? + lda _Sprites+SPRITE_ID,x ; If this is a compiled sprite, call the routine in the compilation bank + bit #SPRITE_COMPILED + bne :compiled + + phx + jsr _DrawStampToScreen + plx + bra :next + +:compiled + +:next + lda _Sprites+SORTED_NEXT,x ; If there another sprite in the list? tax - bpl :loop + bpl :loop :empty rts @@ -633,6 +647,8 @@ _DrawComplementList lda _DirectListTop,x ldy _DirectListBottom,x tax + lda #0 + jsr DebugSCBs jsr _BltRange plx @@ -646,6 +662,8 @@ _DrawComplementList phx ldy _DirectListTop,x tax + lda #1 + jsr DebugSCBs jsr _PEISlam plx bra :blt_range @@ -655,6 +673,41 @@ _DrawComplementList bcs :out ; screen, then expose that range tax ldy ScreenHeight + lda #1 + jsr DebugSCBs jsr _PEISlam :out - rts \ No newline at end of file + rts + +; Helper to set a palette index on a range of SCBs to help show whicih actions are applied to which lines +DebugSCBs + phx + phy + sep #$30 ; short m/x + + pha ; save the SCB value + + phx + tya + sec + sbc 1,s + tay ; number of scanlines + + pla + clc + adc ScreenY0 + tax ; physical line index + + pla +:loop + stal SHR_SCB,x + inx + dey + bne :loop + + rep #$30 + ply + plx + rts + + diff --git a/src/SpriteRender.s b/src/SpriteRender.s index c0a5d37..6879b15 100644 --- a/src/SpriteRender.s +++ b/src/SpriteRender.s @@ -1,7 +1,129 @@ -; Draw a sprite directly to the graphics screen. No clipping / bounds checking is performed +; Compile a stamp into a compilation cache +_CompileStamp +_lines equ tmp0 +_width0 equ tmp1 +_width equ tmp2 +baseAddr equ tmp3 +destAddr equ tmp4 +vbuffAddr equ tmp5 + + lda _Sprites+SPRITE_HEIGHT,x + sta _lines + + lda _Sprites+SPRITE_WIDTH,x ; Width in bytes (4 or 8) + lsr + sta + sta _width0 + + lda _Sprites+SPRITE_DISP,x ; Get the address of the stamp + sta vbuffAddr + tax + + ldy CompileBankTop ; First free byte in the compilation bank + + phb + pei CompileBank + plb + plb ; Set the bank to the compilation cache + + stz baseAddr + stz destAddr + +:oloop + lda _width0 + sta _width + +:iloop + ldal spritemask,x + beq :no_mask ; If Mask == $0000, then it's a solid word + cmp #$FFFF + beq :next ; If Mask == $FFFF, then it's transparent + +; Mask with the screen data + lda #LDA_ABS_X_OPCODE + sta: 0,y + lda destAddr + sta: 1,y + sta: 10,y + lda #AND_IMM_OPCODE + sta: 3,y + ldal spritemask,x + sta: 4,y + lda #ORA_IMM_OPCODE + sta: 6,y + ldal spritedata,x + sta: 7,y + lda #STA_ABS_X_OPCODE + sta: 9,y + + tya + adc #12 + tay + bra :next + +; Just store the data +:no_mask lda #LDA_IMM_OPCODE + sta: 0,y + ldal spritedata,x + sta: 1,y + + lda #STA_ABS_X_OPCODE + sta: 3,y + lda destAddr + sta: 4,y + + tya + adc #6 + tay + +:next + inx + inx + + inc destAddr ; Move to the next word + inc destAddr + + dec _width + bne :iloop + + lda vbuffAddr + adc #SPRITE_PLANE_SPAN + sta vbuffAddr + tax + + lda baseAddr ; Move to the next line + adc #160 + sta baseAddr + sta destAddr + + dec lines + bne :oloop + + lda #RTL_OPCODE ; Finish up the subroutine + sta: 0,y + iny + sty CompileBankTop + + plb + rts + +; Draw a sprite directly to the graphics screen. If sprite is clipped at all, do not draw. ; ; X = sprite record index +_DSTSOut + rts + _DrawStampToScreen + lda _Sprites+IS_OFF_SCREEN,x ; If the sprite is off-screen, don't draw it + bne _DSTSOut + + lda _Sprites+SPRITE_CLIP_WIDTH,x ; If the sprite is clipped to the playfield, don't draw it + cmp _Sprites+SPRITE_WIDTH,x + bne _DSTSOut + lda _Sprites+SPRITE_CLIP_HEIGHT,x + cmp _Sprites+SPRITE_HEIGHT,x + bne _DSTSOut + clc lda _Sprites+SPRITE_Y,x adc ScreenY0 diff --git a/src/static/TileStoreDefs.s b/src/static/TileStoreDefs.s index 6de5d4b..5dccf78 100644 --- a/src/static/TileStoreDefs.s +++ b/src/static/TileStoreDefs.s @@ -61,7 +61,7 @@ SPRITE_HEIGHT equ {MAX_SPRITES*28} SPRITE_CLIP_WIDTH equ {MAX_SPRITES*30} SPRITE_CLIP_HEIGHT equ {MAX_SPRITES*32} TS_VBUFF_BASE equ {MAX_SPRITES*34} ; Finalized VBUFF address based on the sprite position and tile offsets -SORTED_PREV equ {MAX_SPRITES*36} +SORTED_PREV equ {MAX_SPRITES*36} ; Doubly-Linked List that maintains the sprites in sorted order based on SPRITE_Y SORTED_NEXT equ {MAX_SPRITES*38} ; 52 rows by 82 columns + 2 extra rows and columns for sprite sizes From c14f3c7283a854f352ef4596b6519d6472f7b6f3 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Wed, 1 Mar 2023 13:18:37 -0600 Subject: [PATCH 42/68] Functional compiled sprites in demo-5 --- ORCACDefs/gte.h | 1 + demos/kfest-2022/demo-5/App.Main.s | 100 ++++++++++++++++------- macros/GTE.Macs.s | 4 + src/CoreImpl.s | 2 + src/Defs.s | 18 ++--- src/Memory.s | 10 ++- src/Render.s | 18 ++--- src/Sprite.s | 126 +++++++++++++++++++++++++++-- src/SpriteRender.s | 117 +++++++++++++++++++-------- src/Tool.s | 37 ++++++--- src/blitter/Blitter.s | 21 ++--- 11 files changed, 339 insertions(+), 115 deletions(-) diff --git a/ORCACDefs/gte.h b/ORCACDefs/gte.h index d152cf8..3af4406 100644 --- a/ORCACDefs/gte.h +++ b/ORCACDefs/gte.h @@ -61,6 +61,7 @@ extern pascal Word GTEStatus(void) inline(0x06A0, tool_dispatcher); /* GTE Sprite Routines */ extern pascal void GTECreateSpriteStamp(Word spriteDescriptor, Word vBuffAddr) inline(0x0FA0, tool_dispatcher); +extern pascal Word GTECompileSpriteStamp(Word spriteDescriptor, Word vBuffAddr) inline(0x2DA0, tool_dispatcher); extern pascal void GTEAddSprite(Word spriteSlot, Word spriteFlags, Word vBuffAddr, Word x, Word y) inline(0x10A0, tool_dispatcher); extern pascal void GTEMoveSprite(Word spriteSlot, Word x, Word y) inline(0x11A0, tool_dispatcher); extern pascal void GTEUpdateSprite(Word spriteSlot, Word spriteFlags, Word vBuffAddr) inline(0x12A0, tool_dispatcher); diff --git a/demos/kfest-2022/demo-5/App.Main.s b/demos/kfest-2022/demo-5/App.Main.s index 6a33765..f94f4ff 100644 --- a/demos/kfest-2022/demo-5/App.Main.s +++ b/demos/kfest-2022/demo-5/App.Main.s @@ -49,6 +49,10 @@ LastHFlip equ 44 SpriteFrame equ 46 SpriteToggle equ 48 SpriteCount equ 50 +PlayerX1 equ 52 +PlayerY1 equ 54 +PlayerX2 equ 56 +PlayerY2 equ 58 phk plb @@ -111,12 +115,17 @@ SpriteCount equ 50 lda #16 sta PlayerGlobalX sta PlayerX + sta PlayerX1 + sta PlayerX2 + lda MaxGlobalY sec sbc #48 ; 32 for tiles, 16 for sprite lda #48 ; 32 for tiles, 16 for sprite sta PlayerGlobalY sta PlayerY + sta PlayerY1 + sta PlayerY2 stz PlayerXVel stz PlayerYVel @@ -142,6 +151,8 @@ HERO_FRAME_4 equ HERO_SIZE+151 HERO_VBUFF_4 equ VBUFF_SPRITE_START+3*VBUFF_SPRITE_STEP HERO_SLOT equ 1 +; Create stamps of each sprite + pea HERO_FRAME_1 pea HERO_VBUFF_1 _GTECreateSpriteStamp @@ -158,29 +169,37 @@ HERO_SLOT equ 1 pea HERO_VBUFF_4 _GTECreateSpriteStamp +; Compile the sprite stamps and hold the compilation token + + pha ; Space for result + pea HERO_SIZE + pea HERO_VBUFF_1 + _GTECompileSpriteStamp + pla + pea HERO_SLOT ; Put the player in slot 1 - pea HERO_FLAGS - pea HERO_VBUFF_1 ; and use this stamp + pea HERO_FLAGS+SPRITE_COMPILED ; mark this as a compiled sprite (can only use in RENDER_WITH_SHADOWING mode) + pha ; pass in the token of the compiled stamp pei PlayerX pei PlayerY _GTEAddSprite +; brl Exit + +; Repeat for each stamp. _GTECompileSpriteStamp will return an error if it runs out of memory + pea HERO_SLOT+1 ; Put the player in slot 1 pea HERO_FLAGS pea HERO_VBUFF_1 ; and use this stamp - lda PlayerX - adc #4 - pha - pei PlayerY + pei PlayerX1 + pei PlayerY1 _GTEAddSprite pea HERO_SLOT+2 ; Put the player in slot 1 pea HERO_FLAGS pea HERO_VBUFF_1 ; and use this stamp - lda PlayerX - adc #8 - pha - pei PlayerY + pei PlayerX2 + pei PlayerY2 _GTEAddSprite pea #RENDER_WITH_SHADOWING @@ -230,31 +249,39 @@ EvtLoop stz PlayerXVel do_render -; jsr UpdatePlayerPos ; Apply forces -; jsr ApplyCollisions ; Check if we run into things -; jsr UpdateCameraPos ; Moves the screen + jsr UpdatePlayerPos ; Apply forces + jsr ApplyCollisions ; Check if we run into things + jsr UpdateCameraPos ; Moves the screen -; pea HERO_SLOT -; pei PlayerX -; pei PlayerY -; _GTEMoveSprite ; Move the sprite to this local position + pea HERO_SLOT + pei PlayerX + pei PlayerY + _GTEMoveSprite ; Move the sprite to this local position -; pea HERO_SLOT+1 -; lda PlayerX -; adc #4 -; pha -; pei PlayerY -; _GTEMoveSprite ; Move the sprite to this local position + pea HERO_SLOT+1 + lda PlayerX1 + sec + sbc StartX + pha + lda PlayerY1 + sec + sbc StartY + pha + _GTEMoveSprite ; Move the sprite to this local position -; pea HERO_SLOT+2 -; lda PlayerX -; adc #8 -; pha -; pei PlayerY -; _GTEMoveSprite ; Move the sprite to this local position + pea HERO_SLOT+2 + lda PlayerX2 + sec + sbc StartX + pha + lda PlayerY2 + sec + sbc StartY + pha + _GTEMoveSprite ; Move the sprite to this local position -; pea $0000 -; _GTERender + pea #RENDER_WITH_SHADOWING + _GTERender ; Update the performance counters @@ -429,6 +456,17 @@ UpdatePlayerPos ApplyCollisions +; Move coordinates down the list + lda PlayerX1 + sta PlayerX2 + lda PlayerY1 + sta PlayerY2 + + lda PlayerGlobalX + sta PlayerX1 + lda PlayerGlobalY + sta PlayerY1 + ; Convert global to local coordinates lda PlayerGlobalX diff --git a/macros/GTE.Macs.s b/macros/GTE.Macs.s index b24a999..f49fe93 100644 --- a/macros/GTE.Macs.s +++ b/macros/GTE.Macs.s @@ -129,6 +129,9 @@ _GTESetBG1Scale MAC _GTEGetAddress MAC UserTool $2C00+GTEToolNum <<< +_GTECompileSpriteStamp MAC + UserTool $2D00+GTEToolNum + <<< ; EngineMode definitions ; Script definition @@ -181,6 +184,7 @@ TILE_CTRL_MASK equ $FE00 ; Sprite constants +SPRITE_COMPILED equ $4000 ; This is a compiled sprite SPRITE_HIDE equ $2000 SPRITE_16X16 equ $1800 SPRITE_16X8 equ $1000 diff --git a/src/CoreImpl.s b/src/CoreImpl.s index ff6651f..7041f82 100644 --- a/src/CoreImpl.s +++ b/src/CoreImpl.s @@ -220,6 +220,8 @@ EngineReset stz BG1TileMapPtr stz BG1TileMapPtr+2 + stz CompileBankTop + stz SCBArrayPtr stz SCBArrayPtr+2 diff --git a/src/Defs.s b/src/Defs.s index e886f8a..28792c4 100644 --- a/src/Defs.s +++ b/src/Defs.s @@ -40,12 +40,12 @@ EngineMode equ 20 ; Defined the mode/capabilities that ar ; bit 2: 0 = No static buffer, 1 = Allocation Bank 00 space for a static screen buffer DirtyBits equ 22 ; Identify values that have changed between frames -BG1DataBank equ 24 ; Data bank that holds BG1 layer data -BG1AltBank equ 26 ; Alternate BG1 bank +CompileBank0 equ 24 ; Always zero to allow [CompileBank0],y addressing +CompileBank equ 26 ; Data bank that holds compiled sprite code -BlitterDP equ 28 ; Direct page address the holder blitter data +BlitterDP equ 28 ; Direct page address that holds blitter data -OldStartX equ 30 +OldStartX equ 30 ; Used to track deltas between frames OldStartY equ 32 LastPatchOffset equ 34 ; Offset into code field that was patched with BRA instructions @@ -61,7 +61,7 @@ BG1StartYMod208 equ 46 OldBG1StartX equ 48 OldBG1StartY equ 50 -BG1OffsetIndex equ 52 +BG1OffsetIndex equ 52 ; Utility index for scanline effect in BG1 BG0TileOriginX equ 54 ; Coordinate in the tile map that corresponds to the top-left corner BG0TileOriginY equ 56 @@ -73,22 +73,22 @@ BG1TileOriginY equ 64 OldBG1TileOriginX equ 66 OldBG1TileOriginY equ 68 -TileMapWidth equ 70 +TileMapWidth equ 70 ; Pointer to memory holding the tile map for the primary background TileMapHeight equ 72 TileMapPtr equ 74 FringeMapPtr equ 78 BG1TileMapWidth equ 82 BG1TileMapHeight equ 84 -BG1TileMapPtr equ 86 +BG1TileMapPtr equ 86 ; Pointer to memory holding the tile map for the secondary background SCBArrayPtr equ 90 ; Used for palette binding SpriteBanks equ 94 ; Bank bytes for the sprite data and sprite mask LastRender equ 96 ; Record which render function was last executed -; gap +CompileBankTop equ 98 ; First free byte i nthe compile bank. Grows upward in memeory. SpriteMap equ 100 ; Bitmap of open sprite slots. ActiveSpriteCount equ 102 -BankLoad equ 104 +BG1DataBank equ 104 ; Data bank that holds BG1 layer data TileStoreBankAndBank01 equ 106 TileStoreBankAndTileDataBank equ 108 TileStoreBankDoubled equ 110 diff --git a/src/Memory.s b/src/Memory.s index fc52753..721bb83 100644 --- a/src/Memory.s +++ b/src/Memory.s @@ -59,16 +59,20 @@ InitMemory lda EngineMode _Deref stx BlitterDP -; Allocate banks of memory for BG1 +; Allocate banks of memory for BG1. If the user wants to swap between multiple BG1 banks, then they need to be allocated +; outside of GTE and selected using the GTESetBG1Bank() function. Passing a zero for that function's argument will +; always set the bank to the allocated bank number. Bank 00 and Bank 01 are illegal values. + lda EngineMode bit #ENGINE_MODE_TWO_LAYER beq :no_bg1 jsr AllocOneBank2 sta BG1DataBank +:no_bg1 jsr AllocOneBank2 - sta BG1AltBank -:no_bg1 + sta CompileBank + stz CompileBank0 ; Allocate the 13 banks of memory we need and store in double-length array ]step equ 0 diff --git a/src/Render.s b/src/Render.s index 757517c..0b1ad86 100644 --- a/src/Render.s +++ b/src/Render.s @@ -609,17 +609,11 @@ _DrawDirectSprites bit #SPRITE_STATUS_HIDDEN bne :next - lda _Sprites+SPRITE_ID,x ; If this is a compiled sprite, call the routine in the compilation bank - bit #SPRITE_COMPILED - bne :compiled - phx jsr _DrawStampToScreen plx bra :next -:compiled - :next lda _Sprites+SORTED_NEXT,x ; If there another sprite in the list? tax @@ -647,8 +641,8 @@ _DrawComplementList lda _DirectListTop,x ldy _DirectListBottom,x tax - lda #0 - jsr DebugSCBs +; lda #0 +; jsr DebugSCBs jsr _BltRange plx @@ -662,8 +656,8 @@ _DrawComplementList phx ldy _DirectListTop,x tax - lda #1 - jsr DebugSCBs +; lda #1 +; jsr DebugSCBs jsr _PEISlam plx bra :blt_range @@ -673,8 +667,8 @@ _DrawComplementList bcs :out ; screen, then expose that range tax ldy ScreenHeight - lda #1 - jsr DebugSCBs +; lda #1 +; jsr DebugSCBs jsr _PEISlam :out rts diff --git a/src/Sprite.s b/src/Sprite.s index db02ce5..16ca9b3 100644 --- a/src/Sprite.s +++ b/src/Sprite.s @@ -331,7 +331,7 @@ phase1 dw :phase1_0 ; the stamp every time. So this allows users to create stamps in advance and then ; assign them to the sprites as needed. ; -; Note that the user had full freedom to create a stamp at any VBUFF address, however, +; Note that the user has full freedom to create a stamp at any VBUFF address, however, ; without leaving a buffer around each stamp, graphical corruption will occur. It is ; recommended that the defines for VBUFF_SPRITE_START, VBUFF_TILE_ROW_BYTES and ; VBUFF_TILE_COL_BYTES to calculate tile-aligned corner locations to lay out the @@ -362,8 +362,8 @@ _CreateSpriteStamp ; 01 - 8x16 (1x2 tiles) ; 10 - 16x8 (2x1 tiles) ; 11 - 16x16 (2x2 tiles) -; Bit 13 : Show/Hid sprite -; Bit 14 : Reserved. Must be zero. +; Bit 13 : Show/Hide sprite during rendering +; Bit 14 : Mark sprite as a compile sprite. SPRITE_DISP is treated as a compilation token. ; Bit 15 : Reserved. Must be zero. ; TBD: Bit 15 : Low Sprite priority. Draws behind high priority tiles. ; @@ -371,7 +371,7 @@ _CreateSpriteStamp ; the vertical tiles are taken from tileId + 32. This is why tile sheets should be saved ; with a width of 256 pixels. ; -; A = vbuffAddress +; A = Sprite ID / Flags ; Y = High Byte = x-pos, Low Byte = y-pos ; X = Sprite Slot (0 - 15) _AddSprite @@ -387,7 +387,8 @@ _AddSprite lda #SPRITE_STATUS_ADDED ; Used to initialize the SPRITE_STATUS sta _Sprites+SPRITE_STATUS,x - stz _Sprites+VBUFF_ADDR,x ; Clear the VBUFF address, just to initialize it + lda #$FFFF + sta _Sprites+VBUFF_ADDR,x ; Clear the VBUFF address, just to initialize it phy tya @@ -909,14 +910,123 @@ _CacheSpriteBanks ; ; X = sprite index _PrecalcSpriteVBuff - lda _Sprites+SPRITE_ID,x + lda _Sprites+SPRITE_ID,x ; Compiled sprites use the SPRITE_DISP as a fixed address to compiled code + bit #SPRITE_COMPILED + bne :compiled + xba and #$0006 tay lda _Sprites+VBUFF_ADDR,x clc adc _stamp_step,y - sta _Sprites+SPRITE_DISP,x + sta _Sprites+SPRITE_DISP,x ; Interpreted as an address in the VBUFF bank + rts + +:compiled + xba + and #$0006 ; Pick the address from the table of 4 values. Can use this value directly + clc ; as an index + adc _Sprites+VBUFF_ADDR,x + tay + lda [CompileBank0],y + sta _Sprites+SPRITE_DISP,x ; Interpreted as an address in the CompileBank + rts + +; Compile the four stamps and keep a reference to the addresses. We take the current CompileBankTop address and allocate 8 bytes +; of memory. Then compile each stamp and save the compilation address in the header area. Finally, the DISP_ADDR is set +; to that value and the SPRITE_COMPILED bit is set in the SPRITE_ID word. +; +; A = sprite Id +; X = vbuff base address +_CompileStampSet +:height equ tmp8 +:width equ tmp9 +:base equ tmp10 +:output equ tmp11 +:addrs equ tmp12 ; 4 words (tmp12, tmp13, tmp14 and tmp15) + +; Save the base address + stx :base + +; Initialize the height and width based on the sprite flags + + ldy #8 + sty :height + ldx #4 + stx :width + + bit #$1000 ; wide flag + beq :skinny + ldx #8 + stx :width +:skinny + + bit #$0800 ; tall flag + beq :short + ldy #16 + sty :height +:short + + lda CompileBankTop + sta :output ; Save the current address as the return value + + clc + adc #8 + sta CompileBankTop ; Allocate space for the 4 addresses return by _CompileStamp + +; ldy :height ; X and Y are already set for the first call +; ldx :width + lda :base + jsr _CompileStamp ; Compile into the bank + sta :addrs ; Save the address temporarily + + ldy :height + ldx :width + clc + lda :base + adc _stamp_step+2 + jsr _CompileStamp + sta :addrs+2 + + ldy :height + ldx :width + clc + lda :base + adc _stamp_step+4 + jsr _CompileStamp + sta :addrs+4 + + ldy :height + ldx :width + clc + lda :base + adc _stamp_step+6 + jsr _CompileStamp + sta :addrs+6 + +; Now the sprite stamps are all compiled. Set the bank to the compilation bank and fill in the header + + phb + + ldy :output + pei CompileBank + plb + + lda :addrs + sta: 0,y + lda :addrs+2 + sta: 2,y + lda :addrs+4 + sta: 4,y + lda :addrs+6 + sta: 6,y + + plb + plb + + tya ; Put the output value into the accumulator + clc ; No error rts _PrecalcSpriteSize @@ -1026,7 +1136,7 @@ _RemoveSprite ; ; A = Sprite slot ; X = New Sprite Flags -; Y = New Sprite Stamp Address +; Y = New Sprite Stamp Address | New Compiled Sprite Token _UpdateSprite cmp #MAX_SPRITES bcc :ok diff --git a/src/SpriteRender.s b/src/SpriteRender.s index 6879b15..772aa78 100644 --- a/src/SpriteRender.s +++ b/src/SpriteRender.s @@ -1,37 +1,48 @@ ; Compile a stamp into a compilation cache +; +; A = vbuff address +; X = width (in bytes) +; Y = height (in scanlines) + _CompileStamp -_lines equ tmp0 -_width0 equ tmp1 -_width equ tmp2 -baseAddr equ tmp3 -destAddr equ tmp4 -vbuffAddr equ tmp5 +:lines equ tmp0 +:sprwidth equ tmp1 +:cntwidth equ tmp2 +:baseAddr equ tmp3 +:destAddr equ tmp4 +:vbuffAddr equ tmp5 +:rtnval equ tmp6 - lda _Sprites+SPRITE_HEIGHT,x - sta _lines +LDA_IMM_OPCODE equ $A9 +LDA_ABS_X_OPCODE equ $BD +AND_IMM_OPCODE equ $29 +ORA_IMM_OPCODE equ $09 +STA_ABS_X_OPCODE equ $9D +STZ_ABS_X_OPCODE equ $9E +RTL_OPCODE equ $6B - lda _Sprites+SPRITE_WIDTH,x ; Width in bytes (4 or 8) + sta :vbuffAddr + sty :lines + txa lsr - sta - sta _width0 + sta :sprwidth - lda _Sprites+SPRITE_DISP,x ; Get the address of the stamp - sta vbuffAddr - tax +; Get ready to build the sprite ldy CompileBankTop ; First free byte in the compilation bank + sty :rtnval ; Save it as the return value phb pei CompileBank - plb plb ; Set the bank to the compilation cache - stz baseAddr - stz destAddr + stz :baseAddr + stz :destAddr :oloop - lda _width0 - sta _width + lda :sprwidth + sta :cntwidth + ldx :vbuffAddr :iloop ldal spritemask,x @@ -42,9 +53,8 @@ vbuffAddr equ tmp5 ; Mask with the screen data lda #LDA_ABS_X_OPCODE sta: 0,y - lda destAddr + lda :destAddr sta: 1,y - sta: 10,y lda #AND_IMM_OPCODE sta: 3,y ldal spritemask,x @@ -55,8 +65,11 @@ vbuffAddr equ tmp5 sta: 7,y lda #STA_ABS_X_OPCODE sta: 9,y + lda :destAddr + sta: 10,y tya + clc adc #12 tay bra :next @@ -65,46 +78,63 @@ vbuffAddr equ tmp5 :no_mask lda #LDA_IMM_OPCODE sta: 0,y ldal spritedata,x + beq :zero sta: 1,y lda #STA_ABS_X_OPCODE sta: 3,y - lda destAddr + lda :destAddr sta: 4,y tya + clc adc #6 tay + bra :next + +:zero lda #STZ_ABS_X_OPCODE + sta: 0,y + lda :destAddr + sta: 1,y + + iny + iny + iny :next inx inx - inc destAddr ; Move to the next word - inc destAddr + inc :destAddr ; Move to the next word + inc :destAddr - dec _width + dec :cntwidth bne :iloop - lda vbuffAddr + lda :vbuffAddr + clc adc #SPRITE_PLANE_SPAN - sta vbuffAddr - tax + sta :vbuffAddr - lda baseAddr ; Move to the next line + lda :baseAddr ; Move to the next line + clc adc #160 - sta baseAddr - sta destAddr + sta :baseAddr + sta :destAddr - dec lines - bne :oloop + dec :lines + beq :out + brl :oloop +:out lda #RTL_OPCODE ; Finish up the subroutine sta: 0,y iny sty CompileBankTop plb + plb + lda :rtnval ; Address in the compile memory rts ; Draw a sprite directly to the graphics screen. If sprite is clipped at all, do not draw. @@ -144,6 +174,11 @@ _DrawStampToScreen adc _Sprites+SPRITE_X,x ; Move to the horizontal address tay ; This is the on-screen address + lda _Sprites+SPRITE_ID,x ; If this is a compiled sprite, call the routine in the compilation bank + bit #SPRITE_COMPILED + beq *+5 + brl :compiled + lda _Sprites+SPRITE_HEIGHT,x sta tmp0 @@ -222,6 +257,22 @@ _DrawStampToScreen plb rts + +:compiled + lda CompileBank-1 ; Load the bank into the high byte + stal :patch+2 ; Put it into the 3rd address bytes (2nd byte is garbage) + lda _Sprites+SPRITE_DISP,x ; Address in the compile bank + stal :patch+1 ; Set 1st and 2nd address bytes + + tyx ; Put on-screen address in X-register + phb ; Compiled sprites assume bank register is $01 + pea $0101 + plb + plb +:patch jsl $000000 ; Dispatch + plb + rts + ; Alternate entry point that takes arguments in registers instead of using a _Sprite ; record ; diff --git a/src/Tool.s b/src/Tool.s index 76fc809..642247c 100644 --- a/src/Tool.s +++ b/src/Tool.s @@ -97,6 +97,9 @@ _CallTable adrl _TSClearBG1Buffer-1 adrl _TSSetBG1Scale-1 adrl _TSGetAddress-1 + + adrl _TSCompileSpriteStamp-1 + _CTEnd _GTEAddSprite MAC UserTool $1000+GTEToolNum @@ -232,14 +235,14 @@ _TSReserved ; SetScreenMode(width, height) _TSSetScreenMode -height equ FirstParam -width equ FirstParam+2 +:height equ FirstParam +:width equ FirstParam+2 _TSEntry - lda height,s + lda :height,s tay - lda width,s + lda :width,s tax jsr _SetScreenMode @@ -350,7 +353,7 @@ _TSCreateSpriteStamp _TSExit #0;#4 -; AddSprite(spriteSlot, spriteFlags, vbuff, spriteX, spriteY) +; AddSprite(spriteSlot, spriteFlags, vbuff | cbuff, spriteX, spriteY) _TSAddSprite :spriteY equ FirstParam+0 :spriteX equ FirstParam+2 @@ -499,10 +502,10 @@ _TSCopyPicToBG1 sta :src_stride ldy BG1DataBank ; Pick the target data bank - lda :flags,s - bit #$0001 - beq *+4 - ldy BG1AltBank +; lda :flags,s +; bit #$0001 +; beq *+4 +; ldy BG1AltBank lda :ptr+2,s tax @@ -847,6 +850,22 @@ _TSGetAddress :out _TSExit #0;#2 +; CompileSpriteStamp(spriteId, vbuffAddr) +_TSCompileSpriteStamp +:vbuff equ FirstParam +:spriteId equ FirstParam+2 +:output equ FirstParam+4 + + _TSEntry + + lda :vbuff,s + tax + lda :spriteId,s + jsr _CompileStampSet + sta :output,s + + _TSExit #0;#4 + ; Insert the GTE code put Math.s diff --git a/src/blitter/Blitter.s b/src/blitter/Blitter.s index c005369..25a5c11 100644 --- a/src/blitter/Blitter.s +++ b/src/blitter/Blitter.s @@ -59,16 +59,17 @@ _BltRange beq :skip_bank ; TODO: Switch to loading the selected BG1 bank. No special "Alt" bank - - lda RenderFlags - bit #RENDER_ALT_BG1 - beq :primary - - lda BG1AltBank - bra :alt - -:primary lda BG1DataBank -:alt +; +; lda RenderFlags +; bit #RENDER_ALT_BG1 +; beq :primary +; +; lda BG1AltBank +; bra :alt +; +;:primary lda BG1DataBank +;:alt + lda BG1DataBank pha plb From dd9ced08f15841b8e07c5ba6bd2bac9af6abf5ea Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 2 Mar 2023 23:24:03 -0600 Subject: [PATCH 43/68] Transition to fixed snippets --- demos/kfest-2022/demo-10/App.Main.s | 2 +- demos/kfest-2022/demo-4/App.Main.s | 6 +- demos/kfest-2022/demo-4/gen/App.TileSet.s | 12288 +++++++++----------- demos/kfest-2022/demo-4/package.json | 19 +- demos/kfest-2022/demo-9/App.Main.s | 28 +- demos/kfest-2022/demo-9/package.json | 19 +- macros/CORE.MACS.S | 213 - src/Render.s | 2 +- src/Tiles.s | 2 +- src/blitter/Template.s | 163 +- src/blitter/TemplateUtils.s | 2 +- src/render/Dynamic.s | 71 +- src/render/Slow.s | 10 +- src/render/TwoLayer.s | 16 +- 14 files changed, 5629 insertions(+), 7212 deletions(-) diff --git a/demos/kfest-2022/demo-10/App.Main.s b/demos/kfest-2022/demo-10/App.Main.s index 5dc4b55..d134a7c 100644 --- a/demos/kfest-2022/demo-10/App.Main.s +++ b/demos/kfest-2022/demo-10/App.Main.s @@ -61,7 +61,7 @@ Scale equ 56 _MTStartUp ; GTE requires the miscellaneous toolset to be running - lda #ENGINE_MODE_USER_TOOL+ENGINE_MODE_TWO_LAYER+ENGINE_MODE_DYN_TILES + lda #ENGINE_MODE_USER_TOOL+ENGINE_MODE_TWO_LAYER ; +ENGINE_MODE_DYN_TILES jsr GTEStartUp ; Load and install the GTE User Tool ; Initialize local variables diff --git a/demos/kfest-2022/demo-4/App.Main.s b/demos/kfest-2022/demo-4/App.Main.s index a605933..0a5c506 100644 --- a/demos/kfest-2022/demo-4/App.Main.s +++ b/demos/kfest-2022/demo-4/App.Main.s @@ -49,7 +49,7 @@ appTmp2 equ 32 _MTStartUp ; GTE requires the miscellaneous toolset to be running - lda #ENGINE_MODE_USER_TOOL+ENGINE_MODE_TWO_LAYER+ENGINE_MODE_DYN_TILES + lda #ENGINE_MODE_USER_TOOL+ENGINE_MODE_TWO_LAYER ; +ENGINE_MODE_DYN_TILES jsr GTEStartUp ; Load and install the GTE User Tool ; Initialize local variables @@ -60,12 +60,14 @@ appTmp2 equ 32 ; Initialize the graphics screen playfield - pea #320 + pea #160 pea #200 _GTESetScreenMode ; Load a tileset + pea #0 + pea #511 pea #^tiledata pea #tiledata _GTELoadTileSet diff --git a/demos/kfest-2022/demo-4/gen/App.TileSet.s b/demos/kfest-2022/demo-4/gen/App.TileSet.s index cb4e555..98fe996 100644 --- a/demos/kfest-2022/demo-4/gen/App.TileSet.s +++ b/demos/kfest-2022/demo-4/gen/App.TileSet.s @@ -2,13 +2,12 @@ ; Palette TileSetPalette ENT dw $0265,$0B54,$0000,$00D0,$0C95,$0265,$0DEE,$0080,$0F08,$0ED6,$0238,$09CC,$0489,$07AC + ; Converting to BG0 format... tiledata ENT - -; Reserved space (tile 0 is special... +; Reserved space (tile 0 is special...) ds 128 -; Tile ID 1 -; From image coordinates 0, 0 +; Tile ID 1, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -17,16 +16,14 @@ tiledata ENT hex 00000228 hex 00002881 hex 00021811 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex 00000000 - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFF0 + hex FFFFF000 + hex FFFF0000 + hex FFF00000 hex 00000000 hex 00000000 hex 00000000 @@ -35,18 +32,16 @@ tiledata ENT hex 82200000 hex 18820000 hex 11812000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 0FFFFFFF + hex 000FFFFF + hex 0000FFFF + hex 00000FFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 00000000 - -; Tile ID 2 -; From image coordinates 8, 0 +; Tile ID 2, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -55,16 +50,14 @@ tiledata ENT hex 88982000 hex 14962000 hex 22222200 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex 0000ffff - hex 00000000 - hex 00000000 - hex 00000000 - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 0000FFFF + hex 00000FFF + hex 00000FFF + hex 000000FF hex 00000000 hex 00000000 hex 00000000 @@ -73,18 +66,16 @@ tiledata ENT hex 00028988 hex 00026941 hex 00222222 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFF0000 + hex FFF00000 + hex FFF00000 + hex FF000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffff0000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 3 -; From image coordinates 16, 0 +; Tile ID 3, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -93,16 +84,14 @@ tiledata ENT hex 00002289 hex 00028849 hex 00211122 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffff0000 - hex ffff0000 - hex 00000000 - hex 00000000 - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFF00 + hex FFFF0000 + hex FFF00000 + hex FF000000 hex 00000000 hex 00000000 hex 00000000 @@ -111,18 +100,16 @@ tiledata ENT hex 98220000 hex 94882000 hex 22111200 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00FFFFFF + hex 0000FFFF + hex 00000FFF + hex 000000FF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex 0000ffff - hex 0000ffff - hex 00000000 - hex 00000000 - -; Tile ID 4 -; From image coordinates 24, 0 +; Tile ID 4, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -131,16 +118,14 @@ tiledata ENT hex 98220000 hex 96882000 hex 22188200 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex 0000ffff - hex 0000ffff - hex 00000000 - hex 00000000 - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00FFFFFF + hex 0000FFFF + hex 00000FFF + hex 000000FF hex 00000000 hex 00000000 hex 00000000 @@ -149,18 +134,16 @@ tiledata ENT hex 00002289 hex 00028869 hex 00288122 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFF00 + hex FFFF0000 + hex FFF00000 + hex FF000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffff0000 - hex ffff0000 - hex 00000000 - hex 00000000 - -; Tile ID 5 -; From image coordinates 32, 0 +; Tile ID 5, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -169,16 +152,14 @@ tiledata ENT hex 00002288 hex 00028888 hex 00288888 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffff0000 - hex ffff0000 - hex 00000000 - hex 00000000 - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFF00 + hex FFFF0000 + hex FFF00000 + hex FF000000 hex 00000000 hex 00000000 hex 00000000 @@ -187,18 +168,16 @@ tiledata ENT hex 88220000 hex 88882000 hex 88888200 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00FFFFFF + hex 0000FFFF + hex 00000FFF + hex 000000FF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex 0000ffff - hex 0000ffff - hex 00000000 - hex 00000000 - -; Tile ID 6 -; From image coordinates 40, 0 +; Tile ID 6, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -207,16 +186,14 @@ tiledata ENT hex 88220000 hex 88882000 hex 88881200 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex 0000ffff - hex 0000ffff - hex 00000000 - hex 00000000 - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00FFFFFF + hex 0000FFFF + hex 00000FFF + hex 000000FF hex 00000000 hex 00000000 hex 00000000 @@ -225,18 +202,16 @@ tiledata ENT hex 00002288 hex 00028888 hex 00218888 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFF00 + hex FFFF0000 + hex FFF00000 + hex FF000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffff0000 - hex ffff0000 - hex 00000000 - hex 00000000 - -; Tile ID 7 -; From image coordinates 48, 0 +; Tile ID 7, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -245,16 +220,14 @@ tiledata ENT hex 00000228 hex 00002881 hex 00021811 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex 00000000 - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFF0 + hex FFFFF000 + hex FFFF0000 + hex FFF00000 hex 00000000 hex 00000000 hex 00000000 @@ -263,18 +236,16 @@ tiledata ENT hex 82200000 hex 18820000 hex 11812000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 0FFFFFFF + hex 000FFFFF + hex 0000FFFF + hex 00000FFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 00000000 - -; Tile ID 8 -; From image coordinates 56, 0 +; Tile ID 8, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -283,16 +254,14 @@ tiledata ENT hex 88982000 hex 19962000 hex 22222200 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex 0000ffff - hex 00000000 - hex 00000000 - hex 00000000 - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 0000FFFF + hex 00000FFF + hex 00000FFF + hex 000000FF hex 00000000 hex 00000000 hex 00000000 @@ -301,18 +270,16 @@ tiledata ENT hex 00028988 hex 00026991 hex 00222222 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFF0000 + hex FFF00000 + hex FFF00000 + hex FF000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffff0000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 9 -; From image coordinates 64, 0 +; Tile ID 9, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -321,16 +288,14 @@ tiledata ENT hex 00000002 hex 00000228 hex 00002881 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffff0000 - hex ffff0000 - hex ffff0000 - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFF0 + hex FFFFF000 + hex FFFF0000 hex 00000000 hex 00000000 hex 00000000 @@ -339,18 +304,16 @@ tiledata ENT hex 20000000 hex 82200000 hex 18820000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 0FFFFFFF + hex 000FFFFF + hex 0000FFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex 0000ffff - hex 0000ffff - hex 0000ffff - -; Tile ID 10 -; From image coordinates 72, 0 +; Tile ID 10, isSolid: false hex 00000000 hex 00000000 hex 00001100 @@ -359,16 +322,14 @@ tiledata ENT hex 22226661 hex 88982610 hex 14962120 - - hex ffffffff - hex ffffffff - hex ffff0000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFF00FF + hex FFF0000F + hex FF000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex 0000000F + hex 0000000F hex 00000000 hex 00000000 hex 00110000 @@ -377,18 +338,16 @@ tiledata ENT hex 16662222 hex 01628988 hex 02126941 + hex FFFFFFFF + hex FFFFFFFF + hex FF00FFFF + hex F0000FFF + hex 000000FF + hex 00000000 + hex F0000000 + hex F0000000 - hex ffffffff - hex ffffffff - hex 0000ffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 11 -; From image coordinates 80, 0 +; Tile ID 11, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -397,16 +356,14 @@ tiledata ENT hex 00002881 hex 00021811 hex 00211122 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex 00000000 - hex 00000000 - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFF0 + hex FFFFF000 + hex FFFF0000 + hex FFF00000 + hex FF000000 hex 00000000 hex 00000000 hex 00000000 @@ -415,18 +372,16 @@ tiledata ENT hex 18820000 hex 11812000 hex 22111200 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 0FFFFFFF + hex 000FFFFF + hex 0000FFFF + hex 00000FFF + hex 000000FF - hex ffffffff - hex ffffffff - hex ffffffff - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 00000000 - hex 00000000 - -; Tile ID 12 -; From image coordinates 88, 0 +; Tile ID 12, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -435,16 +390,14 @@ tiledata ENT hex 14962000 hex 22222200 hex 22222220 - - hex ffffffff - hex ffffffff - hex ffffffff - hex 0000ffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 000FFFFF + hex 00000FFF + hex 00000FFF + hex 000000FF + hex 0000000F hex 00000000 hex 00000000 hex 00000000 @@ -453,18 +406,50 @@ tiledata ENT hex 00026941 hex 00222222 hex 02222222 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFF000 + hex FFF00000 + hex FFF00000 + hex FF000000 + hex F0000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffff0000 +; Tile ID 13, isSolid: false hex 00000000 hex 00000000 hex 00000000 hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF -; Tile ID 13 -; From image coordinates 96, 0 +; Tile ID 14, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -473,16 +458,66 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff +; Tile ID 15, isSolid: false + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF +; Tile ID 16, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -491,18 +526,66 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff +; Tile ID 17, isSolid: false + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF -; Tile ID 14 -; From image coordinates 104, 0 +; Tile ID 18, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -511,226 +594,66 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff +; Tile ID 19, isSolid: false + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 15 -; From image coordinates 112, 0 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 16 -; From image coordinates 120, 0 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 17 -; From image coordinates 128, 0 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 18 -; From image coordinates 136, 0 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 19 -; From image coordinates 144, 0 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 20 -; From image coordinates 152, 0 +; Tile ID 20, isSolid: true hex 11123333 hex 41125333 hex 44125333 @@ -739,7 +662,6 @@ tiledata ENT hex 44411122 hex 44441111 hex 44444441 - hex 00000000 hex 00000000 hex 00000000 @@ -748,7 +670,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 33332111 hex 33352114 hex 33352144 @@ -757,7 +678,6 @@ tiledata ENT hex 22111444 hex 11114444 hex 14444444 - hex 00000000 hex 00000000 hex 00000000 @@ -767,8 +687,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 21 -; From image coordinates 160, 0 +; Tile ID 21, isSolid: false hex 20000000 hex 32000000 hex 33200000 @@ -777,16 +696,14 @@ tiledata ENT hex 25333200 hex 12533320 hex 12533332 - - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff + hex 0FFFFFFF + hex 00FFFFFF + hex 000FFFFF + hex 0000FFFF + hex 00000FFF + hex 000000FF + hex 0000000F hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000002 hex 00000023 hex 00000233 @@ -795,18 +712,16 @@ tiledata ENT hex 00233352 hex 02333521 hex 23333521 - - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex 00000000 - hex 00000000 - hex 00000000 + hex FFFFFFF0 + hex FFFFFF00 + hex FFFFF000 + hex FFFF0000 + hex FFF00000 + hex FF000000 + hex F0000000 hex 00000000 -; Tile ID 22 -; From image coordinates 168, 0 +; Tile ID 22, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -815,36 +730,32 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 23 -; From image coordinates 176, 0 +; Tile ID 23, isSolid: false hex 00022222 hex 00266666 hex 02666666 @@ -853,16 +764,14 @@ tiledata ENT hex 26666626 hex 26666626 hex 26666626 - + hex FFF00000 + hex FF000000 + hex F0000000 + hex F0000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 22222000 hex 66666200 hex 66666620 @@ -871,18 +780,16 @@ tiledata ENT hex 62666662 hex 62666662 hex 62666662 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00000FFF + hex 000000FF + hex 0000000F + hex 0000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 -; Tile ID 24 -; From image coordinates 184, 0 +; Tile ID 24, isSolid: false hex 22222000 hex 66666200 hex 66666620 @@ -891,16 +798,14 @@ tiledata ENT hex 62666662 hex 62666662 hex 62666662 - + hex 00000FFF + hex 000000FF + hex 0000000F + hex 0000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00022222 hex 00266666 hex 02666666 @@ -909,18 +814,16 @@ tiledata ENT hex 26666626 hex 26666626 hex 26666626 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex FFF00000 + hex FF000000 + hex F0000000 + hex F0000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 -; Tile ID 25 -; From image coordinates 192, 0 +; Tile ID 25, isSolid: false hex 02222222 hex 23366636 hex 27363333 @@ -929,7 +832,7 @@ tiledata ENT hex 27363333 hex 27363333 hex 27363333 - + hex F0000000 hex 00000000 hex 00000000 hex 00000000 @@ -937,8 +840,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 22222220 hex 63666332 hex 33336372 @@ -947,8 +848,7 @@ tiledata ENT hex 33336372 hex 33336372 hex 33336372 - - hex 00000000 + hex 0000000F hex 00000000 hex 00000000 hex 00000000 @@ -957,8 +857,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 26 -; From image coordinates 200, 0 +; Tile ID 26, isSolid: false hex 22222220 hex 33333332 hex 33373772 @@ -967,7 +866,7 @@ tiledata ENT hex 33373772 hex 33373772 hex 33373772 - + hex 0000000F hex 00000000 hex 00000000 hex 00000000 @@ -975,8 +874,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 02222222 hex 23333333 hex 27737333 @@ -985,8 +882,7 @@ tiledata ENT hex 27737333 hex 27737333 hex 27737333 - - hex 00000000 + hex F0000000 hex 00000000 hex 00000000 hex 00000000 @@ -995,8 +891,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 27 -; From image coordinates 208, 0 +; Tile ID 27, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -1005,36 +900,32 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 28 -; From image coordinates 216, 0 +; Tile ID 28, isSolid: false hex 00000002 hex 00000027 hex 00000277 @@ -1043,16 +934,14 @@ tiledata ENT hex 00277733 hex 02777333 hex 27773333 - - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 + hex FFFFFFF0 + hex FFFFFF00 + hex FFFFF000 + hex FFFF0000 + hex FFF00000 + hex FF000000 + hex F0000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 20000000 hex 72000000 hex 77200000 @@ -1061,18 +950,16 @@ tiledata ENT hex 33777200 hex 33377720 hex 33337772 - - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 00000000 - hex 00000000 - hex 00000000 + hex 0FFFFFFF + hex 00FFFFFF + hex 000FFFFF + hex 0000FFFF + hex 00000FFF + hex 000000FF + hex 0000000F hex 00000000 -; Tile ID 29 -; From image coordinates 224, 0 +; Tile ID 29, isSolid: false hex 20000000 hex 32000000 hex 73200000 @@ -1081,16 +968,14 @@ tiledata ENT hex 33336200 hex 33366620 hex 33666662 - - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff + hex 0FFFFFFF + hex 00FFFFFF + hex 000FFFFF + hex 0000FFFF + hex 00000FFF + hex 000000FF + hex 0000000F hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000002 hex 00000023 hex 00000237 @@ -1099,18 +984,16 @@ tiledata ENT hex 00263333 hex 02666333 hex 26666633 - - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex 00000000 - hex 00000000 - hex 00000000 + hex FFFFFFF0 + hex FFFFFF00 + hex FFFFF000 + hex FFFF0000 + hex FFF00000 + hex FF000000 + hex F0000000 hex 00000000 -; Tile ID 30 -; From image coordinates 232, 0 +; Tile ID 30, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -1119,16 +1002,66 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff +; Tile ID 31, isSolid: false + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF +; Tile ID 32, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -1137,94 +1070,32 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 31 -; From image coordinates 240, 0 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 32 -; From image coordinates 248, 0 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 33 -; From image coordinates 0, 8 +; Tile ID 33, isSolid: false hex 00211122 hex 00262224 hex 02616246 @@ -1233,16 +1104,14 @@ tiledata ENT hex 00224462 hex 00021144 hex 00002111 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - + hex FF000000 + hex FF000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex FF000000 + hex FFF00000 + hex FFFF0000 hex 22111200 hex 42226200 hex 64261620 @@ -1251,18 +1120,16 @@ tiledata ENT hex 26442200 hex 44112000 hex 11120000 + hex 000000FF + hex 000000FF + hex 0000000F + hex 0000000F + hex 0000000F + hex 000000FF + hex 00000FFF + hex 0000FFFF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - -; Tile ID 34 -; From image coordinates 8, 8 +; Tile ID 34, isSolid: false hex 22222220 hex 24240000 hex 26261100 @@ -1270,17 +1137,15 @@ tiledata ENT hex 24444410 hex 22222200 hex 42222000 - hex 11a00000 - - hex 00000000 - hex 0000ffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - + hex 11A00000 + hex 0000000F + hex 0000FFFF + hex 000000FF + hex 0000000F + hex 0000000F + hex 000000FF + hex 00000FFF + hex 000FFFFF hex 02222222 hex 00004242 hex 00116262 @@ -1288,19 +1153,17 @@ tiledata ENT hex 01444442 hex 00222222 hex 00022224 - hex 00000a11 + hex 00000A11 + hex F0000000 + hex FFFF0000 + hex FF000000 + hex F0000000 + hex F0000000 + hex FF000000 + hex FFF00000 + hex FFFFF000 - hex 00000000 - hex ffff0000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - -; Tile ID 35 -; From image coordinates 16, 8 +; Tile ID 35, isSolid: false hex 00212222 hex 00124424 hex 01626626 @@ -1309,16 +1172,14 @@ tiledata ENT hex 00014222 hex 00001422 hex 00021111 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - hex 00000000 - + hex FF000000 + hex FF000000 + hex F0000000 + hex F0000000 + hex FF000000 + hex FFF00000 + hex FFFF0000 + hex FFF00000 hex 22221200 hex 42442100 hex 62662610 @@ -1327,18 +1188,16 @@ tiledata ENT hex 22241000 hex 22410000 hex 11112000 + hex 000000FF + hex 000000FF + hex 0000000F + hex 0000000F + hex 000000FF + hex 00000FFF + hex 0000FFFF + hex 00000FFF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - hex 00000000 - -; Tile ID 36 -; From image coordinates 24, 8 +; Tile ID 36, isSolid: false hex 22228200 hex 42442100 hex 62662610 @@ -1347,16 +1206,14 @@ tiledata ENT hex 22241000 hex 22410000 hex 11182000 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - hex 00000000 - + hex 000000FF + hex 000000FF + hex 0000000F + hex 0000000F + hex 000000FF + hex 00000FFF + hex 0000FFFF + hex 00000FFF hex 00282222 hex 00124424 hex 01626626 @@ -1365,18 +1222,16 @@ tiledata ENT hex 00014222 hex 00001422 hex 00028111 + hex FF000000 + hex FF000000 + hex F0000000 + hex F0000000 + hex FF000000 + hex FFF00000 + hex FFFF0000 + hex FFF00000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - hex 00000000 - -; Tile ID 37 -; From image coordinates 32, 8 +; Tile ID 37, isSolid: false hex 00288888 hex 00118888 hex 00121188 @@ -1384,17 +1239,15 @@ tiledata ENT hex 01422222 hex 00112222 hex 00004222 - hex 00022bb2 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - hex 00000000 - + hex 00022BB2 + hex FF000000 + hex FF000000 + hex FF000000 + hex F0000000 + hex F0000000 + hex FF000000 + hex FFFF0000 + hex FFF00000 hex 88888200 hex 88881100 hex 88112100 @@ -1402,19 +1255,17 @@ tiledata ENT hex 22222410 hex 22221100 hex 22240000 - hex 2bb22000 + hex 2BB22000 + hex 000000FF + hex 000000FF + hex 000000FF + hex 0000000F + hex 0000000F + hex 000000FF + hex 0000FFFF + hex 00000FFF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - hex 00000000 - -; Tile ID 38 -; From image coordinates 40, 8 +; Tile ID 38, isSolid: false hex 88881200 hex 88811100 hex 88112100 @@ -1422,17 +1273,15 @@ tiledata ENT hex 22222410 hex 22221100 hex 22240000 - hex 2bc22000 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - hex 00000000 - + hex 2BC22000 + hex 000000FF + hex 000000FF + hex 000000FF + hex 0000000F + hex 0000000F + hex 000000FF + hex 0000FFFF + hex 00000FFF hex 00218888 hex 00111888 hex 00121188 @@ -1440,19 +1289,17 @@ tiledata ENT hex 01422222 hex 00112222 hex 00004222 - hex 00022cb2 + hex 00022CB2 + hex FF000000 + hex FF000000 + hex FF000000 + hex F0000000 + hex F0000000 + hex FF000000 + hex FFFF0000 + hex FFF00000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - hex 00000000 - -; Tile ID 39 -; From image coordinates 48, 8 +; Tile ID 39, isSolid: false hex 00211122 hex 00262224 hex 02616246 @@ -1461,16 +1308,14 @@ tiledata ENT hex 00224462 hex 00021444 hex 00011111 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex FF000000 + hex FF000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex FF000000 + hex FFF00000 + hex FFF00000 hex 22111200 hex 42226200 hex 64261620 @@ -1479,18 +1324,16 @@ tiledata ENT hex 26442200 hex 44412000 hex 11111000 + hex 000000FF + hex 000000FF + hex 0000000F + hex 0000000F + hex 0000000F + hex 000000FF + hex 00000FFF + hex 00000FFF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 40 -; From image coordinates 56, 8 +; Tile ID 40, isSolid: false hex 22222220 hex 24240000 hex 26261100 @@ -1498,17 +1341,15 @@ tiledata ENT hex 24444410 hex 22222200 hex 42222000 - hex 11a00000 - - hex 00000000 - hex 0000ffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - + hex 11A00000 + hex 0000000F + hex 0000FFFF + hex 000000FF + hex 0000000F + hex 0000000F + hex 000000FF + hex 00000FFF + hex 000FFFFF hex 02222222 hex 00004242 hex 00116262 @@ -1516,19 +1357,17 @@ tiledata ENT hex 01444442 hex 00222222 hex 00022224 - hex 00000a11 + hex 00000A11 + hex F0000000 + hex FFFF0000 + hex FF000000 + hex F0000000 + hex F0000000 + hex FF000000 + hex FFF00000 + hex FFFFF000 - hex 00000000 - hex ffff0000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - -; Tile ID 41 -; From image coordinates 64, 8 +; Tile ID 41, isSolid: false hex 00021811 hex 00211122 hex 00262224 @@ -1537,16 +1376,14 @@ tiledata ENT hex 02246266 hex 00224462 hex 01111144 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex FFF00000 + hex FF000000 + hex FF000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex FF000000 + hex F0000000 hex 11812000 hex 22111200 hex 42226200 @@ -1555,18 +1392,16 @@ tiledata ENT hex 66264220 hex 26442200 hex 44111110 + hex 00000FFF + hex 000000FF + hex 000000FF + hex 0000000F + hex 0000000F + hex 0000000F + hex 000000FF + hex 0000000F - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 42 -; From image coordinates 72, 8 +; Tile ID 42, isSolid: false hex 22222200 hex 22222220 hex 24241200 @@ -1575,16 +1410,14 @@ tiledata ENT hex 24444410 hex 22222200 hex 42222000 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex 000000FF + hex 0000000F + hex 000000FF + hex 000000FF + hex 0000000F + hex 0000000F + hex 000000FF + hex 00000FFF hex 00222222 hex 02222222 hex 00214242 @@ -1593,18 +1426,16 @@ tiledata ENT hex 01444442 hex 00222222 hex 00022224 + hex FF000000 + hex F0000000 + hex FF000000 + hex FF000000 + hex F0000000 + hex F0000000 + hex FF000000 + hex FFF00000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 43 -; From image coordinates 80, 8 +; Tile ID 43, isSolid: false hex 00212222 hex 02112246 hex 02162266 @@ -1613,16 +1444,14 @@ tiledata ENT hex 00246266 hex 01661462 hex 16666144 - + hex FF000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex FF000000 + hex F0000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 22221200 hex 64221120 hex 66226120 @@ -1631,18 +1460,16 @@ tiledata ENT hex 66264200 hex 26416610 hex 44166661 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 000000FF + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 000000FF + hex 0000000F hex 00000000 -; Tile ID 44 -; From image coordinates 88, 8 +; Tile ID 44, isSolid: false hex 24220000 hex 66660000 hex 26260000 @@ -1651,16 +1478,14 @@ tiledata ENT hex 24444410 hex 22222261 hex 42222661 - - hex 0000ffff - hex 0000ffff - hex 0000ffff + hex 0000FFFF + hex 0000FFFF + hex 0000FFFF + hex 000000FF + hex 0000000F + hex 0000000F hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00002242 hex 00006666 hex 00006262 @@ -1669,18 +1494,16 @@ tiledata ENT hex 01444442 hex 16222222 hex 16622224 - - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex 00000000 - hex 00000000 - hex 00000000 + hex FFFF0000 + hex FFFF0000 + hex FFFF0000 + hex FF000000 + hex F0000000 + hex F0000000 hex 00000000 hex 00000000 -; Tile ID 45 -; From image coordinates 96, 8 +; Tile ID 45, isSolid: false hex 00000000 hex 00000000 hex 00000022 @@ -1689,16 +1512,14 @@ tiledata ENT hex 00211221 hex 00212662 hex 00226666 - - hex ffffffff - hex ffffffff - hex ffff0000 - hex ffff0000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFF00 + hex FFFF0000 + hex FFF00000 + hex FF000000 + hex FF000000 + hex FF000000 hex 00000000 hex 00000000 hex 22000000 @@ -1707,18 +1528,16 @@ tiledata ENT hex 12211200 hex 26621200 hex 66662200 + hex FFFFFFFF + hex FFFFFFFF + hex 00FFFFFF + hex 0000FFFF + hex 00000FFF + hex 000000FF + hex 000000FF + hex 000000FF - hex ffffffff - hex ffffffff - hex 0000ffff - hex 0000ffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 46 -; From image coordinates 104, 8 +; Tile ID 46, isSolid: false hex 00000000 hex 00000000 hex 22000000 @@ -1727,16 +1546,14 @@ tiledata ENT hex 88191200 hex 88496200 hex 21822220 - - hex ffffffff - hex ffffffff - hex 0000ffff - hex 0000ffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex FFFFFFFF + hex FFFFFFFF + hex 00FFFFFF + hex 0000FFFF + hex 00000FFF + hex 000000FF + hex 000000FF + hex 0000000F hex 00000000 hex 00000000 hex 00000022 @@ -1745,18 +1562,50 @@ tiledata ENT hex 00219188 hex 00269488 hex 02222812 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFF00 + hex FFFF0000 + hex FFF00000 + hex FF000000 + hex FF000000 + hex F0000000 - hex ffffffff - hex ffffffff - hex ffff0000 - hex ffff0000 +; Tile ID 47, isSolid: false hex 00000000 hex 00000000 hex 00000000 hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF -; Tile ID 47 -; From image coordinates 112, 8 +; Tile ID 48, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -1765,16 +1614,66 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff +; Tile ID 49, isSolid: false + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF +; Tile ID 50, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -1783,170 +1682,66 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff +; Tile ID 51, isSolid: false + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF -; Tile ID 48 -; From image coordinates 120, 8 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 49 -; From image coordinates 128, 8 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 50 -; From image coordinates 136, 8 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 51 -; From image coordinates 144, 8 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 52 -; From image coordinates 152, 8 +; Tile ID 52, isSolid: true hex 44444444 hex 44444994 hex 44444994 @@ -1955,7 +1750,6 @@ tiledata ENT hex 44944444 hex 44444444 hex 44444444 - hex 00000000 hex 00000000 hex 00000000 @@ -1964,7 +1758,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 44444444 hex 49944444 hex 49944444 @@ -1973,7 +1766,6 @@ tiledata ENT hex 44444944 hex 44444444 hex 44444444 - hex 00000000 hex 00000000 hex 00000000 @@ -1983,8 +1775,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 53 -; From image coordinates 160, 8 +; Tile ID 53, isSolid: true hex 41253333 hex 41253333 hex 44125333 @@ -1993,7 +1784,6 @@ tiledata ENT hex 44411122 hex 44441111 hex 44444411 - hex 00000000 hex 00000000 hex 00000000 @@ -2002,7 +1792,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 33335214 hex 33335214 hex 33352144 @@ -2011,7 +1800,6 @@ tiledata ENT hex 22111444 hex 11114444 hex 11444444 - hex 00000000 hex 00000000 hex 00000000 @@ -2021,8 +1809,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 54 -; From image coordinates 168, 8 +; Tile ID 54, isSolid: false hex 20000000 hex 32000000 hex 33200000 @@ -2031,16 +1818,14 @@ tiledata ENT hex 25333200 hex 12533320 hex 11233332 - - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff + hex 0FFFFFFF + hex 00FFFFFF + hex 000FFFFF + hex 0000FFFF + hex 00000FFF + hex 000000FF + hex 0000000F hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000002 hex 00000023 hex 00000233 @@ -2049,18 +1834,16 @@ tiledata ENT hex 00233352 hex 02333521 hex 23333211 - - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex 00000000 - hex 00000000 - hex 00000000 + hex FFFFFFF0 + hex FFFFFF00 + hex FFFFF000 + hex FFFF0000 + hex FFF00000 + hex FF000000 + hex F0000000 hex 00000000 -; Tile ID 55 -; From image coordinates 176, 8 +; Tile ID 55, isSolid: false hex 26666666 hex 26668666 hex 26688666 @@ -2069,16 +1852,14 @@ tiledata ENT hex 02666666 hex 00266662 hex 00022220 - hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex F0000000 + hex F0000000 + hex F0000000 + hex FF000000 + hex FFF0000F hex 66666662 hex 66686662 hex 66688662 @@ -2087,18 +1868,16 @@ tiledata ENT hex 66666620 hex 26666200 hex 02222000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 0000000F + hex 0000000F + hex 0000000F + hex 000000FF + hex F0000FFF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 56 -; From image coordinates 184, 8 +; Tile ID 56, isSolid: false hex 66666662 hex 66686662 hex 66688662 @@ -2107,16 +1886,14 @@ tiledata ENT hex 66666620 hex 26666200 hex 02222000 - hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex 0000000F + hex 0000000F + hex 0000000F + hex 000000FF + hex F0000FFF hex 26666666 hex 26668666 hex 26688666 @@ -2125,18 +1902,16 @@ tiledata ENT hex 02666666 hex 00266662 hex 00022220 + hex 00000000 + hex 00000000 + hex 00000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex FF000000 + hex FFF0000F - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 57 -; From image coordinates 192, 8 +; Tile ID 57, isSolid: false hex 22733373 hex 22222222 hex 02736333 @@ -2145,16 +1920,14 @@ tiledata ENT hex 02736333 hex 02736333 hex 02736333 - hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 hex 37333722 hex 22222222 hex 33363720 @@ -2163,18 +1936,16 @@ tiledata ENT hex 33363720 hex 33363720 hex 33363720 + hex 00000000 + hex 00000000 + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 58 -; From image coordinates 200, 8 +; Tile ID 58, isSolid: false hex 77727222 hex 22222222 hex 33737720 @@ -2183,16 +1954,14 @@ tiledata ENT hex 33737720 hex 33737720 hex 33737720 - hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F hex 22272777 hex 22222222 hex 02773733 @@ -2201,18 +1970,16 @@ tiledata ENT hex 02773733 hex 02773733 hex 02773733 + hex 00000000 + hex 00000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 59 -; From image coordinates 208, 8 +; Tile ID 59, isSolid: false hex 00000002 hex 00000027 hex 00000277 @@ -2221,16 +1988,14 @@ tiledata ENT hex 00002722 hex 00027772 hex 00277733 - - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex 00000000 - hex 00000000 - + hex FFFFFFF0 + hex FFFFFF00 + hex FFFFF000 + hex FFFFF000 + hex FFFFF000 + hex FFFF0000 + hex FFF00000 + hex FF000000 hex 20000000 hex 72000000 hex 77200000 @@ -2239,18 +2004,16 @@ tiledata ENT hex 22720000 hex 27772000 hex 33777200 + hex 0FFFFFFF + hex 00FFFFFF + hex 000FFFFF + hex 000FFFFF + hex 000FFFFF + hex 0000FFFF + hex 00000FFF + hex 000000FF - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 00000000 - hex 00000000 - -; Tile ID 60 -; From image coordinates 216, 8 +; Tile ID 60, isSolid: true hex 77733333 hex 77333333 hex 73333336 @@ -2259,7 +2022,6 @@ tiledata ENT hex 23336666 hex 22366663 hex 22236633 - hex 00000000 hex 00000000 hex 00000000 @@ -2268,7 +2030,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 33333777 hex 33333377 hex 63333337 @@ -2277,7 +2038,6 @@ tiledata ENT hex 66663332 hex 36666322 hex 33663222 - hex 00000000 hex 00000000 hex 00000000 @@ -2287,8 +2047,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 61 -; From image coordinates 224, 8 +; Tile ID 61, isSolid: true hex 36666336 hex 66663333 hex 66633333 @@ -2297,7 +2056,6 @@ tiledata ENT hex 33333333 hex 33333333 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -2306,7 +2064,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 63366663 hex 33336666 hex 33333666 @@ -2315,7 +2072,6 @@ tiledata ENT hex 33333333 hex 33333333 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -2325,8 +2081,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 62 -; From image coordinates 232, 8 +; Tile ID 62, isSolid: false hex 20000000 hex 62000000 hex 36200000 @@ -2335,16 +2090,14 @@ tiledata ENT hex 33336200 hex 33333620 hex 33333362 - - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff + hex 0FFFFFFF + hex 00FFFFFF + hex 000FFFFF + hex 0000FFFF + hex 00000FFF + hex 000000FF + hex 0000000F hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000002 hex 00000026 hex 00000263 @@ -2353,18 +2106,16 @@ tiledata ENT hex 00263333 hex 02633333 hex 26333333 - - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex 00000000 - hex 00000000 - hex 00000000 + hex FFFFFFF0 + hex FFFFFF00 + hex FFFFF000 + hex FFFF0000 + hex FFF00000 + hex FF000000 + hex F0000000 hex 00000000 -; Tile ID 63 -; From image coordinates 240, 8 +; Tile ID 63, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -2373,606 +2124,576 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff +; Tile ID 64, isSolid: false + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 64 -; From image coordinates 248, 8 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 65 -; From image coordinates 0, 16 - hex 0002118c - hex 0002111c +; Tile ID 65, isSolid: false + hex 0002118C + hex 0002111C hex 00016661 - hex 0001661c - hex 0001661c + hex 0001661C + hex 0001661C hex 00001111 hex 00002111 hex 00002222 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - - hex c8112000 - hex c1112000 + hex FFF00000 + hex FFF00000 + hex FFF00000 + hex FFF00000 + hex FFF00000 + hex FFFF0000 + hex FFFF0000 + hex FFFF0000 + hex C8112000 + hex C1112000 hex 16661000 - hex c1661000 - hex c1661000 + hex C1661000 + hex C1661000 hex 11110000 hex 11120000 hex 22220000 + hex 00000FFF + hex 00000FFF + hex 00000FFF + hex 00000FFF + hex 00000FFF + hex 0000FFFF + hex 0000FFFF + hex 0000FFFF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - hex 0000ffff - hex 0000ffff - -; Tile ID 66 -; From image coordinates 8, 16 - hex cbba0000 - hex 66b6a000 - hex 66b6a000 - hex ccbba000 - hex caca0000 +; Tile ID 66, isSolid: false + hex CBBA0000 + hex 66B6A000 + hex 66B6A000 + hex CCBBA000 + hex CACA0000 hex 21200000 hex 92920000 hex 22220000 - - hex 0000ffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff - - hex 0000abbc - hex 000a6b66 - hex 000a6b66 - hex 000abbcc - hex 0000acac + hex 0000FFFF + hex 00000FFF + hex 00000FFF + hex 00000FFF + hex 0000FFFF + hex 000FFFFF + hex 0000FFFF + hex 0000FFFF + hex 0000ABBC + hex 000A6B66 + hex 000A6B66 + hex 000ABBCC + hex 0000ACAC hex 00000212 hex 00002929 hex 00002222 + hex FFFF0000 + hex FFF00000 + hex FFF00000 + hex FFF00000 + hex FFFF0000 + hex FFFFF000 + hex FFFF0000 + hex FFFF0000 - hex ffff0000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - -; Tile ID 67 -; From image coordinates 16, 16 - hex 00211cbb - hex 0011c66b - hex 0161c66b - hex 0161cccc - hex 0011acca +; Tile ID 67, isSolid: false + hex 00211CBB + hex 0011C66B + hex 0161C66B + hex 0161CCCC + hex 0011ACCA hex 00002111 hex 00021912 hex 00022222 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - hex 00000000 - hex 00000000 - - hex bbc11200 - hex b66c1100 - hex b66c1610 - hex cccc1610 - hex acca1100 + hex FF000000 + hex FF000000 + hex F0000000 + hex F0000000 + hex FF000000 + hex FFFF0000 + hex FFF00000 + hex FFF00000 + hex BBC11200 + hex B66C1100 + hex B66C1610 + hex CCCC1610 + hex ACCA1100 hex 11120000 hex 21912000 hex 22222000 + hex 000000FF + hex 000000FF + hex 0000000F + hex 0000000F + hex 000000FF + hex 0000FFFF + hex 00000FFF + hex 00000FFF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - hex 00000000 - hex 00000000 - -; Tile ID 68 -; From image coordinates 24, 16 - hex bbb18200 - hex b66b1100 - hex b66b1610 - hex bbba1610 - hex acca1100 +; Tile ID 68, isSolid: false + hex BBB18200 + hex B66B1100 + hex B66B1610 + hex BBBA1610 + hex ACCA1100 hex 11120000 hex 21912000 hex 22222000 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - hex 00000000 - hex 00000000 - - hex 00281bbb - hex 0011b66b - hex 0161b66b - hex 0161abbb - hex 0011acca + hex 000000FF + hex 000000FF + hex 0000000F + hex 0000000F + hex 000000FF + hex 0000FFFF + hex 00000FFF + hex 00000FFF + hex 00281BBB + hex 0011B66B + hex 0161B66B + hex 0161ABBB + hex 0011ACCA hex 00002111 hex 00021912 hex 00022222 + hex FF000000 + hex FF000000 + hex F0000000 + hex F0000000 + hex FF000000 + hex FFFF0000 + hex FFF00000 + hex FFF00000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - hex 00000000 - hex 00000000 - -; Tile ID 69 -; From image coordinates 32, 16 - hex 0021abb9 - hex 002abbbb - hex 002acccb - hex 000abbab - hex 0000acaa +; Tile ID 69, isSolid: false + hex 0021ABB9 + hex 002ABBBB + hex 002ACCCB + hex 000ABBAB + hex 0000ACAA hex 00002111 hex 00021112 hex 00022222 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - hex ffff0000 - hex 00000000 - hex 00000000 - - hex 9bba1200 - hex bbbba200 - hex bccca200 - hex babba000 - hex aaca0000 + hex FF000000 + hex FF000000 + hex FF000000 + hex FFF00000 + hex FFFF0000 + hex FFFF0000 + hex FFF00000 + hex FFF00000 + hex 9BBA1200 + hex BBBBA200 + hex BCCCA200 + hex BABBA000 + hex AACA0000 hex 11120000 hex 21112000 hex 22222000 + hex 000000FF + hex 000000FF + hex 000000FF + hex 00000FFF + hex 0000FFFF + hex 0000FFFF + hex 00000FFF + hex 00000FFF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - hex 0000ffff - hex 00000000 - hex 00000000 - -; Tile ID 70 -; From image coordinates 40, 16 - hex 9bca1200 - hex bbbca200 - hex bcaaa200 - hex bacca000 - hex aaca0000 +; Tile ID 70, isSolid: false + hex 9BCA1200 + hex BBBCA200 + hex BCAAA200 + hex BACCA000 + hex AACA0000 hex 11120000 hex 21112000 hex 22222000 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - hex 0000ffff - hex 00000000 - hex 00000000 - - hex 0021acb9 - hex 002acbbb - hex 002aaacb - hex 000accab - hex 0000acaa + hex 000000FF + hex 000000FF + hex 000000FF + hex 00000FFF + hex 0000FFFF + hex 0000FFFF + hex 00000FFF + hex 00000FFF + hex 0021ACB9 + hex 002ACBBB + hex 002AAACB + hex 000ACCAB + hex 0000ACAA hex 00002111 hex 00021112 hex 00022222 + hex FF000000 + hex FF000000 + hex FF000000 + hex FFF00000 + hex FFFF0000 + hex FFFF0000 + hex FFF00000 + hex FFF00000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - hex ffff0000 - hex 00000000 - hex 00000000 - -; Tile ID 71 -; From image coordinates 48, 16 +; Tile ID 71, isSolid: false hex 00011181 hex 00216661 - hex 0211661c - hex 0211661c - hex 021a11cc - hex 021920aa + hex 0211661C + hex 0211661C + hex 021A11CC + hex 021920AA hex 00220000 hex 00000000 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - hex ffffffff - + hex FFF00000 + hex FF000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000F00 + hex FF00FFFF + hex FFFFFFFF hex 18111000 hex 16661200 - hex c1661120 - hex c1661120 - hex cc11a120 - hex aa029120 + hex C1661120 + hex C1661120 + hex CC11A120 + hex AA029120 hex 00002200 hex 00000000 + hex 00000FFF + hex 000000FF + hex 0000000F + hex 0000000F + hex 0000000F + hex 00F0000F + hex FFFF00FF + hex FFFFFFFF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - hex ffffffff - -; Tile ID 72 -; From image coordinates 56, 16 - hex cbba0000 - hex 66b6a220 - hex 66b62922 - hex ccba2122 - hex cca21220 - hex aa021220 +; Tile ID 72, isSolid: false + hex CBBA0000 + hex 66B6A220 + hex 66B62922 + hex CCBA2122 + hex CCA21220 + hex AA021220 hex 00002200 hex 00000000 - - hex 0000ffff + hex 0000FFFF + hex 0000000F hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - hex ffffffff - - hex 0000abbc - hex 022a6b66 - hex 22926b66 - hex 2212abcc - hex 02212acc - hex 022120aa + hex 0000000F + hex 00F0000F + hex FFFF00FF + hex FFFFFFFF + hex 0000ABBC + hex 022A6B66 + hex 22926B66 + hex 2212ABCC + hex 02212ACC + hex 022120AA hex 00220000 hex 00000000 + hex FFFF0000 + hex F0000000 + hex 00000000 + hex 00000000 + hex F0000000 + hex F0000F00 + hex FF00FFFF + hex FFFFFFFF - hex ffff0000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - hex ffffffff - -; Tile ID 73 -; From image coordinates 64, 16 +; Tile ID 73, isSolid: false hex 11661111 - hex 1666618c - hex 166661cc - hex 01661ccc - hex 0211cccc - hex 021aaacc - hex 021926aa + hex 1666618C + hex 166661CC + hex 01661CCC + hex 0211CCCC + hex 021AAACC + hex 021926AA hex 00226666 - hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex FF000000 hex 11116611 - hex c8166661 - hex cc166661 - hex ccc16610 - hex cccc1120 - hex ccaaa120 - hex aa629120 + hex C8166661 + hex CC166661 + hex CCC16610 + hex CCCC1120 + hex CCAAA120 + hex AA629120 hex 66662200 + hex 00000000 + hex 00000000 + hex 00000000 + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 000000FF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 74 -; From image coordinates 72, 16 - hex 11a00000 - hex cbba0000 - hex 66b6a220 - hex 66b62922 - hex ccba2122 - hex cca21220 - hex aa621220 +; Tile ID 74, isSolid: false + hex 11A00000 + hex CBBA0000 + hex 66B6A220 + hex 66B62922 + hex CCBA2122 + hex CCA21220 + hex AA621220 hex 66662200 - - hex 0000ffff - hex 0000ffff + hex 000FFFFF + hex 0000FFFF + hex 0000000F hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex 00000a11 - hex 0000abbc - hex 022a6b66 - hex 22926b66 - hex 2212abcc - hex 02212acc - hex 022126aa + hex 0000000F + hex 0000000F + hex 000000FF + hex 00000A11 + hex 0000ABBC + hex 022A6B66 + hex 22926B66 + hex 2212ABCC + hex 02212ACC + hex 022126AA hex 00226666 + hex FFFFF000 + hex FFFF0000 + hex F0000000 + hex 00000000 + hex 00000000 + hex F0000000 + hex F0000000 + hex FF000000 - hex ffff0000 - hex ffff0000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 75 -; From image coordinates 80, 16 +; Tile ID 75, isSolid: false hex 16666111 - hex 0166188c - hex 0211accc - hex 0211accc - hex 0219aacc - hex 00220aac - hex 000000aa - hex 00000000 - + hex 0166188C + hex 0211ACCC + hex 0211ACCC + hex 0219AACC + hex 00220AAC + hex 000000AA hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - hex ffffffff - + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex FF00F000 + hex FFFFFF00 + hex FFFFFFFF hex 11166661 - hex c8816610 - hex ccca1120 - hex ccca1120 - hex ccaa9120 - hex caa02200 - hex aa000000 + hex C8816610 + hex CCCA1120 + hex CCCA1120 + hex CCAA9120 + hex CAA02200 + hex AA000000 hex 00000000 + hex 00000000 + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 000F00FF + hex 00FFFFFF + hex FFFFFFFF +; Tile ID 76, isSolid: false + hex 11A16220 + hex CBBA2922 + hex 66B62122 + hex 66B62122 + hex CCBA2122 + hex CCA00220 + hex AA000000 + hex 00000000 + hex 0000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 + hex 000FF00F + hex 00FFFFFF + hex FFFFFFFF + hex 02261A11 + hex 2292ABBC + hex 22126B66 + hex 22126B66 + hex 2212ABCC + hex 02200ACC + hex 000000AA + hex 00000000 + hex F0000000 hex 00000000 hex 00000000 - hex 0000ffff - hex ffffffff + hex 00000000 + hex 00000000 + hex F00FF000 + hex FFFFFF00 + hex FFFFFFFF -; Tile ID 76 -; From image coordinates 88, 16 - hex 11a16220 - hex cbba2922 - hex 66b62122 - hex 66b62122 - hex ccba2122 - hex cca00220 - hex aa000000 - hex 00000000 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - hex ffffffff - - hex 02261a11 - hex 2292abbc - hex 22126b66 - hex 22126b66 - hex 2212abcc - hex 02200acc - hex 000000aa - hex 00000000 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - hex ffffffff - -; Tile ID 77 -; From image coordinates 96, 16 - hex 00a26666 - hex 0ac22222 - hex 0ac21112 - hex 0ac2112c - hex 0acc22ca - hex 0aaccaa1 - hex 00aaa111 +; Tile ID 77, isSolid: false + hex 00A26666 + hex 0AC22222 + hex 0AC21112 + hex 0AC2112C + hex 0ACC22CA + hex 0AACCAA1 + hex 00AAA111 hex 00002222 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - - hex 66662a00 - hex 22222ca0 - hex 21112ca0 - hex c2112ca0 - hex ac22cca0 - hex 1aaccaa0 - hex 111aaa00 + hex FF000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex FF000000 + hex FFFF0000 + hex 66662A00 + hex 22222CA0 + hex 21112CA0 + hex C2112CA0 + hex AC22CCA0 + hex 1AACCAA0 + hex 111AAA00 hex 22220000 + hex 000000FF + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 000000FF + hex 0000FFFF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - -; Tile ID 78 -; From image coordinates 104, 16 +; Tile ID 78, isSolid: false hex 22222222 hex 16666661 - hex b2444441 - hex ca222220 - hex aba22200 + hex B2444441 + hex CA222220 + hex ABA22200 hex 21200000 hex 92920000 hex 22220000 - hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - hex 0000ffff - hex 0000ffff - + hex 0000000F + hex 000000FF + hex 000FFFFF + hex 0000FFFF + hex 0000FFFF hex 22222222 hex 16666661 - hex 1444442b - hex 022222ac - hex 00222aba + hex 1444442B + hex 022222AC + hex 00222ABA hex 00000212 hex 00002929 hex 00002222 + hex 00000000 + hex 00000000 + hex 00000000 + hex F0000000 + hex FF000000 + hex FFFFF000 + hex FFFF0000 + hex FFFF0000 +; Tile ID 79, isSolid: false hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex ffff0000 - hex ffff0000 - hex ffff0000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF -; Tile ID 79 -; From image coordinates 112, 16 +; Tile ID 80, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -2981,16 +2702,66 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff +; Tile ID 81, isSolid: false + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF +; Tile ID 82, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -2999,170 +2770,66 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff +; Tile ID 83, isSolid: false + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF -; Tile ID 80 -; From image coordinates 120, 16 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 81 -; From image coordinates 128, 16 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 82 -; From image coordinates 136, 16 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 83 -; From image coordinates 144, 16 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 84 -; From image coordinates 152, 16 +; Tile ID 84, isSolid: true hex 44444444 hex 44444444 hex 44944444 @@ -3171,7 +2838,6 @@ tiledata ENT hex 44444944 hex 44444944 hex 44444444 - hex 00000000 hex 00000000 hex 00000000 @@ -3180,7 +2846,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 44444444 hex 44444444 hex 44444944 @@ -3189,7 +2854,6 @@ tiledata ENT hex 44944444 hex 44944444 hex 44444444 - hex 00000000 hex 00000000 hex 00000000 @@ -3199,8 +2863,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 85 -; From image coordinates 160, 16 +; Tile ID 85, isSolid: true hex 44444444 hex 44444994 hex 44444994 @@ -3209,7 +2872,6 @@ tiledata ENT hex 44494444 hex 44444444 hex 44444444 - hex 00000000 hex 00000000 hex 00000000 @@ -3218,7 +2880,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 44444444 hex 49944444 hex 49944444 @@ -3227,7 +2888,6 @@ tiledata ENT hex 44449444 hex 44444444 hex 44444444 - hex 00000000 hex 00000000 hex 00000000 @@ -3237,8 +2897,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 86 -; From image coordinates 168, 16 +; Tile ID 86, isSolid: true hex 11123333 hex 41125333 hex 44125333 @@ -3247,7 +2906,6 @@ tiledata ENT hex 44411122 hex 44441111 hex 44444441 - hex 00000000 hex 00000000 hex 00000000 @@ -3256,7 +2914,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 33332111 hex 33352114 hex 33352144 @@ -3265,7 +2922,6 @@ tiledata ENT hex 22111444 hex 11114444 hex 14444444 - hex 00000000 hex 00000000 hex 00000000 @@ -3275,8 +2931,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 87 -; From image coordinates 176, 16 +; Tile ID 87, isSolid: false hex 00002222 hex 00223333 hex 02333333 @@ -3285,16 +2940,14 @@ tiledata ENT hex 25222211 hex 22111111 hex 29111144 - - hex ffff0000 + hex FFFF0000 + hex FF000000 + hex F0000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 22220000 hex 33332200 hex 33333320 @@ -3303,18 +2956,16 @@ tiledata ENT hex 11222252 hex 11111122 hex 44111192 - - hex 0000ffff - hex 00000000 - hex 00000000 + hex 0000FFFF + hex 000000FF + hex 0000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 -; Tile ID 88 -; From image coordinates 184, 16 +; Tile ID 88, isSolid: true hex 44442222 hex 44223333 hex 42333333 @@ -3323,7 +2974,6 @@ tiledata ENT hex 25222211 hex 22111111 hex 29111144 - hex 00000000 hex 00000000 hex 00000000 @@ -3332,7 +2982,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 22224444 hex 33332244 hex 33333324 @@ -3341,7 +2990,6 @@ tiledata ENT hex 11222252 hex 11111122 hex 44111192 - hex 00000000 hex 00000000 hex 00000000 @@ -3351,8 +2999,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 89 -; From image coordinates 192, 16 +; Tile ID 89, isSolid: false hex 02736333 hex 02736333 hex 02736333 @@ -3361,16 +3008,14 @@ tiledata ENT hex 02736333 hex 02736333 hex 02736333 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 hex 33363720 hex 33363720 hex 33363720 @@ -3379,56 +3024,50 @@ tiledata ENT hex 33363720 hex 33363720 hex 33363720 + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 +; Tile ID 90, isSolid: false + hex 33737720 + hex 33737720 + hex 33737720 + hex 33737720 + hex 33737720 + hex 33737720 + hex 33737720 + hex 33737720 + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 02773733 + hex 02773733 + hex 02773733 + hex 02773733 + hex 02773733 + hex 02773733 + hex 02773733 + hex 02773733 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 -; Tile ID 90 -; From image coordinates 200, 16 - hex 33737720 - hex 33737720 - hex 33737720 - hex 33737720 - hex 33737720 - hex 33737720 - hex 33737720 - hex 33737720 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex 02773733 - hex 02773733 - hex 02773733 - hex 02773733 - hex 02773733 - hex 02773733 - hex 02773733 - hex 02773733 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 91 -; From image coordinates 208, 16 +; Tile ID 91, isSolid: false hex 02777333 hex 27773333 hex 77733333 @@ -3437,7 +3076,7 @@ tiledata ENT hex 33333366 hex 33333666 hex 33336666 - + hex F0000000 hex 00000000 hex 00000000 hex 00000000 @@ -3445,8 +3084,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 33377720 hex 33337772 hex 33333777 @@ -3455,8 +3092,7 @@ tiledata ENT hex 66333333 hex 66633333 hex 66663333 - - hex 00000000 + hex 0000000F hex 00000000 hex 00000000 hex 00000000 @@ -3465,8 +3101,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 92 -; From image coordinates 216, 16 +; Tile ID 92, isSolid: true hex 32223333 hex 33222333 hex 36622233 @@ -3475,7 +3110,6 @@ tiledata ENT hex 66333322 hex 63333332 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -3484,7 +3118,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 33332223 hex 33322233 hex 33222663 @@ -3493,7 +3126,6 @@ tiledata ENT hex 22333366 hex 23333336 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -3503,8 +3135,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 93 -; From image coordinates 224, 16 +; Tile ID 93, isSolid: true hex 33333333 hex 33333333 hex 33333333 @@ -3513,7 +3144,6 @@ tiledata ENT hex 23333333 hex 22333333 hex 22233333 - hex 00000000 hex 00000000 hex 00000000 @@ -3522,7 +3152,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 33333333 hex 33333333 hex 33333333 @@ -3531,7 +3160,6 @@ tiledata ENT hex 33333332 hex 33333322 hex 33333222 - hex 00000000 hex 00000000 hex 00000000 @@ -3541,8 +3169,23 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 94 -; From image coordinates 232, 16 +; Tile ID 94, isSolid: true + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 hex 33333333 hex 33333333 hex 33333333 @@ -3551,7 +3194,6 @@ tiledata ENT hex 33333333 hex 33333333 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -3561,26 +3203,7 @@ tiledata ENT hex 00000000 hex 00000000 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 95 -; From image coordinates 240, 16 +; Tile ID 95, isSolid: false hex 20000000 hex 32000000 hex 36200000 @@ -3589,16 +3212,14 @@ tiledata ENT hex 33336200 hex 33333620 hex 33333332 - - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff + hex 0FFFFFFF + hex 00FFFFFF + hex 000FFFFF + hex 0000FFFF + hex 00000FFF + hex 000000FF + hex 0000000F hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000002 hex 00000023 hex 00000263 @@ -3607,18 +3228,16 @@ tiledata ENT hex 00263333 hex 02633333 hex 23333333 - - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex 00000000 - hex 00000000 - hex 00000000 + hex FFFFFFF0 + hex FFFFFF00 + hex FFFFF000 + hex FFFF0000 + hex FFF00000 + hex FF000000 + hex F0000000 hex 00000000 -; Tile ID 96 -; From image coordinates 248, 16 +; Tile ID 96, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -3627,36 +3246,32 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 97 -; From image coordinates 0, 24 +; Tile ID 97, isSolid: false hex 00222222 hex 02444444 hex 24499992 @@ -3665,16 +3280,14 @@ tiledata ENT hex 24999266 hex 24999266 hex 24999926 - + hex FF000000 + hex F0000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 22222200 hex 44444420 hex 29999442 @@ -3683,9 +3296,8 @@ tiledata ENT hex 66299942 hex 66299942 hex 62999942 - - hex 00000000 - hex 00000000 + hex 000000FF + hex 0000000F hex 00000000 hex 00000000 hex 00000000 @@ -3693,8 +3305,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 98 -; From image coordinates 8, 24 +; Tile ID 98, isSolid: false hex 22222200 hex 44444420 hex 29999442 @@ -3703,16 +3314,14 @@ tiledata ENT hex 66299942 hex 66299942 hex 62999942 - + hex 000000FF + hex 0000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00222222 hex 02444444 hex 24499992 @@ -3721,9 +3330,8 @@ tiledata ENT hex 24999266 hex 24999266 hex 24999926 - - hex 00000000 - hex 00000000 + hex FF000000 + hex F0000000 hex 00000000 hex 00000000 hex 00000000 @@ -3731,8 +3339,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 99 -; From image coordinates 16, 24 +; Tile ID 99, isSolid: false hex 00222222 hex 02666444 hex 26699999 @@ -3741,16 +3348,14 @@ tiledata ENT hex 24999299 hex 26999299 hex 24999299 - + hex FF000000 + hex F0000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 22222200 hex 44466620 hex 99999662 @@ -3759,9 +3364,8 @@ tiledata ENT hex 99299942 hex 99299962 hex 99299942 - - hex 00000000 - hex 00000000 + hex 000000FF + hex 0000000F hex 00000000 hex 00000000 hex 00000000 @@ -3769,8 +3373,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 100 -; From image coordinates 24, 24 +; Tile ID 100, isSolid: false hex 22222200 hex 44444420 hex 99994442 @@ -3779,16 +3382,14 @@ tiledata ENT hex 99299442 hex 99299442 hex 99299442 - + hex 000000FF + hex 0000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00222222 hex 02444444 hex 24449999 @@ -3797,9 +3398,8 @@ tiledata ENT hex 24499299 hex 24499299 hex 24499299 - - hex 00000000 - hex 00000000 + hex FF000000 + hex F0000000 hex 00000000 hex 00000000 hex 00000000 @@ -3807,75 +3407,67 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 101 -; From image coordinates 32, 24 +; Tile ID 101, isSolid: false hex 00222222 hex 02666666 hex 02666666 - hex 2666bb66 - hex 2666bb66 - hex 266bbbbb - hex 266bbb66 - hex 266bbb66 - + hex 2666BB66 + hex 2666BB66 + hex 266BBBBB + hex 266BBB66 + hex 266BBB66 + hex FF000000 + hex F0000000 + hex F0000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 22222200 hex 66666620 hex 66666620 - hex 66bb6662 - hex 66bb6662 - hex bbbbb662 - hex 66bbb662 - hex 66bbb662 - - hex 00000000 - hex 00000000 - hex 00000000 + hex 66BB6662 + hex 66BB6662 + hex BBBBB662 + hex 66BBB662 + hex 66BBB662 + hex 000000FF + hex 0000000F + hex 0000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 -; Tile ID 102 -; From image coordinates 40, 24 +; Tile ID 102, isSolid: false hex 22222200 - hex 6666bb20 - hex 6bbbbbb2 - hex 6bbbbbc2 - hex 6bbbbbc2 - hex bbbbbbc2 - hex bbbbccc2 - hex bbccbcc2 - + hex 6666BB20 + hex 6BBBBBB2 + hex 6BBBBBC2 + hex 6BBBBBC2 + hex BBBBBBC2 + hex BBBBCCC2 + hex BBCCBCC2 + hex 000000FF + hex 0000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00222222 - hex 02bb6666 - hex 2bbbbbb6 - hex 2cbbbbb6 - hex 2cbbbbb6 - hex 2cbbbbbb - hex 2cccbbbb - hex 2ccbccbb - - hex 00000000 - hex 00000000 + hex 02BB6666 + hex 2BBBBBB6 + hex 2CBBBBB6 + hex 2CBBBBB6 + hex 2CBBBBBB + hex 2CCCBBBB + hex 2CCBCCBB + hex FF000000 + hex F0000000 hex 00000000 hex 00000000 hex 00000000 @@ -3883,8 +3475,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 103 -; From image coordinates 48, 24 +; Tile ID 103, isSolid: false hex 02222222 hex 23333666 hex 27733336 @@ -3893,7 +3484,7 @@ tiledata ENT hex 27733336 hex 27733336 hex 27733336 - + hex F0000000 hex 00000000 hex 00000000 hex 00000000 @@ -3901,8 +3492,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 22222220 hex 66633332 hex 63333772 @@ -3911,8 +3500,7 @@ tiledata ENT hex 63333772 hex 63333772 hex 63333772 - - hex 00000000 + hex 0000000F hex 00000000 hex 00000000 hex 00000000 @@ -3921,8 +3509,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 104 -; From image coordinates 56, 24 +; Tile ID 104, isSolid: true hex 22222222 hex 66666666 hex 66333333 @@ -3931,7 +3518,6 @@ tiledata ENT hex 66333333 hex 66333333 hex 66333333 - hex 00000000 hex 00000000 hex 00000000 @@ -3940,7 +3526,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 22222222 hex 66666666 hex 33333366 @@ -3949,7 +3534,6 @@ tiledata ENT hex 33333366 hex 33333366 hex 33333366 - hex 00000000 hex 00000000 hex 00000000 @@ -3959,8 +3543,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 105 -; From image coordinates 64, 24 +; Tile ID 105, isSolid: true hex 22222222 hex 66633333 hex 33333337 @@ -3969,7 +3552,6 @@ tiledata ENT hex 33333337 hex 33333337 hex 33333337 - hex 00000000 hex 00000000 hex 00000000 @@ -3978,7 +3560,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 22222222 hex 33333666 hex 73333333 @@ -3987,7 +3568,6 @@ tiledata ENT hex 73333333 hex 73333333 hex 73333333 - hex 00000000 hex 00000000 hex 00000000 @@ -3997,8 +3577,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 106 -; From image coordinates 72, 24 +; Tile ID 106, isSolid: false hex 22222220 hex 33333372 hex 37777722 @@ -4007,7 +3586,7 @@ tiledata ENT hex 37777722 hex 37777722 hex 37777722 - + hex 0000000F hex 00000000 hex 00000000 hex 00000000 @@ -4015,8 +3594,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 02222222 hex 27333333 hex 22777773 @@ -4025,8 +3602,7 @@ tiledata ENT hex 22777773 hex 22777773 hex 22777773 - - hex 00000000 + hex F0000000 hex 00000000 hex 00000000 hex 00000000 @@ -4035,8 +3611,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 107 -; From image coordinates 80, 24 +; Tile ID 107, isSolid: false hex 02777333 hex 02777333 hex 02777333 @@ -4045,16 +3620,14 @@ tiledata ENT hex 02777333 hex 02777333 hex 02777333 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 hex 33377720 hex 33377720 hex 33377720 @@ -4063,18 +3636,16 @@ tiledata ENT hex 33377720 hex 33377720 hex 33377720 + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 108 -; From image coordinates 88, 24 +; Tile ID 108, isSolid: true hex 36663333 hex 36663333 hex 36663333 @@ -4083,7 +3654,6 @@ tiledata ENT hex 36663333 hex 36663333 hex 36663333 - hex 00000000 hex 00000000 hex 00000000 @@ -4092,7 +3662,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 33336663 hex 33336663 hex 33336663 @@ -4101,7 +3670,6 @@ tiledata ENT hex 33336663 hex 33336663 hex 33336663 - hex 00000000 hex 00000000 hex 00000000 @@ -4111,8 +3679,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 109 -; From image coordinates 96, 24 +; Tile ID 109, isSolid: true hex 33333737 hex 33333737 hex 33333737 @@ -4121,7 +3688,22 @@ tiledata ENT hex 33333737 hex 33333737 hex 33333737 - + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 73733333 + hex 73733333 + hex 73733333 + hex 73733333 + hex 73733333 + hex 73733333 + hex 73733333 + hex 73733333 hex 00000000 hex 00000000 hex 00000000 @@ -4131,64 +3713,41 @@ tiledata ENT hex 00000000 hex 00000000 - hex 73733333 - hex 73733333 - hex 73733333 - hex 73733333 - hex 73733333 - hex 73733333 - hex 73733333 - hex 73733333 +; Tile ID 110, isSolid: false + hex 77772220 + hex 77772220 + hex 77772220 + hex 77772220 + hex 77772220 + hex 77772220 + hex 77772220 + hex 77772220 + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 02227777 + hex 02227777 + hex 02227777 + hex 02227777 + hex 02227777 + hex 02227777 + hex 02227777 + hex 02227777 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 110 -; From image coordinates 104, 24 - hex 77772220 - hex 77772220 - hex 77772220 - hex 77772220 - hex 77772220 - hex 77772220 - hex 77772220 - hex 77772220 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex 02227777 - hex 02227777 - hex 02227777 - hex 02227777 - hex 02227777 - hex 02227777 - hex 02227777 - hex 02227777 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 111 -; From image coordinates 112, 24 +; Tile ID 111, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -4197,16 +3756,14 @@ tiledata ENT hex 00000002 hex 00002227 hex 00027773 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffff0000 - hex ffff0000 - hex 00000000 - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFF0 + hex FFFF0000 + hex FFF00000 hex 00000000 hex 00000000 hex 00000000 @@ -4215,18 +3772,16 @@ tiledata ENT hex 20000000 hex 72220000 hex 37772000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 0FFFFFFF + hex 0000FFFF + hex 00000FFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex 0000ffff - hex 0000ffff - hex 00000000 - -; Tile ID 112 -; From image coordinates 120, 24 +; Tile ID 112, isSolid: false hex 00000000 hex 00000000 hex 00022200 @@ -4235,16 +3790,14 @@ tiledata ENT hex 73333333 hex 33333333 hex 33333333 - - hex ffffffff - hex ffffffff + hex FFFFFFFF + hex FFFFFFFF + hex FFF000FF + hex F0000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 hex 00000000 hex 00222000 @@ -4253,18 +3806,16 @@ tiledata ENT hex 33333337 hex 33333333 hex 33333333 - - hex ffffffff - hex ffffffff - hex 00000000 - hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FF000FFF + hex 0000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 -; Tile ID 113 -; From image coordinates 128, 24 +; Tile ID 113, isSolid: false hex 00022000 hex 02277200 hex 27733720 @@ -4273,16 +3824,14 @@ tiledata ENT hex 33333723 hex 33333373 hex 33333333 - + hex FFF00FFF + hex F00000FF + hex 0000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00022000 hex 00277220 hex 02733772 @@ -4291,18 +3840,16 @@ tiledata ENT hex 32733333 hex 37333333 hex 33333333 - - hex 00000000 - hex 00000000 - hex 00000000 + hex FFF00FFF + hex FF00000F + hex F0000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 -; Tile ID 114 -; From image coordinates 136, 24 +; Tile ID 114, isSolid: false hex 00022000 hex 02277200 hex 27733720 @@ -4311,16 +3858,14 @@ tiledata ENT hex 33333723 hex 33343373 hex 33444333 - + hex FFF00FFF + hex F00000FF + hex 0000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00022000 hex 00277220 hex 02733772 @@ -4329,18 +3874,16 @@ tiledata ENT hex 32733333 hex 37334333 hex 33344433 - - hex 00000000 - hex 00000000 - hex 00000000 + hex FFF00FFF + hex FF00000F + hex F0000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 -; Tile ID 115 -; From image coordinates 144, 24 +; Tile ID 115, isSolid: false hex 00022000 hex 02277200 hex 27733720 @@ -4349,16 +3892,14 @@ tiledata ENT hex 33333720 hex 33333372 hex 33333337 - + hex FFF00FFF + hex F00000FF + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00022000 hex 00277220 hex 02733772 @@ -4367,18 +3908,16 @@ tiledata ENT hex 02733333 hex 27333333 hex 73333333 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex FFF00FFF + hex FF00000F + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 hex 00000000 hex 00000000 -; Tile ID 116 -; From image coordinates 152, 24 +; Tile ID 116, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -4387,16 +3926,14 @@ tiledata ENT hex 00000000 hex 20000000 hex 72000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex 0000ffff - hex 0000ffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 0FFFFFFF + hex 00FFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -4405,18 +3942,16 @@ tiledata ENT hex 00000000 hex 00000002 hex 00000027 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFF0 + hex FFFFFF00 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffff0000 - hex ffff0000 - -; Tile ID 117 -; From image coordinates 160, 24 +; Tile ID 117, isSolid: true hex 33332111 hex 33352114 hex 33352144 @@ -4425,7 +3960,6 @@ tiledata ENT hex 22111444 hex 11114444 hex 14444444 - hex 00000000 hex 00000000 hex 00000000 @@ -4434,7 +3968,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 11123333 hex 41125333 hex 44125333 @@ -4443,7 +3976,6 @@ tiledata ENT hex 44411122 hex 44441111 hex 44444441 - hex 00000000 hex 00000000 hex 00000000 @@ -4453,8 +3985,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 118 -; From image coordinates 168, 24 +; Tile ID 118, isSolid: true hex 23352114 hex 23352114 hex 23352114 @@ -4463,7 +3994,6 @@ tiledata ENT hex 23335211 hex 23352111 hex 23352114 - hex 00000000 hex 00000000 hex 00000000 @@ -4472,7 +4002,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 41125332 hex 41125332 hex 41125332 @@ -4481,7 +4010,6 @@ tiledata ENT hex 11253332 hex 11125332 hex 41125332 - hex 00000000 hex 00000000 hex 00000000 @@ -4491,8 +4019,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 119 -; From image coordinates 176, 24 +; Tile ID 119, isSolid: true hex 29444444 hex 29444444 hex 29499444 @@ -4501,7 +4028,6 @@ tiledata ENT hex 29444444 hex 29444444 hex 29444444 - hex 00000000 hex 00000000 hex 00000000 @@ -4510,7 +4036,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 44444492 hex 44444492 hex 44499492 @@ -4519,7 +4044,6 @@ tiledata ENT hex 44444492 hex 44444492 hex 44444492 - hex 00000000 hex 00000000 hex 00000000 @@ -4529,8 +4053,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 120 -; From image coordinates 184, 24 +; Tile ID 120, isSolid: true hex 29444444 hex 29444444 hex 29499444 @@ -4539,7 +4062,6 @@ tiledata ENT hex 29444444 hex 29444444 hex 29444444 - hex 00000000 hex 00000000 hex 00000000 @@ -4548,7 +4070,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 44444492 hex 44444492 hex 44499492 @@ -4557,7 +4078,6 @@ tiledata ENT hex 44444492 hex 44444492 hex 44444492 - hex 00000000 hex 00000000 hex 00000000 @@ -4567,8 +4087,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 121 -; From image coordinates 192, 24 +; Tile ID 121, isSolid: false hex 02736333 hex 02736333 hex 02736333 @@ -4577,16 +4096,14 @@ tiledata ENT hex 02736333 hex 02736333 hex 02736333 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 hex 33363720 hex 33363720 hex 33363720 @@ -4595,56 +4112,50 @@ tiledata ENT hex 33363720 hex 33363720 hex 33363720 + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 +; Tile ID 122, isSolid: false + hex 33737720 + hex 33737720 + hex 33737720 + hex 33737720 + hex 33737720 + hex 33737720 + hex 33737720 + hex 33737720 + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 02773733 + hex 02773733 + hex 02773733 + hex 02773733 + hex 02773733 + hex 02773733 + hex 02773733 + hex 02773733 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 -; Tile ID 122 -; From image coordinates 200, 24 - hex 33737720 - hex 33737720 - hex 33737720 - hex 33737720 - hex 33737720 - hex 33737720 - hex 33737720 - hex 33737720 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex 02773733 - hex 02773733 - hex 02773733 - hex 02773733 - hex 02773733 - hex 02773733 - hex 02773733 - hex 02773733 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 123 -; From image coordinates 208, 24 +; Tile ID 123, isSolid: true hex 33366663 hex 33666633 hex 36666333 @@ -4653,7 +4164,6 @@ tiledata ENT hex 66333333 hex 63333333 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -4662,7 +4172,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 36666333 hex 33666633 hex 33366663 @@ -4671,7 +4180,6 @@ tiledata ENT hex 33333366 hex 33333336 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -4681,8 +4189,23 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 124 -; From image coordinates 216, 24 +; Tile ID 124, isSolid: true + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 hex 33333333 hex 33333333 hex 33333333 @@ -4691,7 +4214,6 @@ tiledata ENT hex 33333333 hex 33333333 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -4701,26 +4223,7 @@ tiledata ENT hex 00000000 hex 00000000 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 125 -; From image coordinates 224, 24 +; Tile ID 125, isSolid: true hex 32223333 hex 33222333 hex 33322273 @@ -4729,7 +4232,6 @@ tiledata ENT hex 33333322 hex 33333332 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -4738,7 +4240,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 33332223 hex 33322233 hex 37222333 @@ -4747,7 +4248,6 @@ tiledata ENT hex 22333333 hex 23333333 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -4757,8 +4257,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 126 -; From image coordinates 232, 24 +; Tile ID 126, isSolid: true hex 33333333 hex 33333333 hex 33333333 @@ -4767,7 +4266,6 @@ tiledata ENT hex 23333333 hex 22333333 hex 22233333 - hex 00000000 hex 00000000 hex 00000000 @@ -4776,7 +4274,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 33333333 hex 33333333 hex 33333333 @@ -4785,7 +4282,6 @@ tiledata ENT hex 33333332 hex 33333322 hex 33333222 - hex 00000000 hex 00000000 hex 00000000 @@ -4795,8 +4291,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 127 -; From image coordinates 240, 24 +; Tile ID 127, isSolid: true hex 33333333 hex 33333333 hex 33333333 @@ -4805,7 +4300,6 @@ tiledata ENT hex 33333373 hex 33333737 hex 33337377 - hex 00000000 hex 00000000 hex 00000000 @@ -4814,7 +4308,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 33333333 hex 33333333 hex 33333333 @@ -4823,7 +4316,6 @@ tiledata ENT hex 37333333 hex 73733333 hex 77373333 - hex 00000000 hex 00000000 hex 00000000 @@ -4833,8 +4325,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 128 -; From image coordinates 248, 24 +; Tile ID 128, isSolid: false hex 20000000 hex 32000000 hex 33200000 @@ -4843,16 +4334,14 @@ tiledata ENT hex 77773200 hex 77777320 hex 77777722 - - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff + hex 0FFFFFFF + hex 00FFFFFF + hex 000FFFFF + hex 0000FFFF + hex 00000FFF + hex 000000FF + hex 0000000F hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000002 hex 00000023 hex 00000233 @@ -4861,18 +4350,16 @@ tiledata ENT hex 00237777 hex 02377777 hex 22777777 - - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex 00000000 - hex 00000000 - hex 00000000 + hex FFFFFFF0 + hex FFFFFF00 + hex FFFFF000 + hex FFFF0000 + hex FFF00000 + hex FF000000 + hex F0000000 hex 00000000 -; Tile ID 129 -; From image coordinates 0, 32 +; Tile ID 129, isSolid: false hex 24999926 hex 24999992 hex 24999926 @@ -4881,16 +4368,14 @@ tiledata ENT hex 24499999 hex 02444444 hex 00222222 - hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - + hex F0000000 + hex FF000000 hex 62999942 hex 29999942 hex 62999942 @@ -4899,18 +4384,16 @@ tiledata ENT hex 99999442 hex 44444420 hex 22222200 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 0000000F + hex 000000FF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 130 -; From image coordinates 8, 32 +; Tile ID 130, isSolid: false hex 62999942 hex 29999942 hex 62999942 @@ -4919,16 +4402,14 @@ tiledata ENT hex 99999442 hex 44444420 hex 22222200 - hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - + hex 0000000F + hex 000000FF hex 24999926 hex 24999992 hex 24999926 @@ -4937,18 +4418,16 @@ tiledata ENT hex 24499999 hex 02444444 hex 00222222 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex F0000000 + hex FF000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 131 -; From image coordinates 16, 32 +; Tile ID 131, isSolid: false hex 24999299 hex 24999999 hex 24999999 @@ -4957,16 +4436,14 @@ tiledata ENT hex 24444444 hex 02444444 hex 00222222 - hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - + hex F0000000 + hex FF000000 hex 99299942 hex 99999942 hex 99999942 @@ -4975,18 +4452,16 @@ tiledata ENT hex 44444442 hex 44444420 hex 22222200 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 0000000F + hex 000000FF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 132 -; From image coordinates 24, 32 +; Tile ID 132, isSolid: false hex 99299442 hex 99999442 hex 99999442 @@ -4995,16 +4470,14 @@ tiledata ENT hex 44444442 hex 44444420 hex 22222200 - hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - + hex 0000000F + hex 000000FF hex 24499299 hex 24499999 hex 24499999 @@ -5013,27 +4486,24 @@ tiledata ENT hex 24444444 hex 02444444 hex 00222222 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex F0000000 + hex FF000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 133 -; From image coordinates 32, 32 - hex 2bbbbb66 - hex 2bbcbbbb - hex 2bbbbbbb - hex 2bbc66cc - hex 2ccc66cc - hex 2ccccccc - hex 22cccccc +; Tile ID 133, isSolid: false + hex 2BBBBB66 + hex 2BBCBBBB + hex 2BBBBBBB + hex 2BBC66CC + hex 2CCC66CC + hex 2CCCCCCC + hex 22CCCCCC hex 02222222 - hex 00000000 hex 00000000 hex 00000000 @@ -5041,37 +4511,33 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - - hex 66bbbbb2 - hex bbbbcbb2 - hex bbbbbbb2 - hex cc66cbb2 - hex cc66ccc2 - hex ccccccc2 - hex cccccc22 + hex F0000000 + hex 66BBBBB2 + hex BBBBCBB2 + hex BBBBBBB2 + hex CC66CBB2 + hex CC66CCC2 + hex CCCCCCC2 + hex CCCCCC22 hex 22222220 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 0000000F - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 134 -; From image coordinates 40, 32 - hex bbccbcc2 - hex bbccccc2 - hex ccccccc2 - hex cccbbcc2 - hex cccbbcc2 - hex cccccc22 - hex ccccc222 +; Tile ID 134, isSolid: false + hex BBCCBCC2 + hex BBCCCCC2 + hex CCCCCCC2 + hex CCCBBCC2 + hex CCCBBCC2 + hex CCCCCC22 + hex CCCCC222 hex 22222220 - hex 00000000 hex 00000000 hex 00000000 @@ -5079,28 +4545,25 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - - hex 2ccbccbb - hex 2cccccbb - hex 2ccccccc - hex 2ccbbccc - hex 2ccbbccc - hex 22cccccc - hex 222ccccc + hex 0000000F + hex 2CCBCCBB + hex 2CCCCCBB + hex 2CCCCCCC + hex 2CCBBCCC + hex 2CCBBCCC + hex 22CCCCCC + hex 222CCCCC hex 02222222 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex F0000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 135 -; From image coordinates 48, 32 +; Tile ID 135, isSolid: true hex 27733336 hex 27733336 hex 27733336 @@ -5109,7 +4572,6 @@ tiledata ENT hex 22277333 hex 22222222 hex 22222222 - hex 00000000 hex 00000000 hex 00000000 @@ -5118,7 +4580,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 63333772 hex 63333772 hex 63333772 @@ -5127,7 +4588,6 @@ tiledata ENT hex 33377222 hex 22222222 hex 22222222 - hex 00000000 hex 00000000 hex 00000000 @@ -5137,8 +4597,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 136 -; From image coordinates 56, 32 +; Tile ID 136, isSolid: true hex 66333333 hex 66333333 hex 66333333 @@ -5147,7 +4606,6 @@ tiledata ENT hex 33333333 hex 22222222 hex 22222222 - hex 00000000 hex 00000000 hex 00000000 @@ -5156,7 +4614,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 33333366 hex 33333366 hex 33333366 @@ -5165,7 +4622,6 @@ tiledata ENT hex 33333333 hex 22222222 hex 22222222 - hex 00000000 hex 00000000 hex 00000000 @@ -5175,8 +4631,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 137 -; From image coordinates 64, 32 +; Tile ID 137, isSolid: true hex 33333337 hex 33333337 hex 33333337 @@ -5185,7 +4640,6 @@ tiledata ENT hex 33377772 hex 22222222 hex 22222222 - hex 00000000 hex 00000000 hex 00000000 @@ -5194,7 +4648,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 73333333 hex 73333333 hex 73333333 @@ -5203,7 +4656,6 @@ tiledata ENT hex 27777333 hex 22222222 hex 22222222 - hex 00000000 hex 00000000 hex 00000000 @@ -5213,8 +4665,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 138 -; From image coordinates 72, 32 +; Tile ID 138, isSolid: true hex 37777722 hex 37777722 hex 37777722 @@ -5223,7 +4674,6 @@ tiledata ENT hex 72222222 hex 22222222 hex 22222222 - hex 00000000 hex 00000000 hex 00000000 @@ -5232,7 +4682,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 22777773 hex 22777773 hex 22777773 @@ -5241,7 +4690,6 @@ tiledata ENT hex 22222227 hex 22222222 hex 22222222 - hex 00000000 hex 00000000 hex 00000000 @@ -5251,8 +4699,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 139 -; From image coordinates 80, 32 +; Tile ID 139, isSolid: false hex 02777333 hex 02777333 hex 02777333 @@ -5261,16 +4708,14 @@ tiledata ENT hex 02777333 hex 02777333 hex 02777333 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 hex 33377720 hex 33377720 hex 33377720 @@ -5279,18 +4724,16 @@ tiledata ENT hex 33377720 hex 33377720 hex 33377720 + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 140 -; From image coordinates 88, 32 +; Tile ID 140, isSolid: true hex 36663333 hex 36663333 hex 36663333 @@ -5299,7 +4742,22 @@ tiledata ENT hex 36663333 hex 36663333 hex 36663333 - + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 33336663 + hex 33336663 + hex 33336663 + hex 33336663 + hex 33336663 + hex 33336663 + hex 33336663 + hex 33336663 hex 00000000 hex 00000000 hex 00000000 @@ -5309,15 +4767,31 @@ tiledata ENT hex 00000000 hex 00000000 - hex 33336663 - hex 33336663 - hex 33336663 - hex 33336663 - hex 33336663 - hex 33336663 - hex 33336663 - hex 33336663 - +; Tile ID 141, isSolid: true + hex 33333737 + hex 33333737 + hex 33333737 + hex 33333737 + hex 33333737 + hex 33333737 + hex 33333737 + hex 33333737 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 73733333 + hex 73733333 + hex 73733333 + hex 73733333 + hex 73733333 + hex 73733333 + hex 73733333 + hex 73733333 hex 00000000 hex 00000000 hex 00000000 @@ -5327,46 +4801,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 141 -; From image coordinates 96, 32 - hex 33333737 - hex 33333737 - hex 33333737 - hex 33333737 - hex 33333737 - hex 33333737 - hex 33333737 - hex 33333737 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex 73733333 - hex 73733333 - hex 73733333 - hex 73733333 - hex 73733333 - hex 73733333 - hex 73733333 - hex 73733333 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 142 -; From image coordinates 104, 32 +; Tile ID 142, isSolid: false hex 77772220 hex 77772220 hex 77772220 @@ -5375,16 +4810,14 @@ tiledata ENT hex 77772220 hex 77772222 hex 77772222 - + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 02227777 hex 02227777 hex 02227777 @@ -5393,18 +4826,16 @@ tiledata ENT hex 02227777 hex 22227777 hex 22227777 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 hex 00000000 hex 00000000 -; Tile ID 143 -; From image coordinates 112, 32 +; Tile ID 143, isSolid: false hex 00027333 hex 00273333 hex 00273336 @@ -5413,16 +4844,14 @@ tiledata ENT hex 27333333 hex 73333333 hex 73333333 - + hex FFF00000 + hex FF000000 + hex FF000000 + hex F0000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 33372000 hex 33337200 hex 63337200 @@ -5431,18 +4860,16 @@ tiledata ENT hex 33333372 hex 33333337 hex 33333337 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00000FFF + hex 000000FF + hex 000000FF + hex 0000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 -; Tile ID 144 -; From image coordinates 120, 32 +; Tile ID 144, isSolid: true hex 36333333 hex 66633333 hex 66333333 @@ -5451,7 +4878,6 @@ tiledata ENT hex 33333333 hex 33333333 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -5460,7 +4886,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 33333363 hex 33333666 hex 33333366 @@ -5469,7 +4894,6 @@ tiledata ENT hex 33333333 hex 33333333 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -5479,8 +4903,23 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 145 -; From image coordinates 128, 32 +; Tile ID 145, isSolid: true + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 hex 33333333 hex 33333333 hex 33333333 @@ -5489,7 +4928,6 @@ tiledata ENT hex 33333333 hex 33333333 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -5499,26 +4937,7 @@ tiledata ENT hex 00000000 hex 00000000 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 146 -; From image coordinates 136, 32 +; Tile ID 146, isSolid: true hex 34443333 hex 33433333 hex 33333333 @@ -5527,7 +4946,6 @@ tiledata ENT hex 33333333 hex 33333333 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -5536,7 +4954,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 33334443 hex 33333433 hex 33333333 @@ -5545,7 +4962,6 @@ tiledata ENT hex 33333333 hex 33333333 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -5555,8 +4971,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 147 -; From image coordinates 144, 32 +; Tile ID 147, isSolid: true hex 33333337 hex 33333333 hex 33333333 @@ -5565,7 +4980,6 @@ tiledata ENT hex 33344433 hex 33444333 hex 33343333 - hex 00000000 hex 00000000 hex 00000000 @@ -5574,7 +4988,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 73333333 hex 33333333 hex 33333333 @@ -5583,7 +4996,6 @@ tiledata ENT hex 33444333 hex 33344433 hex 33334333 - hex 00000000 hex 00000000 hex 00000000 @@ -5593,8 +5005,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 148 -; From image coordinates 152, 32 +; Tile ID 148, isSolid: false hex 77222000 hex 37777200 hex 33777200 @@ -5603,16 +5014,14 @@ tiledata ENT hex 33337720 hex 33377200 hex 33377200 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex 00000FFF + hex 000000FF + hex 000000FF + hex 0000000F + hex 0000000F + hex 0000000F + hex 000000FF + hex 000000FF hex 00022277 hex 00277773 hex 00277733 @@ -5621,18 +5030,16 @@ tiledata ENT hex 02773333 hex 00277333 hex 00277333 + hex FFF00000 + hex FF000000 + hex FF000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex FF000000 + hex FF000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 149 -; From image coordinates 160, 32 +; Tile ID 149, isSolid: false hex 00002222 hex 00223333 hex 02333333 @@ -5641,16 +5048,14 @@ tiledata ENT hex 23335521 hex 23335211 hex 23355214 - - hex ffff0000 + hex FFFF0000 + hex FF000000 + hex F0000000 + hex F0000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 22220000 hex 33332200 hex 33333320 @@ -5659,18 +5064,16 @@ tiledata ENT hex 12553332 hex 11253332 hex 41255332 - - hex 0000ffff - hex 00000000 - hex 00000000 - hex 00000000 + hex 0000FFFF + hex 000000FF + hex 0000000F + hex 0000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 -; Tile ID 150 -; From image coordinates 168, 32 +; Tile ID 150, isSolid: true hex 23352114 hex 23352114 hex 23335211 @@ -5679,7 +5082,6 @@ tiledata ENT hex 23333521 hex 23333521 hex 23335211 - hex 00000000 hex 00000000 hex 00000000 @@ -5688,7 +5090,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 41125332 hex 41125332 hex 11253332 @@ -5697,7 +5098,6 @@ tiledata ENT hex 12533332 hex 12533332 hex 11253332 - hex 00000000 hex 00000000 hex 00000000 @@ -5707,8 +5107,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 151 -; From image coordinates 176, 32 +; Tile ID 151, isSolid: true hex 29444444 hex 29444994 hex 29444994 @@ -5717,7 +5116,6 @@ tiledata ENT hex 29494444 hex 29444444 hex 29444444 - hex 00000000 hex 00000000 hex 00000000 @@ -5726,7 +5124,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 44444492 hex 49944492 hex 49944492 @@ -5735,7 +5132,6 @@ tiledata ENT hex 44449492 hex 44444492 hex 44444492 - hex 00000000 hex 00000000 hex 00000000 @@ -5745,8 +5141,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 152 -; From image coordinates 184, 32 +; Tile ID 152, isSolid: true hex 29444444 hex 29444994 hex 29444994 @@ -5755,7 +5150,6 @@ tiledata ENT hex 29494444 hex 29444444 hex 29444444 - hex 00000000 hex 00000000 hex 00000000 @@ -5764,7 +5158,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 44444492 hex 49944492 hex 49944492 @@ -5773,7 +5166,6 @@ tiledata ENT hex 44449492 hex 44444492 hex 44444492 - hex 00000000 hex 00000000 hex 00000000 @@ -5783,8 +5175,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 153 -; From image coordinates 192, 32 +; Tile ID 153, isSolid: false hex 02736333 hex 02736333 hex 02736333 @@ -5793,16 +5184,14 @@ tiledata ENT hex 02736333 hex 22222222 hex 22733373 - + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 33363720 hex 33363720 hex 33363720 @@ -5811,18 +5200,16 @@ tiledata ENT hex 33363720 hex 22222222 hex 37333722 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F hex 00000000 hex 00000000 -; Tile ID 154 -; From image coordinates 200, 32 +; Tile ID 154, isSolid: false hex 33737720 hex 33737720 hex 33737720 @@ -5831,16 +5218,14 @@ tiledata ENT hex 33737720 hex 22222222 hex 77727222 - + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F + hex 0000000F hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 02773733 hex 02773733 hex 02773733 @@ -5849,7 +5234,40 @@ tiledata ENT hex 02773733 hex 22222222 hex 22272777 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex F0000000 + hex 00000000 + hex 00000000 +; Tile ID 155, isSolid: true + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 hex 00000000 hex 00000000 hex 00000000 @@ -5859,8 +5277,23 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 155 -; From image coordinates 208, 32 +; Tile ID 156, isSolid: true + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 hex 33333333 hex 33333333 hex 33333333 @@ -5869,7 +5302,6 @@ tiledata ENT hex 33333333 hex 33333333 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -5879,6 +5311,23 @@ tiledata ENT hex 00000000 hex 00000000 +; Tile ID 157, isSolid: true + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 hex 33333333 hex 33333333 hex 33333333 @@ -5887,7 +5336,6 @@ tiledata ENT hex 33333333 hex 33333333 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -5897,84 +5345,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 156 -; From image coordinates 216, 32 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 157 -; From image coordinates 224, 32 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 158 -; From image coordinates 232, 32 +; Tile ID 158, isSolid: true hex 32227333 hex 33222733 hex 33322273 @@ -5983,7 +5354,6 @@ tiledata ENT hex 33337322 hex 33373772 hex 33737777 - hex 00000000 hex 00000000 hex 00000000 @@ -5992,7 +5362,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 33372223 hex 33722233 hex 37222333 @@ -6001,7 +5370,6 @@ tiledata ENT hex 22373333 hex 27737333 hex 77773733 - hex 00000000 hex 00000000 hex 00000000 @@ -6011,8 +5379,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 159 -; From image coordinates 240, 32 +; Tile ID 159, isSolid: true hex 33373777 hex 33737777 hex 37377777 @@ -6021,7 +5388,6 @@ tiledata ENT hex 27777777 hex 22777772 hex 22277722 - hex 00000000 hex 00000000 hex 00000000 @@ -6030,7 +5396,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 77737333 hex 77773733 hex 77777373 @@ -6039,7 +5404,6 @@ tiledata ENT hex 77777772 hex 27777722 hex 22777222 - hex 00000000 hex 00000000 hex 00000000 @@ -6049,8 +5413,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 160 -; From image coordinates 248, 32 +; Tile ID 160, isSolid: false hex 77777222 hex 77772220 hex 77722200 @@ -6059,16 +5422,14 @@ tiledata ENT hex 22200000 hex 22000000 hex 20000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff - + hex 0000000F + hex 000000FF + hex 00000FFF + hex 0000FFFF + hex 000FFFFF + hex 00FFFFFF + hex 0FFFFFFF hex 22277777 hex 02227777 hex 00222777 @@ -6077,18 +5438,16 @@ tiledata ENT hex 00000222 hex 00000022 hex 00000002 + hex 00000000 + hex F0000000 + hex FF000000 + hex FFF00000 + hex FFFF0000 + hex FFFFF000 + hex FFFFFF00 + hex FFFFFFF0 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - -; Tile ID 161 -; From image coordinates 0, 40 +; Tile ID 161, isSolid: true hex 22222222 hex 33333333 hex 33333333 @@ -6097,7 +5456,6 @@ tiledata ENT hex 12255522 hex 11122211 hex 41111114 - hex 00000000 hex 00000000 hex 00000000 @@ -6106,7 +5464,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 22222222 hex 33333333 hex 33333333 @@ -6115,7 +5472,6 @@ tiledata ENT hex 22555221 hex 11222111 hex 41111114 - hex 00000000 hex 00000000 hex 00000000 @@ -6125,8 +5481,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 162 -; From image coordinates 8, 40 +; Tile ID 162, isSolid: true hex 22222222 hex 33333333 hex 33333333 @@ -6135,7 +5490,6 @@ tiledata ENT hex 11122211 hex 11111111 hex 44411144 - hex 00000000 hex 00000000 hex 00000000 @@ -6144,7 +5498,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 22222222 hex 33333333 hex 33333333 @@ -6153,7 +5506,6 @@ tiledata ENT hex 11222111 hex 11111111 hex 44111444 - hex 00000000 hex 00000000 hex 00000000 @@ -6163,8 +5515,23 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 163 -; From image coordinates 16, 40 +; Tile ID 163, isSolid: true + hex 44444444 + hex 44444444 + hex 44499444 + hex 44499444 + hex 44499444 + hex 44444444 + hex 44444444 + hex 44444444 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 hex 44444444 hex 44444444 hex 44499444 @@ -6173,7 +5540,6 @@ tiledata ENT hex 44444444 hex 44444444 hex 44444444 - hex 00000000 hex 00000000 hex 00000000 @@ -6183,26 +5549,7 @@ tiledata ENT hex 00000000 hex 00000000 - hex 44444444 - hex 44444444 - hex 44499444 - hex 44499444 - hex 44499444 - hex 44444444 - hex 44444444 - hex 44444444 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 164 -; From image coordinates 24, 40 +; Tile ID 164, isSolid: true hex 44444444 hex 44444994 hex 44444994 @@ -6211,7 +5558,6 @@ tiledata ENT hex 44944444 hex 44444444 hex 44444444 - hex 00000000 hex 00000000 hex 00000000 @@ -6220,7 +5566,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 44444444 hex 49944444 hex 49944444 @@ -6229,7 +5574,6 @@ tiledata ENT hex 44444944 hex 44444444 hex 44444444 - hex 00000000 hex 00000000 hex 00000000 @@ -6239,8 +5583,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 165 -; From image coordinates 32, 40 +; Tile ID 165, isSolid: true hex 44444444 hex 44444994 hex 44444994 @@ -6249,7 +5592,6 @@ tiledata ENT hex 44494444 hex 44444444 hex 44444444 - hex 00000000 hex 00000000 hex 00000000 @@ -6258,7 +5600,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 44444444 hex 49944444 hex 49944444 @@ -6267,7 +5608,6 @@ tiledata ENT hex 44449444 hex 44444444 hex 44444444 - hex 00000000 hex 00000000 hex 00000000 @@ -6277,8 +5617,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 166 -; From image coordinates 40, 40 +; Tile ID 166, isSolid: true hex 44444444 hex 44444444 hex 44944444 @@ -6287,7 +5626,6 @@ tiledata ENT hex 44444944 hex 44444944 hex 44444444 - hex 00000000 hex 00000000 hex 00000000 @@ -6296,7 +5634,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 44444444 hex 44444444 hex 44444944 @@ -6305,7 +5642,6 @@ tiledata ENT hex 44944444 hex 44944444 hex 44444444 - hex 00000000 hex 00000000 hex 00000000 @@ -6315,8 +5651,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 167 -; From image coordinates 48, 40 +; Tile ID 167, isSolid: false hex 20000000 hex 92000000 hex 49200000 @@ -6325,16 +5660,14 @@ tiledata ENT hex 44449200 hex 44444920 hex 44444492 - - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff + hex 0FFFFFFF + hex 00FFFFFF + hex 000FFFFF + hex 0000FFFF + hex 00000FFF + hex 000000FF + hex 0000000F hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000002 hex 00000029 hex 00000294 @@ -6343,18 +5676,16 @@ tiledata ENT hex 00294444 hex 02944444 hex 29444444 - - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex 00000000 - hex 00000000 - hex 00000000 + hex FFFFFFF0 + hex FFFFFF00 + hex FFFFF000 + hex FFFF0000 + hex FFF00000 + hex FF000000 + hex F0000000 hex 00000000 -; Tile ID 168 -; From image coordinates 56, 40 +; Tile ID 168, isSolid: false hex 29444444 hex 02944444 hex 00294444 @@ -6363,16 +5694,14 @@ tiledata ENT hex 00000294 hex 00000029 hex 00000002 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - + hex F0000000 + hex FF000000 + hex FFF00000 + hex FFFF0000 + hex FFFFF000 + hex FFFFFF00 + hex FFFFFFF0 hex 44444492 hex 44444920 hex 44449200 @@ -6381,18 +5710,16 @@ tiledata ENT hex 49200000 hex 92000000 hex 20000000 + hex 00000000 + hex 0000000F + hex 000000FF + hex 00000FFF + hex 0000FFFF + hex 000FFFFF + hex 00FFFFFF + hex 0FFFFFFF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff - -; Tile ID 169 -; From image coordinates 64, 40 +; Tile ID 169, isSolid: false hex 00023335 hex 00233352 hex 02333521 @@ -6401,16 +5728,14 @@ tiledata ENT hex 23352114 hex 25552114 hex 02224144 - + hex FFF00000 + hex FF000000 + hex F0000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex F0000000 hex 53332000 hex 25333200 hex 12533320 @@ -6419,18 +5744,16 @@ tiledata ENT hex 41125332 hex 41125552 hex 44142220 + hex 00000FFF + hex 000000FF + hex 0000000F + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 0000000F - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 170 -; From image coordinates 72, 40 +; Tile ID 170, isSolid: true hex 55221444 hex 22111444 hex 11114444 @@ -6439,7 +5762,6 @@ tiledata ENT hex 44444994 hex 44444994 hex 44444994 - hex 00000000 hex 00000000 hex 00000000 @@ -6448,7 +5770,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 44412255 hex 44411122 hex 44441111 @@ -6457,7 +5778,6 @@ tiledata ENT hex 49944444 hex 49944444 hex 49944444 - hex 00000000 hex 00000000 hex 00000000 @@ -6467,8 +5787,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 171 -; From image coordinates 80, 40 +; Tile ID 171, isSolid: false hex 00000002 hex 00000023 hex 00000233 @@ -6477,16 +5796,14 @@ tiledata ENT hex 00233333 hex 02333335 hex 23333355 - - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 + hex FFFFFFF0 + hex FFFFFF00 + hex FFFFF000 + hex FFFF0000 + hex FFF00000 + hex FF000000 + hex F0000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 20000000 hex 32000000 hex 33200000 @@ -6495,18 +5812,16 @@ tiledata ENT hex 33333200 hex 53333320 hex 55333332 - - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 00000000 - hex 00000000 - hex 00000000 + hex 0FFFFFFF + hex 00FFFFFF + hex 000FFFFF + hex 0000FFFF + hex 00000FFF + hex 000000FF + hex 0000000F hex 00000000 -; Tile ID 172 -; From image coordinates 88, 40 +; Tile ID 172, isSolid: true hex 33355522 hex 33522211 hex 35211111 @@ -6515,7 +5830,6 @@ tiledata ENT hex 52144444 hex 21444449 hex 21444449 - hex 00000000 hex 00000000 hex 00000000 @@ -6524,7 +5838,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 22555333 hex 11222533 hex 11111253 @@ -6533,7 +5846,6 @@ tiledata ENT hex 44444125 hex 94444412 hex 94444412 - hex 00000000 hex 00000000 hex 00000000 @@ -6543,8 +5855,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 173 -; From image coordinates 96, 40 +; Tile ID 173, isSolid: false hex 00000002 hex 00000023 hex 00000233 @@ -6553,16 +5864,14 @@ tiledata ENT hex 00233335 hex 02333335 hex 23333555 - - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 + hex FFFFFFF0 + hex FFFFFF00 + hex FFFFF000 + hex FFFF0000 + hex FFF00000 + hex FF000000 + hex F0000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 20000000 hex 32000000 hex 33200000 @@ -6571,18 +5880,16 @@ tiledata ENT hex 53333200 hex 53333320 hex 55533332 - - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 00000000 - hex 00000000 - hex 00000000 + hex 0FFFFFFF + hex 00FFFFFF + hex 000FFFFF + hex 0000FFFF + hex 00000FFF + hex 000000FF + hex 0000000F hex 00000000 -; Tile ID 174 -; From image coordinates 104, 40 +; Tile ID 174, isSolid: true hex 33355522 hex 33522211 hex 35211111 @@ -6591,7 +5898,6 @@ tiledata ENT hex 21144444 hex 21444494 hex 21444494 - hex 00000000 hex 00000000 hex 00000000 @@ -6600,7 +5906,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 22555333 hex 11222533 hex 11111253 @@ -6609,7 +5914,6 @@ tiledata ENT hex 44444112 hex 49444412 hex 49444412 - hex 00000000 hex 00000000 hex 00000000 @@ -6619,8 +5923,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 175 -; From image coordinates 112, 40 +; Tile ID 175, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -6629,16 +5932,14 @@ tiledata ENT hex 00233320 hex 02333352 hex 23333352 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFF000FF + hex FF00000F + hex F0000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 hex 00000000 hex 00000000 @@ -6647,18 +5948,16 @@ tiledata ENT hex 02333200 hex 25333320 hex 25333332 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FF000FFF + hex F00000FF + hex 0000000F hex 00000000 -; Tile ID 176 -; From image coordinates 120, 40 +; Tile ID 176, isSolid: false hex 00000000 hex 00000000 hex 00000002 @@ -6667,16 +5966,14 @@ tiledata ENT hex 00002777 hex 00027773 hex 00277733 - - hex ffffffff - hex ffffffff - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex 00000000 - hex 00000000 - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFF0 + hex FFFFFF00 + hex FFFFF000 + hex FFFF0000 + hex FFF00000 + hex FF000000 hex 00000000 hex 00000000 hex 20000000 @@ -6685,18 +5982,16 @@ tiledata ENT hex 77720000 hex 37772000 hex 33777200 + hex FFFFFFFF + hex FFFFFFFF + hex 0FFFFFFF + hex 00FFFFFF + hex 000FFFFF + hex 0000FFFF + hex 00000FFF + hex 000000FF - hex ffffffff - hex ffffffff - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 00000000 - hex 00000000 - -; Tile ID 177 -; From image coordinates 128, 40 +; Tile ID 177, isSolid: false hex 02777333 hex 27773333 hex 77733333 @@ -6705,7 +6000,7 @@ tiledata ENT hex 33333366 hex 33333666 hex 33336666 - + hex F0000000 hex 00000000 hex 00000000 hex 00000000 @@ -6713,8 +6008,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 33377720 hex 33337772 hex 33333777 @@ -6723,8 +6016,7 @@ tiledata ENT hex 66333333 hex 66633333 hex 66663333 - - hex 00000000 + hex 0000000F hex 00000000 hex 00000000 hex 00000000 @@ -6733,8 +6025,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 178 -; From image coordinates 136, 40 +; Tile ID 178, isSolid: true hex 33366663 hex 33666633 hex 36666333 @@ -6743,7 +6034,6 @@ tiledata ENT hex 66333333 hex 63333333 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -6752,7 +6042,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 36666333 hex 33666633 hex 33366663 @@ -6761,7 +6050,6 @@ tiledata ENT hex 33333366 hex 33333336 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -6771,8 +6059,23 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 179 -; From image coordinates 144, 40 +; Tile ID 179, isSolid: true + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 hex 33333333 hex 33333333 hex 33333333 @@ -6781,7 +6084,6 @@ tiledata ENT hex 33333333 hex 33333333 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -6791,6 +6093,23 @@ tiledata ENT hex 00000000 hex 00000000 +; Tile ID 180, isSolid: true + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 hex 33333333 hex 33333333 hex 33333333 @@ -6799,7 +6118,6 @@ tiledata ENT hex 33333333 hex 33333333 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -6809,8 +6127,23 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 180 -; From image coordinates 152, 40 +; Tile ID 181, isSolid: true + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 hex 33333333 hex 33333333 hex 33333333 @@ -6819,7 +6152,6 @@ tiledata ENT hex 33333333 hex 33333333 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -6829,64 +6161,7 @@ tiledata ENT hex 00000000 hex 00000000 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 181 -; From image coordinates 160, 40 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 182 -; From image coordinates 168, 40 +; Tile ID 182, isSolid: true hex 33333333 hex 33333333 hex 33333337 @@ -6895,7 +6170,6 @@ tiledata ENT hex 33337377 hex 33373777 hex 33737777 - hex 00000000 hex 00000000 hex 00000000 @@ -6904,7 +6178,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 33333333 hex 33333333 hex 73333333 @@ -6913,7 +6186,6 @@ tiledata ENT hex 77373333 hex 77737333 hex 77773733 - hex 00000000 hex 00000000 hex 00000000 @@ -6923,8 +6195,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 183 -; From image coordinates 176, 40 +; Tile ID 183, isSolid: false hex 37377777 hex 73777777 hex 37777777 @@ -6933,7 +6204,6 @@ tiledata ENT hex 77777722 hex 77777222 hex 77772220 - hex 00000000 hex 00000000 hex 00000000 @@ -6941,8 +6211,7 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - + hex 0000000F hex 77777373 hex 77777737 hex 77777773 @@ -6951,18 +6220,16 @@ tiledata ENT hex 22777777 hex 22277777 hex 02227777 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex F0000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 184 -; From image coordinates 184, 40 +; Tile ID 184, isSolid: false hex 77722200 hex 77222000 hex 72220000 @@ -6971,16 +6238,14 @@ tiledata ENT hex 20000000 hex 00000000 hex 00000000 - - hex 00000000 - hex 00000000 - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex ffffffff - hex ffffffff - + hex 000000FF + hex 00000FFF + hex 0000FFFF + hex 000FFFFF + hex 00FFFFFF + hex 0FFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00222777 hex 00022277 hex 00002227 @@ -6989,18 +6254,16 @@ tiledata ENT hex 00000002 hex 00000000 hex 00000000 + hex FF000000 + hex FFF00000 + hex FFFF0000 + hex FFFFF000 + hex FFFFFF00 + hex FFFFFFF0 + hex FFFFFFFF + hex FFFFFFFF - hex 00000000 - hex 00000000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffffffff - hex ffffffff - -; Tile ID 185 -; From image coordinates 192, 40 +; Tile ID 185, isSolid: false hex 27363333 hex 27363333 hex 27363333 @@ -7009,7 +6272,6 @@ tiledata ENT hex 27363333 hex 23366636 hex 02222222 - hex 00000000 hex 00000000 hex 00000000 @@ -7017,8 +6279,7 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - + hex F0000000 hex 33336372 hex 33336372 hex 33336372 @@ -7027,18 +6288,16 @@ tiledata ENT hex 33336372 hex 63666332 hex 22222220 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 0000000F - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 186 -; From image coordinates 200, 40 +; Tile ID 186, isSolid: true hex 33373772 hex 33373772 hex 33373772 @@ -7047,7 +6306,6 @@ tiledata ENT hex 33373772 hex 33333332 hex 22222226 - hex 00000000 hex 00000000 hex 00000000 @@ -7056,7 +6314,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 27737333 hex 27737333 hex 27737333 @@ -7065,7 +6322,6 @@ tiledata ENT hex 27737333 hex 23333333 hex 62222222 - hex 00000000 hex 00000000 hex 00000000 @@ -7075,8 +6331,23 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 187 -; From image coordinates 208, 40 +; Tile ID 187, isSolid: true + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 hex 33333333 hex 33333333 hex 33333333 @@ -7085,7 +6356,6 @@ tiledata ENT hex 33333333 hex 33333333 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -7095,6 +6365,23 @@ tiledata ENT hex 00000000 hex 00000000 +; Tile ID 188, isSolid: true + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 33333333 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 hex 33333333 hex 33333333 hex 33333333 @@ -7103,7 +6390,6 @@ tiledata ENT hex 33333333 hex 33333333 hex 33333333 - hex 00000000 hex 00000000 hex 00000000 @@ -7113,46 +6399,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 188 -; From image coordinates 216, 40 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - hex 33333333 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 189 -; From image coordinates 224, 40 +; Tile ID 189, isSolid: true hex 33333333 hex 33333333 hex 33333337 @@ -7161,7 +6408,6 @@ tiledata ENT hex 33337377 hex 33373777 hex 33737777 - hex 00000000 hex 00000000 hex 00000000 @@ -7170,7 +6416,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 33333333 hex 33333333 hex 73333333 @@ -7179,7 +6424,6 @@ tiledata ENT hex 77373333 hex 77737333 hex 77773733 - hex 00000000 hex 00000000 hex 00000000 @@ -7189,8 +6433,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 190 -; From image coordinates 232, 40 +; Tile ID 190, isSolid: false hex 37377777 hex 73777777 hex 37777777 @@ -7199,7 +6442,6 @@ tiledata ENT hex 77777722 hex 77777222 hex 77772220 - hex 00000000 hex 00000000 hex 00000000 @@ -7207,8 +6449,7 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - + hex 0000000F hex 77777373 hex 77777737 hex 77777773 @@ -7217,18 +6458,16 @@ tiledata ENT hex 22777777 hex 22277777 hex 02227777 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex F0000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 191 -; From image coordinates 240, 40 +; Tile ID 191, isSolid: false hex 72222222 hex 77222220 hex 72222200 @@ -7237,16 +6476,14 @@ tiledata ENT hex 20000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex ffffffff - hex ffffffff - + hex 0000000F + hex 000000FF + hex 000FFFFF + hex 00FFFFFF + hex 0FFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 22222227 hex 02222277 hex 00222227 @@ -7255,56 +6492,50 @@ tiledata ENT hex 00000002 hex 00000000 hex 00000000 + hex 00000000 + hex F0000000 + hex FF000000 + hex FFFFF000 + hex FFFFFF00 + hex FFFFFFF0 + hex FFFFFFFF + hex FFFFFFFF +; Tile ID 192, isSolid: false hex 00000000 hex 00000000 hex 00000000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffffffff - hex ffffffff + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF -; Tile ID 192 -; From image coordinates 248, 40 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 193 -; From image coordinates 0, 48 +; Tile ID 193, isSolid: false hex 00000000 hex 02222220 hex 22999922 @@ -7313,16 +6544,14 @@ tiledata ENT hex 29922992 hex 22999922 hex 02222220 - - hex ffffffff + hex FFFFFFFF + hex F000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - + hex F000000F hex 00000000 hex 02222220 hex 22999922 @@ -7331,18 +6560,16 @@ tiledata ENT hex 29922992 hex 22999922 hex 02222220 + hex FFFFFFFF + hex F000000F + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex F000000F - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 194 -; From image coordinates 8, 48 +; Tile ID 194, isSolid: false hex 00000000 hex 02222200 hex 02999200 @@ -7351,16 +6578,14 @@ tiledata ENT hex 00299200 hex 00299200 hex 00222200 - - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex FFFFFFFF + hex F00000FF + hex F00000FF + hex F00000FF + hex FF0000FF + hex FF0000FF + hex FF0000FF + hex FF0000FF hex 00000000 hex 00222220 hex 00299920 @@ -7369,18 +6594,16 @@ tiledata ENT hex 00299200 hex 00299200 hex 00222200 + hex FFFFFFFF + hex FF00000F + hex FF00000F + hex FF00000F + hex FF0000FF + hex FF0000FF + hex FF0000FF + hex FF0000FF - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 195 -; From image coordinates 16, 48 +; Tile ID 195, isSolid: false hex 00000000 hex 02222220 hex 22999922 @@ -7389,16 +6612,14 @@ tiledata ENT hex 02992222 hex 29999992 hex 22222222 - - hex ffffffff + hex FFFFFFFF + hex F000000F hex 00000000 hex 00000000 + hex 0000000F + hex F0000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 hex 02222220 hex 22999922 @@ -7407,18 +6628,16 @@ tiledata ENT hex 22229920 hex 29999992 hex 22222222 - - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 + hex FFFFFFFF + hex F000000F hex 00000000 hex 00000000 + hex F0000000 + hex 0000000F hex 00000000 hex 00000000 -; Tile ID 196 -; From image coordinates 24, 48 +; Tile ID 196, isSolid: false hex 00000000 hex 22222220 hex 29999922 @@ -7427,16 +6646,14 @@ tiledata ENT hex 22222992 hex 29999922 hex 22222220 - - hex ffffffff + hex FFFFFFFF + hex 0000000F hex 00000000 hex 00000000 + hex FF00000F hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex 0000000F hex 00000000 hex 02222222 hex 22999992 @@ -7445,18 +6662,16 @@ tiledata ENT hex 29922222 hex 22999992 hex 02222222 + hex FFFFFFFF + hex F0000000 + hex 00000000 + hex 00000000 + hex F00000FF + hex 00000000 + hex 00000000 + hex F0000000 - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 197 -; From image coordinates 32, 48 +; Tile ID 197, isSolid: false hex 00000000 hex 00222220 hex 02299920 @@ -7465,16 +6680,14 @@ tiledata ENT hex 29999992 hex 22229922 hex 00022220 - - hex ffffffff + hex FFFFFFFF + hex FF00000F + hex F000000F + hex 0000000F hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex FFF0000F hex 00000000 hex 02222200 hex 02999220 @@ -7483,18 +6696,16 @@ tiledata ENT hex 29999992 hex 22992222 hex 02222000 + hex FFFFFFFF + hex F00000FF + hex F000000F + hex F0000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex F0000FFF - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 198 -; From image coordinates 40, 48 +; Tile ID 198, isSolid: false hex 00000000 hex 22222220 hex 29999920 @@ -7503,16 +6714,14 @@ tiledata ENT hex 02222992 hex 29999922 hex 22222220 - - hex ffffffff + hex FFFFFFFF + hex 0000000F + hex 0000000F + hex 0000000F hex 00000000 + hex F0000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex 0000000F hex 00000000 hex 02222222 hex 02999992 @@ -7521,18 +6730,16 @@ tiledata ENT hex 29922220 hex 22999992 hex 02222222 + hex FFFFFFFF + hex F0000000 + hex F0000000 + hex F0000000 + hex 00000000 + hex 0000000F + hex 00000000 + hex F0000000 - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 199 -; From image coordinates 48, 48 +; Tile ID 199, isSolid: false hex 00000000 hex 02222220 hex 22999920 @@ -7541,16 +6748,14 @@ tiledata ENT hex 29922992 hex 22999922 hex 02222220 - - hex ffffffff + hex FFFFFFFF + hex F000000F + hex 0000000F + hex 0000000F hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex F000000F hex 00000000 hex 02222220 hex 02999922 @@ -7559,18 +6764,16 @@ tiledata ENT hex 29922992 hex 22999922 hex 02222220 + hex FFFFFFFF + hex F000000F + hex F0000000 + hex F0000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex F000000F - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 200 -; From image coordinates 56, 48 +; Tile ID 200, isSolid: false hex 00000000 hex 22222222 hex 29999992 @@ -7579,16 +6782,14 @@ tiledata ENT hex 00299200 hex 00299200 hex 00222200 - - hex ffffffff + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex 0000000F + hex FF0000FF + hex FF0000FF + hex FF0000FF hex 00000000 hex 22222222 hex 29999992 @@ -7597,18 +6798,16 @@ tiledata ENT hex 00299200 hex 00299200 hex 00222200 + hex FFFFFFFF + hex 00000000 + hex 00000000 + hex 00000000 + hex F0000000 + hex FF0000FF + hex FF0000FF + hex FF0000FF - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 201 -; From image coordinates 64, 48 +; Tile ID 201, isSolid: false hex 00000000 hex 02222220 hex 22999922 @@ -7617,16 +6816,14 @@ tiledata ENT hex 29922992 hex 22999922 hex 02222220 - - hex ffffffff + hex FFFFFFFF + hex F000000F hex 00000000 hex 00000000 + hex F000000F hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex F000000F hex 00000000 hex 02222220 hex 22999922 @@ -7635,18 +6832,16 @@ tiledata ENT hex 29922992 hex 22999922 hex 02222220 + hex FFFFFFFF + hex F000000F + hex 00000000 + hex 00000000 + hex F000000F + hex 00000000 + hex 00000000 + hex F000000F - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 202 -; From image coordinates 72, 48 +; Tile ID 202, isSolid: false hex 00000000 hex 02222220 hex 22999922 @@ -7655,16 +6850,14 @@ tiledata ENT hex 02222992 hex 02999922 hex 02222220 - - hex ffffffff + hex FFFFFFFF + hex F000000F hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex F0000000 + hex F0000000 + hex F000000F hex 00000000 hex 02222220 hex 22999922 @@ -7673,18 +6866,16 @@ tiledata ENT hex 29922220 hex 22999920 hex 02222220 + hex FFFFFFFF + hex F000000F + hex 00000000 + hex 00000000 + hex 00000000 + hex 0000000F + hex 0000000F + hex F000000F - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 203 -; From image coordinates 80, 48 +; Tile ID 203, isSolid: false hex 00000000 hex 02200022 hex 02920292 @@ -7693,16 +6884,14 @@ tiledata ENT hex 00292920 hex 02920292 hex 02200022 - - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex FFFFFFFF + hex F00FFF00 + hex F000F000 + hex FF00000F + hex FFF000FF + hex FF00000F + hex F000F000 + hex F00FFF00 hex 00000000 hex 22000220 hex 29202920 @@ -7711,18 +6900,16 @@ tiledata ENT hex 02929200 hex 29202920 hex 22000220 + hex FFFFFFFF + hex 00FFF00F + hex 000F000F + hex F00000FF + hex FF000FFF + hex F00000FF + hex 000F000F + hex 00FFF00F - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 204 -; From image coordinates 88, 48 +; Tile ID 204, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -7731,16 +6918,14 @@ tiledata ENT hex 02999920 hex 02222220 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex F000000F + hex F000000F + hex F000000F + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -7749,18 +6934,16 @@ tiledata ENT hex 02999920 hex 02222220 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex F000000F + hex F000000F + hex F000000F + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex ffffffff - -; Tile ID 205 -; From image coordinates 96, 48 +; Tile ID 205, isSolid: false hex 00022000 hex 00299200 hex 00299200 @@ -7769,16 +6952,14 @@ tiledata ENT hex 00022000 hex 00299200 hex 00022000 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex FFF00FFF + hex FF0000FF + hex FF0000FF + hex FF0000FF + hex FF0000FF + hex FFF00FFF + hex FF0000FF + hex FFF00FFF hex 00022000 hex 00299200 hex 00299200 @@ -7787,18 +6968,16 @@ tiledata ENT hex 00022000 hex 00299200 hex 00022000 + hex FFF00FFF + hex FF0000FF + hex FF0000FF + hex FF0000FF + hex FF0000FF + hex FFF00FFF + hex FF0000FF + hex FFF00FFF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 206 -; From image coordinates 104, 48 +; Tile ID 206, isSolid: false hex 00222200 hex 02992920 hex 29929292 @@ -7807,16 +6986,14 @@ tiledata ENT hex 29229292 hex 02992920 hex 00222200 - + hex FF0000FF + hex F000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex F000000F + hex FF0000FF hex 00222200 hex 02929920 hex 29292992 @@ -7825,18 +7002,16 @@ tiledata ENT hex 29292292 hex 02929920 hex 00222200 + hex FF0000FF + hex F000000F + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex F000000F + hex FF0000FF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 207 -; From image coordinates 112, 48 +; Tile ID 207, isSolid: false hex 00222000 hex 02929200 hex 29929920 @@ -7845,16 +7020,14 @@ tiledata ENT hex 02999200 hex 00222000 hex 00000000 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffffffff - + hex FF000FFF + hex F00000FF + hex 0000000F + hex 0000000F + hex 0000000F + hex F00000FF + hex FF000FFF + hex FFFFFFFF hex 00022200 hex 00292920 hex 02992992 @@ -7863,18 +7036,16 @@ tiledata ENT hex 00299920 hex 00022200 hex 00000000 + hex FFF000FF + hex FF00000F + hex F0000000 + hex F0000000 + hex F0000000 + hex FF00000F + hex FFF000FF + hex FFFFFFFF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffffffff - -; Tile ID 208 -; From image coordinates 120, 48 +; Tile ID 208, isSolid: false hex 00000000 hex 02222220 hex 02999920 @@ -7883,16 +7054,14 @@ tiledata ENT hex 02999920 hex 02222220 hex 00000000 - - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffffffff - + hex FFFFFFFF + hex F000000F + hex F000000F + hex F000000F + hex F000000F + hex F000000F + hex F000000F + hex FFFFFFFF hex 00000000 hex 02222220 hex 02999920 @@ -7901,18 +7070,16 @@ tiledata ENT hex 02999920 hex 02222220 hex 00000000 + hex FFFFFFFF + hex F000000F + hex F000000F + hex F000000F + hex F000000F + hex F000000F + hex F000000F + hex FFFFFFFF - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffffffff - -; Tile ID 209 -; From image coordinates 128, 48 +; Tile ID 209, isSolid: false hex 00022200 hex 00029200 hex 00022200 @@ -7921,16 +7088,14 @@ tiledata ENT hex 00022200 hex 00029200 hex 00022200 - - hex 00000000 - hex 00000000 - hex 00000000 - hex ffffffff - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - + hex FFF000FF + hex FFF000FF + hex FFF000FF + hex FFFFFFFF + hex FFFFFFFF + hex FFF000FF + hex FFF000FF + hex FFF000FF hex 00222000 hex 00292000 hex 00222000 @@ -7939,18 +7104,16 @@ tiledata ENT hex 00222000 hex 00292000 hex 00222000 + hex FF000FFF + hex FF000FFF + hex FF000FFF + hex FFFFFFFF + hex FFFFFFFF + hex FF000FFF + hex FF000FFF + hex FF000FFF - hex 00000000 - hex 00000000 - hex 00000000 - hex ffffffff - hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 210 -; From image coordinates 136, 48 +; Tile ID 210, isSolid: false hex 00022000 hex 00299200 hex 02922920 @@ -7959,16 +7122,14 @@ tiledata ENT hex 29922992 hex 29922992 hex 22222222 - + hex FFF00FFF + hex FF0000FF + hex F000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00022000 hex 00299200 hex 02922920 @@ -7977,18 +7138,16 @@ tiledata ENT hex 29922992 hex 29922992 hex 22222222 - - hex 00000000 - hex 00000000 - hex 00000000 + hex FFF00FFF + hex FF0000FF + hex F000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 -; Tile ID 211 -; From image coordinates 144, 48 +; Tile ID 211, isSolid: false hex 22222200 hex 29999920 hex 29922992 @@ -7997,16 +7156,14 @@ tiledata ENT hex 29922992 hex 29999920 hex 22222200 - + hex 000000FF + hex 0000000F + hex 00000000 + hex 0000000F hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex 0000000F + hex 000000FF hex 00222222 hex 02999992 hex 29922992 @@ -8015,18 +7172,16 @@ tiledata ENT hex 29922992 hex 02999992 hex 00222222 + hex FF000000 + hex F0000000 + hex 00000000 + hex F0000000 + hex 00000000 + hex 00000000 + hex F0000000 + hex FF000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 212 -; From image coordinates 152, 48 +; Tile ID 212, isSolid: false hex 00222200 hex 02999920 hex 29922992 @@ -8035,16 +7190,14 @@ tiledata ENT hex 29922992 hex 02999920 hex 00222200 - + hex FF0000FF + hex F000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex F000000F + hex FF0000FF hex 00222200 hex 02999920 hex 29922992 @@ -8053,18 +7206,16 @@ tiledata ENT hex 29922992 hex 02999920 hex 00222200 + hex FF0000FF + hex F000000F + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex F000000F + hex FF0000FF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 213 -; From image coordinates 160, 48 +; Tile ID 213, isSolid: false hex 22222000 hex 29999200 hex 29922920 @@ -8073,16 +7224,14 @@ tiledata ENT hex 29922920 hex 29999200 hex 22222000 - + hex 00000FFF + hex 000000FF + hex 0000000F hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex 0000000F + hex 000000FF + hex 00000FFF hex 00022222 hex 00299992 hex 02922992 @@ -8091,18 +7240,16 @@ tiledata ENT hex 02922992 hex 00299992 hex 00022222 + hex FFF00000 + hex FF000000 + hex F0000000 + hex 00000000 + hex 00000000 + hex F0000000 + hex FF000000 + hex FFF00000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 214 -; From image coordinates 168, 48 +; Tile ID 214, isSolid: false hex 22222222 hex 29999992 hex 29922222 @@ -8111,16 +7258,14 @@ tiledata ENT hex 29922222 hex 29999992 hex 22222222 - hex 00000000 hex 00000000 hex 00000000 + hex 0000000F + hex 0000000F hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 22222222 hex 29999992 hex 22222992 @@ -8129,18 +7274,16 @@ tiledata ENT hex 22222992 hex 29999992 hex 22222222 - - hex 00000000 - hex 00000000 hex 00000000 hex 00000000 hex 00000000 + hex F0000000 + hex F0000000 hex 00000000 hex 00000000 hex 00000000 -; Tile ID 215 -; From image coordinates 176, 48 +; Tile ID 215, isSolid: false hex 22222222 hex 29999992 hex 29922222 @@ -8149,16 +7292,14 @@ tiledata ENT hex 29920000 hex 29920000 hex 22220000 - hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - hex 0000ffff - hex 0000ffff - + hex 0000000F + hex 0000000F + hex 0000FFFF + hex 0000FFFF + hex 0000FFFF hex 22222222 hex 29999992 hex 22222992 @@ -8167,18 +7308,16 @@ tiledata ENT hex 00002992 hex 00002992 hex 00002222 + hex 00000000 + hex 00000000 + hex 00000000 + hex F0000000 + hex F0000000 + hex FFFF0000 + hex FFFF0000 + hex FFFF0000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - -; Tile ID 216 -; From image coordinates 184, 48 +; Tile ID 216, isSolid: false hex 02222220 hex 22999922 hex 29922992 @@ -8187,16 +7326,14 @@ tiledata ENT hex 29922992 hex 22999992 hex 02222220 - + hex F000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - + hex F000000F hex 02222220 hex 22999922 hex 29922992 @@ -8205,18 +7342,16 @@ tiledata ENT hex 29922992 hex 29999922 hex 02222220 + hex F000000F + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex F000000F - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 217 -; From image coordinates 192, 48 +; Tile ID 217, isSolid: true hex 22222222 hex 29922992 hex 29922992 @@ -8225,7 +7360,6 @@ tiledata ENT hex 29922992 hex 29922992 hex 22222222 - hex 00000000 hex 00000000 hex 00000000 @@ -8234,7 +7368,6 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 22222222 hex 29922992 hex 29922992 @@ -8243,7 +7376,6 @@ tiledata ENT hex 29922992 hex 29922992 hex 22222222 - hex 00000000 hex 00000000 hex 00000000 @@ -8253,8 +7385,7 @@ tiledata ENT hex 00000000 hex 00000000 -; Tile ID 218 -; From image coordinates 200, 48 +; Tile ID 218, isSolid: false hex 02222220 hex 02999920 hex 00299200 @@ -8263,16 +7394,14 @@ tiledata ENT hex 00299200 hex 02999920 hex 02222220 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex F000000F + hex F000000F + hex FF0000FF + hex FF0000FF + hex FF0000FF + hex FF0000FF + hex F000000F + hex F000000F hex 02222220 hex 02999920 hex 00299200 @@ -8281,18 +7410,16 @@ tiledata ENT hex 00299200 hex 02999920 hex 02222220 + hex F000000F + hex F000000F + hex FF0000FF + hex FF0000FF + hex FF0000FF + hex FF0000FF + hex F000000F + hex F000000F - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 219 -; From image coordinates 208, 48 +; Tile ID 219, isSolid: false hex 00222222 hex 00299992 hex 00229922 @@ -8301,16 +7428,14 @@ tiledata ENT hex 29929920 hex 22999220 hex 02222200 - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex FF000000 + hex FF000000 + hex FF000000 + hex FFF0000F + hex 0000000F + hex 0000000F + hex 0000000F + hex F00000FF hex 22222200 hex 29999200 hex 22992200 @@ -8319,18 +7444,16 @@ tiledata ENT hex 02992992 hex 02299922 hex 00222220 + hex 000000FF + hex 000000FF + hex 000000FF + hex F0000FFF + hex F0000000 + hex F0000000 + hex F0000000 + hex FF00000F - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 220 -; From image coordinates 216, 48 +; Tile ID 220, isSolid: false hex 22222222 hex 29922992 hex 29929922 @@ -8339,16 +7462,14 @@ tiledata ENT hex 29929922 hex 29922992 hex 22222222 - hex 00000000 hex 00000000 hex 00000000 + hex 0000000F + hex 0000000F hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 22222222 hex 29922992 hex 22992992 @@ -8357,18 +7478,16 @@ tiledata ENT hex 22992992 hex 29922992 hex 22222222 - - hex 00000000 - hex 00000000 hex 00000000 hex 00000000 hex 00000000 + hex F0000000 + hex F0000000 hex 00000000 hex 00000000 hex 00000000 -; Tile ID 221 -; From image coordinates 224, 48 +; Tile ID 221, isSolid: false hex 22220000 hex 29920000 hex 29920000 @@ -8377,16 +7496,14 @@ tiledata ENT hex 29922222 hex 29999992 hex 22222222 - - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff - hex 0000ffff + hex 0000FFFF + hex 0000FFFF + hex 0000FFFF + hex 0000FFFF + hex 0000FFFF hex 00000000 hex 00000000 hex 00000000 - hex 00002222 hex 00002992 hex 00002992 @@ -8395,18 +7512,16 @@ tiledata ENT hex 22222992 hex 29999992 hex 22222222 - - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 - hex ffff0000 + hex FFFF0000 + hex FFFF0000 + hex FFFF0000 + hex FFFF0000 + hex FFFF0000 hex 00000000 hex 00000000 hex 00000000 -; Tile ID 222 -; From image coordinates 232, 48 +; Tile ID 222, isSolid: false hex 22200022 hex 29920292 hex 29992992 @@ -8415,16 +7530,14 @@ tiledata ENT hex 29922292 hex 29920292 hex 22220222 - + hex 000FFF00 + hex 0000F000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex 0000F000 + hex 0000F000 hex 22000222 hex 29202992 hex 29929992 @@ -8433,18 +7546,16 @@ tiledata ENT hex 29222992 hex 29202992 hex 22202222 + hex 00FFF000 + hex 000F0000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 000F0000 + hex 000F0000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 223 -; From image coordinates 240, 48 +; Tile ID 223, isSolid: false hex 22200222 hex 29920292 hex 29992292 @@ -8453,16 +7564,14 @@ tiledata ENT hex 29922992 hex 29920292 hex 22220022 - + hex 000FF000 + hex 0000F000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex 0000F000 + hex 0000FF00 hex 22200222 hex 29202992 hex 29229992 @@ -8471,18 +7580,16 @@ tiledata ENT hex 29922992 hex 29202992 hex 22002222 + hex 000FF000 + hex 000F0000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 000F0000 + hex 00FF0000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 224 -; From image coordinates 248, 48 +; Tile ID 224, isSolid: false hex 00222200 hex 02999920 hex 29922992 @@ -8491,16 +7598,14 @@ tiledata ENT hex 29922992 hex 02999920 hex 00222200 - + hex FF0000FF + hex F000000F hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex F000000F + hex FF0000FF hex 00222200 hex 02999920 hex 29922992 @@ -8509,18 +7614,16 @@ tiledata ENT hex 29922992 hex 02999920 hex 00222200 + hex FF0000FF + hex F000000F + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex F000000F + hex FF0000FF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 225 -; From image coordinates 0, 56 +; Tile ID 225, isSolid: false hex 22222200 hex 29999920 hex 29922992 @@ -8529,16 +7632,14 @@ tiledata ENT hex 29922200 hex 29920000 hex 22220000 - + hex 000000FF + hex 0000000F hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 0000ffff - hex 0000ffff - + hex 0000000F + hex 000000FF + hex 0000FFFF + hex 0000FFFF hex 00222222 hex 02999992 hex 29922992 @@ -8547,18 +7648,16 @@ tiledata ENT hex 00222992 hex 00002992 hex 00002222 + hex FF000000 + hex F0000000 + hex 00000000 + hex 00000000 + hex F0000000 + hex FF000000 + hex FFFF0000 + hex FFFF0000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex ffff0000 - hex ffff0000 - -; Tile ID 226 -; From image coordinates 8, 56 +; Tile ID 226, isSolid: false hex 00222200 hex 02999920 hex 29922992 @@ -8567,16 +7666,14 @@ tiledata ENT hex 29922920 hex 02999992 hex 00222220 - + hex FF0000FF + hex F000000F hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex 0000000F + hex F0000000 + hex FF00000F hex 00222200 hex 02999920 hex 29922992 @@ -8585,18 +7682,16 @@ tiledata ENT hex 02922992 hex 29999920 hex 02222200 + hex FF0000FF + hex F000000F + hex 00000000 + hex 00000000 + hex 00000000 + hex F0000000 + hex 0000000F + hex F00000FF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 227 -; From image coordinates 16, 56 +; Tile ID 227, isSolid: false hex 22222200 hex 29999920 hex 29922992 @@ -8605,16 +7700,14 @@ tiledata ENT hex 29929920 hex 29922992 hex 22220222 - + hex 000000FF + hex 0000000F hex 00000000 hex 00000000 + hex 0000000F + hex 0000000F hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex 0000F000 hex 00222222 hex 02999992 hex 29922992 @@ -8623,18 +7716,16 @@ tiledata ENT hex 02992992 hex 29922992 hex 22202222 + hex FF000000 + hex F0000000 + hex 00000000 + hex 00000000 + hex F0000000 + hex F0000000 + hex 00000000 + hex 000F0000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 228 -; From image coordinates 24, 56 +; Tile ID 228, isSolid: false hex 00222220 hex 02999920 hex 29922200 @@ -8643,16 +7734,14 @@ tiledata ENT hex 29922992 hex 02999920 hex 00222200 - + hex FF00000F + hex F000000F + hex 000000FF + hex F000000F hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex F000000F + hex FF0000FF hex 02222200 hex 02999920 hex 00222992 @@ -8661,18 +7750,16 @@ tiledata ENT hex 29922992 hex 02999920 hex 00222200 + hex F00000FF + hex F000000F + hex FF000000 + hex F000000F + hex 00000000 + hex 00000000 + hex F000000F + hex FF0000FF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 229 -; From image coordinates 32, 56 +; Tile ID 229, isSolid: false hex 22222222 hex 29999992 hex 22299222 @@ -8681,16 +7768,14 @@ tiledata ENT hex 00299200 hex 00299200 hex 00222200 - hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex FF0000FF + hex FF0000FF + hex FF0000FF + hex FF0000FF + hex FF0000FF hex 22222222 hex 29999992 hex 22299222 @@ -8699,18 +7784,16 @@ tiledata ENT hex 00299200 hex 00299200 hex 00222200 + hex 00000000 + hex 00000000 + hex 00000000 + hex FF0000FF + hex FF0000FF + hex FF0000FF + hex FF0000FF + hex FF0000FF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 230 -; From image coordinates 40, 56 +; Tile ID 230, isSolid: false hex 22200222 hex 29922992 hex 29922992 @@ -8719,16 +7802,14 @@ tiledata ENT hex 29922992 hex 02999920 hex 00222200 - + hex 000FF000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex F000000F + hex FF0000FF hex 22200222 hex 29922992 hex 29922992 @@ -8737,18 +7818,16 @@ tiledata ENT hex 29922992 hex 02999920 hex 00222200 + hex 000FF000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex F000000F + hex FF0000FF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 231 -; From image coordinates 48, 56 +; Tile ID 231, isSolid: false hex 22222222 hex 29922992 hex 29922992 @@ -8757,16 +7836,14 @@ tiledata ENT hex 02999920 hex 02299220 hex 00222200 - hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex F000000F + hex F000000F + hex FF0000FF hex 22222222 hex 29922992 hex 29922992 @@ -8775,18 +7852,16 @@ tiledata ENT hex 02999920 hex 02299220 hex 00222200 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex F000000F + hex F000000F + hex FF0000FF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 232 -; From image coordinates 56, 56 +; Tile ID 232, isSolid: false hex 22222222 hex 29929292 hex 29929292 @@ -8795,7 +7870,6 @@ tiledata ENT hex 29999992 hex 22292922 hex 02222220 - hex 00000000 hex 00000000 hex 00000000 @@ -8803,8 +7877,7 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - + hex F000000F hex 22222222 hex 29292992 hex 29292992 @@ -8813,18 +7886,16 @@ tiledata ENT hex 29999992 hex 22929222 hex 02222220 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex F000000F - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 233 -; From image coordinates 64, 56 +; Tile ID 233, isSolid: false hex 22220222 hex 29922292 hex 29992922 @@ -8833,16 +7904,14 @@ tiledata ENT hex 22929992 hex 29222992 hex 22202222 - + hex 0000F000 hex 00000000 hex 00000000 + hex 0000000F + hex F0000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex 000F0000 hex 22202222 hex 29222992 hex 22929992 @@ -8851,18 +7920,16 @@ tiledata ENT hex 29992922 hex 29922292 hex 22220222 + hex 000F0000 + hex 00000000 + hex 00000000 + hex F0000000 + hex 0000000F + hex 00000000 + hex 00000000 + hex 0000F000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 234 -; From image coordinates 72, 56 +; Tile ID 234, isSolid: false hex 22222222 hex 29922992 hex 29922992 @@ -8871,16 +7938,14 @@ tiledata ENT hex 00299200 hex 00299200 hex 00222200 - hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - + hex F000000F + hex FF0000FF + hex FF0000FF + hex FF0000FF hex 22222222 hex 29922992 hex 29922992 @@ -8889,18 +7954,16 @@ tiledata ENT hex 00299200 hex 00299200 hex 00222200 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex F000000F + hex FF0000FF + hex FF0000FF + hex FF0000FF - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - -; Tile ID 235 -; From image coordinates 80, 56 +; Tile ID 235, isSolid: false hex 22222222 hex 29999992 hex 22229992 @@ -8909,16 +7972,14 @@ tiledata ENT hex 29992222 hex 29999992 hex 22222222 - hex 00000000 hex 00000000 hex 00000000 + hex FF00000F + hex F00000FF hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 22222222 hex 29999992 hex 29992222 @@ -8927,18 +7988,16 @@ tiledata ENT hex 22229992 hex 29999992 hex 22222222 - - hex 00000000 - hex 00000000 hex 00000000 hex 00000000 hex 00000000 + hex F00000FF + hex FF00000F hex 00000000 hex 00000000 hex 00000000 -; Tile ID 236 -; From image coordinates 88, 56 +; Tile ID 236, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -8947,16 +8006,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -8965,18 +8022,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 237 -; From image coordinates 96, 56 +; Tile ID 237, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -8985,16 +8040,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9003,18 +8056,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 238 -; From image coordinates 104, 56 +; Tile ID 238, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9023,16 +8074,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9041,18 +8090,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 239 -; From image coordinates 112, 56 +; Tile ID 239, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9061,16 +8108,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9079,18 +8124,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 240 -; From image coordinates 120, 56 +; Tile ID 240, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9099,16 +8142,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9117,18 +8158,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 241 -; From image coordinates 128, 56 +; Tile ID 241, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9137,16 +8176,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9155,18 +8192,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 242 -; From image coordinates 136, 56 +; Tile ID 242, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9175,16 +8210,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9193,18 +8226,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 243 -; From image coordinates 144, 56 +; Tile ID 243, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9213,16 +8244,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9231,18 +8260,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 244 -; From image coordinates 152, 56 +; Tile ID 244, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9251,16 +8278,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9269,18 +8294,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 245 -; From image coordinates 160, 56 +; Tile ID 245, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9289,16 +8312,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9307,18 +8328,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 246 -; From image coordinates 168, 56 +; Tile ID 246, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9327,16 +8346,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9345,18 +8362,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 247 -; From image coordinates 176, 56 +; Tile ID 247, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9365,16 +8380,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9383,18 +8396,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 248 -; From image coordinates 184, 56 +; Tile ID 248, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9403,16 +8414,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9421,18 +8430,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 249 -; From image coordinates 192, 56 +; Tile ID 249, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9441,16 +8448,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9459,18 +8464,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 250 -; From image coordinates 200, 56 +; Tile ID 250, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9479,16 +8482,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9497,18 +8498,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 251 -; From image coordinates 208, 56 +; Tile ID 251, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9517,16 +8516,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9535,18 +8532,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 252 -; From image coordinates 216, 56 +; Tile ID 252, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9555,16 +8550,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9573,18 +8566,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 253 -; From image coordinates 224, 56 +; Tile ID 253, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9593,16 +8584,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9611,18 +8600,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 254 -; From image coordinates 232, 56 +; Tile ID 254, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9631,16 +8618,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9649,18 +8634,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 255 -; From image coordinates 240, 56 +; Tile ID 255, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9669,16 +8652,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9687,18 +8668,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 256 -; From image coordinates 248, 56 +; Tile ID 256, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9707,16 +8686,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9725,18 +8702,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 257 -; From image coordinates 0, 64 +; Tile ID 257, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9745,16 +8720,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9763,18 +8736,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 258 -; From image coordinates 8, 64 +; Tile ID 258, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9783,16 +8754,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9801,18 +8770,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 259 -; From image coordinates 16, 64 +; Tile ID 259, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9821,16 +8788,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9839,18 +8804,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 260 -; From image coordinates 24, 64 +; Tile ID 260, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9859,16 +8822,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9877,18 +8838,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 261 -; From image coordinates 32, 64 +; Tile ID 261, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9897,16 +8856,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9915,18 +8872,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 262 -; From image coordinates 40, 64 +; Tile ID 262, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9935,16 +8890,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9953,18 +8906,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 263 -; From image coordinates 48, 64 +; Tile ID 263, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -9973,16 +8924,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -9991,18 +8940,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 264 -; From image coordinates 56, 64 +; Tile ID 264, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10011,16 +8958,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10029,18 +8974,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 265 -; From image coordinates 64, 64 +; Tile ID 265, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10049,16 +8992,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10067,18 +9008,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 266 -; From image coordinates 72, 64 +; Tile ID 266, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10087,16 +9026,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10105,18 +9042,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 267 -; From image coordinates 80, 64 +; Tile ID 267, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10125,16 +9060,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10143,18 +9076,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 268 -; From image coordinates 88, 64 +; Tile ID 268, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10163,16 +9094,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10181,18 +9110,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 269 -; From image coordinates 96, 64 +; Tile ID 269, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10201,16 +9128,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10219,18 +9144,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 270 -; From image coordinates 104, 64 +; Tile ID 270, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10239,16 +9162,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10257,18 +9178,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 271 -; From image coordinates 112, 64 +; Tile ID 271, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10277,16 +9196,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10295,18 +9212,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 272 -; From image coordinates 120, 64 +; Tile ID 272, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10315,16 +9230,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10333,18 +9246,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 273 -; From image coordinates 128, 64 +; Tile ID 273, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10353,16 +9264,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10371,18 +9280,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 274 -; From image coordinates 136, 64 +; Tile ID 274, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10391,16 +9298,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10409,18 +9314,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 275 -; From image coordinates 144, 64 +; Tile ID 275, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10429,16 +9332,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10447,18 +9348,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 276 -; From image coordinates 152, 64 +; Tile ID 276, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10467,16 +9366,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10485,18 +9382,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 277 -; From image coordinates 160, 64 +; Tile ID 277, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10505,16 +9400,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10523,18 +9416,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 278 -; From image coordinates 168, 64 +; Tile ID 278, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10543,16 +9434,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10561,18 +9450,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 279 -; From image coordinates 176, 64 +; Tile ID 279, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10581,16 +9468,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10599,18 +9484,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 280 -; From image coordinates 184, 64 +; Tile ID 280, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10619,16 +9502,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10637,18 +9518,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 281 -; From image coordinates 192, 64 +; Tile ID 281, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10657,16 +9536,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10675,18 +9552,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 282 -; From image coordinates 200, 64 +; Tile ID 282, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10695,16 +9570,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10713,18 +9586,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 283 -; From image coordinates 208, 64 +; Tile ID 283, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10733,16 +9604,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10751,18 +9620,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 284 -; From image coordinates 216, 64 +; Tile ID 284, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10771,16 +9638,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10789,18 +9654,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 285 -; From image coordinates 224, 64 +; Tile ID 285, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10809,16 +9672,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10827,18 +9688,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 286 -; From image coordinates 232, 64 +; Tile ID 286, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10847,16 +9706,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10865,18 +9722,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 287 -; From image coordinates 240, 64 +; Tile ID 287, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10885,16 +9740,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10903,18 +9756,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 288 -; From image coordinates 248, 64 +; Tile ID 288, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10923,16 +9774,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10941,18 +9790,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 289 -; From image coordinates 0, 72 +; Tile ID 289, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10961,16 +9808,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -10979,18 +9824,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 290 -; From image coordinates 8, 72 +; Tile ID 290, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -10999,16 +9842,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11017,18 +9858,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 291 -; From image coordinates 16, 72 +; Tile ID 291, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11037,16 +9876,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11055,18 +9892,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 292 -; From image coordinates 24, 72 +; Tile ID 292, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11075,16 +9910,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11093,18 +9926,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 293 -; From image coordinates 32, 72 +; Tile ID 293, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11113,16 +9944,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11131,18 +9960,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 294 -; From image coordinates 40, 72 +; Tile ID 294, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11151,16 +9978,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11169,18 +9994,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 295 -; From image coordinates 48, 72 +; Tile ID 295, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11189,16 +10012,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11207,18 +10028,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 296 -; From image coordinates 56, 72 +; Tile ID 296, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11227,16 +10046,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11245,18 +10062,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 297 -; From image coordinates 64, 72 +; Tile ID 297, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11265,16 +10080,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11283,18 +10096,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 298 -; From image coordinates 72, 72 +; Tile ID 298, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11303,16 +10114,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11321,18 +10130,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 299 -; From image coordinates 80, 72 +; Tile ID 299, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11341,16 +10148,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11359,18 +10164,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 300 -; From image coordinates 88, 72 +; Tile ID 300, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11379,16 +10182,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11397,18 +10198,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 301 -; From image coordinates 96, 72 +; Tile ID 301, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11417,16 +10216,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11435,18 +10232,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 302 -; From image coordinates 104, 72 +; Tile ID 302, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11455,16 +10250,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11473,18 +10266,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 303 -; From image coordinates 112, 72 +; Tile ID 303, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11493,16 +10284,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11511,18 +10300,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 304 -; From image coordinates 120, 72 +; Tile ID 304, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11531,16 +10318,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11549,18 +10334,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 305 -; From image coordinates 128, 72 +; Tile ID 305, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11569,16 +10352,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11587,18 +10368,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 306 -; From image coordinates 136, 72 +; Tile ID 306, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11607,16 +10386,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11625,18 +10402,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 307 -; From image coordinates 144, 72 +; Tile ID 307, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11645,16 +10420,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11663,18 +10436,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 308 -; From image coordinates 152, 72 +; Tile ID 308, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11683,16 +10454,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11701,18 +10470,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 309 -; From image coordinates 160, 72 +; Tile ID 309, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11721,16 +10488,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11739,18 +10504,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 310 -; From image coordinates 168, 72 +; Tile ID 310, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11759,16 +10522,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11777,18 +10538,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 311 -; From image coordinates 176, 72 +; Tile ID 311, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11797,16 +10556,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11815,18 +10572,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 312 -; From image coordinates 184, 72 +; Tile ID 312, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11835,16 +10590,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11853,18 +10606,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 313 -; From image coordinates 192, 72 +; Tile ID 313, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11873,16 +10624,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11891,18 +10640,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 314 -; From image coordinates 200, 72 +; Tile ID 314, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11911,16 +10658,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11929,18 +10674,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 315 -; From image coordinates 208, 72 +; Tile ID 315, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11949,16 +10692,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -11967,18 +10708,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 316 -; From image coordinates 216, 72 +; Tile ID 316, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -11987,16 +10726,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12005,18 +10742,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 317 -; From image coordinates 224, 72 +; Tile ID 317, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12025,16 +10760,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12043,18 +10776,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 318 -; From image coordinates 232, 72 +; Tile ID 318, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12063,16 +10794,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12081,18 +10810,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 319 -; From image coordinates 240, 72 +; Tile ID 319, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12101,16 +10828,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12119,18 +10844,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 320 -; From image coordinates 248, 72 +; Tile ID 320, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12139,16 +10862,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12157,18 +10878,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 321 -; From image coordinates 0, 80 +; Tile ID 321, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12177,16 +10896,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12195,18 +10912,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 322 -; From image coordinates 8, 80 +; Tile ID 322, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12215,16 +10930,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12233,18 +10946,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 323 -; From image coordinates 16, 80 +; Tile ID 323, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12253,16 +10964,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12271,18 +10980,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 324 -; From image coordinates 24, 80 +; Tile ID 324, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12291,16 +10998,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12309,18 +11014,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 325 -; From image coordinates 32, 80 +; Tile ID 325, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12329,16 +11032,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12347,18 +11048,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 326 -; From image coordinates 40, 80 +; Tile ID 326, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12367,16 +11066,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12385,18 +11082,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 327 -; From image coordinates 48, 80 +; Tile ID 327, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12405,16 +11100,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12423,18 +11116,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 328 -; From image coordinates 56, 80 +; Tile ID 328, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12443,16 +11134,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12461,18 +11150,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 329 -; From image coordinates 64, 80 +; Tile ID 329, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12481,16 +11168,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12499,18 +11184,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 330 -; From image coordinates 72, 80 +; Tile ID 330, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12519,16 +11202,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12537,18 +11218,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 331 -; From image coordinates 80, 80 +; Tile ID 331, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12557,16 +11236,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12575,18 +11252,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 332 -; From image coordinates 88, 80 +; Tile ID 332, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12595,16 +11270,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12613,18 +11286,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 333 -; From image coordinates 96, 80 +; Tile ID 333, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12633,16 +11304,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12651,18 +11320,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 334 -; From image coordinates 104, 80 +; Tile ID 334, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12671,16 +11338,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12689,18 +11354,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 335 -; From image coordinates 112, 80 +; Tile ID 335, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12709,16 +11372,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12727,18 +11388,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 336 -; From image coordinates 120, 80 +; Tile ID 336, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12747,16 +11406,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12765,18 +11422,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 337 -; From image coordinates 128, 80 +; Tile ID 337, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12785,16 +11440,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12803,18 +11456,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 338 -; From image coordinates 136, 80 +; Tile ID 338, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12823,16 +11474,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12841,18 +11490,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 339 -; From image coordinates 144, 80 +; Tile ID 339, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12861,16 +11508,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12879,18 +11524,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 340 -; From image coordinates 152, 80 +; Tile ID 340, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12899,16 +11542,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12917,18 +11558,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 341 -; From image coordinates 160, 80 +; Tile ID 341, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12937,16 +11576,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12955,18 +11592,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 342 -; From image coordinates 168, 80 +; Tile ID 342, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -12975,16 +11610,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -12993,18 +11626,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 343 -; From image coordinates 176, 80 +; Tile ID 343, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -13013,16 +11644,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -13031,18 +11660,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 344 -; From image coordinates 184, 80 +; Tile ID 344, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -13051,16 +11678,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -13069,18 +11694,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 345 -; From image coordinates 192, 80 +; Tile ID 345, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -13089,16 +11712,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -13107,18 +11728,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 346 -; From image coordinates 200, 80 +; Tile ID 346, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -13127,16 +11746,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -13145,18 +11762,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 347 -; From image coordinates 208, 80 +; Tile ID 347, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -13165,16 +11780,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -13183,18 +11796,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 348 -; From image coordinates 216, 80 +; Tile ID 348, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -13203,16 +11814,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -13221,18 +11830,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 349 -; From image coordinates 224, 80 +; Tile ID 349, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -13241,16 +11848,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -13259,18 +11864,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 350 -; From image coordinates 232, 80 +; Tile ID 350, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -13279,16 +11882,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -13297,18 +11898,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 351 -; From image coordinates 240, 80 +; Tile ID 351, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -13317,16 +11916,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -13335,18 +11932,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 352 -; From image coordinates 248, 80 +; Tile ID 352, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -13355,16 +11950,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -13373,18 +11966,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 353 -; From image coordinates 0, 88 +; Tile ID 353, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -13393,16 +11984,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -13411,18 +12000,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 354 -; From image coordinates 8, 88 +; Tile ID 354, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -13431,16 +12018,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -13449,18 +12034,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 355 -; From image coordinates 16, 88 +; Tile ID 355, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -13469,16 +12052,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -13487,18 +12068,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 356 -; From image coordinates 24, 88 +; Tile ID 356, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -13507,16 +12086,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -13525,18 +12102,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 357 -; From image coordinates 32, 88 +; Tile ID 357, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -13545,16 +12120,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -13563,18 +12136,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 358 -; From image coordinates 40, 88 +; Tile ID 358, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -13583,16 +12154,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -13601,18 +12170,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 359 -; From image coordinates 48, 88 +; Tile ID 359, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -13621,16 +12188,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -13639,18 +12204,16 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 360 -; From image coordinates 56, 88 +; Tile ID 360, isSolid: false hex 00000000 hex 00000000 hex 00000000 @@ -13659,16 +12222,14 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF hex 00000000 hex 00000000 hex 00000000 @@ -13677,13 +12238,12 @@ tiledata ENT hex 00000000 hex 00000000 hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF + hex FFFFFFFF diff --git a/demos/kfest-2022/demo-4/package.json b/demos/kfest-2022/demo-4/package.json index 782906c..c9a2409 100644 --- a/demos/kfest-2022/demo-4/package.json +++ b/demos/kfest-2022/demo-4/package.json @@ -14,17 +14,17 @@ }, "scripts": { "test": "npm run build && npm run build:image && npm run gsport", - "gsport": "%npm_package_config_gsport%", - "debug": "%npm_package_config_crossrunner% GTEDemo4 -Source GTEDemo4_S02_MAINSEG_Output.txt -Debug -CompatibilityLayer", + "gsport": "cross-var $npm_package_config_gsport", + "debug": "cross-var $npm_package_config_crossrunner GTEDemo4 -Source GTEDemo4_S02_MAINSEG_Output.txt -Debug -CompatibilityLayer", "build:all": "npm run build:tiles && npm run build:map && npm run build:tool && npm run build:sys16 && npm run build:image", - "build:map": "node %npm_package_config_tiled2iigs% ./assets/tiled/yoshi-1.json --force-masked --no-gen-tiles --output-dir ./gen", - "build:tiles": "node %npm_package_config_png2iigs% ./assets/tilesets/smw-256x128-4bpp.png --max-tiles 360 --as-tile-data --verbose --transparent-color FF00FF --background-color 216058 > ./gen/App.TileSet.s", - "build:tiles:blocky": "node %npm_package_config_png2iigs% ./assets/tilesets/smw-256x128-4bpp.png --max-tiles 360 --as-tile-data --verbose --force-word-alignment --transparent-color FF00FF --background-color 216058 > ./gen/App.TileSet.s", - "build:sys16": "%npm_package_config_merlin32% -V %npm_package_config_macros% App.s", + "build:map": "cross-var node $npm_package_config_tiled2iigs ./assets/tiled/yoshi-1.json --force-masked --no-gen-tiles --output-dir ./gen", + "build:tiles": "cross-var node $npm_package_config_png2iigs ./assets/tilesets/smw-256x128-4bpp.png --max-tiles 360 --as-tile-data --var-name tiledata --verbose --transparent-color FF00FF --background-color 216058 > ./gen/App.TileSet.s", + "build:tiles:blocky": "cross-var node $npm_package_config_png2iigs ./assets/tilesets/smw-256x128-4bpp.png --max-tiles 360 --as-tile-data --var-name tiledata --verbose --force-word-alignment --transparent-color FF00FF --background-color 216058 > ./gen/App.TileSet.s", + "build:sys16": "cross-var $npm_package_config_merlin32 -V $npm_package_config_macros App.s", "build": "npm run build:tool && npm run build:sys16", - "build:tool": "%npm_package_config_merlin32% -V %npm_package_config_macros% ../../../src/Master.s", - "build:image": "build-image.bat %npm_package_config_cadius%", - "build:background": "node %npm_package_config_png2iigs% ./assets/tilesets/bg1.png ./gen/bg1.bin --force-color-match --palette FF00FF,C14F4A,020202,00E100,C89858,216058,DCE9EE,008000,F80080,F5D56C,20308F,A0CDCC,4080A0,70B0D0" + "build:tool": "cross-var $npm_package_config_merlin32 -V $npm_package_config_macros ../../../src/Master.s", + "build:image": "cross-var build-image.bat $npm_package_config_cadius", + "build:background": "cross-var node $npm_package_config_png2iigs ./assets/tilesets/bg1.png ./gen/bg1.bin --force-color-match --palette FF00FF,C14F4A,020202,00E100,C89858,216058,DCE9EE,008000,F80080,F5D56C,20308F,A0CDCC,4080A0,70B0D0" }, "repository": { "type": "git", @@ -37,6 +37,7 @@ }, "homepage": "https://github.com/lscharen/iigs-game-engine#readme", "devDependencies": { + "cross-var": "^1.1.0", "pngjs": "^6.0.0", "string-builder": "^0.1.8", "watch": "latest", diff --git a/demos/kfest-2022/demo-9/App.Main.s b/demos/kfest-2022/demo-9/App.Main.s index fd5231c..b9e3d0f 100644 --- a/demos/kfest-2022/demo-9/App.Main.s +++ b/demos/kfest-2022/demo-9/App.Main.s @@ -60,7 +60,7 @@ SpriteCount equ 54 _MTStartUp ; GTE requires the miscellaneous toolset to be running - lda #ENGINE_MODE_USER_TOOL+ENGINE_MODE_TWO_LAYER+ENGINE_MODE_DYN_TILES + lda #ENGINE_MODE_USER_TOOL+ENGINE_MODE_TWO_LAYER ; +ENGINE_MODE_DYN_TILES jsr GTEStartUp ; Load and install the GTE User Tool ; Initialize local variables @@ -75,12 +75,14 @@ SpriteCount equ 54 ; Initialize the graphics screen playfield - pea #320 + pea #160 pea #200 _GTESetScreenMode ; Load a tileset + pea #0 + pea #511 pea #^tiledata pea #tiledata _GTELoadTileSet @@ -141,6 +143,8 @@ SpriteCount equ 54 ; Create the sprites +HERO_SIZE equ {SPRITE_16X16} +HERO_FLAGS equ HERO_SIZE ; no extra H/V bits for now HERO_FRAME_1 equ {SPRITE_16X16+1} HERO_VBUFF_1 equ VBUFF_SPRITE_START+0*VBUFF_SPRITE_STEP HERO_FRAME_2 equ {SPRITE_16X16+7} @@ -168,31 +172,23 @@ HERO_SLOT_2 equ 2 pea HERO_VBUFF_4 _GTECreateSpriteStamp - pea HERO_FRAME_1 + pea HERO_SLOT_1 ; Put the player in slot 1 + pea HERO_FLAGS + pea HERO_VBUFF_1 pei PlayerX pei PlayerY - pea HERO_SLOT_1 ; Put the player in slot 1 _GTEAddSprite - pea HERO_SLOT_1 - pea $0000 - pea HERO_VBUFF_1 ; and use this stamp - _GTEUpdateSprite - - pea HERO_FRAME_2 + pea HERO_SLOT_2 + pea HERO_FLAGS + pea HERO_VBUFF_2 pei PlayerX lda PlayerY clc adc #16 pha - pea HERO_SLOT_2 ; Put the player in slot 1 _GTEAddSprite - pea HERO_SLOT_2 - pea $0000 - pea HERO_VBUFF_3 ; and use this stamp - _GTEUpdateSprite - EvtLoop pha _GTEReadControl diff --git a/demos/kfest-2022/demo-9/package.json b/demos/kfest-2022/demo-9/package.json index 55a5770..e918ea7 100644 --- a/demos/kfest-2022/demo-9/package.json +++ b/demos/kfest-2022/demo-9/package.json @@ -14,17 +14,17 @@ }, "scripts": { "test": "npm run build && npm run build:image && npm run gsport", - "gsport": "%npm_package_config_gsport%", - "debug": "%npm_package_config_crossrunner% GTEDemo4 -Source GTEDemo4_S02_MAINSEG_Output.txt -Debug -CompatibilityLayer", + "gsport": "cross-var $npm_package_config_gsport", + "debug": "cross-var $npm_package_config_crossrunner GTEDemo4 -Source GTEDemo4_S02_MAINSEG_Output.txt -Debug -CompatibilityLayer", "build:all": "npm run build:tiles && npm run build:map && npm run build:tool && npm run build:sys16 && npm run build:image", - "build:map": "node %npm_package_config_tiled2iigs% ./assets/tiled/yoshi-1.json --force-masked --no-gen-tiles --output-dir ./gen", - "build:tiles": "node %npm_package_config_png2iigs% ./assets/tilesets/smw-256x128-4bpp.png --max-tiles 360 --as-tile-data --verbose --transparent-color FF00FF --background-color 216058 > ./gen/App.TileSet.s", - "build:tiles:blocky": "node %npm_package_config_png2iigs% ./assets/tilesets/smw-256x128-4bpp.png --max-tiles 360 --as-tile-data --verbose --force-word-alignment --transparent-color FF00FF --background-color 216058 > ./gen/App.TileSet.s", - "build:sys16": "%npm_package_config_merlin32% -V %npm_package_config_macros% App.s", + "build:map": "cross-var node $npm_package_config_tiled2iigs ./assets/tiled/yoshi-1.json --force-masked --no-gen-tiles --output-dir ./gen", + "build:tiles": "cross-var node $npm_package_config_png2iigs ./assets/tilesets/smw-256x128-4bpp.png --max-tiles 360 --as-tile-data --verbose --transparent-color FF00FF --background-color 216058 > ./gen/App.TileSet.s", + "build:tiles:blocky": "cross-var node $npm_package_config_png2iigs ./assets/tilesets/smw-256x128-4bpp.png --max-tiles 360 --as-tile-data --verbose --force-word-alignment --transparent-color FF00FF --background-color 216058 > ./gen/App.TileSet.s", + "build:sys16": "cross-var $npm_package_config_merlin32 -V $npm_package_config_macros App.s", "build": "npm run build:tool && npm run build:sys16", - "build:tool": "%npm_package_config_merlin32% -V %npm_package_config_macros% ../../../src/Master.s", - "build:image": "build-image.bat %npm_package_config_cadius%", - "build:background": "node %npm_package_config_png2iigs% ./assets/tilesets/bg1.png ./gen/bg1.bin --force-color-match --palette FF00FF,C14F4A,020202,00E100,C89858,216058,DCE9EE,008000,F80080,F5D56C,20308F,A0CDCC,4080A0,70B0D0" + "build:tool": "cross-var $npm_package_config_merlin32 -V $npm_package_config_macros ../../../src/Master.s", + "build:image": "cross-var build-image.bat $npm_package_config_cadius", + "build:background": "cross-var node $npm_package_config_png2iigs ./assets/tilesets/bg1.png ./gen/bg1.bin --force-color-match --palette FF00FF,C14F4A,020202,00E100,C89858,216058,DCE9EE,008000,F80080,F5D56C,20308F,A0CDCC,4080A0,70B0D0" }, "repository": { "type": "git", @@ -37,6 +37,7 @@ }, "homepage": "https://github.com/lscharen/iigs-game-engine#readme", "devDependencies": { + "cross-var": "^1.1.0", "pngjs": "^6.0.0", "string-builder": "^0.1.8", "watch": "latest", diff --git a/macros/CORE.MACS.S b/macros/CORE.MACS.S index e939015..82c0a3c 100644 --- a/macros/CORE.MACS.S +++ b/macros/CORE.MACS.S @@ -166,216 +166,3 @@ ScriptStep MAC dw ]1,]2,]3,]4 FIN <<< - -; A specialized CopyMaskedWord macro that draws a tile from a direct page workspace. Used -; to render fringe tiles and sprite tiles when BG1 is active. If there is no second background, -; then one should use the optimized functions which assumes a PEA opcode and only -; needs to copy data words -; -; ]1 : tiledata direct page address , the tilemask direct page address is tiledata + 32 -; ]2 : code field offset -CopyMaskedWordD MAC - lda ]1+32 ; load the mask value - bne mixed ; a non-zero value may be mixed - -; This is a solid word - lda #$00F4 ; PEA instruction - sta: ]2,y - lda ]1 ; load the tile data - sta: ]2+1,y ; PEA operand - bra next - -mixed cmp #$FFFF ; All 1's in the mask is fully transparent - beq transparent - -; This is the slowest path because there is a *lot* of work to do. So much that it's -; worth it to change up the environment to optimize things a bit more. -; -; Need to fill in the first 10 bytes of the JMP handler with the following code sequence -; -; lda (00),y -; and #MASK -; ora #DATA - - lda #$004C ; JMP instruction - sta: ]2,y - - ldx _X_REG ; Get the addressing offset - ldal JTableOffset,x ; Get the address offset and add to the base address - adc _BASE_ADDR ; of the current code field line - adc #{]2&$F000} ; adjust for the current row offset - sta: ]2+1,y - - tay ; This becomes the new address that we use to patch in - txa ; Get the offset and render a LDA (dp),y instruction - - sep #$20 - sta: $0001,y ; LDA (00),y operand - lda #$B1 - sta: $0000,y ; LDA (00),y opcode - lda #$29 - sta: $0002,y ; AND #$0000 opcode - lda #$09 - sta: $0005,y ; ORA #$0000 opcode - rep #$20 - - lda ]1+32 ; insert the tile mask and data into the exception - sta: $0003,y ; handler. - lda ]1 - sta: $0006,y - - lda #$0D80 ; branch to the prologue (BRA *+15) - sta: $0008,y - - ldy _Y_REG ; restore original y-register value and move on - bra next - -; This is a transparent word, so just show the second background layer -transparent - lda #$00B1 ; LDA (dp),y instruction - sta: ]2,y - lda _X_REG ; X is the logical tile offset (0, 2, 4, ... 82) left-to-right - ora #$4800 ; put a PHA after the offset - sta: ]2+1,y -next - eom - -; Macros to use in the Masked Tile renderer -; -; ]1 : tiledata offset -; ]2 : tilemask offset -; ]3 : code field offset -CopyMaskedWord MAC - ldal ]2,x ; load the mask value - bne mixed ; a non-zero value may be mixed - -; This is a solid word - lda #$00F4 ; PEA instruction - sta: ]3,y - ldal ]1,x ; load the tile data - sta: ]3+1,y ; PEA operand - bra next - -mixed cmp #$FFFF ; All 1's in the mask is fully transparent - beq transparent - -; This is the slowest path because there is a *lot* of work to do. So much that it's -; worth it to change up the environment to optimize things a bit more. -; -; Need to fill in the first 8 bytes of the JMP handler with the following code sequence -; -; lda (00),y -; and #MASK -; ora #DATA - - lda #$004C ; JMP instruction - sta: ]3,y - - ldx _X_REG ; Get the addressing offset - ldal JTableOffset,x ; Get the address offset and add to the base address - ora _BASE_ADDR ; of the current code field row (2 rows per bank) $0000 or $8000 - ora #{]3&$7000} ; adjust for the current line offset within the row - sta: ]3+1,y - - tay ; This becomes the new address that we use to patch in - txa ; Get the offset and render a LDA (dp),y instruction - - sep #$20 - sta: $0001,y ; LDA (00),y operand - lda #$B1 - sta: $0000,y ; LDA (00),y opcode - lda #$29 - sta: $0002,y ; AND #$0000 opcode - lda #$09 - sta: $0005,y ; ORA #$0000 opcode - rep #$20 - - ldx _T_PTR ; restore the original x-register value - ldal ]2,x ; insert the tile mask and data into the exception - sta: $0003,y ; handler. - ldal ]1,x - sta: $0006,y - -; Copy the top 9 bytes down. We have 23 bytes of space and are only using 8. Since 9 + 8 = 17 < 23, we -; can save 3 cycles per word by eliminating the BRA instruction - -; lda #$0D80 ; branch to the prologue (BRA *+15) -; sta: $0008,y - - lda: $0017,y - sta: $0008,y - lda: $0019,y - sta: $000A,y - lda: $001B,y - sta: $000C,y - lda: $001D,y - sta: $000E,y - lda: $001E,y - sta: $000F,y - - ldy _Y_REG ; restore original y-register value and move on - bra next - -; This is a transparent word, so just show the second background layer -transparent - lda #$00B1 ; LDA (dp),y instruction - sta: ]3,y - lda _X_REG ; X is the logical tile offset (0, 2, 4, ... 82) left-to-right - ora #$4800 ; put a PHA after the offset - sta: ]3+1,y -next - eom - -; Large code blocks that can be used in sprite blitters -; ]1: line number -OneSpriteToCodeField mac - lda blttmp+{]1*4} - andl spritemask+{]1*SPRITE_PLANE_SPAN},x - oral spritedata+{]1*SPRITE_PLANE_SPAN},x - sta: $0004+{]1*$1000},y - - lda blttmp+{]1*4}+2 - andl spritemask+{]1*SPRITE_PLANE_SPAN}+2,x - oral spritedata+{]1*SPRITE_PLANE_SPAN}+2,x - sta: $0001+{]1*$1000},y - eom - -TwoSpritesToCodeField mac - ldy #{]1*SPRITE_PLANE_SPAN} - lda blttmp+{]1*4} - andl [spritemask_1],y - oral [spritedata_1],y - andl [spritemask_0],y - oral [spritedata_0],y - sta: $0004+{]1*$1000},x - - ldy #{]1*SPRITE_PLANE_SPAN}+2 - lda blttmp+{]1*4}+2 - andl [spritemask_1],y - oral [spritedata_1],y - andl [spritemask_0],y - oral [spritedata_0],y - sta: $0001+{]1*$1000},x - eom - -ThreeSpritesToCodeField mac - ldy #{]1*SPRITE_PLANE_SPAN} - lda blttmp+{]1*4} - andl [spritemask_2],y - oral [spritedata_2],y - andl [spritemask_1],y - oral [spritedata_1],y - andl [spritemask_0],y - oral [spritedata_0],y - sta: $0004+{]1*$1000},x - - ldy #{]1*SPRITE_PLANE_SPAN}+2 - lda blttmp+{]1*4}+2 - andl [spritemask_2],y - oral [spritedata_2],y - andl [spritemask_1],y - oral [spritedata_1],y - andl [spritemask_0],y - oral [spritedata_0],y - sta: $0001+{]1*$1000},x - eom diff --git a/src/Render.s b/src/Render.s index 0b1ad86..d5ba62e 100644 --- a/src/Render.s +++ b/src/Render.s @@ -58,8 +58,8 @@ _Render jsr _UpdateBG0TileMap ; and the tile maps. These subroutines build up a list of tiles ; jsr _UpdateBG1TileMap ; that need to be updated in the code field - jsr _ApplyTiles ; This function actually draws the new tiles into the code field + jsr _ApplyTiles ; This function actually draws the new tiles into the code field jsr _ApplyBG0XPos ; Patch the code field instructions with exit BRA opcode lda #RENDER_BG1_ROTATION diff --git a/src/Tiles.s b/src/Tiles.s index 6acf6f2..2a3a9fc 100644 --- a/src/Tiles.s +++ b/src/Tiles.s @@ -268,7 +268,7 @@ _SetNormalTileProcs brl :pickDynProc :pickTwoLyrProc ldy #TwoLyrProcs - pla ; pull of the proc index + pla ; pull off the proc index jmp _SetTileProcs ; Specialized check for when the engine is in "Fast" mode. If is a simple decision tree based on whether diff --git a/src/blitter/Template.s b/src/blitter/Template.s index 2c1c335..badf5d2 100644 --- a/src/blitter/Template.s +++ b/src/blitter/Template.s @@ -25,6 +25,12 @@ ENABLE_INT equ enable_int-base ; offset that re-enable inte LINES_PER_BANK equ 16 SNIPPET_BASE equ snippets-base +; offsets from each snippet base address for the different entry points + +SNIPPET_ENTRY_1 equ 0 ; two layer + dynamic tile + sprite +SNIPPET_ENTRY_2 equ 4 ; (two layer | dynamic tile) + sprite +SNIPPET_ENTRY_3 equ 18 ; two layer + dynamic tile (no sprite) + ; Locations that need the page offset added PagePatches da {long_0-base+2} da {long_1-base+2} @@ -43,9 +49,9 @@ PagePatches da {long_0-base+2} ; da {jmp_rtn_2-base+2} ]index equ 0 - lup 82 ; All the snippet addresses. The two JMP - da {snippets-base+{]index*32}+31} ; instructions are at the end of each of - da {snippets-base+{]index*32}+28} ; the 32-byte buffers + lup 82 ; Patch anything that needs updating within the snippets + da {snippets-base+{]index*32}+17} + da {snippets-base+{]index*32}+28} ]index equ ]index+1 --^ PagePatchNum equ *-PagePatches @@ -232,88 +238,93 @@ epilogue_1 tsc ; its passed state, because having the carry bit clear prevents evaluation of ; the V bit. ; -; The snippet code is fixed to allow fast updates and the entry point is chosen based on the -; EngineMode during initializations +; Version 2: In order to improve performance, especially for two-layer tiles + sprites, the +; snippet code was revised to have a fixed structure so that the constant DATA and +; MASK values always exist in the same location, regarless of the tile type. The +; tradeoff is that there is a different entry point into the snippet based on the +; tile type, but that is significantly cheaper to lookup and patch into the code +; field JMP instruction than it is to rebuild 20+ bytes of code each time. ; -; _snippet -; lda (00),y ; Entry point for mixed dyn & bg1. Set opcode below. -; and 80,x -; lda (00),y ; Entry point for BG1 or Dyn. Change opcode. -; and #MASK -; ora #DATA -; _2 bcs _alt +; There are different snippet templates + offset tables based on the EngineMode +; +; EngineMode +; +; ENGINE_MODE_TWO_LAYER NO +; ENGINE_MODE_DYN_TILES NO +; +; Snippet Template +; None. +; +; ENGINE_MODE_TWO_LAYER YES +; ENGINE_MODE_DYN_TILES NO +; +; Snippet Template +; +; ds 4 +; lda (00),y <-- Single Entry Point +; and #MASK <-- Mask is always at byte 8 +; ora #DATA <-- Data is always at byte 11 +; bcs _alt ; pha ; jmp NEXT ; _alt jmp RTN ; +; ENGINE_MODE_TWO_LAYER NO +; ENGINE_MODE_DYN_TILES YES +; +; Snippet Template +; +; ds 4 +; lda 00,x <-- Single Entry Point +; and #MASK +; ora #DATA +; bcs _alt +; pha +; jmp NEXT +; _alt jmp RTN +; +; ENGINE_MODE_TWO_LAYER YES +; ENGINE_MODE_DYN_TILES YES +; +; Snippet Template +; +; lda (00),y <-- Entry Point 1 +; and $80,x +; ora $00,x <-- Entry Point 2 (Change this word to "lda (00),y" or "lda 00,x", or "ora 00,x" depending on combination) +; and #MASK +; ora #DATA +; bcs _alt +; _16bit pha +; jmp NEXT +; lda (00),y <--- Entry Point 3 (sneak this in here to avoid extra branch) +; and $80,x +; ora $00,x +; bcc _16bit +; _alt jmp RTN (29 bytes) +; +; Note that the code that's assembled in these snippets is just a template. Every routine that utilizes +; an exception handler *MUST* patch up the routines. There are different routines based on the Engine Mode. +; +; The LDA (00),y opcodes have a fixed operand, but the dynamic tile instructions are determined by the +; dynamic tile id and must be set each time. -; Snippet Samples: -; -; Standard Two-level Mix (23 bytes) -; -; Optimal = 18 cycles (LDA/AND/ORA/PHA/JMP) -; 16-bit write = 20 cycles -; 8-bit low = 28 cycles -; 8-bit high = 27 cycles -; -; start lda (00),y ; 6 -; and #MASK ; 3 -; ora #DATA ; 3 = 12 cycles to load the data -; bcs alt_exit ; 2/3 -; pha ; 4 -; out jmp next ; 3 Fast-path completes in 5 additional cycles -; alt_exit jmp jmp_rtn ; 3 -; -; -; For dynamic masked tiles, we re-write bytes 2 - 8 as this, which mostly -; avoids an execution speed pentaly for having to fill in the two extra bytes -; with an instruction -; -; start lda (00),y ; 6 -; and $80,x ; 5 -; ora $00,x ; 5 = 16 cycles to load the data -; bcs alt_exit ; 2/3 -; pha -; ... -; -; A theoretical exception handler that performed a full 3-level blend would be -; -; start lda 0,s -; and [00],y -; ora (00),y -; and $80,x -; ora $00,x -; and #MASK -; ora #DATA -; bcs alt_exit -; pha ; 4 -; out brl next ; 4 Fast-path completes in 5 additional cycles -; -; alt_exit bvs r_edge ; 2/3 -; clc ; 2 -; brl l_jmp_rtn ; 3 -; r_edge rep #$41 -; brl r_jmp_rtn ; 3 - -; Each snippet is provided 32 bytes of space. The constant code is filled in from the end and -; it is the responsibility of the code that fills in the hander to create valid program in the -; first 23 bytes are available to be manipulated. -; -; Note that the code that's assembled in the first bytes of these snippets is just an example. Every -; routine that created an exception handler *MUST* write a full set of instructions since there is -; no guarantee of what was written previously. ds \,$00 ; pad to the next page boundary ]index equ 0 snippets lup 82 - ds 2 ; space for all exception handlers - and #$0000 ; the mask operand will be set when the tile is drawn - ora #$0000 ; the data operand will be set when the tile is drawn - ds 15 ; extra padding - - bcs :byte ; if C = 0, just push the data and return - pha ; 1 byte - jmp loop+3+{3*]index}-base ; 3 bytes -:byte jmp jmp_rtn-base ; 3 bytes + lda ({{81-]index}*2}),y ; 0: Pre-set the LDA (XX),y instructions + and $80,x ; 2: The direct page instructions are placeholders and get overwritten + ora $00,x ; 4: This gets patched out often + and #$0000 ; 6: the mask operand will be set when the tile is drawn + ora #$0000 ; 9: the data operand will be set when the tile is drawn + bcs :byte ; 12: if C = 0, just push the data and return +:word pha ; 14: + jmp loop+3+{3*]index}-base ; 15: Return address offset within the code field + lda ({{81-]index}*2}),y ; 18: Pre-set the LDA (XX),y instructions + and $80,x ; 20: + ora $00,x ; 22: + bcc :word ; 24: +:byte jmp jmp_rtn-base ; 26: + ds 3 ; 29: Padding to make a full 32 bytes ]index equ ]index+1 --^ top \ No newline at end of file diff --git a/src/blitter/TemplateUtils.s b/src/blitter/TemplateUtils.s index a027127..4aec8b7 100644 --- a/src/blitter/TemplateUtils.s +++ b/src/blitter/TemplateUtils.s @@ -72,7 +72,7 @@ Counter equ tmp3 rts -; Patch an 8-bit or 16-bit valueS into the bank. These are a set up unrolled loops to +; Patch an 8-bit or 16-bit valueS into the bank. These are set up as unrolled loops to ; quickly patch in a constant value, or a value from an array into a given set of ; templates. ; diff --git a/src/render/Dynamic.s b/src/render/Dynamic.s index d417675..0e174dc 100644 --- a/src/render/Dynamic.s +++ b/src/render/Dynamic.s @@ -459,8 +459,76 @@ CopyMaskedDWord MAC sta: $0004,x ; ORA $00,x lda #$0F80 ; branch to the prologue (BRA *+17) sta: $0006,x + +; Version 2 only needs to set the JMP address to Entry Point 3 +; lda _JTBL_CACHE +; ora #{{]1}&$7000} ; adjust for the current row offset +; sta: {]1}+1,y + eom +; Version 2 will set the JMP to Entry Point 1 and set the Opcode at Entry Point 2 to a ora $00,x. Also +; the mask transparency check can be performed earlier. +; +; lda #$004C ; JMP to handler +; sta: {]2},y +; lda _JTBL_CACHE ; Get the offset to the exception handler for this column +; ora #{]2&$7000} ; adjust for the current row offset +; sta: {]2}+1,y +; tax ; This becomes the new address that we use to patch in +; lda OP_CACHE_2 ; switch from AND to ORA instruction cached in setup +; sta: $0004,x ; ORA $00,x + +CopyDynMaskedSpriteWord2 MAC +; If MASK == 0, then we can do a PEA. If MASK == $FFFF, then fall back to the simple Dynamic Tile +; code and eliminate the constant AND/ORA instructions. + + lda tmp_sprite_mask+{]1} ; load the mask value + bne mixed ; a non-zero value may be mixed + +; This is a solid word + lda #$00F4 ; PEA instruction + sta: {]2},y + + lda tmp_sprite_data+{]1} ; load the sprite data + sta: {]2}+1,y ; PEA operand + bra next + +; We will always do a JMP to the exception handler, but the entry point changes depending on +; whether the mask is transparent or not +mixed + cmp #$FFFF + beq transparent + + lda #$004C ; JMP to handler + sta: {]2},y + + lda _JTBL_CACHE ; Get the offset to the exception handler for this column + ora #{]2&$7000} ; adjust for the current row offset + sta: {]2}+1,y + tax ; This becomes the new address that we use to patch in + + lda _OP_CACHE2 + sta: $0004,x ; ORA $00,x + + lda tmp_sprite_mask+{]1} + sta: $0007,x + + lda tmp_sprite_data+{]1} + sta: $000A,x + + bra next + +; This is a transparent word, so just show the dynamic data overlaid on layer 2 +transparent + lda #$004C ; JMP to handler + sta: {]2},y + lda _JTBL_CACHE ; Get the offset to the exception handler for this column + ora #{]2&$7000}.ENTRY_POINT_2 ; adjust for the current row offset and OR in the offset since snippets are 32-byte aligned + sta: {]2}+1,y + +next + eom ; Masked renderer for a masked dynamic tile with sprite data overlaid. ; @@ -479,7 +547,7 @@ CopyDynMaskedSpriteWord MAC ; bra *+15 ; ; If MASK == 0, then we can do a PEA. If MASK == $FFFF, then fall back to the simple Dynamic Tile -; code and eliminate the constanct AND/ORA instructions. +; code and eliminate the constant AND/ORA instructions. lda tmp_sprite_mask+{]1} ; load the mask value bne mixed ; a non-zero value may be mixed @@ -493,6 +561,7 @@ CopyDynMaskedSpriteWord MAC ; We will always do a JMP to the exception handler, so set that up, then check for sprite ; transparency + mixed lda #$004C ; JMP to handler sta: {]2},y diff --git a/src/render/Slow.s b/src/render/Slow.s index 47ede31..32d5bce 100644 --- a/src/render/Slow.s +++ b/src/render/Slow.s @@ -7,8 +7,8 @@ ; GenericUnderSlow : Places the TileStore's tile on top of tmp_sprite_data ConstTile0Slow - jsr FillPEAOpcode - jmp ConstTile0Fast + jsr FillPEAOpcode ; Could these be slightly faster to do PEA ConstTile0Fast-1 ; JMP FillPEAOpcode? + jmp ConstTile0Fast ; Currently it's 6 + 6 + 3 + 6, improved would be 5 + 3 + 6 + 6 = 1 cycle saved. :( SpriteOverASlow lda TileStore+TS_CODE_ADDR_HIGH,x ; load the bank of the target code field line @@ -79,12 +79,6 @@ FillPEAOpcode rep #$20 rts -; This is a stub; will be removed eventually -_FillPEAOpcode - jsr FillPEAOpcode - plb ; Restore the TileStore bank - rts - CopyTileASlow tax jsr FillPEAOpcode diff --git a/src/render/TwoLayer.s b/src/render/TwoLayer.s index 8ca2df6..aee0fd8 100644 --- a/src/render/TwoLayer.s +++ b/src/render/TwoLayer.s @@ -50,6 +50,7 @@ Tile0TwoLyr SpriteOver0TwoLyr lda TileStore+TS_JMP_ADDR,x ; Get the address of the exception handler + ora #SNIPPET_ENTRY_2 ; Offset into the second entry point sta _JTBL_CACHE lda TileStore+TS_WORD_OFFSET,x ; Load the word offset of this tile (0 to 82 in steps of 2) @@ -95,6 +96,7 @@ SpriteOver0TwoLyr TmpTileDataToCodeField lda TileStore+TS_JMP_ADDR,x ; Get the address of the exception handler + ora #SNIPPET_ENTRY_2 sta _JTBL_CACHE lda TileStore+TS_WORD_OFFSET,x ; Load the word offset of this tile (0 to 82 in steps of 2) @@ -143,6 +145,7 @@ _TmpTileDataToCodeField ; Copy a tile into the tile data buffer and then render to the code field CopyTileATwoLyr ldal TileStore+TS_JMP_ADDR,x ; Get the address of the exception handler + ora #SNIPPET_ENTRY_2 sta _JTBL_CACHE ldal TileStore+TS_WORD_OFFSET,x ; Load the word offset of this tile (0 to 82 in steps of 2) @@ -170,6 +173,7 @@ CopyTileATwoLyr CopyTileVTwoLyr ldal TileStore+TS_JMP_ADDR,x ; Get the address of the exception handler + ora #SNIPPET_ENTRY_2 sta _JTBL_CACHE ldal TileStore+TS_WORD_OFFSET,x ; Load the word offset of this tile (0 to 82 in steps of 2) @@ -348,22 +352,14 @@ mixed cmp #$FFFF ; All 1's in the mask is fully transparent sta: {]2}+1,y tax ; This becomes the new address that we use to patch in - lda #$29 - sta: $0002,x ; AND #$0000 opcode - lda #$09 - sta: $0005,x ; ORA #$0000 opcode - lda _OP_CACHE ; Get the LDA (dp),y instruction for this column sta: $0000,x - lda {]1}+32 ; insert the tile mask and data into the exception - sta: $0003,x ; handler. + lda {]1}+32 ; insert the tile mask and data into the exception + sta: $0003,x ; handler. lda {]1} sta: $0006,x - lda #$0D80 ; branch to the prologue (BRA *+15) - sta: $0008,x - bra next ; This is a transparent word, so just show the second background layer From 6832c7f4057985974ec62eb0f4fdd317e3a6b384 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Fri, 3 Mar 2023 21:44:39 -0600 Subject: [PATCH 44/68] Update dynamic tile rendered to use fixed snippets. Add DAMAGES flag for the one render that doesn't fit the mold --- src/Defs.s | 8 +-- src/blitter/Template.s | 21 +++--- src/render/Dynamic.s | 156 ++++++++++++----------------------------- 3 files changed, 62 insertions(+), 123 deletions(-) diff --git a/src/Defs.s b/src/Defs.s index 28792c4..28e7a9e 100644 --- a/src/Defs.s +++ b/src/Defs.s @@ -216,16 +216,16 @@ PAD_BUTTON_A equ $0200 PAD_KEY_DOWN equ $0400 ; Tile constants -; TILE_RESERVED_BIT equ $8000 -TILE_PRIORITY_BIT equ $4000 ; Put tile on top of sprite +TILE_DAMAGED_BIT equ $8000 ; Mark a tile as damaged (internal only) +TILE_PRIORITY_BIT equ $4000 ; Put tile on top of sprite (unimplemented) TILE_FRINGE_BIT equ $2000 ; Unused TILE_SOLID_BIT equ $1000 ; Hint bit used in TWO_LAYER_MODE to optimize rendering TILE_DYN_BIT equ $0800 ; Is this a Dynamic Tile? TILE_VFLIP_BIT equ $0400 TILE_HFLIP_BIT equ $0200 TILE_ID_MASK equ $01FF -TILE_CTRL_MASK equ $FE00 -; TILE_PROC_MASK equ $F800 ; Select tile proc for rendering +TILE_CTRL_MASK equ $7E00 +; TILE_PROC_MASK equ $7800 ; Select tile proc for rendering ; Sprite constants SPRITE_COMPILED equ $4000 ; This is a compiled sprite (SPRITE_DISP points to a routine in the compiled cache bank) diff --git a/src/blitter/Template.s b/src/blitter/Template.s index badf5d2..eb10054 100644 --- a/src/blitter/Template.s +++ b/src/blitter/Template.s @@ -29,7 +29,8 @@ SNIPPET_BASE equ snippets-base SNIPPET_ENTRY_1 equ 0 ; two layer + dynamic tile + sprite SNIPPET_ENTRY_2 equ 4 ; (two layer | dynamic tile) + sprite -SNIPPET_ENTRY_3 equ 18 ; two layer + dynamic tile (no sprite) +SNIPPET_ENTRY_3 equ 18 ; sprite under dynamic tile +SNIPPET_ENTRY_4 equ 19 ; two layer + dynamic tile (no sprite) ; Locations that need the page offset added PagePatches da {long_0-base+2} @@ -51,7 +52,7 @@ PagePatches da {long_0-base+2} ]index equ 0 lup 82 ; Patch anything that needs updating within the snippets da {snippets-base+{]index*32}+17} - da {snippets-base+{]index*32}+28} + da {snippets-base+{]index*32}+29} ]index equ ]index+1 --^ PagePatchNum equ *-PagePatches @@ -296,7 +297,8 @@ epilogue_1 tsc ; bcs _alt ; _16bit pha ; jmp NEXT -; lda (00),y <--- Entry Point 3 (sneak this in here to avoid extra branch) +; db 1 <--- Entry Point 3 (opcode for an LDA #DATA instruction) +; lda (00),y <--- Entry Point 4 (sneak this in here to avoid extra branch) ; and $80,x ; ora $00,x ; bcc _16bit @@ -319,12 +321,13 @@ snippets lup 82 bcs :byte ; 12: if C = 0, just push the data and return :word pha ; 14: jmp loop+3+{3*]index}-base ; 15: Return address offset within the code field - lda ({{81-]index}*2}),y ; 18: Pre-set the LDA (XX),y instructions - and $80,x ; 20: - ora $00,x ; 22: - bcc :word ; 24: -:byte jmp jmp_rtn-base ; 26: - ds 3 ; 29: Padding to make a full 32 bytes + db $A9 ; 18: LDA #DATA opcode + lda ({{81-]index}*2}),y ; 19: Pre-set the LDA (XX),y instructions + and $80,x ; 21: + ora $00,x ; 23: + bcc :word ; 25: +:byte jmp jmp_rtn-base ; 27: + ds 2 ; 30: Padding to make a full 32 bytes ]index equ ]index+1 --^ top \ No newline at end of file diff --git a/src/render/Dynamic.s b/src/render/Dynamic.s index 0e174dc..3c9cdf2 100644 --- a/src/render/Dynamic.s +++ b/src/render/Dynamic.s @@ -45,13 +45,14 @@ CopyDynamicTile ; populating the code field and snippet space DynamicOver lda TileStore+TS_JMP_ADDR,x ; Get the address of the exception handler + ora #SNIPPET_ENTRY_2 sta _JTBL_CACHE lda TileStore+TS_TILE_ID,x ; Get the original tile descriptor - and #$007F ; clamp to < (32 * 4) + and #$007F ; clamp to < (32 * 4) ora #$B500 xba - sta _OP_CACHE ; This is the 2-byte opcode for to load the data + sta _OP_CACHE ; This is the 2-byte opcode for to load the data lda TileStore+TS_CODE_ADDR_HIGH,x pha @@ -91,6 +92,7 @@ DynamicOver DynamicUnder lda TileStore+TS_JMP_ADDR,x ; Get the address of the exception handler + ora #SNIPPET_ENTRY_3 sta _JTBL_CACHE lda TileStore+TS_TILE_ID,x ; Get the original tile descriptor @@ -164,6 +166,7 @@ _DynFillJmpOpcode CopyDynamicTileTwoLyr ldal TileStore+TS_JMP_ADDR,x ; Get the address of the exception handler + ora #SNIPPET_ENTRY_4 sta _JTBL_CACHE ldal TileStore+TS_WORD_OFFSET,x @@ -215,9 +218,10 @@ CopyDynamicTileTwoLyr jmp _DynFillJmpOpcode -; Render a sprite on top of a dyamic tile with transparent areas shwing the second background +; Render a sprite on top of a dyamic tile with transparent areas showing the second background DynamicOverTwoLyr lda TileStore+TS_JMP_ADDR,x ; Get the address of the exception handler + ora #SNIPPET_ENTRY_1 sta _JTBL_CACHE lda TileStore+TS_WORD_OFFSET,x @@ -275,9 +279,19 @@ DynamicOverTwoLyr plb rts -; Render a sprite on top of a dyamic tile with transparent areas shwing the second background +; Render a sprite under a dyamic tile with transparent areas showing the second background +; +; This is a special case where we cannot fit the code into the fixed snippet structure. As such, +; any tile drawn with this routine will set a DAMAGED flag on the TileStore flags. If another +; tile blitter in the TwoLayer function set sees that a tile is marked as DAMAGED, it must +; restore the original code structure before proceeding. +; +; The damages area is not too bad -- just the 10 bytes from [2, 10] are overwritten and must be +; restored. This is actually less work than a lot of the snippet macros were doing before +; applying the fixed snippet optimization. DynamicUnderTwoLyr lda TileStore+TS_JMP_ADDR,x ; Get the address of the exception handler + ora #SNIPPET_ENTRY_1 sta _JTBL_CACHE lda TileStore+TS_WORD_OFFSET,x @@ -290,6 +304,8 @@ DynamicUnderTwoLyr ; perform and EOR #$2080 to covert the opcode and operand in one instruction lda TileStore+TS_TILE_ID,x ; Get the original tile descriptor + ora #TILE_DAMAGED_BIT ; Set the DAMAGED bit here since we have to load TILE_ID anyway + sta TileStore+TS_TILE_ID,x and #$007F ; clamp to < (32 * 4) ora #$3580 ; Pre-calc the AND $80,x opcode + operand xba @@ -368,18 +384,12 @@ mixed cmp #$FFFF ; All 1's in the mask is a fully transparent sp lda _OP_CACHE ; Get the LDA dp,x instruction for this column sta: $0000,x - lda #$0029 ; AND #SPRITE_MASK - sta: $0002,x lda tmp_sprite_mask+{]1} sta: $0003,x - lda #$0009 ; ORA #SPRITE_DATA - sta: $0005,x lda tmp_sprite_data+{]1} sta: $0006,x - lda #$0D80 ; branch to the prologue (BRA *+15) - sta: $0008,x bra next ; This is a transparent word, so just show the dynamic data @@ -410,10 +420,8 @@ CopyDynUnder MAC lda _JTBL_CACHE ; Get the offset to the exception handler for this column ora #{]2&$7000} ; adjust for the current row offset sta: {]2}+1,y - tax ; This becomes the new address that we use to patch in + tax ; This becomes the new address that we use to patch in - lda #$00A9 ; LDA #DATA - sta: $0000,x lda tmp_sprite_data+{]1} sta: $0001,x @@ -421,9 +429,6 @@ CopyDynUnder MAC sta: $0003,x ; AND $80,x eor #$8020 ; Switch the opcode to an ORA and remove the high bit of the operand sta: $0005,x ; ORA $00,x - - lda #$0E80 ; branch to the prologue (BRA *+16) - sta: $0007,x eom ; Masked renderer for a dynamic tile. What's interesting about this renderer is that the mask @@ -449,22 +454,14 @@ CopyMaskedDWord MAC lda _JTBL_CACHE ora #{{]1}&$7000} ; adjust for the current row offset sta: {]1}+1,y - tax ; This becomes the new address that we use to patch in + lda _OP_CACHE sta: $0000,x ; LDA (00),y lda _OP_CACHE2 sta: $0002,x ; AND $80,x eor #$8020 ; Switch the opcode to an ORA and remove the high bit of the operand sta: $0004,x ; ORA $00,x - lda #$0F80 ; branch to the prologue (BRA *+17) - sta: $0006,x - -; Version 2 only needs to set the JMP address to Entry Point 3 -; lda _JTBL_CACHE -; ora #{{]1}&$7000} ; adjust for the current row offset -; sta: {]1}+1,y - eom ; Version 2 will set the JMP to Entry Point 1 and set the Opcode at Entry Point 2 to a ora $00,x. Also @@ -479,7 +476,7 @@ CopyMaskedDWord MAC ; lda OP_CACHE_2 ; switch from AND to ORA instruction cached in setup ; sta: $0004,x ; ORA $00,x -CopyDynMaskedSpriteWord2 MAC +CopyDynMaskedSpriteWord MAC ; If MASK == 0, then we can do a PEA. If MASK == $FFFF, then fall back to the simple Dynamic Tile ; code and eliminate the constant AND/ORA instructions. @@ -489,7 +486,6 @@ CopyDynMaskedSpriteWord2 MAC ; This is a solid word lda #$00F4 ; PEA instruction sta: {]2},y - lda tmp_sprite_data+{]1} ; load the sprite data sta: {]2}+1,y ; PEA operand bra next @@ -502,13 +498,14 @@ mixed lda #$004C ; JMP to handler sta: {]2},y - lda _JTBL_CACHE ; Get the offset to the exception handler for this column ora #{]2&$7000} ; adjust for the current row offset sta: {]2}+1,y tax ; This becomes the new address that we use to patch in lda _OP_CACHE2 + sta: $0002,x ; AND $80,x + eor #$8020 ; Switch the opcode to an ORA and remove the high bit of the operand sta: $0004,x ; ORA $00,x lda tmp_sprite_mask+{]1} @@ -524,51 +521,9 @@ transparent lda #$004C ; JMP to handler sta: {]2},y lda _JTBL_CACHE ; Get the offset to the exception handler for this column - ora #{]2&$7000}.ENTRY_POINT_2 ; adjust for the current row offset and OR in the offset since snippets are 32-byte aligned + ora #{]2&$7000}.SNIPPET_ENTRY_4 ; adjust for the current row offset and OR in the offset since snippets are 32-byte aligned sta: {]2}+1,y - -next - eom - -; Masked renderer for a masked dynamic tile with sprite data overlaid. -; -; ]1 : sprite plane offset -; ]2 : code field offset -CopyDynMaskedSpriteWord MAC - -; Need to fill in the first 14 bytes of the JMP handler with the following code sequence where -; the data and mask from from the sprite plane -; -; lda ($00),y -; and $80,x -; ora $00,x -; and #MASK -; ora #DATA -; bra *+15 -; -; If MASK == 0, then we can do a PEA. If MASK == $FFFF, then fall back to the simple Dynamic Tile -; code and eliminate the constant AND/ORA instructions. - - lda tmp_sprite_mask+{]1} ; load the mask value - bne mixed ; a non-zero value may be mixed - -; This is a solid word - lda #$00F4 ; PEA instruction - sta: {]2},y - lda tmp_sprite_data+{]1} ; load the sprite data - sta: {]2}+1,y ; PEA operand - bra next - -; We will always do a JMP to the exception handler, so set that up, then check for sprite -; transparency - -mixed - lda #$004C ; JMP to handler - sta: {]2},y - lda _JTBL_CACHE ; Get the offset to the exception handler for this column - ora #{]2&$7000} ; adjust for the current row offset - sta: {]2}+1,y - tax ; This becomes the new address that we use to patch in + tax lda _OP_CACHE sta: $0000,x ; LDA (00),y @@ -576,31 +531,9 @@ mixed sta: $0002,x ; AND $80,x eor #$8020 ; Switch the opcode to an ORA and remove the high bit of the operand sta: $0004,x ; ORA $00,x - - lda #$0029 ; AND #SPRITE_MASK - sta: $0006,x - lda tmp_sprite_mask+{]1} - cmp #$FFFF ; All 1's in the mask is a fully transparent sprite word - beq transparent - sta: $0007,x - - lda #$0009 ; ORA #SPRITE_DATA - sta: $0009,x - lda tmp_sprite_data+{]1} - sta: $000A,x - - lda #$0980 ; branch to the prologue (BRA *+11) - sta: $000C,x - bra next - -; This is a transparent word, so just show the dynamic data -transparent - lda #$0F80 ; branch to the epilogue (BRA *+17) - sta: $0006,x next eom - ; Masked renderer for a masked dynamic tile with sprite data underlaid. ; ; ]1 : sprite plane offset @@ -615,7 +548,12 @@ CopyDynPrioMaskedSpriteWord MAC ; ora #DATA ; and $80,x ; ora $00,x -; bra *+15 + +; This macro has different targets based on the transparency + + lda tmp_sprite_mask+{]1} + cmp #$FFFF ; All 1's in the mask is a fully transparent sprite word + beq transparent lda #$004C ; JMP to handler sta: {]2},y @@ -624,15 +562,10 @@ CopyDynPrioMaskedSpriteWord MAC sta: {]2}+1,y tax ; This becomes the new address that we use to patch in - lda _OP_CACHE - sta: $0000,x ; LDA (00),y - lda #$0029 ; AND #SPRITE_MASK sta: $0002,x lda tmp_sprite_mask+{]1} - cmp #$FFFF ; All 1's in the mask is a fully transparent sprite word - beq transparent ; so we can use the Tile00011 method sta: $0003,x lda #$0009 ; ORA #SPRITE_DATA @@ -645,19 +578,22 @@ CopyDynPrioMaskedSpriteWord MAC eor #$8020 ; Switch the opcode to an ORA and remove the high bit of the operand sta: $000A,x ; ORA $00,x - lda #$0980 ; branch to the prologue (BRA *+11) - sta: $000C,x bra next - -; This is a transparent word, so just show the dynamic data transparent - lda _OP_CACHE2 - sta: $0002,x ; AND $80,x - eor #$8020 ; Switch the opcode to an ORA and remove the high bit of the operand - sta: $0004,x ; ORA $00,x +; This is a transparent word, so just show the dynamic data + lda #$004C ; JMP to handler + sta: {]2},y + lda _JTBL_CACHE ; Get the offset to the exception handler for this column + ora #{]2&$7000}.SNIPPET_ENTRY_4 ; adjust for the current row offset and OR in the offset since snippets are 32-byte aligned + sta: {]2}+1,y + tax - lda #$0F80 ; branch to the epilogue (BRA *+17) - sta: $0006,x + lda _OP_CACHE + sta: $0000,x ; LDA (00),y + lda _OP_CACHE2 + sta: $0002,x ; AND $80,x + eor #$8020 ; Switch the opcode to an ORA and remove the high bit of the operand + sta: $0004,x ; ORA $00,x next eom From 5697737a939b0e1b59ca0d30dfd39a7cdb2c007b Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Mon, 6 Mar 2023 14:39:23 -0600 Subject: [PATCH 45/68] Add workable overlay support to the scanline renderer --- src/Defs.s | 10 +-- src/Render.s | 153 +++++++++++++++++++++++++++++++++++-- src/Tool.s | 42 +++++++++- src/static/TileStore.s | 17 +++-- src/static/TileStoreDefs.s | 54 ++++++++----- 5 files changed, 232 insertions(+), 44 deletions(-) diff --git a/src/Defs.s b/src/Defs.s index 28e7a9e..4d181cf 100644 --- a/src/Defs.s +++ b/src/Defs.s @@ -182,13 +182,6 @@ OVERLAY_SOLID equ $8000 ; Overlay covers the scan line and is fu OVERLAY_ABOVE equ $0000 ; Overlay is drawn above scanline sprites OVERLAY_BELOW equ $4000 ; Overlay is drawn below scanline sprites -OVERLAY_BASE equ 2 ; 2 bytes for the number of overlays -OVERLAY_REC_SIZE equ 10 ; Size of an overlay record (10 bytes) -OVERLAY_FLAGS equ {OVERLAY_BASE+0} -OVERLAY_TOP equ {OVERLAY_BASE+2} -OVERLAY_BOTTOM equ {OVERLAY_BASE+4} -OVERLAY_PROC equ {OVERLAY_BASE+6} - ; DirtyBits definitions DIRTY_BIT_BG0_X equ $0001 DIRTY_BIT_BG0_Y equ $0002 @@ -228,6 +221,7 @@ TILE_CTRL_MASK equ $7E00 ; TILE_PROC_MASK equ $7800 ; Select tile proc for rendering ; Sprite constants +SPRITE_OVERLAY equ $8000 ; This is an overlay record. Stored as a sprite for render ordering purposes SPRITE_COMPILED equ $4000 ; This is a compiled sprite (SPRITE_DISP points to a routine in the compiled cache bank) SPRITE_HIDE equ $2000 ; Do not render the sprite SPRITE_16X16 equ $1800 ; 16 pixels wide x 16 pixels tall @@ -283,7 +277,7 @@ VBuffArray EXT _stamp_step EXT VBuffVertTableSelect EXT VBuffHorzTableSelect EXT -Overlays EXT +; Overlays EXT BG1YCache EXT ScalingTables EXT diff --git a/src/Render.s b/src/Render.s index d5ba62e..9d9b7b2 100644 --- a/src/Render.s +++ b/src/Render.s @@ -71,7 +71,7 @@ _Render ; The code fields are locked in now and ready to be rendered. See if there is an overlay or any ; other reason to render with shadowing off. Otherwise, just do things quickly. - lda Overlays + lda Overlays+OVERLAY_ID beq :no_ovrly jsr _ShadowOff @@ -82,6 +82,7 @@ _Render ldx Overlays+OVERLAY_TOP ; Blit the full virtual buffer to the screen ldy Overlays+OVERLAY_BOTTOM + iny jsr _BltRange ; Turn shadowing back on @@ -93,6 +94,7 @@ _Render jsr _DoOverlay ldx Overlays+OVERLAY_BOTTOM + inx cpx ScreenHeight beq :done ldy ScreenHeight @@ -343,14 +345,15 @@ _RenderWithShadowing jsr _BuildShadowList ; Create the rages based on the sorted sprite y-values ; jsr _MergeOverlay ; Add the overlay range into the shadow list (treat it as a sprite) - jsr _ComplementList ; Create the complement to identify non-sprite / non-overlay scanlines +; jsr _ComplementList ; Create the complement to identify non-sprite / non-overlay scanlines jsr _ShadowOff ; Turn off shadowing and draw all the scanlines with sprites on them jsr _DrawShadowList jsr _DrawDirectSprites ; Draw the sprites directly to the Bank $01 graphics buffer (skipping the render-to-tile step) jsr _ShadowOn ; Turn shadowing back on - jsr _DrawComplementList ; Alternate drawing scanlines and PEI slam to expose the full fram +; jsr _DrawComplementList ; Alternate drawing scanlines and PEI slam to expose the full fram + jsr _DrawFinalPass ; ; The objects that need to be reasoned about are @@ -598,13 +601,16 @@ _DrawShadowList rts -; Run through the list of sprites that are not IS_OFFSCREEN and draw them directly to the graphics screen. We can use +; Run through the list of sprites that are not IS_OFFSCREEN and not OVERLAYS and draw them directly to the graphics screen. We can use ; compiled sprites here, with limitations. _DrawDirectSprites ldx _SortedHead bmi :empty :loop + lda _Sprites+SPRITE_ID,x + bit #SPRITE_OVERLAY + bne :next lda _Sprites+SPRITE_STATUS,x bit #SPRITE_STATUS_HIDDEN bne :next @@ -622,7 +628,144 @@ _DrawDirectSprites :empty rts -; Run through the complement list and alternate between calling _PEISlam and _BltRange to show to full screen +; Run through the sorted list and perform a final render the jumps between calling _PEISlam for shadowed lines, +; _BltRange for clean backgrounds and Overlays as needed. +; +; The trick here is to merge runs of shared render types. +; +; Loop invariant: X-register is the current object index, Y-register is the next object index +; +; TODO: This does not yet handle the case of a narrow overlay in the middle of a sprite. The second half of the sprite will not be exposed +; by a PEISlam. +; +; e.g. |--- Overlay ---| +; |-------------- Sprite ----------------| +; +; Output Should be |-- PEI --||--- Overlay ---||--- PEI --| +; But currently is |-- PEI --||--- Overlay ---| + +_DrawFinalPass +:curr_top equ tmp0 +:curr_bottom equ tmp1 +:curr_type equ tmp2 + + ldx _SortedHead + bmi :empty + + lda _Sprites+SPRITE_CLIP_TOP,x ; Load the first object's top edge + sta :curr_top + beq :loop ; If it's at the top edge of the screen, proceed. Othrewise _BltRange the top range + + ldx #0 + tay + jsr _BltRange + ldx _SortedHead ; Reload the register + +:loop + lda _Sprites+SPRITE_ID,x ; Save the type of the current segment. Do this first because it can be skipped + and #SPRITE_OVERLAY ; when merging ranges of the same type + sta :curr_type + + lda _Sprites+SPRITE_CLIP_TOP,x + sta :curr_top + lda _Sprites+SPRITE_CLIP_BOTTOM,x ; Optimistically set the end of the segment to the bottom of this object + inc ; Clip values are on the scanline, so add one to make it a proper interval + +:update + sta :curr_bottom + +:skip + ldy _Sprites+SORTED_NEXT,x ; If there another object in the list? + bmi :no_more ; If not, we can finish up + + lda :curr_bottom ; If the bottom of the current object is _less than_ the top of the next + cmp _Sprites+SPRITE_CLIP_TOP,y ; sprite, then there is a gap and we can draw the current object and a + bcc :advance ; _BltRange up to the next one + +; Here, we've established that there is another object segment that starts at or within the bounds of the current +; object. If they are of the same type, then we can merge them and look at the next object in the list; treating +; the merges range as a larger, single object range. +; +; If they are different, then clip the current object range to the top of the next one, render the current object +; range and then take the new object as the current one. +; +; If the first object extends past the second, we are going to miss the remainder of that object. We really need a +; stack to put it on so that it can eventually be processed later. + + lda _Sprites+SPRITE_ID,y + and #SPRITE_OVERLAY + cmp :curr_type + bne :no_merge + + tyx ; Move the next index into the current + lda _Sprites+SPRITE_CLIP_BOTTOM,y ; Get the bottom value of the next sprite. + inc + cmp :curr_bottom ; If it extends the segment then replace the bottom value, otherwise skip. In + bcc :skip ; either case, the type and top value remain the same + bra :update + +; This is a simpler version of the 'advance' below. In this case there are overlapping ranges, so we just need to draw a +; clipped version of the top range and then restart the loop with the next range. +:no_merge + lda _Sprites+SPRITE_CLIP_TOP,y ; Get the top of the next segment + sta :curr_bottom ; Use it as the bottom of the current segment + phy ; Save the next index... + jsr :PEIOrOverlay ; Draw the current segment type + plx ; ...and restore as the current + bra :loop ; Start again + +:advance + phy + jsr :PEIOrOverlay ; Draw the appropriate filler + lda 1,s + tax + ldy _Sprites+SPRITE_CLIP_TOP,x ; Draw the background in between + ldx :curr_bottom + jsr _BltRange + plx + bra :loop + +; List is empty, so just do one big _BltRange with a tail call +:empty + ldx #0 +:no_more2 + ldy ScreenHeight + jmp _BltRange + +; Found the end of the list. Draw current object and then blit the rest of the screen +:no_more + jsr :PEIOrOverlay + ldx :curr_bottom + cpx ScreenHeight + bcc :no_more2 + rts + +; Help to select between calling an Overlay or PEISlam routine +:PEIOrOverlay + lda :curr_type + bne :overlay + + ldx :curr_top + ldy :curr_bottom + jmp _PEISlam +:overlay + lda _Sprites+OVERLAY_PROC,x + stal :disp+1 + lda _Sprites+OVERLAY_PROC+1,x + stal :disp+2 + + lda ScreenY0 ; pass the address of the first line of the overlay + clc + adc _Sprites+OVERLAY_TOP,x + asl + tax + lda ScreenAddr,x + clc + adc ScreenX0 +:disp jsl $000000 + rts + + _DrawComplementList ldx #0 diff --git a/src/Tool.s b/src/Tool.s index 642247c..d442127 100644 --- a/src/Tool.s +++ b/src/Tool.s @@ -698,6 +698,11 @@ _TSStartScript _TSExit #0;#6 ; SetOverlay(top, bottom, proc) +; +; Overlays are handled as quasi-sprites. They need to be included in the y-sorted list of "stuff", but they are not drawn like +; sprites. As such, they set a special flag in the SPRITE_ID field which allows them to be ignored for other purposes. Also, +; they are not added into the "normal" sprite range on 0 - 15, but are stored in locations 16 and up to further seggregate them from +; the rest of the system. A lot of the SPRITE_* locations are repurposed for Overlay-specific information. _TSSetOverlay :proc equ FirstParam+0 :bottom equ FirstParam+4 @@ -705,9 +710,40 @@ _TSSetOverlay _TSEntry - lda #1 - sta Overlays - stz Overlays+OVERLAY_FLAGS + ldx #0 ; Always just use the first spot + lda #SPRITE_OVERLAY + sta Overlays+OVERLAY_ID,x + stz Overlays+OVERLAY_FLAGS,x + + lda :top,s + sta Overlays+OVERLAY_TOP,x + lda :bottom,s + dec + sta Overlays+OVERLAY_BOTTOM,x + sec + sbc :top,s + inc + sta Overlays+OVERLAY_HEIGHT,x + + lda :proc,s + sta Overlays+OVERLAY_PROC,x + lda :proc+2,s + sta Overlays+OVERLAY_PROC+2,x + + ldx #{MAX_SPRITES+0}*2 ; Adjust to call the generic routings + jsr _InsertSprite + + _TSExit #0;#8 + +_TSUpdateOverlay +:proc equ FirstParam+0 +:bottom equ FirstParam+4 +:top equ FirstParam+6 + + _TSEntry + + ldx #0 + stz Overlays+OVERLAY_FLAGS,x lda :top,s sta Overlays+OVERLAY_TOP lda :bottom,s diff --git a/src/static/TileStore.s b/src/static/TileStore.s index 5951097..0042dca 100644 --- a/src/static/TileStore.s +++ b/src/static/TileStore.s @@ -27,7 +27,7 @@ DirtyTiles ENT ds \,$00 ; pad to the next page boundary _Sprites ENT - ds SPRITE_REC_SIZE*MAX_SPRITES + ds SPRITE_REC_SIZE*MAX_ELEMENTS ;------------------------------------------------------------------------------------- ; @@ -389,9 +389,10 @@ OldOneSecVec ENT ds 4 Timers ENT ds TIMER_REC_SIZE*MAX_TIMERS -Overlays ENT - dw 0 ; count - ds 10 ; only support one for now (flags, start_line, end_line, function call) + +;Overlays ENT +; dw 0 ; count +; ds 10 ; only support one for now (flags, start_line, end_line, function call) ; From the IIgs ref DefaultPalette ENT @@ -513,17 +514,17 @@ _SortedHead ENT _ShadowListCount ENT ds 2 _ShadowListTop ENT - ds {2*{MAX_SPRITES+1}} ; space for all of the sprites + overlay range + ds {2*{MAX_ELEMENTS}} ; space for all of the sprites + overlay range _ShadowListBottom ENT - ds {2*{MAX_SPRITES+1}} + ds {2*{MAX_ELEMENTS}} ; Complement of the Shadow List. Can have one more segment than that list _DirectListCount ENT ds 2 _DirectListTop ENT - ds {2*{MAX_SPRITES+2}} + ds {2*{MAX_ELEMENTS+1}} _DirectListBottom ENT - ds {2*{MAX_SPRITES+2}} + ds {2*{MAX_ELEMENTS+1}} ; Steps to the different sprite stamps diff --git a/src/static/TileStoreDefs.s b/src/static/TileStoreDefs.s index 5dccf78..6d300bf 100644 --- a/src/static/TileStoreDefs.s +++ b/src/static/TileStoreDefs.s @@ -28,6 +28,9 @@ TILE_STORE_NUM equ 12 ; Need this many parallel arra MAX_SPRITES equ 16 SPRITE_REC_SIZE equ 42 +MAX_OVERLAYS equ 2 +MAX_ELEMENTS equ {MAX_SPRITES+MAX_OVERLAYS} + ; Mark each sprite as ADDED, UPDATED, MOVED, REMOVED depending on the actions applied to it ; on this frame. Quick note, the same Sprite ID cannot be removed and added in the same frame. ; A REMOVED sprite if removed from the sprite list during the Render call, so it's ID is not @@ -41,28 +44,39 @@ SPRITE_STATUS_REMOVED equ $0008 ; Sprite has been removed. SPRITE_STATUS_HIDDEN equ $0010 ; Sprite is in a hidden state ; These values are set by the user -SPRITE_STATUS equ {MAX_SPRITES*0} -SPRITE_ID equ {MAX_SPRITES*2} -SPRITE_X equ {MAX_SPRITES*4} -SPRITE_Y equ {MAX_SPRITES*6} -VBUFF_ADDR equ {MAX_SPRITES*8} ; Base address of the sprite's stamp in the data/mask banks +SPRITE_STATUS equ {MAX_ELEMENTS*0} +SPRITE_ID equ {MAX_ELEMENTS*2} +SPRITE_X equ {MAX_ELEMENTS*4} +SPRITE_Y equ {MAX_ELEMENTS*6} +VBUFF_ADDR equ {MAX_ELEMENTS*8} ; Base address of the sprite's stamp in the data/mask banks ; These values are cached / calculated during the rendering process -TS_LOOKUP_INDEX equ {MAX_SPRITES*10} ; The index from the TileStoreLookup table that corresponds to the top-left corner of the sprite -TS_COVERAGE_SIZE equ {MAX_SPRITES*12} ; Representation of how many TileStore tiles (NxM) are covered by this sprite -SPRITE_DISP equ {MAX_SPRITES*14} ; Cached address of the specific stamp based on sprite flags -SPRITE_CLIP_LEFT equ {MAX_SPRITES*16} -SPRITE_CLIP_RIGHT equ {MAX_SPRITES*18} -SPRITE_CLIP_TOP equ {MAX_SPRITES*20} -SPRITE_CLIP_BOTTOM equ {MAX_SPRITES*22} -IS_OFF_SCREEN equ {MAX_SPRITES*24} -SPRITE_WIDTH equ {MAX_SPRITES*26} -SPRITE_HEIGHT equ {MAX_SPRITES*28} -SPRITE_CLIP_WIDTH equ {MAX_SPRITES*30} -SPRITE_CLIP_HEIGHT equ {MAX_SPRITES*32} -TS_VBUFF_BASE equ {MAX_SPRITES*34} ; Finalized VBUFF address based on the sprite position and tile offsets -SORTED_PREV equ {MAX_SPRITES*36} ; Doubly-Linked List that maintains the sprites in sorted order based on SPRITE_Y -SORTED_NEXT equ {MAX_SPRITES*38} +TS_LOOKUP_INDEX equ {MAX_ELEMENTS*10} ; The index from the TileStoreLookup table that corresponds to the top-left corner of the sprite +TS_COVERAGE_SIZE equ {MAX_ELEMENTS*12} ; Representation of how many TileStore tiles (NxM) are covered by this sprite +SPRITE_DISP equ {MAX_ELEMENTS*14} ; Cached address of the specific stamp based on sprite flags +SPRITE_CLIP_LEFT equ {MAX_ELEMENTS*16} +SPRITE_CLIP_RIGHT equ {MAX_ELEMENTS*18} +SPRITE_CLIP_TOP equ {MAX_ELEMENTS*20} +SPRITE_CLIP_BOTTOM equ {MAX_ELEMENTS*22} +IS_OFF_SCREEN equ {MAX_ELEMENTS*24} +SPRITE_WIDTH equ {MAX_ELEMENTS*26} +SPRITE_HEIGHT equ {MAX_ELEMENTS*28} +SPRITE_CLIP_WIDTH equ {MAX_ELEMENTS*30} +SPRITE_CLIP_HEIGHT equ {MAX_ELEMENTS*32} +TS_VBUFF_BASE equ {MAX_ELEMENTS*34} ; Finalized VBUFF address based on the sprite position and tile offsets +SORTED_PREV equ {MAX_ELEMENTS*36} ; Doubly-Linked List that maintains the sprites in sorted order based on SPRITE_Y +SORTED_NEXT equ {MAX_ELEMENTS*38} + +; The Overlays are part of the _Sprites memory space and come after the maximum number of sprites +Overlays equ {_Sprites+{MAX_SPRITES*2}} + +; Aliases of SPRITE_* memory locations that are used for Overlay info when the SPRITE_OVERLAY bit is set on SPRITE_ID +OVERLAY_ID equ SPRITE_ID +OVERLAY_FLAGS equ SPRITE_STATUS +OVERLAY_TOP equ SPRITE_CLIP_TOP ; This is important because SPRITE_CLIP_TOP is used for sorting +OVERLAY_BOTTOM equ SPRITE_CLIP_BOTTOM +OVERLAY_HEIGHT equ SPRITE_HEIGHT +OVERLAY_PROC equ VBUFF_ADDR ; 52 rows by 82 columns + 2 extra rows and columns for sprite sizes ; From 4bfdeae6aad3858b293c4aa8d7afa72b3700b656 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Mon, 6 Mar 2023 14:39:38 -0600 Subject: [PATCH 46/68] Update some demos to match new behaviors --- demos/kfest-2022/demo-5/App.Main.s | 6 +-- demos/kfest-2022/demo-9/App.Main.s | 64 +++++++++++++++++++++++++++--- demos/shell/App.Main.s | 5 ++- demos/shell/Overlay.s | 4 +- 4 files changed, 68 insertions(+), 11 deletions(-) diff --git a/demos/kfest-2022/demo-5/App.Main.s b/demos/kfest-2022/demo-5/App.Main.s index f94f4ff..52a921b 100644 --- a/demos/kfest-2022/demo-5/App.Main.s +++ b/demos/kfest-2022/demo-5/App.Main.s @@ -202,9 +202,6 @@ HERO_SLOT equ 1 pei PlayerY2 _GTEAddSprite - pea #RENDER_WITH_SHADOWING - _GTERender - EvtLoop pha _GTEReadControl @@ -280,7 +277,8 @@ do_render pha _GTEMoveSprite ; Move the sprite to this local position - pea #RENDER_WITH_SHADOWING +; pea #RENDER_WITH_SHADOWING + pea $0000 _GTERender ; Update the performance counters diff --git a/demos/kfest-2022/demo-9/App.Main.s b/demos/kfest-2022/demo-9/App.Main.s index b9e3d0f..feba6b1 100644 --- a/demos/kfest-2022/demo-9/App.Main.s +++ b/demos/kfest-2022/demo-9/App.Main.s @@ -172,16 +172,64 @@ HERO_SLOT_2 equ 2 pea HERO_VBUFF_4 _GTECreateSpriteStamp - pea HERO_SLOT_1 ; Put the player in slot 1 - pea HERO_FLAGS + DO 0 + lda #SPRITE_16X16 + sta SpriteFlags1 + lda #SPRITE_16X8 + sta SpriteFlags2 + ELSE + lda #SPRITE_16X16+SPRITE_COMPILED + sta SpriteFlags1 + lda #SPRITE_16X8+SPRITE_COMPILED + sta SpriteFlags2 + + pha ; Space for result + pea HERO_SIZE pea HERO_VBUFF_1 + _GTECompileSpriteStamp + pla + sta HeroFrames1+2 + sta HeroFrames1+6 + + pha ; Space for result + pea HERO_SIZE + pea HERO_VBUFF_2 + _GTECompileSpriteStamp + pla + sta HeroFrames1+0 + sta HeroFrames1+4 + + pha ; Space for result + pea HERO_SIZE + pea HERO_VBUFF_3 + _GTECompileSpriteStamp + pla + sta HeroFrames2+2 + sta HeroFrames2+6 + + pha ; Space for result + pea HERO_SIZE + pea HERO_VBUFF_4 + _GTECompileSpriteStamp + pla + sta HeroFrames2+0 + sta HeroFrames2+4 + FIN + + pea HERO_SLOT_1 ; Put the player in slot 1 + lda SpriteFlags1 + pha + lda HeroFrames1 + pha pei PlayerX pei PlayerY _GTEAddSprite pea HERO_SLOT_2 - pea HERO_FLAGS - pea HERO_VBUFF_2 + lda SpriteFlags2 + pha + lda HeroFrames2 + pha pei PlayerX lda PlayerY clc @@ -294,7 +342,9 @@ do_render pha _GTESetBG1Origin - pea #RENDER_BG1_HORZ_OFFSET +; pea #RENDER_BG1_HORZ_OFFSET + pea #RENDER_WITH_SHADOWING +; pea #0 _GTERender ; Update the performance counters @@ -525,6 +575,10 @@ Fatal brk $00 qtRec adrl $0000 da $00 +; Sprite VBUFF / Compile tokens +SpriteFlags1 ds 2 +SpriteFlags2 ds 2 + ; Color palette MyDirectPage ds 2 diff --git a/demos/shell/App.Main.s b/demos/shell/App.Main.s index 28c7222..add3cdd 100644 --- a/demos/shell/App.Main.s +++ b/demos/shell/App.Main.s @@ -301,9 +301,12 @@ DoLoadBG1 ldx #BG1AltDataFile jsr LoadFile + lda altBG1Bank + jsl SetBG1Bank + ldx BankLoad lda #0 - ldy BG1AltBank + ldy BG1DataBank jsl CopyBinToBG1 rts diff --git a/demos/shell/Overlay.s b/demos/shell/Overlay.s index a72abf0..a440541 100644 --- a/demos/shell/Overlay.s +++ b/demos/shell/Overlay.s @@ -105,7 +105,7 @@ InitOverlay ldx #r_line+{CHAR_WIDTH*4} jsr _DrawChar - pea $0000 + pea $0000 ; logical lines for the overlay bar pea $0008 pea #^StatusBar pea #StatusBar @@ -174,6 +174,8 @@ oneSecondCounter ds 2 ; Draw the overlay ; A = address of the left edge of the screen +; X = top line to start drawing the overlay (typically 0) +; Y = bottom line to stop drawing the overlayer (typically the overlay height set during call to _SetOverlay) StatusBar phb ; Called via JSL phd ; save the direct page register From 04681447a5b4c0b6f70af3a07afe89961dfd95d9 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Mon, 6 Mar 2023 14:57:52 -0600 Subject: [PATCH 47/68] Checkpoint --- tools/scanline-test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/scanline-test.py b/tools/scanline-test.py index 396e06e..96f6faa 100644 --- a/tools/scanline-test.py +++ b/tools/scanline-test.py @@ -35,8 +35,8 @@ def simplify(a): return b # Given two sorted lists, merge them together into a minimal set of ranges. This could -# be done as a list merge nd then a combine step, but we want to be more efficient and -# do the merge-and-compbine at the same time +# be done as a list merge and then a combine step, but we want to be more efficient and +# do the merge-and-combine at the same time def merge(a, b): if len(a) == 0: return simplify(b) From 011f5c041991160e4c3b6a63397d3671e8b4e0a4 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Mon, 6 Mar 2023 15:14:22 -0600 Subject: [PATCH 48/68] Doc updates --- docs/toolboxref.html | 118 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 106 insertions(+), 12 deletions(-) diff --git a/docs/toolboxref.html b/docs/toolboxref.html index 988b373..3f80e4c 100644 --- a/docs/toolboxref.html +++ b/docs/toolboxref.html @@ -89,7 +89,11 @@ style: toolref - + + + + + @@ -794,12 +798,12 @@ style: toolref - + - + @@ -1424,6 +1428,90 @@ style: toolref +
+

$2DXX

+

GTECompileSpriteStamp

+

+ Creates a compiled sprite in a special compilation buffer from an existing sprite stamp. The return value + is an address token that can be passed into the AddSprite function in place of the vBuffAddr parameter as + long as the `SPRITE_COMPILED` flag is set. +

+
+
Parameters
+
previous contents
startWord—index of the first tile to copy
finishWord—terminating index. This tile is not copied.
tileSetPtr
GTECreateSpriteStamp Creates a sprite stamp from the tile setCreates a sprite stamp from the tile set
GTECompilepriteStampCreated a compiled sprite from a sprite stamp
GTEAddSprite
width Word—Width of the playfield in pixels. Must be even.Word—Width of the playfield in bytes. Must be even.
height Word—Height of the playfield in pixels.Word—Height of the playfield in scanlines.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Stack before call
previous contents
wordspaceWord—Space for result
spriteIdentWord—sprite identifier word
vBuffAddrWord—Location in the sprite vitual buffer.
SP
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Stack after call
previous contents
addrWord—Location in the sprite compilation buffer.
SP
+
+
+
Errors
+

None

+
+
+
C
+

extern pascal Word GTECompileSpriteStamp(spriteIdent, vBuffAddr)

+

Word spriteIdent;

+

Word vBuffAddr;

+
+
+

$10XX

GTEAddSprite

@@ -1451,9 +1539,19 @@ style: toolref previous contents - spriteDescriptor + spriteSlot - Word—Sprite descriptor word that is used to set the status bits. + Word—The slot to assign the sprite to. There are 16 slots and sprites in lower slots are drawn above the sprites in higher slots. + + + spriteFlags + + Word—Sprite flags that define the sprite's properties. + + + vBuffAddr + + Word—Sprite address in the VBUFF space, or a compiled sprite address x @@ -1465,11 +1563,6 @@ style: toolref Word—Signed vertical sprite position on the playfield. - - spriteSlot - - Word—The slot to assign the sprite to. There are 16 slots and sprites in lower slots are drawn above the sprites in higher slots. - @@ -1505,11 +1598,12 @@ style: toolref
C
-

extern pascal void GTEAddSprite(spriteDescriptor, x, y, spriteSlot)

+

extern pascal void GTEAddSprite(spriteSlot, spriteFlags, vBuffAddr, x, y)

+

Word spriteSlot;

Word spriteDescriptor;

+

Word vBuffAddr;

Word x;

Word y;

-

Word spriteSlot;

Sprite Descriptor
From 85cce2fe8203cd3de14384819eea0ec069e1d2e5 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Mon, 6 Mar 2023 15:18:26 -0600 Subject: [PATCH 49/68] Fix docs typo --- docs/toolboxref.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/toolboxref.html b/docs/toolboxref.html index 3f80e4c..4fe87b4 100644 --- a/docs/toolboxref.html +++ b/docs/toolboxref.html @@ -92,7 +92,7 @@ style: toolref Creates a sprite stamp from the tile set - GTECompilepriteStamp + GTECompileSpriteStamp Created a compiled sprite from a sprite stamp From 536959619fb7ea3e0f55efa0cc294574d4d75f7a Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Tue, 7 Mar 2023 17:32:46 -0600 Subject: [PATCH 50/68] Refine the horizontal dispatch Find small optimizations to improve the average performance of the blitter, especially in the odd-aligned case. - Odd-aligned PEA exit is 2 cycles faster per line - Odd-aligned JMP exit is 2 cycles faster per line - Odd-aligned LDA exit is 6 cycles faster (eliminated long store) - Merged setting the entry opcode and offset to convert 2 8-bit store into a single 16-bit store (save 6 cycles per line) - Load and save the full word for the high bytes. Cost 2 cycles but enabled the 6 cycles saved for the LDA case. --- src/Defs.s | 1 + src/blitter/Horz.s | 465 ++++++++++++++++++++++++++++++++++++----- src/blitter/Template.s | 39 ++-- src/static/TileStore.s | 3 + 4 files changed, 441 insertions(+), 67 deletions(-) diff --git a/src/Defs.s b/src/Defs.s index 4d181cf..8d7bae1 100644 --- a/src/Defs.s +++ b/src/Defs.s @@ -292,6 +292,7 @@ _DirectListCount EXT _DirectListTop EXT _DirectListBottom EXT +StartXMod164Tbl EXT ; Tool error codes NO_TIMERS_AVAILABLE equ 10 diff --git a/src/blitter/Horz.s b/src/blitter/Horz.s index 55384fc..bc23f13 100644 --- a/src/blitter/Horz.s +++ b/src/blitter/Horz.s @@ -2,6 +2,35 @@ ; these routines are to adjust tables and patch in new values into the code field ; when the virtual X-position of the play field changes. +; NOTE: There is still quite a bit of work done in the blitter to figure out if an +; opcode is a PEA, LDA or JMP. If there _some_ way that we could engineer a single +; target opcode change that would allow us to take different code branches in the +; blitter based on the opcode since the save/restore code has a change to look +; at the opcode now; before the blitter executes. +; +; PEA = $F4 = %1111 0100 +; LDA (),y = $B1 = %1011 0001 +; LDA 0,x = $B5 = %1011 0101 +; JMP addr = $4C = %0100 1100 +; +; IDEA: Save the 2-byte code directly after a BRA opcode to unconditionally branch out after masking. Would be a +; bit tricky to handle the forward and backward branches. +; +; Improvement. The current "fast path" for the PEA operand is +; +; ldal l_is_jmp+1-base ; 6 +; bit #$000B ; 3 +; bne :chk_jmp ; 2 +; sep #$20 ; 3 +; ldal l_is_jmp+3-base ; 5 +; pha ; 3 = 22 cycles +; +; If we do an immediate branch to a routine that we _know_ is the right one, the code reduces to +; +; bra pea ; 3 +; sep #$20 ; 3 +; ldal l_is_jmp+3-base ; 5 +; pha ; 3 = 17 cycles ; Simple function that restores the saved opcode that are stashed in _applyBG0Xpos. It is ; very important that opcodes are restored before new ones are inserted, because there is @@ -244,34 +273,39 @@ _ApplyBG0XPos cmp #164 ; Keep the value in range bcc *+5 sbc #164 -:hop2 ; Same logic as above. If the right edge is odd, then the full word needs to be drawn and we ; will enter at that index, rounded down. ; ; If the right edge is even, then only the low byte needs to be drawn, which is handled before ; entering the code field. So enter one word before the right edge. +; +; We performan an optimization here and fuse the entry_offset byte with the opcode that is +; changed depending on even/odd alignment in order to do the work with a single 16-bit +; store instead of two 8-bit stores. bit #$0001 beq :odd_entry and #$FFFE tax - lda Col2CodeOffset,x - sta :entry_offset - lda #$004C ; set the entry_jmp opcode to JMP + lda Col2CodeOffset-1,x ; Only use the one byte for the entry_offset + and #$FF00 + ora #$004C ; Merge in the JMP instruction sta :opcode + stz :odd_entry_offset ; mark as an even case bra :prep_complete :odd_entry tax - lda Col2CodeOffset,x - sta :entry_offset ; Will be used to load the data + lda Col2CodeOffset-1,x + and #$FF00 + ora #$00AF + sta :opcode + lda Col2CodeOffset-2,x sta :odd_entry_offset ; will the the actual location to jump to - lda #$00AF ; set the entry_jmp opcode to LDAL - sta :opcode :prep_complete ; Main loop that @@ -286,26 +320,28 @@ _ApplyBG0XPos :loop ldx :virt_line_x2 - ldal BTableLow,x ; Get the address of the first code field line - tay ; Save it to use as the base address - clc - adc :exit_offset ; Add some offsets to get the base address in the code field line - sta :exit_address - sty :base_address - - ldal BTableHigh,x + ldal BTableHigh,x ; Get the bank pha plb - txa + ldal BTableLow,x ; Get the address of the first code field line + tay ; Save it to use as the base address + + txa ; Calculate number of lines to draw on this iteration and #$001E eor #$FFFF sec adc #32 min :lines_left_x2 - sta :draw_count_x2 + tax ; Use for the first iteration + + tya + clc + adc :exit_offset ; Add some offsets to get the base address in the code field line + sta :exit_address + sty :base_address ; First step is to set the BRA instruction to exit the code field at the proper location. There ; are two sub-steps to do here; we need to save the 16-bit value that exists at the location and @@ -315,12 +351,8 @@ _ApplyBG0XPos ; used in odd-aligned cases to determine how to draw the 8-bit value on the left edge of the ; screen ; y is already set to :base_address - tax ; :draw_count_x2 - clc ; advance to the virtual line after the segment we just - adc :virt_line_x2 ; filled in - sta :virt_line_x2 - - lda :exit_address ; Save from this location (not needed in fast mode) +; ldx :draw_count_x2 ; :draw_count_x2 +; lda :exit_address ; Save from this location (not needed in fast mode) SaveOpcode ; X = :exit_address on return txy ; ldy :exit_address -- starting at this address @@ -330,15 +362,10 @@ _ApplyBG0XPos ; Next, patch in the CODE_ENTRY value, which is the low byte of a JMP instruction. This is an ; 8-bit operation and, since the PEA code is bank aligned, we use the entry_offset value directly +; +; Now, patch in the opcode + code entry_offset - sep #$20 - - lda :entry_offset ldy :base_address - SetCodeEntry ; All registers are preserved - -; Now, patch in the opcode - lda :opcode SetCodeEntryOpcode ; All registers are preserved @@ -347,15 +374,22 @@ _ApplyBG0XPos lda :odd_entry_offset jeq :not_odd + sep #$20 SetOddCodeEntry ; All registers are preserved + rep #$20 + SaveHighOperand :exit_address ; Only used once, so "inline" it :not_odd - rep #$21 ; clear the carry ; Do the end of the loop -- update the virtual line counter and reduce the number ; of lines left to render + clc + lda :virt_line_x2 ; advance to the virtual line after + adc :draw_count_x2 ; filled in + sta :virt_line_x2 + lda :lines_left_x2 ; subtract the number of lines we just completed sec sbc :draw_count_x2 @@ -368,6 +402,341 @@ _ApplyBG0XPos plb rts +; This is a variant of the above routine that allows each x-position to be set independently from a table of value. This is +; quite a bit slower than the other routine since we cannot store constant values for each line. +; +; We still want to perform operation in blocks of 16 to avoid repeatedly setting the data bank register for each line. In +; order to accomplish this, the even/odd cases are split into separate code blocks and the unrolled loop will patch up +; all of the memory locations on each line, rather than doing each patch one at a time. This may actually be more efficient +; since it eliminates several jmp (abs,x) / tax instructions and removed some register reloading. +; +; The two unrolled loop elements are: +; +; Even: +; lda: $0000,x ; Load from BTableLow + exit_offset +; sta: OPCODE_SAVE,y ; Save the two byte in another area of the line code +; lda :exit_bra +; sta $0000,x ; Replace the two bytes with a BRA instruction to exit the blitter +; lda :opcode|:entry_offset +; sta: CODE_ENTRY_OPCODE,y ; CODE_ENTRY_OPCODE and CODE_ENTRY are adjacent -- could make this a single 16-bit store +; +; Odd: +; Same as above, plus... +; lda :odd_entry_offset ; Get back into the code after fixing up the odd edge +; sta: ODD_ENTRY,y +; lda: $0002,x ; Save the high byte in case the last instruction is PEA and we need to load the top byte +; sta: OPCODE_HIGH_SAVE,y +; +_ApplyBG0XPosPerScanline +:stk_save equ tmp0 +:virt_line_x2 equ tmp1 +:lines_left_x2 equ tmp2 +:draw_count_x2 equ tmp3 +:exit_offset equ tmp4 +:entry_offset equ tmp5 +:exit_bra equ tmp6 +:exit_address equ tmp7 +:base_address equ tmp8 +:opcode equ tmp9 +:odd_entry_offset equ tmp10 + +; If there are saved opcodes that have not been restored, do not run this routine + lda LastPatchOffset + beq :ok + rts + +; In this routine, basically every horizontal parameter is based off of the :virt_line_x2 index +:ok + lda StartYMod208 ; This is the base line of the virtual screen + asl + sta :virt_line_x2 ; Keep track of it + + lda ScreenHeight + asl + sta :lines_left_x2 + +; Sketch out the core structural elements of the loop + bank management + + phb ; Save the existing bank + tsc + sta :stk_save + +:loop + ldx :virt_line_x2 + + txa + and #$001E + eor #$FFFF + sec + adc #2*16 ; 2 * (16 - virt_line % 16). This get us aligned to 16-line boundaries + min :lines_left_x2 ; Make sure we handle cases where lines_left < aligned remainder + sta :draw_count_x2 ; We are drawing this many lines on this iteration starting at _virt_line_x2 + + ldal BTableHigh,x ; Set the bank + pha + plb + + jsr :DoScanlineRange ; Patch in the code field for this range (Bank is set) + + lda :draw_count_x2 + clc ; advance to the virtual line after the segment we just + adc :virt_line_x2 ; filled in + sta :virt_line_x2 + + lda :lines_left_x2 ; subtract the number of lines we just completed + sec + sbc :draw_count_x2 + sta :lines_left_x2 + jne :loop + + lda :stk_save + tcs + plb + rts + +:DoScanlineRange + ldx :virt_line_x2 + +; First, calculate the exit point + + ldal StartXMod164Tbl,x ; Get the origin for this line + bit #$0001 + bne :is_odd ; Quickly switch to specialized even/odd routines + +; This is an even-aligned line + + dec ; Move to the previous address for entry (a - 1) % 164 + dec ; Optimization: Coule eliminate this with a double-width tbale for CodeFieldEvenBRA + bpl *+5 + lda #162 + +; and #$FFFE ; Must be even by construction + tay + lda CodeFieldEvenBRA,y + sta :exit_bra ; Store are exit_offset + + lda Col2CodeOffset,y + sta :exit_offset + + tya + adc ScreenWidth + cmp #164 ; Keep the value in range + bcc *+5 + sbc #164 + tay + + lda Col2CodeOffset,y + sta :entry_offset +; lda #$004C ; set the entry_jmp opcode to JMP +; sta :opcode +; stz :odd_entry_offset ; mark as an even case + + ldal BTableLow,x ; Get the address of the code field line + tay ; Save it to use as the base address + clc + adc :exit_offset ; Add some offsets to get the base address in the code field line + tax + + clc +; This is the core even patch loop. The y-register tracks the base address of the starting line. Set the x-register +; based on the per-line exit_offset and eveything else references other data + +; tya +; adc :exit_offset+{]line*2} +; tax +; lda: {]line*$1000},x +; sta: OPCODE_SAVE+{]line*$1000},y +; lda :exit_bra+{]line*2} ; Copy this value into all of the lines +; sta: {]line*$1000},x +; lda :entry_offset+{]line*2} ; Pre-merged with the appropriate opcode + offset +; sta: CODE_ENTRY_OPCODE+{]line*$1000},y + + bra :prep_complete + +; This is an odd-aligned line +:is_odd + dec ; Remove the least-significant byte (must stay positive) + tay + lda CodeFieldOddBRA,y + sta :exit_bra + lda Col2CodeOffset,y + sta :exit_offset + + tya + adc ScreenWidth + cmp #164 ; Keep the value in range + bcc *+5 + sbc #164 + tay + lda Col2CodeOffset,y + sta :entry_offset ; Will be used to load the data + lda Col2CodeOffset-2,y + sta :odd_entry_offset ; will be the actual location to jump to + lda #$00AF ; set the entry_jmp opcode to LDAL + sta :opcode + +:prep_complete + ldal BTableLow,x ; Get the address of the code field line + tay ; Save it to use as the base address + clc + adc :exit_offset ; Add some offsets to get the base address in the code field line + +; sta :exit_address +; sty :base_address + + +; ldy :base_address +; ldx :exit_address ; Save from this location (not needed in fast mode) +; SaveOpcode ; X = :exit_address on return + tax + lda: $0000,x + sta: OPCODE_SAVE+$0000,y + + +; txy ; ldy :exit_address -- starting at this address +; ldx :draw_count_x2 ; Do this many lines + lda :exit_bra ; Copy this value into all of the lines +; SetConst ; All registers are preserved + sta: $0000,x + +; Next, patch in the CODE_ENTRY value, which is the low byte of a JMP instruction. This is an +; 8-bit operation and, since the PEA code is bank aligned, we use the entry_offset value directly + + sep #$20 + + lda :entry_offset +; ldy :base_address +; SetCodeEntry ; All registers are preserved + sta: CODE_ENTRY+$0000,y + +; Now, patch in the opcode + + lda :opcode +; SetCodeEntryOpcode ; All registers are preserved + sta: CODE_ENTRY_OPCODE+$0000,y + +; If this is an odd entry, also set the odd_entry low byte and save the operand high byte + + lda :odd_entry_offset + jeq :not_odd + +; SetOddCodeEntry ; All registers are preserved + sta: ODD_ENTRY+$0000,y +; SaveHighOperand :exit_address ; Only used once, so "inline" it + ldx :exit_address + lda: $0002,x + sta: OPCODE_HIGH_SAVE+$0000,y + +:not_odd + rep #$21 ; clear the carry + + lda :virt_line_x2 ; advance to the virtual line after + adc :draw_count_x2 ; filled in + sta :virt_line_x2 + + lda :lines_left_x2 ; subtract the number of lines we just completed + sec + sbc :draw_count_x2 + sta :lines_left_x2 + + jne :loop + + rts + + +; DoEvenRange +; +; Does all the core operations for an even range (16-bit accumulator and registers) +; +; X = number of lines * 2, 0 to 32 +; Y = starting line * $1000 +; A = code field location * $1000 +DoEvenRange mac + asl ; mult the offset by 2 and clear the carry at the same time + adc #dispTbl + stal patch+1 +patch jmp $0000 +dispTbl jmp bottom + db 1 + jmp x01 + db 1 + jmp x02 + db 1 + jmp x03 + db 1 + jmp x04 + db 1 + jmp x05 + db 1 + jmp x06 + db 1 + jmp x07 + db 1 + jmp x08 + db 1 + jmp x09 + db 1 + jmp x10 + db 1 + jmp x11 + db 1 + jmp x12 + db 1 + jmp x13 + db 1 + jmp x14 + db 1 + jmp x15 + db 1 +x16 tya + adc :exit_offset+$1E + tax + lda: $F000,x + sta: OPCODE_SAVE+$F000,y + lda :exit_bra+$1E + sta: $F000,x + lda :entry_offset+$1E ; Pre-merged with the appropriate opcode + offset + sta: CODE_ENTRY_OPCODE+$F000,y + +x15 tya + adc :exit_offset+$1E + tax + lda: $E000,x + sta: OPCODE_SAVE+$E000,y + lda :exit_bra+$1C + sta: $E000,x + lda :entry_offset+$1C + sta: CODE_ENTRY_OPCODE+$E000,y + +x14 lda $D002,x + sta OPCODE_HIGH_SAVE+$D000,y +x13 lda $C002,x + sta OPCODE_HIGH_SAVE+$C000,y +x12 lda $B002,x + sta OPCODE_HIGH_SAVE+$B000,y +x11 lda $A002,x + sta OPCODE_HIGH_SAVE+$A000,y +x10 lda $9002,x + sta OPCODE_HIGH_SAVE+$9000,y +x09 lda $8002,x + sta OPCODE_HIGH_SAVE+$8000,y +x08 lda $7002,x + sta OPCODE_HIGH_SAVE+$7000,y +x07 lda $6002,x + sta OPCODE_HIGH_SAVE+$6000,y +x06 lda $5002,x + sta OPCODE_HIGH_SAVE+$5000,y +x05 lda $4002,x + sta OPCODE_HIGH_SAVE+$4000,y +x04 lda $3002,x + sta OPCODE_HIGH_SAVE+$3000,y +x03 lda $2002,x + sta OPCODE_HIGH_SAVE+$2000,y +x02 lda $1002,x + sta OPCODE_HIGH_SAVE+$1000,y +x01 lda: $0002,x + sta: OPCODE_HIGH_SAVE+$0000,y +bottom <<< + ; SaveHighOperand ; ; Save the high byte of the 3-byte code field instruction into the odd handler at the end @@ -415,37 +784,37 @@ do02 ldx ]1 do01 ldx ]1 bra x01 do16 ldx ]1 -x16 lda $F002,x +x16 lda $F001,x sta OPCODE_HIGH_SAVE+$F000,y -x15 lda $E002,x +x15 lda $E001,x sta OPCODE_HIGH_SAVE+$E000,y -x14 lda $D002,x +x14 lda $D001,x sta OPCODE_HIGH_SAVE+$D000,y -x13 lda $C002,x +x13 lda $C001,x sta OPCODE_HIGH_SAVE+$C000,y -x12 lda $B002,x +x12 lda $B001,x sta OPCODE_HIGH_SAVE+$B000,y -x11 lda $A002,x +x11 lda $A001,x sta OPCODE_HIGH_SAVE+$A000,y -x10 lda $9002,x +x10 lda $9001,x sta OPCODE_HIGH_SAVE+$9000,y -x09 lda $8002,x +x09 lda $8001,x sta OPCODE_HIGH_SAVE+$8000,y -x08 lda $7002,x +x08 lda $7001,x sta OPCODE_HIGH_SAVE+$7000,y -x07 lda $6002,x +x07 lda $6001,x sta OPCODE_HIGH_SAVE+$6000,y -x06 lda $5002,x +x06 lda $5001,x sta OPCODE_HIGH_SAVE+$5000,y -x05 lda $4002,x +x05 lda $4001,x sta OPCODE_HIGH_SAVE+$4000,y -x04 lda $3002,x +x04 lda $3001,x sta OPCODE_HIGH_SAVE+$3000,y -x03 lda $2002,x +x03 lda $2001,x sta OPCODE_HIGH_SAVE+$2000,y -x02 lda $1002,x +x02 lda $1001,x sta OPCODE_HIGH_SAVE+$1000,y -x01 lda: $0002,x +x01 lda: $0001,x sta: OPCODE_HIGH_SAVE+$0000,y bottom <<< diff --git a/src/blitter/Template.s b/src/blitter/Template.s index eb10054..ada2248 100644 --- a/src/blitter/Template.s +++ b/src/blitter/Template.s @@ -18,8 +18,8 @@ ODD_ENTRY equ odd_entry-base+1 CODE_TOP equ loop-base CODE_LEN equ top-base CODE_EXIT equ even_exit-base -OPCODE_SAVE equ odd_save-base ; spot to save the code field opcode when patching exit BRA -OPCODE_HIGH_SAVE equ odd_save-base+2 ; save the third byte +OPCODE_SAVE equ odd_low_save-base ; spot to save the code field opcode when patching exit BRA +OPCODE_HIGH_SAVE equ odd_high_save-base ; save the second and third byte FULL_RETURN equ full_return-base ; offset that returns from the blitter ENABLE_INT equ enable_int-base ; offset that re-enable interrupts and continues LINES_PER_BANK equ 16 @@ -37,7 +37,7 @@ PagePatches da {long_0-base+2} da {long_1-base+2} da {long_2-base+2} da {long_3-base+2} - da {long_4-base+2} +; da {long_4-base+2} da {long_5-base+2} da {long_6-base+2} da {odd_entry-base+2} @@ -62,7 +62,7 @@ BankPatches da {long_0-base+3} da {long_1-base+3} da {long_2-base+3} da {long_3-base+3} - da {long_4-base+3} +; da {long_4-base+3} da {long_5-base+3} da {long_6-base+3} BankPatchNum equ *-BankPatches @@ -178,38 +178,39 @@ loop lup 82 ; +6 Set up 82 PEA instruc loop_back jmp loop-base ; +252 Ensure execution continues to loop around loop_exit_3 jmp even_exit-base ; +255 -long_5 -odd_exit ldal l_is_jmp+1-base - bit #$000B +odd_exit sep #$21 ; 8-bit mode and set the carry just in case we get to a snippet JMP +long_5 ldal OPCODE_SAVE ; Load the opcode that was saved + bit #$0B bne :chk_jmp - - sep #$20 -long_6 ldal l_is_jmp+3-base ; get the high byte of the PEA operand +long_6 ldal OPCODE_HIGH_SAVE+1 ; get the high byte of the PEA operand ; Fall-through when we have to push a byte on the left edge. Must be 8-bit on entry. Optimized -; for the PEA $0000 case -- only 19 cycles to handle the edge, so pretty good -:left_byte +; for the PEA $0000 case -- only 17 cycles to handle the edge, so pretty good + pha - rep #$20 + rep #$21 ; JMP opcode = $4C, JML opcode = $5C even_exit jmp $1000 ; Jump to the next line. ds 1 ; space so that the last line in a bank can be patched into a JML -:chk_jmp - bit #$0040 +:chk_jmp mx %10 ; 8-bit accumulator / 16-bit registers + bit #$40 bne l_is_jmp -long_4 stal *+4-base - dfb $00,$00 + rep #$20 ; saved 3 cycles using 8-bit mode, but give it back here. +odd_low_save dfb $00,$00 ; save the first and second bytes of the code field. Works for LDA dp,x and LDA (0),y l_jmp_rtn xba sep #$20 pha rep #$61 ; Clear everything C, V and M bra even_exit -l_is_jmp sec ; Set the C flag (V is always cleared at this point) which tells a snippet to push only the high byte -odd_save dfb $00,$00,$00 ; The odd exit 3-byte sequence is always stashed here +l_is_jmp + rep #$20 ; Back to 16-bit mode (carry was set above) +; sec ; Set the C flag (V is always cleared at this point) which tells a snippet to push only the high byte + dfb $4C ; Expect a JMP instruction +odd_high_save dfb $00,$00 ; The high 2 bytes of the 3-byte code field sequence is always stashed here ; Special epilogue: skip a number of bytes and jump back into the code field. This is useful for ; large, floating panels in the attract mode of a game, or to overlay solid diff --git a/src/static/TileStore.s b/src/static/TileStore.s index 0042dca..1b2b6cd 100644 --- a/src/static/TileStore.s +++ b/src/static/TileStore.s @@ -382,6 +382,9 @@ BG1YOffsetTable ENT ; dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 --^ +; Per-scanline offsets for BG0 +StartXMod164Tbl ENT + ; Other Toolset variables OneSecondCounter ENT dw 0 From a70412211c2db86e252d7a2783d13b284a618459 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Wed, 8 Mar 2023 12:49:45 -0600 Subject: [PATCH 51/68] Simplify and specialize the even/odd patching Allows the odd case to be slightly more efficient and the code is cleaned up by not having to handle both even and odd alignment cases at multiple points. --- src/blitter/Horz.s | 350 +++++++++++++++++++++++++++++++---------- src/static/TileStore.s | 2 + 2 files changed, 265 insertions(+), 87 deletions(-) diff --git a/src/blitter/Horz.s b/src/blitter/Horz.s index bc23f13..3655e53 100644 --- a/src/blitter/Horz.s +++ b/src/blitter/Horz.s @@ -31,9 +31,12 @@ ; sep #$20 ; 3 ; ldal l_is_jmp+3-base ; 5 ; pha ; 3 = 17 cycles +; +; Even if some additional branch is needed, it is likely to be a small improvement for the PEA case +; and a significant improvement for the other cases since it avoids the chain of BIT instructions ; Simple function that restores the saved opcode that are stashed in _applyBG0Xpos. It is -; very important that opcodes are restored before new ones are inserted, because there is +; very important that opcodes are restored before new ones are inserted, because there is ; only one, fixed storage location and old values will be overwritten if operations are not ; performed in order. ; @@ -229,46 +232,26 @@ _ApplyBG0XPos ; +-----------+ lda StartXMod164 - -; Right now we have the offset of the left-edge visible byte. Move one byte earlier to figure out -; where the exit will be patched in - - dec ; (a - 1) % 164 - bpl *+5 - lda #163 + bit #$0001 + jne :odd_case ; Specialized routines for even/odd cases ; If the exit byte is odd, then the left edge is even-aligned and we round down and exit at at ; that word. ; ; If the exit byte is even, then the left edge is odd-aligned and we exit at this word. - bit #$0001 - beq :odd_exit - -; This is the even code path - - and #$FFFE tax - lda CodeFieldEvenBRA,x + lda CodeFieldEvenBRA-2,x sta :exit_bra - lda Col2CodeOffset,x - sta :exit_offset - sta LastPatchOffset ; Cache as a flag for later - bra :do_entry - -; This is the odd code path -:odd_exit tax - lda CodeFieldOddBRA,x - sta :exit_bra - lda Col2CodeOffset,x + lda Col2CodeOffset-2,x sta :exit_offset sta LastPatchOffset ; Cache as a flag for later ; Calculate the entry point into the code field by calculating the right edge -:do_entry lda StartXMod164 + + txa ; lda StartXMod164 clc - adc ScreenWidth ; move to the right edge and back up a byte - dec ; to get the index of the first on-screen byte + adc ScreenWidth ; move to the right edge cmp #164 ; Keep the value in range bcc *+5 @@ -284,30 +267,12 @@ _ApplyBG0XPos ; changed depending on even/odd alignment in order to do the work with a single 16-bit ; store instead of two 8-bit stores. - bit #$0001 - beq :odd_entry - - and #$FFFE tax - lda Col2CodeOffset-1,x ; Only use the one byte for the entry_offset + lda Col2CodeOffset-3,x ; Only use the one byte for the entry_offset and #$FF00 ora #$004C ; Merge in the JMP instruction sta :opcode - stz :odd_entry_offset ; mark as an even case - bra :prep_complete - -:odd_entry - tax - lda Col2CodeOffset-1,x - and #$FF00 - ora #$00AF - sta :opcode - - lda Col2CodeOffset-2,x - sta :odd_entry_offset ; will the the actual location to jump to -:prep_complete - ; Main loop that ; ; 1. Saves the opcodes in the code field @@ -318,7 +283,7 @@ _ApplyBG0XPos tsc sta :stk_save -:loop +:even_loop ldx :virt_line_x2 ldal BTableHigh,x ; Get the bank @@ -360,28 +325,12 @@ _ApplyBG0XPos lda :exit_bra ; Copy this value into all of the lines SetConst ; All registers are preserved -; Next, patch in the CODE_ENTRY value, which is the low byte of a JMP instruction. This is an -; 8-bit operation and, since the PEA code is bank aligned, we use the entry_offset value directly -; ; Now, patch in the opcode + code entry_offset ldy :base_address lda :opcode SetCodeEntryOpcode ; All registers are preserved -; If this is an odd entry, also set the odd_entry low byte and save the operand high byte - - lda :odd_entry_offset - jeq :not_odd - - sep #$20 - SetOddCodeEntry ; All registers are preserved - rep #$20 - - SaveHighOperand :exit_address ; Only used once, so "inline" it - -:not_odd - ; Do the end of the loop -- update the virtual line counter and reduce the number ; of lines left to render @@ -395,7 +344,101 @@ _ApplyBG0XPos sbc :draw_count_x2 sta :lines_left_x2 - jne :loop + jne :even_loop + + lda :stk_save + tcs + plb + rts + +:odd_case + dec + tax + lda CodeFieldOddBRA,x + sta :exit_bra + lda Col2CodeOffset,x + sta :exit_offset + sta LastPatchOffset ; Cache as a flag for later + + txa ; StartXMod164 - 1 + clc + adc ScreenWidth + cmp #164 ; Keep the value in range + bcc *+5 + sbc #164 + + tax + lda Col2CodeOffset-1,x + and #$FF00 + ora #$00AF + sta :opcode + + lda Col2CodeOffset-2,x + sta :odd_entry_offset + +; Main loop + + phb ; Save the existing bank + tsc + sta :stk_save + +:odd_loop + ldx :virt_line_x2 + + ldal BTableHigh,x ; Get the bank + pha + plb + + ldal BTableLow,x ; Get the address of the first code field line + tay ; Save it to use as the base address + + txa ; Calculate number of lines to draw on this iteration + and #$001E + eor #$FFFF + sec + adc #32 + min :lines_left_x2 + sta :draw_count_x2 + tax ; Use for the first iteration + + tya + clc + adc :exit_offset ; Add some offsets to get the base address in the code field line + sta :exit_address + sty :base_address + +; At this point y = :base_address, x = :draw_count_x2 and the accumulator is the exit_address + + SaveOpcodeAndOperand ; X = :exit_address on return + + txy ; ldy :exit_address -- starting at this address + ldx :draw_count_x2 ; Do this many lines + lda :exit_bra ; Copy this value into all of the lines + SetConst ; All registers are preserved + +; Now, patch in the opcode + code entry_offset + + ldy :base_address + lda :opcode + SetCodeEntryOpcode ; All registers are preserved + +; The odd case need to do a bit of extra work + + sep #$20 + lda :odd_entry_offset + SetOddCodeEntry ; All registers are preserved + rep #$21 ; Clear the carry + + lda :virt_line_x2 ; advance to the virtual line after + adc :draw_count_x2 ; filled in + sta :virt_line_x2 + + lda :lines_left_x2 ; subtract the number of lines we just completed + sec + sbc :draw_count_x2 + sta :lines_left_x2 + + jne :odd_loop lda :stk_save tcs @@ -413,18 +456,18 @@ _ApplyBG0XPos ; The two unrolled loop elements are: ; ; Even: -; lda: $0000,x ; Load from BTableLow + exit_offset +; lda: $0000,x ; Load from X = BTableLow + exit_offset ; sta: OPCODE_SAVE,y ; Save the two byte in another area of the line code -; lda :exit_bra +; lda :exit_bra[n] ; sta $0000,x ; Replace the two bytes with a BRA instruction to exit the blitter -; lda :opcode|:entry_offset +; lda :opcode[n] ; sta: CODE_ENTRY_OPCODE,y ; CODE_ENTRY_OPCODE and CODE_ENTRY are adjacent -- could make this a single 16-bit store ; ; Odd: ; Same as above, plus... -; lda :odd_entry_offset ; Get back into the code after fixing up the odd edge +; lda :odd_entry_offset[n] ; [8-bit] Get back into the code after fixing up the odd edge ; sta: ODD_ENTRY,y -; lda: $0002,x ; Save the high byte in case the last instruction is PEA and we need to load the top byte +; lda: $0001,x ; Save the high word in case the last instruction is PEA and we need to load the top byte ; sta: OPCODE_HIGH_SAVE,y ; _ApplyBG0XPosPerScanline @@ -494,6 +537,21 @@ _ApplyBG0XPosPerScanline plb rts +; Run through and build an array of scanline data and place it in temporary zero page space. Need a total of 48 bytes. +:BuildScanlineData + +; First step, run though and create the tables for the copy routine + lda StartXMod164Tbl,x + bit #$0001 +; bne :bsd_odd + + tay + lda CodeFieldEvenBRA-2,y ; The exit point comes after the left edge (reverse order due to stack) + sta :exit_bra,x + lda Col2CodeOffset-2,y + sta :exit_offset,x + + :DoScanlineRange ldx :virt_line_x2 @@ -503,31 +561,36 @@ _ApplyBG0XPosPerScanline bit #$0001 bne :is_odd ; Quickly switch to specialized even/odd routines +; For even offsets, the index is x - 2 +; For odd offsets, the index is x - 1 +; +; So, for both we can do (x - 1) & $FFFE = dec / and #$FFFE = lsr / asl + clears the carry + ; This is an even-aligned line - dec ; Move to the previous address for entry (a - 1) % 164 - dec ; Optimization: Coule eliminate this with a double-width tbale for CodeFieldEvenBRA - bpl *+5 - lda #162 +; dec ; Move to the previous address for entry (a - 1) % 164 +; dec ; Optimization: Coule eliminate this with a double-width tbale for CodeFieldEvenBRA +; bpl *+5 +; lda #162 -; and #$FFFE ; Must be even by construction tay - lda CodeFieldEvenBRA,y + lda CodeFieldEvenBRA-2,y sta :exit_bra ; Store are exit_offset + - lda Col2CodeOffset,y + lda Col2CodeOffset-2,y sta :exit_offset - tya - adc ScreenWidth - cmp #164 ; Keep the value in range - bcc *+5 - sbc #164 - tay +; tya +; adc ScreenWidth +; cmp #164 ; Keep the value in range +; bcc *+5 +; sbc #164 +; tay - lda Col2CodeOffset,y - sta :entry_offset -; lda #$004C ; set the entry_jmp opcode to JMP -; sta :opcode + lda Col2CodeOffset-2-1,y ; -2 for even case , -1 to load value into high byte + and #$FF00 +; sta :entry_offset + ora #$004C ; set the entry_jmp opcode to JMP + sta :opcode ; stz :odd_entry_offset ; mark as an even case ldal BTableLow,x ; Get the address of the code field line @@ -900,6 +963,119 @@ x01 lda: $0000,x bottom <<< +; SaveOpcodeAndOperand +; +; Save both the opcode and operand at the same time +; +; X = number of lines * 2, 0 to 32 +; Y = starting line * $1000 +; A = code field location * $1000 +SaveOpcodeAndOperand mac + jmp (dispTbl,x) +dispTbl da bottom + da do01,do02,do03,do04 + da do05,do06,do07,do08 + da do09,do10,do11,do12 + da do13,do14,do15,do16 + +do15 tax + jmp x15 +do14 tax + jmp x14 +do13 tax + jmp x13 +do12 tax + jmp x12 +do11 tax + jmp x11 +do10 tax + jmp x10 +do09 tax + jmp x09 +do08 tax + jmp x08 +do07 tax + jmp x07 +do06 tax + jmp x06 +do05 tax + jmp x05 +do04 tax + jmp x04 +do03 tax + jmp x03 +do02 tax + jmp x02 +do01 tax + jmp x01 +do16 tax +x16 lda $F000,x + sta OPCODE_SAVE+$F000,y + lda $F001,x + sta OPCODE_HIGH_SAVE+$F000,y +x15 lda $E000,x + sta OPCODE_SAVE+$E000,y + lda $E001,x + sta OPCODE_HIGH_SAVE+$E000,y +x14 lda $D000,x + sta OPCODE_SAVE+$D000,y + lda $D001,x + sta OPCODE_HIGH_SAVE+$D000,y +x13 lda $C000,x + sta OPCODE_SAVE+$C000,y + lda $C001,x + sta OPCODE_HIGH_SAVE+$C000,y +x12 lda $B000,x + sta OPCODE_SAVE+$B000,y + lda $B001,x + sta OPCODE_HIGH_SAVE+$B000,y +x11 lda $A000,x + sta OPCODE_SAVE+$A000,y + lda $A001,x + sta OPCODE_HIGH_SAVE+$A000,y +x10 lda $9000,x + sta OPCODE_SAVE+$9000,y + lda $9001,x + sta OPCODE_HIGH_SAVE+$9000,y +x09 lda $8000,x + sta OPCODE_SAVE+$8000,y + lda $8001,x + sta OPCODE_HIGH_SAVE+$8000,y +x08 lda $7000,x + sta OPCODE_SAVE+$7000,y + lda $7001,x + sta OPCODE_HIGH_SAVE+$7000,y +x07 lda $6000,x + sta OPCODE_SAVE+$6000,y + lda $6001,x + sta OPCODE_HIGH_SAVE+$6000,y +x06 lda $5000,x + sta OPCODE_SAVE+$5000,y + lda $5001,x + sta OPCODE_HIGH_SAVE+$5000,y +x05 lda $4000,x + sta OPCODE_SAVE+$4000,y + lda $4001,x + sta OPCODE_HIGH_SAVE+$4000,y +x04 lda $3000,x + sta OPCODE_SAVE+$3000,y + lda $3001,x + sta OPCODE_HIGH_SAVE+$3000,y +x03 lda $2000,x + sta OPCODE_SAVE+$2000,y + lda $2001,x + sta OPCODE_HIGH_SAVE+$2000,y +x02 lda $1000,x + sta OPCODE_SAVE+$1000,y + lda $1001,x + sta OPCODE_HIGH_SAVE+$1000,y +x01 lda: $0000,x + sta: OPCODE_SAVE+$0000,y + lda: $0001,x + sta: OPCODE_HIGH_SAVE+$0000,y +bottom + <<< + ; RestoreOpcode ; ; Restore the values back to the code field. diff --git a/src/static/TileStore.s b/src/static/TileStore.s index 1b2b6cd..6bc53cf 100644 --- a/src/static/TileStore.s +++ b/src/static/TileStore.s @@ -129,6 +129,7 @@ JTableOffset ENT ; ; These tables are reversed to be parallel with the JTableOffset and Col2CodeOffset tables above. The ; physical word index that each instruction is intended to be placed at is in the comment. + bra *-3 ; wrap around CodeFieldEvenBRA ENT bra *+6 ; 81 -- need to skip over the JMP loop that passed control back bra *+9 ; 80 @@ -213,6 +214,7 @@ CodeFieldEvenBRA ENT bra *-6 ; 1 bra *-3 ; 0 + bra *-6 ; wrap around CodeFieldOddBRA ENT bra *+9 ; 81 -- need to skip over two JMP instructions bra *+12 ; 80 From 029ab62f0cc322126f2fa6929f06d446904d66b5 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Wed, 8 Mar 2023 14:15:11 -0600 Subject: [PATCH 52/68] Fix accidental double-addition of the screen origin --- src/blitter/PEISlammer.s | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/blitter/PEISlammer.s b/src/blitter/PEISlammer.s index a01a437..b6c084c 100644 --- a/src/blitter/PEISlammer.s +++ b/src/blitter/PEISlammer.s @@ -38,11 +38,6 @@ _PEISlam tay ; get the number of lines in the y register txa - clc - adc ScreenY0 ; Adjust for the origin - cmp #201 - bcc *+4 - brk $A7 asl tax lda RTable,x ; This is the right visible byte, so add one to get the From 6c5e133b17b4cc4def2dc3ec83520fbf9e9272e2 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Wed, 8 Mar 2023 16:29:12 -0600 Subject: [PATCH 53/68] Fix some linked-list manipulations --- src/Sprite.s | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/src/Sprite.s b/src/Sprite.s index 16ca9b3..301b02e 100644 --- a/src/Sprite.s +++ b/src/Sprite.s @@ -438,7 +438,7 @@ _SortSprite ldy _Sprites+SORTED_PREV,x bmi :chk_fwd cmp _Sprites+SPRITE_CLIP_TOP,y - bcc :chk_bkwd ; The current node needs to move to an lower position + bcc :scan_bkwd ; The current node needs to move to an lower position :chk_fwd ldy _Sprites+SORTED_NEXT,x ; If there is nothing ahead of the current node, we're done @@ -502,12 +502,6 @@ _SortSprite sta _Sprites+SORTED_NEXT,y rts -:chk_bkwd - ldy _Sprites+SORTED_PREV,x ; If there is nothing behind the current node, we're done - bmi :done - cmp _Sprites+SPRITE_CLIP_TOP,y ; If the current node is >= the previous node, we're done - bcs :done - ; Look to move the sprite into an earlier position :scan_bkwd lda _Sprites+SORTED_PREV,y ; Need to step backward; if we're at the beginning, then insert here @@ -529,16 +523,16 @@ _SortSprite jsr _OrphanNode tya - sta _Sprites+SORTED_NEXT,x ; Link X to Y + sta _Sprites+SORTED_PREV,x ; c <=> y <-- x --- d - lda _Sprites+SORTED_PREV,y - sta _Sprites+SORTED_PREV,x ; Link X to C + lda _Sprites+SORTED_NEXT,y ; c <=> y <-- x --> d + sta _Sprites+SORTED_NEXT,x - txa ; Link Y to X - sta _Sprites+SORTED_PREV,y + txa + ldx _Sprites+SORTED_NEXT,y + sta _Sprites+SORTED_NEXT,y ; c <=> y <=> x --> d - ldy _Sprites+SORTED_PREV,x ; Link C to X - sta _Sprites+SORTED_NEXT,y + sta _Sprites+SORTED_PREV,x ; c <=> y <=> x <=> d rts ; Move X to the front of the list. Y points to the first element @@ -559,7 +553,6 @@ _SortSprite sta _Sprites+SORTED_PREV,x tya sta _Sprites+SORTED_NEXT,x - rts :done rts @@ -596,7 +589,6 @@ _InsertSprite cmp _Sprites+SPRITE_CLIP_TOP,y bcs :next -:insert lda _Sprites+SORTED_PREV,y sta _Sprites+SORTED_PREV,x ; [p] <-- [c] [n] @@ -604,10 +596,10 @@ _InsertSprite sta _Sprites+SORTED_NEXT,x ; [p] <-- [c] --> [n] txa + ldx _Sprites+SORTED_PREV,y ; get ref to the [p]revious node sta _Sprites+SORTED_PREV,y ; [p] <-- [c] <=> [n] - ldy _Sprites+SORTED_PREV,x - sta _Sprites+SORTED_NEXT,y ; [p] <=> [c] <=> [n] + sta _Sprites+SORTED_NEXT,x ; [p] <=> [c] <=> [n] rts From c533d846d7714f7de5ac7c53efabc9b86539f1c5 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Wed, 8 Mar 2023 20:09:57 -0600 Subject: [PATCH 54/68] Be more cautious when manipulaitng the sorted list --- demos/tool/App.Main.s | 511 ++++++++++++------------------------------ src/Sprite.s | 61 +++-- 2 files changed, 193 insertions(+), 379 deletions(-) diff --git a/demos/tool/App.Main.s b/demos/tool/App.Main.s index 179db9e..f47311e 100644 --- a/demos/tool/App.Main.s +++ b/demos/tool/App.Main.s @@ -24,6 +24,8 @@ Selected equ 10 Flips equ 12 DTile equ 14 Tmp2 equ 16 +ScreenWidth equ 18 +ScreenHeight equ 20 ; Typical init phk @@ -32,32 +34,30 @@ Tmp2 equ 16 sta MyUserId ; GS/OS passes the memory manager user ID for the application into the program _MTStartUp ; GTE requires the miscellaneous toolset to be running + lda #ENGINE_MODE_USER_TOOL+ENGINE_MODE_TWO_LAYER jsr GTEStartUp ; Load and install the GTE User Tool ; Initialize the graphics screen to a 256x160 playfield - pea #320 + pea #160 pea #200 _GTESetScreenMode ; Load a tileset + pea 0 + pea 120 pea #^TSZelda pea #TSZelda _GTELoadTileSet ; Set the palette - ldx #11*2 -:ploop - lda palette,x - stal $E19E00,x - dex - dex - bpl :ploop - bra sprt + pea $0000 + pea #^palette + pea #palette + _GTESetPalette -palette dw $0000,$08C1,$0C41,$0F93,$0777,$0FDA,$00A0,$0000,$0D20,$0FFF,$023E -sprt + jsr SetLimits ; Create stamps for the sprites we are going to use HERO_SPRITE equ SPRITE_16X16+1 @@ -68,23 +68,19 @@ HERO_SPRITE equ SPRITE_16X16+1 ; Create sprites stz Tmp0 - stz Tmp1 + stz Tmp1 ; Slot number ldx Tmp0 :sloop - pea HERO_SPRITE ; sprite id + pei Tmp1 ; Put the sprite in this slot + pea SPRITE_16X16 ; with these flags (h/v flip) + pea VBUFF_SPRITE_START lda PlayerX,x pha lda PlayerY,x pha - pei Tmp1 _GTEAddSprite - pei Tmp1 ; update the sprite in this slot - pea $0000 ; with these flags (h/v flip) - pea VBUFF_SPRITE_START ; and use this stamp - _GTEUpdateSprite - inc Tmp1 ldx Tmp0 inx @@ -95,70 +91,7 @@ HERO_SPRITE equ SPRITE_16X16+1 ; Manually fill in the 41x26 tiles of the TileStore with a test pattern of trees -; lda #TILE_DYN_BIT+TILE_PRIORITY_BIT+0 ; fill the screen the the dynamic tile slot 0 - lda #TILE_DYN_BIT+0 ; fill the screen the the dynamic tile slot 0 jsr _fillTileStore -; brl :no_trees - - ldx #0 - ldy #0 - jsr _drawTree - - ldx #3 - ldy #0 - jsr _drawTreeH - - ldx #0 - ldy #3 - jsr _drawTreeV - - ldx #3 - ldy #3 - jsr _drawTreeHV - - ldx #9 - ldy #0 - jsr _drawTree - - ldx #9 - ldy #3 - jsr _drawTree - - ldx #12 - ldy #0 - jsr _drawTree - - ldx #12 - ldy #3 - jsr _drawTree - - ldx #6 - ldy #0 - jsr _drawTreeFront - - ldx #6 - ldy #3 - jsr _drawTreeFront - - ldx #6 - ldy #6 - jsr _drawTreeFront - - ldx #3 - ldy #6 - jsr _drawTreeFront - - ldx #0 - ldy #6 - jsr _drawTreeFront -:no_trees -; Set up the dynamic tile - lda #65 - sta DTile - - pei DTile - pea $0000 - _GTECopyTileToDynamic ; Copy DTile into the first dynamic tile slot ; Initialize the frame counter @@ -166,9 +99,9 @@ HERO_SPRITE equ SPRITE_16X16+1 ; Set the screen coordinates - lda #128 + lda #0 sta ScreenX - lda #128 + lda #0 sta ScreenY stz Selected @@ -179,248 +112,58 @@ HERO_SPRITE equ SPRITE_16X16+1 pha ; space for result, with pattern _GTEReadControl pla - and #$00FF - cmp #'q' - bne :2 - brl :exit -:2 -; cmp KeyState -; beq :evt_loop -; sta KeyState -; cmp #0 -; beq :evt_loop -; cmp #' ' -; bne :evt_loop ; only advance one frame at a time -; brl :next - -:3 - cmp #'1' - bcc :3a - cmp #'9' - bcs :3a - sec - sbc #'1' - asl - sta Selected - brl :next - -:3a - cmp #'r' - bne :3b - lda Flips - clc - adc #SPRITE_HFLIP - and #SPRITE_VFLIP+SPRITE_HFLIP - sta Flips - - pei Selected ; update the sprite in this slot - pei Flips ; with these flags (h/v flip) - pea VBUFF_SPRITE_START ; and use this stamp - _GTEUpdateSprite - -:3b - cmp #'x' - bne :3d - ldx Selected - lda PlayerX,x - clc - adc PlayerU,x - sta PlayerX,x - - lda PlayerY,x - clc - adc PlayerV,x - sta PlayerY,x - brl :next -:3d - cmp #'z' - bne :3e - ldx Selected - lda PlayerX,x - sec - sbc PlayerU,x - sta PlayerX,x - - lda PlayerY,x - sec - sbc PlayerV,x - sta PlayerY,x - brl :next -:3e - cmp #'s' - bne :4 - ldx Selected - inc PlayerY,x - brl :next -:4 - cmp #'w' - bne :5 - ldx Selected - dec PlayerY,x - brl :next -:5 - cmp #'d' - bne :6 - ldx Selected - inc PlayerX,x - brl :next -:6 - cmp #'a' - bne :7 - ldx Selected - dec PlayerX,x - brl :next -:7 - cmp #$15 ; left = $08, right = $15, up = $0B, down = $0A - bne :8 - inc ScreenX - bra :next - -:8 cmp #$08 - bne :9 - dec ScreenX - brl :next - -:9 cmp #$0B - bne :10 - inc ScreenY - brl :next - -:10 cmp #$0A - bne :11 - dec ScreenY - brl :next - -:11 cmp #'y' - bne :12 - lda DTile - inc + jsr HandleKeys ; Do the generic key handlers + bcs :do_more + brl :do_render +:do_more and #$007F - sta DTile - pha - pea $0000 - _GTECopyTileToDynamic - brl :next - -:12 cmp #'f' - bne :13 - pea $0000 - _GTEFillTileStore - brl :next - -:13 cmp #'m' - bne :next - _GTERefresh - -:next -; inc ScreenX - + cmp #'a' + bne :skip_a + inc ScreenX pei ScreenX pei ScreenY _GTESetBG0Origin - -; brl no_animate - - stz Tmp0 - stz Tmp1 - - ldx Tmp0 -loopX - lda PlayerX,x - clc - adc PlayerU,x - sta PlayerX,x - bpl is_posx - cmp #-15 - bcs do_y - lda PlayerU,x - eor #$FFFF - inc - sta PlayerU,x - bra do_y -is_posx cmp #128 - bcc do_y - lda PlayerU,x - eor #$FFFF - inc - sta PlayerU,x - -do_y - lda PlayerY,x - clc - adc PlayerV,x - sta PlayerY,x - bpl is_posy - cmp #-15 - bcs do_z - lda PlayerV,x - eor #$FFFF - inc - sta PlayerV,x - bra do_z -is_posy cmp #160 - bcc do_z - lda PlayerV,x - eor #$FFFF - inc - sta PlayerV,x -do_z - inc Tmp1 - ldx Tmp0 - inx - inx - stx Tmp0 - cpx #MAX_SPRITES*2 - bcc loopX - -no_animate - stz Tmp0 - stz Tmp1 - ldx Tmp0 -loopY - pei Tmp1 - lda PlayerX,x + brl :do_render +:skip_a + cmp #'z' + bne :skip_z + inc PlayerX + pea 0 + lda PlayerX pha - lda PlayerY,x + lda PlayerY pha - _GTEMoveSprite - - inc Tmp1 - ldx Tmp0 - inx - inx - stx Tmp0 - cpx #MAX_SPRITES*2 - bcc loopY + _GTEMoveSprite +:skip_z + +:do_render + jsr _moveSprites + pea #RENDER_WITH_SHADOWING _GTERender - inc FrameCount -; Debug stuff +; Update the performance counters + + inc FrameCount pha _GTEGetSeconds pla cmp LastSecond beq :no_fps sta LastSecond - - lda FrameCount - ldx #0 - ldy #$FFFF - jsr DrawWord + +; lda FrameCount +; ldx #0 +; ldy #$FFFF +; jsr DrawWord stz FrameCount :no_fps - -; tdc -; ldx #160*32 -; jsr DrawWord - brl :evt_loop ; Shut down everything -:exit +Exit _GTEShutDown _QuitGS qtRec qtRec adrl $0000 @@ -432,56 +175,98 @@ PlayerY dw 72,24,13,56,35,72,23,8,93,123,134,87,143,14,46,65 PlayerU dw 1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4 PlayerV dw 1,1,1,1,2,2,2,4,3,3,3,3,4,4,4,4 -; Load the GTE User Tool and install it -GTEStartUp - pea $0000 - _LoaderStatus +_moveSprites + stz Tmp0 +:loop + ldx Tmp0 + + lda PlayerX,x + clc + adc PlayerU,x + sta PlayerX,x + + bpl :chk_xpos + eor #$FFFF + inc + sta PlayerX,x + bra :rev_x +:chk_xpos + cmp ScreenWidth + bcc :ok_x + sbc ScreenWidth + eor #$FFFF + inc + clc + adc ScreenWidth + sta PlayerX,x + +:rev_x + lda PlayerU,x ; reverse the velocity + eor #$FFFF + inc + sta PlayerU,x +:ok_x + + lda PlayerY,x + clc + adc PlayerV,x + sta PlayerY,x + bpl :chk_ypos + eor #$FFFF + inc + sta PlayerY,x + bra :rev_y +:chk_ypos + cmp ScreenHeight + bcc :ok_y + sbc ScreenHeight + eor #$FFFF + inc + clc + adc ScreenHeight + sta PlayerY,x + +:rev_y + lda PlayerV,x ; reverse the velocity + eor #$FFFF + inc + sta PlayerV,x + +:ok_y + txa + lsr + pha + lda PlayerX,x + pha + lda PlayerY,x + pha + _GTEMoveSprite + + lda Tmp0 + inc + inc + sta Tmp0 + cmp #2*MAX_SPRITES + bcc :loop + rts + +; Called by StartUp function callbacks when the screen size changes +SetLimits + pha ; Allocate space for x, y, width, height + pha + pha + pha + _GTEGetScreenInfo pla - - pea $0000 - pea $0000 - pea $0000 - pea $0000 - pea $0000 ; result space - - lda MyUserId - pha - - pea #^ToolPath - pea #ToolPath - pea $0001 ; do not load into special memory - _InitialLoad - bcc :ok1 - brk $01 - -:ok1 - ply - pla ; Address of the loaded tool - plx - ply - ply - - pea $8000 ; User toolset - pea $00A0 ; Set the tool set number - phx - pha ; Address of function pointer table - _SetTSPtr - bcc :ok2 - brk $02 - -:ok2 - clc ; Give GTE a page of direct page memory - tdc - adc #$0100 - pha - pea #ENGINE_MODE_DYN_TILES+ENGINE_MODE_TWO_LAYER ; Enable Dynamic Tiles and Two Layer - lda MyUserId ; Pass the userId for memory allocation - pha - _GTEStartUp - bcc :ok3 - brk $03 - -:ok3 + pla ; Discard screen corner + pla + sec + sbc #8 + sta ScreenWidth ; Pre-adjust to keep sprites on the visible playfield (for compiled sprites) + pla + sec + sbc #16 + sta ScreenHeight rts _fillTileStore @@ -490,25 +275,22 @@ _fillTileStore :oloop stz Tmp1 :iloop - pei Tmp1 - pei Tmp0 - pei Tmp2 - _GTESetTile - - lda Tmp2 - eor #TILE_PRIORITY_BIT - sta Tmp2 + ldx Tmp1 + ldy Tmp0 + jsr _drawTree lda Tmp1 inc + inc sta Tmp1 - cmp #41 + cmp #40 bcc :iloop lda Tmp0 inc + inc sta Tmp0 - cmp #26 + cmp #25 bcc :oloop rts @@ -646,9 +428,10 @@ _drawTreeHV rts MyUserId ds 2 -ToolPath str '1/Tool160' FrameCount ds 2 LastSecond dw 0 +palette dw $0000,$08C1,$0C41,$0F93,$0777,$0FDA,$00A0,$0000,$0D20,$0FFF,$023E,$0,$0,$0,$0,$0 + PUT ../kfest-2022/StartUp.s PUT App.Msg.s PUT font.s diff --git a/src/Sprite.s b/src/Sprite.s index 301b02e..478a344 100644 --- a/src/Sprite.s +++ b/src/Sprite.s @@ -411,7 +411,8 @@ _AddSprite jsr _PrecalcSpriteSize ; Cache sprite property values jsr _PrecalcSpriteBounds - jmp _InsertSprite ; Insert it into the sorted list + jsr _InsertSprite ; Insert it into the sorted list + jmp _Validate ; _SortSprite ; @@ -468,7 +469,7 @@ _SortSprite ; Into ; a <=> b and c <=> x <=> y <=> d :insert_before - jsr _OrphanNode + jsr _ReleaseNode tya sta _Sprites+SORTED_NEXT,x ; Link X to Y @@ -492,7 +493,7 @@ _SortSprite ; Into ; a <=> b and y <=> x -> nil :insert_end - jsr _OrphanNode + jsr _ReleaseNode lda #$FFFF sta _Sprites+SORTED_NEXT,x @@ -520,7 +521,7 @@ _SortSprite ; Into ; a <=> b and c <=> y <=> x <=> d :insert_after - jsr _OrphanNode + jsr _ReleaseNode tya sta _Sprites+SORTED_PREV,x ; c <=> y <-- x --- d @@ -544,7 +545,7 @@ _SortSprite ; Into ; a <=> b and head -> x <=> y :insert_front - jsr _OrphanNode + jsr _ReleaseNode stx _SortedHead txa @@ -557,16 +558,10 @@ _SortSprite :done rts -; Take the node pointed at X and remove it from the doubly-linked list. Assumes it is not -; at the beginning or end of the list -_OrphanNode +; Take the node pointed at X and remove it from the doubly-linked list. +_ReleaseNode phy - ldy _Sprites+SORTED_PREV,x ; Remove X from between A and B - lda _Sprites+SORTED_NEXT,x - sta _Sprites+SORTED_NEXT,y - tay - lda _Sprites+SORTED_PREV,x - sta _Sprites+SORTED_PREV,y + jsr _DeleteSprite ply rts @@ -663,7 +658,42 @@ _DeleteSprite sta _SortedHead rts +; Validate the integrity of the linked list +_Validate +:prev equ tmp0 +:curr equ tmp1 + ldy #$FFFF + ldx _SortedHead + bmi :done +:loop + sty :prev + stx :curr + + lda _Sprites+SORTED_PREV,x + cmp :prev + beq *+4 + brk $08 + + cpy #$FFFF + beq :skip + lda _Sprites+SORTED_NEXT,y + cmp :curr + beq *+4 + brk $06 + + lda _Sprites+SPRITE_CLIP_TOP,x + cmp _Sprites+SPRITE_CLIP_TOP,y + bcs *+4 + brk $0A +:skip + txy + lda _Sprites+SORTED_NEXT,x + tax + bpl :loop + +:done + rts ; Macro to make the unrolled loop more concise ; ; 1. Load the tile store address from a fixed offset @@ -1211,4 +1241,5 @@ _MoveSprite sta _Sprites+SPRITE_STATUS,x jsr _PrecalcSpriteBounds ; Can be specialized to only update (x,y) values - jmp _SortSprite ; Update the sprite's sorted position + jsr _SortSprite ; Update the sprite's sorted position + jmp _Validate From 39163ea786baec93c2c1ca6b0b496f025182aebb Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 9 Mar 2023 00:23:12 -0600 Subject: [PATCH 55/68] Expose the ability to select which rendering order to use for sprites --- demos/tool/App.Main.s | 154 +- demos/tool/Zelda.TileSet.s | 4237 ++++++++++++++++++------------------ macros/GTE.Macs.s | 1 + src/Defs.s | 1 + src/Render.s | 63 +- 5 files changed, 2269 insertions(+), 2187 deletions(-) diff --git a/demos/tool/App.Main.s b/demos/tool/App.Main.s index f47311e..0b585fc 100644 --- a/demos/tool/App.Main.s +++ b/demos/tool/App.Main.s @@ -26,17 +26,36 @@ DTile equ 14 Tmp2 equ 16 ScreenWidth equ 18 ScreenHeight equ 20 +SpriteFlags equ 22 +frameCount equ 24 +OldOneSecondCounter equ 26 +SpriteAddr equ 28 +RenderMode equ 30 + +; Control modes +DefaultMode equ RENDER_WITH_SHADOWING +SlowSprites equ 0 ; Typical init phk plb sta MyUserId ; GS/OS passes the memory manager user ID for the application into the program + tdc + sta MyDirectPage ; Keep a copy for the overlay callback + _MTStartUp ; GTE requires the miscellaneous toolset to be running - lda #ENGINE_MODE_USER_TOOL+ENGINE_MODE_TWO_LAYER + lda #ENGINE_MODE_USER_TOOL ; +ENGINE_MODE_TWO_LAYER jsr GTEStartUp ; Load and install the GTE User Tool +; Init local variables + + stz frameCount + + lda #DefaultMode + sta RenderMode + ; Initialize the graphics screen to a 256x160 playfield pea #160 @@ -46,7 +65,7 @@ ScreenHeight equ 20 ; Load a tileset pea 0 - pea 120 + pea 360 pea #^TSZelda pea #TSZelda _GTELoadTileSet @@ -59,6 +78,14 @@ ScreenHeight equ 20 jsr SetLimits + lda #193 ; Tile ID of '0' + jsr InitOverlay ; Initialize the status bar + pha + _GTEGetSeconds + pla + sta OldOneSecondCounter + jsr UdtOverlay + ; Create stamps for the sprites we are going to use HERO_SPRITE equ SPRITE_16X16+1 @@ -66,6 +93,23 @@ HERO_SPRITE equ SPRITE_16X16+1 pea VBUFF_SPRITE_START ; vbuff address _GTECreateSpriteStamp + DO SlowSprites + lda #SPRITE_16X16 + sta SpriteFlags + lda #VBUFF_SPRITE_START + sta SpriteAddr + ELSE + lda #SPRITE_16X16+SPRITE_COMPILED + sta SpriteFlags + + pha ; Space for result + pea SPRITE_16X16 + pea VBUFF_SPRITE_START + _GTECompileSpriteStamp + pla + sta SpriteAddr + FIN + ; Create sprites stz Tmp0 stz Tmp1 ; Slot number @@ -73,8 +117,8 @@ HERO_SPRITE equ SPRITE_16X16+1 ldx Tmp0 :sloop pei Tmp1 ; Put the sprite in this slot - pea SPRITE_16X16 ; with these flags (h/v flip) - pea VBUFF_SPRITE_START + pei SpriteFlags ; with these flags (h/v flip) + pei SpriteAddr lda PlayerX,x pha lda PlayerY,x @@ -93,10 +137,6 @@ HERO_SPRITE equ SPRITE_16X16+1 jsr _fillTileStore -; Initialize the frame counter - - stz FrameCount - ; Set the screen coordinates lda #0 @@ -118,49 +158,60 @@ HERO_SPRITE equ SPRITE_16X16+1 brl :do_render :do_more and #$007F - cmp #'a' + cmp #'a' ; Put in single-step advance mode bne :skip_a +:a_loop + jsr :next_frame +:a_spin + pha ; space for result, with pattern + _GTEReadControl + pla + bit #PAD_KEY_DOWN + bne :a_spin + and #$007F + cmp #'r' ; resume? + beq :do_render + cmp #'s' + beq :toggle_sort + cmp #'a' + beq :a_loop + bra :a_spin +:toggle_sort lda RenderMode + eor #RENDER_SPRITES_SORTED + sta RenderMode + pei RenderMode + _GTERender + bra :a_spin +:skip_a + +:do_render jsr :next_frame + brl :evt_loop + +:next_frame + jsr _moveSprites + inc ScreenX + inc ScreenY pei ScreenX pei ScreenY _GTESetBG0Origin - brl :do_render -:skip_a - cmp #'z' - bne :skip_z - inc PlayerX - pea 0 - lda PlayerX - pha - lda PlayerY - pha - _GTEMoveSprite -:skip_z - -:do_render - jsr _moveSprites - pea #RENDER_WITH_SHADOWING + pei RenderMode _GTERender ; Update the performance counters - inc FrameCount + inc frameCount pha _GTEGetSeconds pla - cmp LastSecond - beq :no_fps - sta LastSecond - -; lda FrameCount -; ldx #0 -; ldy #$FFFF -; jsr DrawWord - - stz FrameCount -:no_fps - brl :evt_loop + cmp OldOneSecondCounter + beq :noudt + sta OldOneSecondCounter + jsr UdtOverlay + stz frameCount +:noudt + rts ; Shut down everything Exit @@ -170,11 +221,17 @@ qtRec adrl $0000 da $00 ; Array of sprite positions and velocities + DO 1 PlayerX dw 8,14,29,34,45,67,81,83,92,101,39,22,7,74,111,9 PlayerY dw 72,24,13,56,35,72,23,8,93,123,134,87,143,14,46,65 PlayerU dw 1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4 PlayerV dw 1,1,1,1,2,2,2,4,3,3,3,3,4,4,4,4 - + ELSE +PlayerX dw 2,12,22,32,42,52,62,72,2,12,22,32,42,52,62,72, +PlayerY dw 24,24,24,24,24,24,24,24,44,44,44,44,44,44,44,44 +PlayerU dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +PlayerV dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + FIN _moveSprites stz Tmp0 :loop @@ -280,15 +337,15 @@ _fillTileStore jsr _drawTree lda Tmp1 - inc - inc + clc + adc #2 sta Tmp1 cmp #40 bcc :iloop lda Tmp0 - inc - inc + clc + adc #2 sta Tmp0 cmp #25 bcc :oloop @@ -427,11 +484,12 @@ _drawTreeHV _GTESetTile rts +MyDirectPage ds 2 MyUserId ds 2 -FrameCount ds 2 -LastSecond dw 0 -palette dw $0000,$08C1,$0C41,$0F93,$0777,$0FDA,$00A0,$0000,$0D20,$0FFF,$023E,$0,$0,$0,$0,$0 +palette dw $0000,$08C1,$0C41,$0F93,$0777,$0FDA,$00A0,$0000,$0D20,$0FFF,$0FD7,$0F59,$0000,$01CE,$0EDA,$0EEE PUT ../kfest-2022/StartUp.s - PUT App.Msg.s - PUT font.s + PUT ../shell/Overlay.s + +; PUT App.Msg.s +; PUT font.s diff --git a/demos/tool/Zelda.TileSet.s b/demos/tool/Zelda.TileSet.s index 8743dee..c1f93ef 100644 --- a/demos/tool/Zelda.TileSet.s +++ b/demos/tool/Zelda.TileSet.s @@ -7305,420 +7305,420 @@ TSZelda ENT ; Tile ID 193 ; From image coordinates 0, 48 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0cccccc0 + hex ccaaaacc + hex caaccaac + hex caaccaac + hex caaccaac + hex ccaaaacc + hex 0cccccc0 hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f000000f + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex f000000f hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0cccccc0 + hex ccaaaacc + hex caaccaac + hex caaccaac + hex caaccaac + hex ccaaaacc + hex 0cccccc0 hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f000000f + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex f000000f ; Tile ID 194 ; From image coordinates 8, 48 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0ccccc00 + hex 0caaac00 + hex 0ccaac00 + hex 00caac00 + hex 00caac00 + hex 00caac00 + hex 00cccc00 hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f00000ff + hex f00000ff + hex f00000ff + hex ff0000ff + hex ff0000ff + hex ff0000ff + hex ff0000ff hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00ccccc0 + hex 00caaac0 + hex 00caacc0 + hex 00caac00 + hex 00caac00 + hex 00caac00 + hex 00cccc00 hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff00000f + hex ff00000f + hex ff00000f + hex ff0000ff + hex ff0000ff + hex ff0000ff + hex ff0000ff ; Tile ID 195 ; From image coordinates 16, 48 hex 00000000 + hex 0cccccc0 + hex ccaaaacc + hex caaccaac + hex cccaaac0 + hex 0caacccc + hex caaaaaac + hex cccccccc + + hex ffffffff + hex f000000f hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0000000f + hex f0000000 hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 hex 00000000 + hex 0cccccc0 + hex ccaaaacc + hex caaccaac + hex 0caaaccc + hex ccccaac0 + hex caaaaaac + hex cccccccc hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f000000f + hex 00000000 + hex 00000000 + hex f0000000 + hex 0000000f + hex 00000000 + hex 00000000 ; Tile ID 196 ; From image coordinates 24, 48 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex ccccccc0 + hex caaaaacc + hex cccccaac + hex 00caaac0 + hex cccccaac + hex caaaaacc + hex ccccccc0 hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 0000000f + hex 00000000 + hex 00000000 + hex ff00000f + hex 00000000 + hex 00000000 + hex 0000000f hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0ccccccc + hex ccaaaaac + hex caaccccc + hex 0caaac00 + hex caaccccc + hex ccaaaaac + hex 0ccccccc hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f0000000 + hex 00000000 + hex 00000000 + hex f00000ff + hex 00000000 + hex 00000000 + hex f0000000 ; Tile ID 197 ; From image coordinates 32, 48 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00ccccc0 + hex 0ccaaac0 + hex ccacaac0 + hex caccaacc + hex caaaaaac + hex ccccaacc + hex 000cccc0 hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff00000f + hex f000000f + hex 0000000f + hex 00000000 + hex 00000000 + hex 00000000 + hex fff0000f hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0ccccc00 + hex 0caaacc0 + hex 0caacacc + hex ccaaccac + hex caaaaaac + hex ccaacccc + hex 0cccc000 hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f00000ff + hex f000000f + hex f0000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex f0000fff ; Tile ID 198 ; From image coordinates 40, 48 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex ccccccc0 + hex caaaaac0 + hex caacccc0 + hex caaaaacc + hex 0ccccaac + hex caaaaacc + hex ccccccc0 hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 0000000f + hex 0000000f + hex 0000000f + hex 00000000 + hex f0000000 + hex 00000000 + hex 0000000f hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0ccccccc + hex 0caaaaac + hex 0ccccaac + hex ccaaaaac + hex caacccc0 + hex ccaaaaac + hex 0ccccccc hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f0000000 + hex f0000000 + hex f0000000 + hex 00000000 + hex 0000000f + hex 00000000 + hex f0000000 ; Tile ID 199 ; From image coordinates 48, 48 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0cccccc0 + hex ccaaaac0 + hex caacccc0 + hex caaaaacc + hex caaccaac + hex ccaaaacc + hex 0cccccc0 hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f000000f + hex 0000000f + hex 0000000f + hex 00000000 + hex 00000000 + hex 00000000 + hex f000000f hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0cccccc0 + hex 0caaaacc + hex 0ccccaac + hex ccaaaaac + hex caaccaac + hex ccaaaacc + hex 0cccccc0 hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f000000f + hex f0000000 + hex f0000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex f000000f ; Tile ID 200 ; From image coordinates 56, 48 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex cccccccc + hex caaaaaac + hex caaccaac + hex ccccaac0 + hex 00caac00 + hex 00caac00 + hex 00cccc00 hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 00000000 + hex 00000000 + hex 00000000 + hex 0000000f + hex ff0000ff + hex ff0000ff + hex ff0000ff hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex cccccccc + hex caaaaaac + hex caaccaac + hex 0caacccc + hex 00caac00 + hex 00caac00 + hex 00cccc00 hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 00000000 + hex 00000000 + hex 00000000 + hex f0000000 + hex ff0000ff + hex ff0000ff + hex ff0000ff ; Tile ID 201 ; From image coordinates 64, 48 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0cccccc0 + hex ccaaaacc + hex caaccaac + hex 0caaaac0 + hex caaccaac + hex ccaaaacc + hex 0cccccc0 hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f000000f + hex 00000000 + hex 00000000 + hex f000000f + hex 00000000 + hex 00000000 + hex f000000f hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0cccccc0 + hex ccaaaacc + hex caaccaac + hex 0caaaac0 + hex caaccaac + hex ccaaaacc + hex 0cccccc0 hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f000000f + hex 00000000 + hex 00000000 + hex f000000f + hex 00000000 + hex 00000000 + hex f000000f ; Tile ID 202 ; From image coordinates 72, 48 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0cccccc0 + hex ccaaaacc + hex caaccaac + hex ccaaaaac + hex 0ccccaac + hex 0caaaacc + hex 0cccccc0 hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f000000f + hex 00000000 + hex 00000000 + hex 00000000 + hex f0000000 + hex f0000000 + hex f000000f hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0cccccc0 + hex ccaaaacc + hex caaccaac + hex caaaaacc + hex caacccc0 + hex ccaaaac0 + hex 0cccccc0 hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f000000f + hex 00000000 + hex 00000000 + hex 00000000 + hex 0000000f + hex 0000000f + hex f000000f ; Tile ID 203 ; From image coordinates 80, 48 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0cc000cc + hex 0cac0cac + hex 00cacac0 + hex 000cac00 + hex 00cacac0 + hex 0cac0cac + hex 0cc000cc hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f00fff00 + hex f000f000 + hex ff00000f + hex fff000ff + hex ff00000f + hex f000f000 + hex f00fff00 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex cc000cc0 + hex cac0cac0 + hex 0cacac00 + hex 00cac000 + hex 0cacac00 + hex cac0cac0 + hex cc000cc0 hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 00fff00f + hex 000f000f + hex f00000ff + hex ff000fff + hex f00000ff + hex 000f000f + hex 00fff00f ; Tile ID 204 ; From image coordinates 88, 48 @@ -7726,513 +7726,504 @@ TSZelda ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0cccccc0 + hex 0caaaac0 + hex 0cccccc0 hex 00000000 hex ffffffff hex ffffffff hex ffffffff hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f000000f + hex f000000f + hex f000000f hex ffffffff hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0cccccc0 + hex 0caaaac0 + hex 0cccccc0 hex 00000000 hex ffffffff hex ffffffff hex ffffffff hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f000000f + hex f000000f + hex f000000f hex ffffffff ; Tile ID 205 ; From image coordinates 96, 48 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 000cc000 + hex 00caac00 + hex 00caac00 + hex 00caac00 + hex 00caac00 + hex 000cc000 + hex 00caac00 + hex 000cc000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex fff00fff + hex ff0000ff + hex ff0000ff + hex ff0000ff + hex ff0000ff + hex fff00fff + hex ff0000ff + hex fff00fff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 000cc000 + hex 00caac00 + hex 00caac00 + hex 00caac00 + hex 00caac00 + hex 000cc000 + hex 00caac00 + hex 000cc000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex fff00fff + hex ff0000ff + hex ff0000ff + hex ff0000ff + hex ff0000ff + hex fff00fff + hex ff0000ff + hex fff00fff ; Tile ID 206 ; From image coordinates 104, 48 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00cccc00 + hex 0caacac0 + hex caacacac + hex caacacac + hex caacacac + hex caccacac + hex 0caacac0 + hex 00cccc00 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff0000ff + hex f000000f + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex f000000f + hex ff0000ff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00cccc00 + hex 0cacaac0 + hex cacacaac + hex cacacaac + hex cacacaac + hex cacaccac + hex 0cacaac0 + hex 00cccc00 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff0000ff + hex f000000f + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex f000000f + hex ff0000ff ; Tile ID 207 ; From image coordinates 112, 48 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00ccc000 + hex 0cacac00 + hex caacaac0 + hex caacccc0 + hex caaaaac0 + hex 0caaac00 + hex 00ccc000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff000fff + hex f00000ff + hex 0000000f + hex 0000000f + hex 0000000f + hex f00000ff + hex ff000fff hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 000ccc00 + hex 00cacac0 + hex 0caacaac + hex 0ccccaac + hex 0caaaaac + hex 00caaac0 + hex 000ccc00 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex fff000ff + hex ff00000f + hex f0000000 + hex f0000000 + hex f0000000 + hex ff00000f + hex fff000ff hex ffffffff ; Tile ID 208 ; From image coordinates 120, 48 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0cccccc0 + hex 0caaaac0 + hex 0cccccc0 + hex 0cccccc0 + hex 0caaaac0 + hex 0cccccc0 hex 00000000 hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f000000f + hex f000000f + hex f000000f + hex f000000f + hex f000000f + hex f000000f hex ffffffff hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0cccccc0 + hex 0caaaac0 + hex 0cccccc0 + hex 0cccccc0 + hex 0caaaac0 + hex 0cccccc0 hex 00000000 hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f000000f + hex f000000f + hex f000000f + hex f000000f + hex f000000f + hex f000000f hex ffffffff ; Tile ID 209 ; From image coordinates 128, 48 + hex 000ccc00 + hex 000cac00 + hex 000ccc00 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 000ccc00 + hex 000cac00 + hex 000ccc00 + hex fff000ff + hex fff000ff + hex fff000ff hex ffffffff hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex fff000ff + hex fff000ff + hex fff000ff + hex 00ccc000 + hex 00cac000 + hex 00ccc000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00ccc000 + hex 00cac000 + hex 00ccc000 + hex ff000fff + hex ff000fff + hex ff000fff hex ffffffff hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff000fff + hex ff000fff + hex ff000fff ; Tile ID 210 ; From image coordinates 136, 48 - hex 00000000 - hex 00000000 - hex 00000000 + hex 000cc000 + hex 00caac00 + hex 0caccac0 + hex caaccaac + hex caaaaaac + hex caaccaac + hex caaccaac + hex cccccccc + + hex fff00fff + hex ff0000ff + hex f000000f hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 000cc000 + hex 00caac00 + hex 0caccac0 + hex caaccaac + hex caaaaaac + hex caaccaac + hex caaccaac + hex cccccccc + hex fff00fff + hex ff0000ff + hex f000000f hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff ; Tile ID 211 ; From image coordinates 144, 48 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex cccccc00 + hex caaaaac0 + hex caaccaac + hex caaaaac0 + hex caaccaac + hex caaccaac + hex caaaaac0 + hex cccccc00 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 000000ff + hex 0000000f + hex 00000000 + hex 0000000f + hex 00000000 + hex 00000000 + hex 0000000f + hex 000000ff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00cccccc + hex 0caaaaac + hex caaccaac + hex 0caaaaac + hex caaccaac + hex caaccaac + hex 0caaaaac + hex 00cccccc - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff000000 + hex f0000000 + hex 00000000 + hex f0000000 + hex 00000000 + hex 00000000 + hex f0000000 + hex ff000000 ; Tile ID 212 ; From image coordinates 152, 48 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00cccc00 + hex 0caaaac0 + hex caaccaac + hex caaccccc + hex caaccccc + hex caaccaac + hex 0caaaac0 + hex 00cccc00 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff0000ff + hex f000000f + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex f000000f + hex ff0000ff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00cccc00 + hex 0caaaac0 + hex caaccaac + hex cccccaac + hex cccccaac + hex caaccaac + hex 0caaaac0 + hex 00cccc00 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff0000ff + hex f000000f + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex f000000f + hex ff0000ff ; Tile ID 213 ; From image coordinates 160, 48 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex ccccc000 + hex caaaac00 + hex caaccac0 + hex caaccaac + hex caaccaac + hex caaccac0 + hex caaaac00 + hex ccccc000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 00000fff + hex 000000ff + hex 0000000f + hex 00000000 + hex 00000000 + hex 0000000f + hex 000000ff + hex 00000fff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 000ccccc + hex 00caaaac + hex 0caccaac + hex caaccaac + hex caaccaac + hex 0caccaac + hex 00caaaac + hex 000ccccc - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex fff00000 + hex ff000000 + hex f0000000 + hex 00000000 + hex 00000000 + hex f0000000 + hex ff000000 + hex fff00000 ; Tile ID 214 ; From image coordinates 168, 48 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex caaaaaac + hex caaccccc + hex caaaaac0 + hex caacccc0 + hex caaccccc + hex caaaaaac + hex cccccccc hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 + hex 0000000f + hex 0000000f hex 00000000 hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex caaaaaac + hex cccccaac + hex 0caaaaac + hex 0ccccaac + hex cccccaac + hex caaaaaac + hex cccccccc + + hex 00000000 + hex 00000000 + hex 00000000 + hex f0000000 + hex f0000000 + hex 00000000 + hex 00000000 + hex 00000000 ; Tile ID 215 ; From image coordinates 176, 48 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex caaaaaac + hex caaccccc + hex caaaaac0 + hex caacccc0 + hex caac0000 + hex caac0000 + hex cccc0000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0000000f + hex 0000000f + hex 0000ffff + hex 0000ffff + hex 0000ffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex caaaaaac + hex cccccaac + hex 0caaaaac + hex 0ccccaac + hex 0000caac + hex 0000caac + hex 0000cccc + + hex 00000000 + hex 00000000 + hex 00000000 + hex f0000000 + hex f0000000 + hex ffff0000 + hex ffff0000 + hex ffff0000 ; Tile ID 216 ; From image coordinates 184, 48 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0cccccc0 + hex ccaaaacc + hex caaccaac + hex caaccccc + hex caacaaac + hex caaccaac + hex ccaaaaac + hex 0cccccc0 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f000000f + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex f000000f - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0cccccc0 + hex ccaaaacc + hex caaccaac + hex cccccaac + hex caaacaac + hex caaccaac + hex caaaaacc + hex 0cccccc0 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f000000f + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex f000000f ; Tile ID 217 ; From image coordinates 192, 48 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex caaccaac + hex caaccaac + hex caaaaaac + hex caaccaac + hex caaccaac + hex caaccaac + hex cccccccc hex 00000000 hex 00000000 @@ -8243,566 +8234,566 @@ TSZelda ENT hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex caaccaac + hex caaccaac + hex caaaaaac + hex caaccaac + hex caaccaac + hex caaccaac + hex cccccccc + + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 ; Tile ID 218 ; From image coordinates 200, 48 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0cccccc0 + hex 0caaaac0 + hex 00caac00 + hex 00caac00 + hex 00caac00 + hex 00caac00 + hex 0caaaac0 + hex 0cccccc0 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f000000f + hex f000000f + hex ff0000ff + hex ff0000ff + hex ff0000ff + hex ff0000ff + hex f000000f + hex f000000f - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0cccccc0 + hex 0caaaac0 + hex 00caac00 + hex 00caac00 + hex 00caac00 + hex 00caac00 + hex 0caaaac0 + hex 0cccccc0 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f000000f + hex f000000f + hex ff0000ff + hex ff0000ff + hex ff0000ff + hex ff0000ff + hex f000000f + hex f000000f ; Tile ID 219 ; From image coordinates 208, 48 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00cccccc + hex 00caaaac + hex 00ccaacc + hex 000caac0 + hex ccccaac0 + hex caacaac0 + hex ccaaacc0 + hex 0ccccc00 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff000000 + hex ff000000 + hex ff000000 + hex fff0000f + hex 0000000f + hex 0000000f + hex 0000000f + hex f00000ff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex cccccc00 + hex caaaac00 + hex ccaacc00 + hex 0caac000 + hex 0caacccc + hex 0caacaac + hex 0ccaaacc + hex 00ccccc0 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 000000ff + hex 000000ff + hex 000000ff + hex f0000fff + hex f0000000 + hex f0000000 + hex f0000000 + hex ff00000f ; Tile ID 220 ; From image coordinates 216, 48 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex caaccaac + hex caacaacc + hex caaaacc0 + hex caaaacc0 + hex caacaacc + hex caaccaac + hex cccccccc hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 + hex 0000000f + hex 0000000f hex 00000000 hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex caaccaac + hex ccaacaac + hex 0ccaaaac + hex 0ccaaaac + hex ccaacaac + hex caaccaac + hex cccccccc -; Tile ID 221 -; From image coordinates 224, 48 - hex 00000000 - hex 00000000 hex 00000000 hex 00000000 hex 00000000 + hex f0000000 + hex f0000000 hex 00000000 hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff +; Tile ID 221 +; From image coordinates 224, 48 + hex cccc0000 + hex caac0000 + hex caac0000 + hex caac0000 + hex caac0000 + hex caaccccc + hex caaaaaac + hex cccccccc - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0000ffff + hex 0000ffff + hex 0000ffff + hex 0000ffff + hex 0000ffff hex 00000000 hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 0000cccc + hex 0000caac + hex 0000caac + hex 0000caac + hex 0000caac + hex cccccaac + hex caaaaaac + hex cccccccc -; Tile ID 222 -; From image coordinates 232, 48 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex ffff0000 + hex ffff0000 + hex ffff0000 + hex ffff0000 + hex ffff0000 hex 00000000 hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff +; Tile ID 222 +; From image coordinates 232, 48 + hex ccc000cc + hex caac0cac + hex caaacaac + hex caaaaaac + hex caacacac + hex caacccac + hex caac0cac + hex cccc0ccc + hex 000fff00 + hex 0000f000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0000f000 + hex 0000f000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cc000ccc + hex cac0caac + hex caacaaac + hex caaaaaac + hex cacacaac + hex cacccaac + hex cac0caac + hex ccc0cccc + + hex 00fff000 + hex 000f0000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 000f0000 + hex 000f0000 ; Tile ID 223 ; From image coordinates 240, 48 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex ccc00ccc + hex caac0cac + hex caaaccac + hex caaaacac + hex caacaaac + hex caaccaac + hex caac0cac + hex cccc00cc - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 000ff000 + hex 0000f000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 0000f000 + hex 0000ff00 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex ccc00ccc + hex cac0caac + hex caccaaac + hex cacaaaac + hex caaacaac + hex caaccaac + hex cac0caac + hex cc00cccc - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 000ff000 + hex 000f0000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 000f0000 + hex 00ff0000 ; Tile ID 224 ; From image coordinates 248, 48 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00cccc00 + hex 0caaaac0 + hex caaccaac + hex caaccaac + hex caaccaac + hex caaccaac + hex 0caaaac0 + hex 00cccc00 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff0000ff + hex f000000f + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex f000000f + hex ff0000ff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00cccc00 + hex 0caaaac0 + hex caaccaac + hex caaccaac + hex caaccaac + hex caaccaac + hex 0caaaac0 + hex 00cccc00 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff0000ff + hex f000000f + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex f000000f + hex ff0000ff ; Tile ID 225 ; From image coordinates 0, 56 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex cccccc00 + hex caaaaac0 + hex caaccaac + hex caaccaac + hex caaaaac0 + hex caaccc00 + hex caac0000 + hex cccc0000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 000000ff + hex 0000000f + hex 00000000 + hex 00000000 + hex 0000000f + hex 000000ff + hex 0000ffff + hex 0000ffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00cccccc + hex 0caaaaac + hex caaccaac + hex caaccaac + hex 0caaaaac + hex 00cccaac + hex 0000caac + hex 0000cccc - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff000000 + hex f0000000 + hex 00000000 + hex 00000000 + hex f0000000 + hex ff000000 + hex ffff0000 + hex ffff0000 ; Tile ID 226 ; From image coordinates 8, 56 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00cccc00 + hex 0caaaac0 + hex caaccaac + hex caaccaac + hex caaaaaac + hex caaccac0 + hex 0caaaaac + hex 00ccccc0 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff0000ff + hex f000000f + hex 00000000 + hex 00000000 + hex 00000000 + hex 0000000f + hex f0000000 + hex ff00000f - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00cccc00 + hex 0caaaac0 + hex caaccaac + hex caaccaac + hex caaaaaac + hex 0caccaac + hex caaaaac0 + hex 0ccccc00 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff0000ff + hex f000000f + hex 00000000 + hex 00000000 + hex 00000000 + hex f0000000 + hex 0000000f + hex f00000ff ; Tile ID 227 ; From image coordinates 16, 56 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex cccccc00 + hex caaaaac0 + hex caaccaac + hex caaccaac + hex caaaaac0 + hex caacaac0 + hex caaccaac + hex cccc0ccc - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 000000ff + hex 0000000f + hex 00000000 + hex 00000000 + hex 0000000f + hex 0000000f + hex 00000000 + hex 0000f000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00cccccc + hex 0caaaaac + hex caaccaac + hex caaccaac + hex 0caaaaac + hex 0caacaac + hex caaccaac + hex ccc0cccc - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff000000 + hex f0000000 + hex 00000000 + hex 00000000 + hex f0000000 + hex f0000000 + hex 00000000 + hex 000f0000 ; Tile ID 228 ; From image coordinates 24, 56 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00ccccc0 + hex 0caaaac0 + hex caaccc00 + hex 0caaaac0 + hex cccccaac + hex caaccaac + hex 0caaaac0 + hex 00cccc00 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff00000f + hex f000000f + hex 000000ff + hex f000000f + hex 00000000 + hex 00000000 + hex f000000f + hex ff0000ff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0ccccc00 + hex 0caaaac0 + hex 00cccaac + hex 0caaaac0 + hex caaccccc + hex caaccaac + hex 0caaaac0 + hex 00cccc00 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex f00000ff + hex f000000f + hex ff000000 + hex f000000f + hex 00000000 + hex 00000000 + hex f000000f + hex ff0000ff ; Tile ID 229 ; From image coordinates 32, 56 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex caaaaaac + hex cccaaccc + hex 00caac00 + hex 00caac00 + hex 00caac00 + hex 00caac00 + hex 00cccc00 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex ff0000ff + hex ff0000ff + hex ff0000ff + hex ff0000ff + hex ff0000ff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex caaaaaac + hex cccaaccc + hex 00caac00 + hex 00caac00 + hex 00caac00 + hex 00caac00 + hex 00cccc00 + + hex 00000000 + hex 00000000 + hex 00000000 + hex ff0000ff + hex ff0000ff + hex ff0000ff + hex ff0000ff + hex ff0000ff ; Tile ID 230 ; From image coordinates 40, 56 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex ccc00ccc + hex caaccaac + hex caaccaac + hex caaccaac + hex caaccaac + hex caaccaac + hex 0caaaac0 + hex 00cccc00 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 000ff000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex f000000f + hex ff0000ff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex ccc00ccc + hex caaccaac + hex caaccaac + hex caaccaac + hex caaccaac + hex caaccaac + hex 0caaaac0 + hex 00cccc00 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 000ff000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex f000000f + hex ff0000ff ; Tile ID 231 ; From image coordinates 48, 56 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex caaccaac + hex caaccaac + hex caaccaac + hex ccaccacc + hex 0caaaac0 + hex 0ccaacc0 + hex 00cccc00 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex f000000f + hex f000000f + hex ff0000ff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex caaccaac + hex caaccaac + hex caaccaac + hex ccaccacc + hex 0caaaac0 + hex 0ccaacc0 + hex 00cccc00 + + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex f000000f + hex f000000f + hex ff0000ff ; Tile ID 232 ; From image coordinates 56, 56 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex caacacac + hex caacacac + hex caacacac + hex caacacac + hex caaaaaac + hex cccacacc + hex 0cccccc0 hex 00000000 hex 00000000 @@ -8811,130 +8802,139 @@ TSZelda ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 + hex f000000f - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex cacacaac + hex cacacaac + hex cacacaac + hex cacacaac + hex caaaaaac + hex ccacaccc + hex 0cccccc0 + + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex f000000f ; Tile ID 233 ; From image coordinates 64, 56 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex cccc0ccc + hex caacccac + hex caaacacc + hex ccaaacc0 + hex 0ccaaacc + hex ccacaaac + hex cacccaac + hex ccc0cccc - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 0000f000 + hex 00000000 + hex 00000000 + hex 0000000f + hex f0000000 + hex 00000000 + hex 00000000 + hex 000f0000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex ccc0cccc + hex cacccaac + hex ccacaaac + hex 0ccaaacc + hex ccaaacc0 + hex caaacacc + hex caacccac + hex cccc0ccc - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 000f0000 + hex 00000000 + hex 00000000 + hex f0000000 + hex 0000000f + hex 00000000 + hex 00000000 + hex 0000f000 ; Tile ID 234 ; From image coordinates 72, 56 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex caaccaac + hex caaccaac + hex ccaaaacc + hex 0ccaacc0 + hex 00caac00 + hex 00caac00 + hex 00cccc00 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex f000000f + hex ff0000ff + hex ff0000ff + hex ff0000ff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex caaccaac + hex caaccaac + hex ccaaaacc + hex 0ccaacc0 + hex 00caac00 + hex 00caac00 + hex 00cccc00 + + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex f000000f + hex ff0000ff + hex ff0000ff + hex ff0000ff ; Tile ID 235 ; From image coordinates 80, 56 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex caaaaaac + hex ccccaaac + hex 00caaac0 + hex 0caaac00 + hex caaacccc + hex caaaaaac + hex cccccccc hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 + hex ff00000f + hex f00000ff hex 00000000 hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex caaaaaac + hex caaacccc + hex 0caaac00 + hex 00caaac0 + hex ccccaaac + hex caaaaaac + hex cccccccc + + hex 00000000 + hex 00000000 + hex 00000000 + hex f00000ff + hex ff00000f + hex 00000000 + hex 00000000 + hex 00000000 ; Tile ID 236 ; From image coordinates 88, 56 @@ -9470,117 +9470,117 @@ TSZelda ENT ; Tile ID 250 ; From image coordinates 200, 56 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0000cccc + hex 00cc2222 + hex 0c224444 + hex 0c244222 + hex c2442ccc + hex c242cc00 + hex c242c0c0 + hex c242c00c - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ffff0000 + hex ff000000 + hex f0000000 + hex f0000000 + hex 00000000 + hex 000000ff + hex 00000f0f + hex 00000ff0 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex cccc0000 + hex 2222cc00 + hex 444422c0 + hex 222442c0 + hex ccc2442c + hex 00cc242c + hex 0c0c242c + hex c00c242c - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 0000ffff + hex 000000ff + hex 0000000f + hex 0000000f + hex 00000000 + hex ff000000 + hex f0f00000 + hex 0ff00000 ; Tile ID 251 ; From image coordinates 208, 56 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex 22222222 + hex 44444444 + hex 22222222 + hex cccccccc + hex 00c00c00 + hex 0c0000c0 + hex c000000c hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex ff0ff0ff + hex f0ffff0f + hex 0ffffff0 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex 22222222 + hex 44444444 + hex 22222222 + hex cccccccc + hex 00c00c00 + hex 0c0000c0 + hex c000000c + + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex ff0ff0ff + hex f0ffff0f + hex 0ffffff0 ; Tile ID 252 ; From image coordinates 216, 56 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex cccc0000 + hex 2222cc00 + hex 444422c0 + hex 222442c0 + hex ccc2442c + hex 00cc242c + hex 0c0c242c + hex c00c242c - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 0000ffff + hex 000000ff + hex 0000000f + hex 0000000f + hex 00000000 + hex ff000000 + hex f0f00000 + hex 0ff00000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0000cccc + hex 00cc2222 + hex 0c224444 + hex 0c244222 + hex c2442ccc + hex c242cc00 + hex c242c0c0 + hex c242c00c - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ffff0000 + hex ff000000 + hex f0000000 + hex f0000000 + hex 00000000 + hex 000000ff + hex 00000f0f + hex 00000ff0 ; Tile ID 253 ; From image coordinates 224, 56 @@ -9660,79 +9660,79 @@ TSZelda ENT ; Tile ID 255 ; From image coordinates 240, 56 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00000099 + hex 00000999 + hex 00009999 + hex 00099999 + hex 00999999 + hex 09944499 + hex 09444449 + hex 99444449 + + hex ffffff00 + hex fffff000 + hex ffff0000 + hex fff00000 + hex ff000000 + hex f0000000 + hex f0000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 99000000 + hex 99900000 + hex 99990000 + hex 99999000 + hex 99999900 + hex 99444990 + hex 94444490 + hex 94444499 + hex 00ffffff + hex 000fffff + hex 0000ffff + hex 00000fff + hex 000000ff + hex 0000000f + hex 0000000f hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff ; Tile ID 256 ; From image coordinates 248, 56 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 99000000 + hex 94400000 + hex 44440000 + hex 44444000 + hex 94449900 + hex 99999990 + hex 99999990 + hex 99994499 + + hex 00ffffff + hex 000fffff + hex 0000ffff + hex 00000fff + hex 000000ff + hex 0000000f + hex 0000000f hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 00000099 + hex 00000449 + hex 00004444 + hex 00044444 + hex 00994449 + hex 09999999 + hex 09999999 + hex 99449999 + hex ffffff00 + hex fffff000 + hex ffff0000 + hex fff00000 + hex ff000000 + hex f0000000 + hex f0000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff ; Tile ID 257 ; From image coordinates 0, 64 @@ -9780,8 +9780,8 @@ TSZelda ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 + hex 00000001 + hex 00000001 hex ffffffff hex ffffffff @@ -9789,8 +9789,8 @@ TSZelda ENT hex ffffffff hex ffffffff hex ffffffff - hex ffffffff - hex ffffffff + hex fffffff0 + hex fffffff0 hex 00000000 hex 00000000 @@ -9798,8 +9798,8 @@ TSZelda ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 + hex 10000000 + hex 10000000 hex ffffffff hex ffffffff @@ -9807,84 +9807,84 @@ TSZelda ENT hex ffffffff hex ffffffff hex ffffffff - hex ffffffff - hex ffffffff + hex 0fffffff + hex 0fffffff ; Tile ID 259 ; From image coordinates 16, 64 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 + hex 00100001 + hex 01f1001f + hex 1fcf11fc + hex 1fcfcfcc + hex fcccfccc + hex fccccccf + + hex ffffffff + hex ffffffff + hex ff0ffff0 + hex f000ff00 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 hex 00000000 hex 00000000 + hex 10000100 + hex f1001f10 + hex cf11fcf1 + hex ccfcfcf1 + hex cccfcccf + hex fccccccf hex ffffffff hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 0ffff0ff + hex 00ff000f + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 ; Tile ID 260 ; From image coordinates 24, 64 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 10000000 + hex f1000000 + hex f1000000 + hex f1000000 + hex c1000000 hex ffffffff hex ffffffff hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 0fffffff + hex 00ffffff + hex 00ffffff + hex 00ffffff + hex 00ffffff hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00000001 + hex 0000001f + hex 0000001f + hex 0000001f + hex 0000001c hex ffffffff hex ffffffff hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex fffffff0 + hex ffffff00 + hex ffffff00 + hex ffffff00 + hex ffffff00 ; Tile ID 261 ; From image coordinates 32, 64 @@ -9933,7 +9933,7 @@ TSZelda ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 + hex 00000001 hex ffffffff hex ffffffff @@ -9942,7 +9942,7 @@ TSZelda ENT hex ffffffff hex ffffffff hex ffffffff - hex ffffffff + hex fffffff0 hex 00000000 hex 00000000 @@ -9951,7 +9951,7 @@ TSZelda ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 + hex 10000000 hex ffffffff hex ffffffff @@ -9960,45 +9960,45 @@ TSZelda ENT hex ffffffff hex ffffffff hex ffffffff - hex ffffffff + hex 0fffffff ; Tile ID 263 ; From image coordinates 48, 64 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00100001 + hex 01f1001f + hex 1fcf11fc + hex 1fcfcfcc + hex fcccfccc hex ffffffff hex ffffffff hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff0ffff0 + hex f000ff00 + hex 00000000 + hex 00000000 + hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 10000100 + hex f1001f10 + hex cf11fcf1 + hex ccfcfcf1 + hex cccfcccf hex ffffffff hex ffffffff hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 0ffff0ff + hex 00ff000f + hex 00000000 + hex 00000000 + hex 00000000 ; Tile ID 264 ; From image coordinates 56, 64 @@ -10006,37 +10006,37 @@ TSZelda ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 10000000 + hex f1000000 + hex f1000000 + hex f1000000 hex ffffffff hex ffffffff hex ffffffff hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 0fffffff + hex 00ffffff + hex 00ffffff + hex 00ffffff hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00000001 + hex 0000001f + hex 0000001f + hex 0000001f hex ffffffff hex ffffffff hex ffffffff hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex fffffff0 + hex ffffff00 + hex ffffff00 + hex ffffff00 ; Tile ID 265 ; From image coordinates 64, 64 @@ -10686,117 +10686,117 @@ TSZelda ENT ; Tile ID 282 ; From image coordinates 200, 64 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex c242c00c + hex c242c0c0 + hex c242cc00 + hex c242c000 + hex c242c000 + hex c242cc00 + hex c242c0c0 + hex c242c00c - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 00000ff0 + hex 00000f0f + hex 000000ff + hex 00000fff + hex 00000fff + hex 000000ff + hex 00000f0f + hex 00000ff0 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex c00c242c + hex 0c0c242c + hex 00cc242c + hex 000c242c + hex 000c242c + hex 00cc242c + hex 0c0c242c + hex c00c242c - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 0ff00000 + hex f0f00000 + hex ff000000 + hex fff00000 + hex fff00000 + hex ff000000 + hex f0f00000 + hex 0ff00000 ; Tile ID 283 ; From image coordinates 208, 64 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex c000000c + hex 0c0000c0 + hex 00c00c00 + hex 000cc000 + hex 000cc000 + hex 00c00c00 + hex 0c0000c0 + hex c000000c - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 0ffffff0 + hex f0ffff0f + hex ff0ff0ff + hex fff00fff + hex fff00fff + hex ff0ff0ff + hex f0ffff0f + hex 0ffffff0 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex c000000c + hex 0c0000c0 + hex 00c00c00 + hex 000cc000 + hex 000cc000 + hex 00c00c00 + hex 0c0000c0 + hex c000000c - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 0ffffff0 + hex f0ffff0f + hex ff0ff0ff + hex fff00fff + hex fff00fff + hex ff0ff0ff + hex f0ffff0f + hex 0ffffff0 ; Tile ID 284 ; From image coordinates 216, 64 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex c00c242c + hex 0c0c242c + hex 00cc242c + hex 000c242c + hex 000c242c + hex 00cc242c + hex 0c0c242c + hex c00c242c - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 0ff00000 + hex f0f00000 + hex ff000000 + hex fff00000 + hex fff00000 + hex ff000000 + hex f0f00000 + hex 0ff00000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex c242c00c + hex c242c0c0 + hex c242cc00 + hex c242c000 + hex c242c000 + hex c242cc00 + hex c242c0c0 + hex c242c00c - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 00000ff0 + hex 00000f0f + hex 000000ff + hex 00000fff + hex 00000fff + hex 000000ff + hex 00000f0f + hex 00000ff0 ; Tile ID 285 ; From image coordinates 224, 64 @@ -10876,79 +10876,79 @@ TSZelda ENT ; Tile ID 287 ; From image coordinates 240, 64 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 99444449 + hex 99944499 + hex 99999999 + hex 09444fff + hex 0000ffff + hex 0000ffff + hex 0000ffff + hex 00000fff hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex f0000000 + hex ffff0000 + hex ffff0000 + hex ffff0000 + hex fffff000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 94444499 + hex 99444999 + hex 99999999 + hex fff44490 + hex ffff0000 + hex ffff0000 + hex ffff0000 + hex fff00000 + + hex 00000000 + hex 00000000 + hex 00000000 + hex 0000000f + hex 0000ffff + hex 0000ffff + hex 0000ffff + hex 000fffff ; Tile ID 288 ; From image coordinates 248, 64 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 99994449 + hex 99999449 + hex 99999999 + hex fff44490 + hex ffff0000 + hex ff9f0000 + hex ff9f0000 + hex f9f00000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0000000f + hex 0000ffff + hex 0000ffff + hex 0000ffff + hex 000fffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 94449999 + hex 94499999 + hex 99999999 + hex 09444fff + hex 0000ffff + hex 0000f9ff + hex 0000f9ff + hex 00000f9f + + hex 00000000 + hex 00000000 + hex 00000000 + hex f0000000 + hex ffff0000 + hex ffff0000 + hex ffff0000 + hex fffff000 ; Tile ID 289 ; From image coordinates 0, 72 @@ -10956,95 +10956,86 @@ TSZelda ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00111000 + hex 001ff100 + hex 001fcf10 + hex 001fccf1 hex ffffffff hex ffffffff hex ffffffff hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff000fff + hex ff0000ff + hex ff00000f + hex ff000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00011100 + hex 001ff100 + hex 01fcf100 + hex 1fccf100 hex ffffffff hex ffffffff hex ffffffff hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex fff000ff + hex ff0000ff + hex f00000ff + hex 000000ff ; Tile ID 290 ; From image coordinates 8, 72 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00000001 + hex 0000001c + hex 000011ff + hex 0001ffcc + hex 001fcccc + hex 01fccccc + hex 1fcccccc + hex fccccccc + + hex fffffff0 + hex ffffff00 + hex ffff0000 + hex fff00000 + hex ff000000 + hex f0000000 hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 10000000 + hex c1000000 + hex ff110000 + hex ccff1000 + hex ccccf100 + hex cccccf10 + hex ccccccf1 + hex cccccccf + hex 0fffffff + hex 00ffffff + hex 0000ffff + hex 00000fff + hex 000000ff + hex 0000000f hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff ; Tile ID 291 ; From image coordinates 16, 72 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex fccccccc + hex fcccfcfc + hex cccccccc + hex cccccccc + hex cccccccc + hex ccccfccc + hex cccf2fff + hex cccffccf hex 00000000 hex 00000000 @@ -11055,52 +11046,61 @@ TSZelda ENT hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccf + hex cfcfcccf + hex cccccccc + hex cccccccc + hex cccccccc + hex cccfcccc + hex fff2fccc + hex fccffccc + + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 ; Tile ID 292 ; From image coordinates 24, 72 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex ff100000 + hex ccf10000 + hex cccf1000 + hex cccf1000 + hex cccf1000 + hex cff10000 + hex f1100000 + hex 10000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 000fffff + hex 0000ffff + hex 00000fff + hex 00000fff + hex 00000fff + hex 0000ffff + hex 000fffff + hex 0fffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 000001ff + hex 00001fcc + hex 0001fccc + hex 0001fccc + hex 0001fccc + hex 00001ffc + hex 0000011f + hex 00000001 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex fffff000 + hex ffff0000 + hex fff00000 + hex fff00000 + hex fff00000 + hex ffff0000 + hex fffff000 + hex fffffff0 ; Tile ID 293 ; From image coordinates 32, 72 @@ -11109,94 +11109,85 @@ TSZelda ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00111000 + hex 001ff100 + hex 001fcf10 hex ffffffff hex ffffffff hex ffffffff hex ffffffff hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff000fff + hex ff0000ff + hex ff00000f hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00011100 + hex 001ff100 + hex 01fcf100 hex ffffffff hex ffffffff hex ffffffff hex ffffffff hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex fff000ff + hex ff0000ff + hex f00000ff ; Tile ID 294 ; From image coordinates 40, 72 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00000001 + hex 00000001 + hex 0000001c + hex 000011ff + hex 0001ffcc + hex 001fcccc + hex 01fccccc + hex 1fcccccc + + hex fffffff0 + hex fffffff0 + hex ffffff00 + hex ffff0000 + hex fff00000 + hex ff000000 + hex f0000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 10000000 + hex 10000000 + hex c1000000 + hex ff110000 + hex ccff1000 + hex ccccf100 + hex cccccf10 + hex ccccccf1 + hex 0fffffff + hex 0fffffff + hex 00ffffff + hex 0000ffff + hex 00000fff + hex 000000ff + hex 0000000f hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff ; Tile ID 295 ; From image coordinates 48, 72 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex fccccccf + hex fccccccc + hex fcccfcfc + hex cccccccc + hex cccccccc + hex cccccccc + hex ccccfccc + hex cccf2fff hex 00000000 hex 00000000 @@ -11207,52 +11198,61 @@ TSZelda ENT hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex fccccccf + hex cccccccf + hex cfcfcccf + hex cccccccc + hex cccccccc + hex cccccccc + hex cccfcccc + hex fff2fccc + + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 ; Tile ID 296 ; From image coordinates 56, 72 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex c1000000 + hex ff100000 + hex ccf10000 + hex cccf1000 + hex cccf1000 + hex cccf1000 + hex cff10000 + hex f1100000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 00ffffff + hex 000fffff + hex 0000ffff + hex 00000fff + hex 00000fff + hex 00000fff + hex 0000ffff + hex 000fffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0000001c + hex 000001ff + hex 00001fcc + hex 0001fccc + hex 0001fccc + hex 0001fccc + hex 00001ffc + hex 0000011f - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ffffff00 + hex fffff000 + hex ffff0000 + hex fff00000 + hex fff00000 + hex fff00000 + hex ffff0000 + hex fffff000 ; Tile ID 297 ; From image coordinates 64, 72 @@ -11902,117 +11902,117 @@ TSZelda ENT ; Tile ID 314 ; From image coordinates 200, 72 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex c242c00c + hex c242c0c0 + hex c242cc00 + hex c2442ccc + hex 0c244222 + hex 0c224444 + hex 00cc2222 + hex 0000cccc - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 00000ff0 + hex 00000f0f + hex 000000ff + hex 00000000 + hex f0000000 + hex f0000000 + hex ff000000 + hex ffff0000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex c00c242c + hex 0c0c242c + hex 00cc242c + hex ccc2442c + hex 222442c0 + hex 444422c0 + hex 2222cc00 + hex cccc0000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 0ff00000 + hex f0f00000 + hex ff000000 + hex 00000000 + hex 0000000f + hex 0000000f + hex 000000ff + hex 0000ffff ; Tile ID 315 ; From image coordinates 208, 72 - hex 00000000 - hex 00000000 - hex 00000000 + hex c000000c + hex 0c0000c0 + hex 00c00c00 + hex cccccccc + hex 22222222 + hex 44444444 + hex 22222222 + hex cccccccc + + hex 0ffffff0 + hex f0ffff0f + hex ff0ff0ff hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex c000000c + hex 0c0000c0 + hex 00c00c00 + hex cccccccc + hex 22222222 + hex 44444444 + hex 22222222 + hex cccccccc - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - -; Tile ID 316 -; From image coordinates 216, 72 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0ffffff0 + hex f0ffff0f + hex ff0ff0ff hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff +; Tile ID 316 +; From image coordinates 216, 72 + hex c00c242c + hex 0c0c242c + hex 00cc242c + hex ccc2442c + hex 222442c0 + hex 444422c0 + hex 2222cc00 + hex cccc0000 + hex 0ff00000 + hex f0f00000 + hex ff000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0000000f + hex 0000000f + hex 000000ff + hex 0000ffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex c242c00c + hex c242c0c0 + hex c242cc00 + hex c2442ccc + hex 0c244222 + hex 0c224444 + hex 00cc2222 + hex 0000cccc + + hex 00000ff0 + hex 00000f0f + hex 000000ff + hex 00000000 + hex f0000000 + hex f0000000 + hex ff000000 + hex ffff0000 ; Tile ID 317 ; From image coordinates 224, 72 @@ -12168,61 +12168,52 @@ TSZelda ENT ; Tile ID 321 ; From image coordinates 0, 80 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0001ffff + hex 00001cfc + hex 000001fc + hex 000001fc + hex 000001fc + hex 0000001f + hex 00000001 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex fff00000 + hex ffff0000 + hex fffff000 + hex fffff000 + hex fffff000 + hex ffffff00 + hex fffffff0 hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex ffff1000 + hex cfc10000 + hex cf100000 + hex cf100000 + hex cf100000 + hex f1000000 + hex 10000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 00000fff + hex 0000ffff + hex 000fffff + hex 000fffff + hex 000fffff + hex 00ffffff + hex 0fffffff hex ffffffff ; Tile ID 322 ; From image coordinates 8, 80 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex cccccccc + hex cccccccc + hex cccccccc + hex cccccccc + hex ffcccfff + hex 11fff111 + hex 001c1000 hex 00000000 hex 00000000 @@ -12231,87 +12222,96 @@ TSZelda ENT hex 00000000 hex 00000000 hex 00000000 - hex 00000000 + hex ff000fff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccc + hex cccccccc + hex cccccccc + hex cccccccc + hex cccccccc + hex fffcccff + hex 111fff11 + hex 0001c100 + + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex fff000ff ; Tile ID 323 ; From image coordinates 16, 80 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccf + hex cccccccf + hex cccccccf + hex ccccccf1 + hex cccccf10 + hex ffcccf10 + hex 11fff100 + hex 001c1000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0000000f + hex 0000000f + hex 000000ff + hex ff000fff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex fccccccc + hex fccccccc + hex fccccccc + hex 1fcccccc + hex 01fccccc + hex 01fcccff + hex 001fff11 + hex 0001c100 + + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex f0000000 + hex f0000000 + hex ff000000 + hex fff000ff ; Tile ID 324 ; From image coordinates 24, 80 - hex 00000000 - hex 00000000 - hex 00000000 + hex 10000000 + hex 10000000 + hex 10000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff + hex 0fffffff + hex 0fffffff + hex 0fffffff hex ffffffff hex ffffffff hex ffffffff hex ffffffff hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 + hex 00000001 + hex 00000001 + hex 00000001 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff + hex fffffff0 + hex fffffff0 + hex fffffff0 hex ffffffff hex ffffffff hex ffffffff @@ -12320,61 +12320,52 @@ TSZelda ENT ; Tile ID 325 ; From image coordinates 32, 80 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 001fccf1 + hex 0001ffff + hex 00001cfc + hex 000001fc + hex 000001fc + hex 000001fc + hex 0000001f + hex 00000001 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex ff000000 + hex fff00000 + hex ffff0000 + hex fffff000 + hex fffff000 + hex fffff000 + hex ffffff00 + hex fffffff0 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 1fccf100 + hex ffff1000 + hex cfc10000 + hex cf100000 + hex cf100000 + hex cf100000 + hex f1000000 + hex 10000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 000000ff + hex 00000fff + hex 0000ffff + hex 000fffff + hex 000fffff + hex 000fffff + hex 00ffffff + hex 0fffffff ; Tile ID 326 ; From image coordinates 40, 80 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex fccccccc + hex cccccccc + hex cccccccc + hex cccccccc + hex cccccccc + hex cccccccc + hex ffcccfff + hex cccccccc hex 00000000 hex 00000000 @@ -12385,86 +12376,95 @@ TSZelda ENT hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccccccf + hex cccccccc + hex cccccccc + hex cccccccc + hex cccccccc + hex cccccccc + hex fffcccff + hex cccccccc + + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 ; Tile ID 327 ; From image coordinates 48, 80 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 - - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex cccffccf + hex cccccccf + hex cccccccf + hex cccccccf + hex ccccccf1 + hex cccccf10 + hex ffcccf10 + hex ccccc100 hex 00000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 0000000f + hex 0000000f + hex 000000ff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex fccffccc + hex fccccccc + hex fccccccc + hex fccccccc + hex 1fcccccc + hex 01fccccc + hex 01fcccff + hex 001ccccc + + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex 00000000 + hex f0000000 + hex f0000000 + hex ff000000 ; Tile ID 328 ; From image coordinates 56, 80 - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 10000000 + hex 10000000 + hex 10000000 + hex 10000000 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex 0fffffff + hex 0fffffff + hex 0fffffff + hex 0fffffff hex ffffffff hex ffffffff hex ffffffff hex ffffffff - hex 00000000 - hex 00000000 - hex 00000000 - hex 00000000 + hex 00000001 + hex 00000001 + hex 00000001 + hex 00000001 hex 00000000 hex 00000000 hex 00000000 hex 00000000 - hex ffffffff - hex ffffffff - hex ffffffff - hex ffffffff + hex fffffff0 + hex fffffff0 + hex fffffff0 + hex fffffff0 hex ffffffff hex ffffffff hex ffffffff @@ -13685,4 +13685,3 @@ TSZelda ENT hex ffffffff hex ffffffff hex ffffffff - diff --git a/macros/GTE.Macs.s b/macros/GTE.Macs.s index f49fe93..46ca6b1 100644 --- a/macros/GTE.Macs.s +++ b/macros/GTE.Macs.s @@ -161,6 +161,7 @@ RENDER_BG1_VERT_OFFSET equ $0004 RENDER_BG1_ROTATION equ $0008 RENDER_PER_SCANLINE equ $0010 RENDER_WITH_SHADOWING equ $0020 +RENDER_SPRITES_SORTED equ $0040 ; Overlay flags OVERLAY_MASKED equ $0000 ; Overlay has a mask, so the background must be draw first diff --git a/src/Defs.s b/src/Defs.s index 8d7bae1..7134be2 100644 --- a/src/Defs.s +++ b/src/Defs.s @@ -175,6 +175,7 @@ RENDER_BG1_VERT_OFFSET equ $0004 RENDER_BG1_ROTATION equ $0008 RENDER_PER_SCANLINE equ $0010 RENDER_WITH_SHADOWING equ $0020 +RENDER_SPRITES_SORTED equ $0040 ; Draw the sprites in y-sorted order. Otherwise, use the index. ; Overlay flags OVERLAY_MASKED equ $0000 ; Overlay has a mask, so the background must be draw first diff --git a/src/Render.s b/src/Render.s index 9d9b7b2..ab2d3ef 100644 --- a/src/Render.s +++ b/src/Render.s @@ -156,7 +156,6 @@ _DoOverlay ; Use the per-scanline tables to set the screen. This is really meant to be used without the built-in tilemap ; support and is more of a low-level way to control the background rendering _RenderScanlines - jsr _ApplyBG0YPos ; Set stack addresses for the virtual lines to the physical screen jsr _ApplyBG1YPos ; Set the y-register values of the blitter @@ -343,9 +342,6 @@ _RenderWithShadowing ; to create priority lists of scanline ranges. jsr _BuildShadowList ; Create the rages based on the sorted sprite y-values -; jsr _MergeOverlay ; Add the overlay range into the shadow list (treat it as a sprite) - -; jsr _ComplementList ; Create the complement to identify non-sprite / non-overlay scanlines jsr _ShadowOff ; Turn off shadowing and draw all the scanlines with sprites on them jsr _DrawShadowList @@ -604,30 +600,55 @@ _DrawShadowList ; Run through the list of sprites that are not IS_OFFSCREEN and not OVERLAYS and draw them directly to the graphics screen. We can use ; compiled sprites here, with limitations. _DrawDirectSprites + lda RenderFlags + bit #RENDER_SPRITES_SORTED + bne :sorted + +; Shift through the sprites + + lda SpriteMap + beq :empty + sta tmp15 + ldx #0 + +:iloop + lsr tmp15 + bcc :next + jsr :render + +:next inx + inx + lda tmp15 + bne :iloop + rts + +:sorted ldx _SortedHead bmi :empty :loop - lda _Sprites+SPRITE_ID,x - bit #SPRITE_OVERLAY - bne :next - lda _Sprites+SPRITE_STATUS,x - bit #SPRITE_STATUS_HIDDEN - bne :next - - phx - jsr _DrawStampToScreen - plx - bra :next - -:next + jsr :render lda _Sprites+SORTED_NEXT,x ; If there another sprite in the list? tax bpl :loop - :empty rts +:render + lda _Sprites+SPRITE_ID,x + bit #SPRITE_OVERLAY + beq *+3 + rts + lda _Sprites+SPRITE_STATUS,x + bit #SPRITE_STATUS_HIDDEN + beq *+3 + rts + phx + jsr _DrawStampToScreen + plx + rts + + ; Run through the sorted list and perform a final render the jumps between calling _PEISlam for shadowed lines, ; _BltRange for clean backgrounds and Overlays as needed. ; @@ -653,7 +674,7 @@ _DrawFinalPass bmi :empty lda _Sprites+SPRITE_CLIP_TOP,x ; Load the first object's top edge - sta :curr_top +; sta :curr_top beq :loop ; If it's at the top edge of the screen, proceed. Othrewise _BltRange the top range ldx #0 @@ -669,7 +690,7 @@ _DrawFinalPass lda _Sprites+SPRITE_CLIP_TOP,x sta :curr_top lda _Sprites+SPRITE_CLIP_BOTTOM,x ; Optimistically set the end of the segment to the bottom of this object - inc ; Clip values are on the scanline, so add one to make it a proper interval + inc ; Clip values are on the scanline, so add one to make it a proper interval :update sta :curr_bottom @@ -762,6 +783,8 @@ _DrawFinalPass lda ScreenAddr,x clc adc ScreenX0 + ldx :curr_top + ldy :curr_bottom :disp jsl $000000 rts From 3a78398ea762e4fca0dc9333420a7b502fde624e Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 9 Mar 2023 00:26:31 -0600 Subject: [PATCH 56/68] Remove dead label --- src/blitter/Template.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blitter/Template.s b/src/blitter/Template.s index ada2248..4bf4d14 100644 --- a/src/blitter/Template.s +++ b/src/blitter/Template.s @@ -94,7 +94,7 @@ entry_jmp jmp $0100 ; update the low-byte of the address, the means it takes only ; an amortized 4-cycles per line to set the entry point break -right_odd bit #$000B ; Check the bottom nibble to quickly identify a PEA instruction + bit #$000B ; Check the bottom nibble to quickly identify a PEA instruction bne r_is_not_pea ; This costs 5 cycles in the fast-path xba ; fast code for PEA From 9fba232df0b38ed26ad358171bc9326bc4cfd63b Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 9 Mar 2023 00:27:03 -0600 Subject: [PATCH 57/68] Minor cleanups --- demos/kfest-2022/demo-5/App.Main.s | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/demos/kfest-2022/demo-5/App.Main.s b/demos/kfest-2022/demo-5/App.Main.s index 52a921b..b486018 100644 --- a/demos/kfest-2022/demo-5/App.Main.s +++ b/demos/kfest-2022/demo-5/App.Main.s @@ -36,6 +36,7 @@ MaxGlobalX equ 16 MaxGlobalY equ 18 MaxBG0X equ 20 MaxBG0Y equ 22 +frameCount equ 24 OldOneSecondCounter equ 26 appTmp0 equ 28 PlayerX equ 30 @@ -277,8 +278,8 @@ do_render pha _GTEMoveSprite ; Move the sprite to this local position -; pea #RENDER_WITH_SHADOWING - pea $0000 + pea #RENDER_WITH_SHADOWING +; pea $0000 _GTERender ; Update the performance counters @@ -607,8 +608,6 @@ _GetVBLTicks plx rts -frameCount equ 24 - MusicFile str '1/overworld.ntp' PUT ../StartUp.s From c04bf0d323a545889e66768b44f9b6ad93924960 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 9 Mar 2023 00:31:45 -0600 Subject: [PATCH 58/68] Add new render flags to the docs --- docs/toolboxref.html | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/toolboxref.html b/docs/toolboxref.html index 4fe87b4..f34eb2f 100644 --- a/docs/toolboxref.html +++ b/docs/toolboxref.html @@ -1211,10 +1211,25 @@ style: toolref Offsets each column of the secondary background's vertical position. Unimplemented. - RENDER_BG1_ROTATIONT - $0004 + RENDER_BG1_ROTATION + $0008 Use the internal rotation tables to render the secondary background + + RENDER_PER_SCANLINE + $0010 + Set individual scanline properties for the primary and secondary backgrounds from a table. + + + RENDER_WITH_SHADOWING + $0020 + Uses a rendering mode that does not draw sprites into the tiles but uses shadowing to draw sprites on top of the rendered background and then expose the final composited image. This mode is required to use compiled sprites. + + + RENDER_SPRITES_SORTED + $0040 + Draws the sprite in y-sorted order instead of sprite slot order. + From 899c6c97702f96545617dbda2f37cf136359d28e Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 9 Mar 2023 09:19:10 -0600 Subject: [PATCH 59/68] Upgrade to lockfile version 2 --- package-lock.json | 186 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 185 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 4c502b2..2e61eea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,192 @@ { "name": "generic-tile-engine", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "generic-tile-engine", + "version": "1.0.0", + "license": "Apache-2.0", + "devDependencies": { + "pngjs": "^6.0.0", + "string-builder": "^0.1.8", + "watch": "latest", + "xml2json": "^0.12.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "dependencies": { + "merge": "^1.2.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, + "node_modules/hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", + "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/isemail": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", + "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", + "dev": true, + "dependencies": { + "punycode": "2.x.x" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/joi": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-13.7.0.tgz", + "integrity": "sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q==", + "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", + "dev": true, + "dependencies": { + "hoek": "5.x.x", + "isemail": "3.x.x", + "topo": "3.x.x" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/joi/node_modules/hoek": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-5.0.4.tgz", + "integrity": "sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w==", + "deprecated": "This version has been deprecated in accordance with the hapi support policy (hapi.im/support). Please upgrade to the latest version to get the best features, bug fixes, and security patches. If you are unable to upgrade at this time, paid support is available for older versions (hapi.im/commercial).", + "dev": true, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/nan": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", + "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", + "dev": true + }, + "node_modules/node-expat": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/node-expat/-/node-expat-2.4.0.tgz", + "integrity": "sha512-X8Y/Zk/izfNgfayeOeUGqze7KlaOwVJ9SDTjHUMKd0hu0aFTRpLlLCBwmx79cTPiQWD24I1YOafF+U+rTvEMfQ==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.13.2" + } + }, + "node_modules/pngjs": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", + "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", + "dev": true, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/string-builder": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/string-builder/-/string-builder-0.1.8.tgz", + "integrity": "sha512-0pUtikmhChLaf+uLqzYTgzTCQc4jAjaWHolxPGq3D77SgSoTqkOlv0RVF3XwDxMR9x/y1WPPwkTNalZCA9DGnQ==", + "dev": true + }, + "node_modules/topo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz", + "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==", + "deprecated": "This module has moved and is now available at @hapi/topo. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.", + "dev": true, + "dependencies": { + "hoek": "6.x.x" + } + }, + "node_modules/topo/node_modules/hoek": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz", + "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==", + "deprecated": "This module has moved and is now available at @hapi/hoek. Please update your dependencies as this version is no longer maintained an may contain bugs and security issues.", + "dev": true + }, + "node_modules/watch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/watch/-/watch-1.0.2.tgz", + "integrity": "sha512-1u+Z5n9Jc1E2c7qDO8SinPoZuHj7FgbgU1olSFoyaklduDvvtX7GMMtlE6OC9FTXq4KvNAOfj6Zu4vI1e9bAKA==", + "dev": true, + "dependencies": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + }, + "bin": { + "watch": "cli.js" + }, + "engines": { + "node": ">=0.1.95" + } + }, + "node_modules/xml2json": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/xml2json/-/xml2json-0.12.0.tgz", + "integrity": "sha512-EPJHRWJnJUYbJlzR4pBhZODwWdi2IaYGtDdteJi0JpZ4OD31IplWALuit8r73dJuM4iHZdDVKY1tLqY2UICejg==", + "dev": true, + "dependencies": { + "hoek": "^4.2.1", + "joi": "^13.1.2", + "node-expat": "^2.3.18" + }, + "bin": { + "xml2json": "bin/xml2json" + } + } + }, "dependencies": { "bindings": { "version": "1.5.0", From e3409f92fad2b91aa0c3222a8403f537a58f6e36 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 9 Mar 2023 15:29:58 -0600 Subject: [PATCH 60/68] Add per-scanline offset rendering. --- ORCACDefs/gte.h | 2 + demos/kfest-2022/demo-1/App.Main.s | 115 ++++++- macros/GTE.Macs.s | 3 + src/CoreImpl.s | 14 +- src/Defs.s | 9 +- src/Render.s | 22 +- src/Tool.s | 37 ++- src/blitter/Horz.s | 474 ++++++++--------------------- src/static/TileStore.s | 16 +- 9 files changed, 319 insertions(+), 373 deletions(-) diff --git a/ORCACDefs/gte.h b/ORCACDefs/gte.h index 3af4406..e0103d2 100644 --- a/ORCACDefs/gte.h +++ b/ORCACDefs/gte.h @@ -104,6 +104,8 @@ extern pascal void GTEClearBG1Buffer(Word value) inline(0x29A0, tool_dispatcher) /* GTE Misc. Functions */ extern pascal Word GTEReadControl(void) inline(0x09A0, tool_dispatcher); extern pascal Word GTEGetSeconds(void) inline(0x14A0, tool_dispatcher); +extern pascal Pointer GTEGetAddress(Word tableId) inline(0x2CA0, tool_dispatcher); +extern pascal void GTESetAddress(Word tableId, Pointer pointer) inline(0x2EA0, tool_dispatcher); /* GTE Timer Functions */ diff --git a/demos/kfest-2022/demo-1/App.Main.s b/demos/kfest-2022/demo-1/App.Main.s index 6ad1f60..44d6d02 100644 --- a/demos/kfest-2022/demo-1/App.Main.s +++ b/demos/kfest-2022/demo-1/App.Main.s @@ -35,6 +35,7 @@ MaxGlobalX equ 16 MaxGlobalY equ 18 MaxBG0X equ 20 MaxBG0Y equ 22 +frameCount equ 24 OldOneSecondCounter equ 26 appTmp0 equ 28 @@ -74,6 +75,10 @@ appTmp0 equ 28 jsr BG0SetUp jsr SetLimits + pea #80 + pei MaxBG0Y + _GTESetBG0Origin + lda #193 ; Tile ID of '0' jsr InitOverlay ; Initialize the status bar pha @@ -82,6 +87,18 @@ appTmp0 equ 28 sta OldOneSecondCounter jsr UdtOverlay +; Set up the per-scanline rendering + + lda #0 + jsr InitOffsets + pea #scanlineHorzOffset + pea #^BG0Offsets + pea #BG0Offsets + _GTESetAddress + + pea $0000 ; one regular render to fill the screen with the tilemap + _GTERender + ; Set up a very specific test. First, we draw a sprite into the sprite plane, and then ; leave it alone. We are just testing the ability to merge sprite plane data into ; the play field tiles. @@ -102,9 +119,11 @@ EvtLoop bcc *+5 brl :do_render inc StartX - pei StartX - pei StartY - _GTESetBG0Origin + lda StartX + jsr SetOffsets +; pei StartX +; pei StartY +; _GTESetBG0Origin brl :do_render :not_d @@ -114,9 +133,11 @@ EvtLoop bne *+5 brl :do_render dec StartX - pei StartX - pei StartY - _GTESetBG0Origin + lda StartX + jsr SetOffsets +; pei StartX +; pei StartY +; _GTESetBG0Origin brl :do_render :not_a @@ -144,7 +165,7 @@ EvtLoop :not_w :do_render - pea $0000 + pea #RENDER_PER_SCANLINE _GTERender ; Update the performance counters @@ -234,7 +255,85 @@ SetLimits rts -frameCount equ 24 +SetOffsets + and #$00FF + brl _SetOffsets + +InitOffsets + and #$00FF + sta appTmp0 + + ldx #0 + ldy #80 + jsr _InitRange + ldx #80 + ldy #80 + jsr _InitRange + ldx #160 + ldy #48 + jsr _InitRange + + lda appTmp0 +_SetOffsets + ldx #160 + ldy #48 + jsr _SetRange + lsr + ldx #80 + ldy #80 + jsr _SetRange + lsr + ldx #0 + ldy #80 + jsr _SetRange + rts + +_SetRange + pha + + txa + asl + tax + +:loop2 lda BG0Offsets,x + and #$FF00 + ora 1,s + sta BG0Offsets,x + + dey + beq :done + + inx + inx + cpx #416 + bcc :loop2 +:done + pla + rts + +_InitRange + txa + asl + tax + + tya + dec + and #$00FF + xba + +:loop1 sta BG0Offsets,x + sec + sbc #$0100 + dey + beq :done + inx + inx + cpx #416 + bcc :loop1 +:done + rts + +BG0Offsets ds 416 PUT ../StartUp.s PUT ../../shell/Overlay.s diff --git a/macros/GTE.Macs.s b/macros/GTE.Macs.s index 46ca6b1..0e9e976 100644 --- a/macros/GTE.Macs.s +++ b/macros/GTE.Macs.s @@ -132,6 +132,9 @@ _GTEGetAddress MAC _GTECompileSpriteStamp MAC UserTool $2D00+GTEToolNum <<< +_GTESetAddress MAC + UserTool $2E00+GTEToolNum + <<< ; EngineMode definitions ; Script definition diff --git a/src/CoreImpl.s b/src/CoreImpl.s index 7041f82..18a2ac9 100644 --- a/src/CoreImpl.s +++ b/src/CoreImpl.s @@ -251,13 +251,13 @@ EngineReset bne :loop ; Set the scanline tables to reasonable default values - ldx #{416*2}-2 - lda #0 -:sxm_loop - sta StartXMod164Arr,x - dex - dex - bpl :sxm_loop +; ldx #{416*2}-2 +; lda #0 +;:sxm_loop +; sta StartXMod164Arr,x +; dex +; dex +; bpl :sxm_loop rts diff --git a/src/Defs.s b/src/Defs.s index 7134be2..c642db1 100644 --- a/src/Defs.s +++ b/src/Defs.s @@ -102,7 +102,9 @@ RenderFlags equ 124 ; Flags passed to the Render() function BG1Scaling equ 126 activeSpriteList equ 128 ; 32 bytes for the active sprite list (can persist across frames) -; tiletmp equ 178 ; 16 bytes of temp storage for the tile renderers + +; Free space from 160 to 192 + blttmp equ 192 ; 32 bytes of local cache/scratch space for blitter tmp8 equ 224 ; another 16 bytes of temporary space to be used as scratch @@ -282,8 +284,8 @@ VBuffHorzTableSelect EXT BG1YCache EXT ScalingTables EXT -StartXMod164Arr EXT -LastPatchOffsetArr EXT +;StartXMod164Arr EXT +;LastPatchOffsetArr EXT _SortedHead EXT _ShadowListCount EXT @@ -294,6 +296,7 @@ _DirectListTop EXT _DirectListBottom EXT StartXMod164Tbl EXT +LastOffsetTbl EXT ; Tool error codes NO_TIMERS_AVAILABLE equ 10 diff --git a/src/Render.s b/src/Render.s index ab2d3ef..73959e6 100644 --- a/src/Render.s +++ b/src/Render.s @@ -169,7 +169,17 @@ _RenderScanlines ; jsr _ApplyTiles ; This function actually draws the new tiles into the code field - jsr _ScanlineBG0XPos ; Patch the code field instructions with exit BRA opcode + jsr _ApplyScanlineBG0XPos ; Patch the code field instructions with exit BRA opcode + + jsr _BuildShadowList ; Create the rages based on the sorted sprite y-values + + jsr _ShadowOff ; Turn off shadowing and draw all the scanlines with sprites on them + jsr _DrawShadowList + jsr _DrawDirectSprites ; Draw the sprites directly to the Bank $01 graphics buffer (skipping the render-to-tile step) + + jsr _ShadowOn ; Turn shadowing back on +; jsr _DrawComplementList ; Alternate drawing scanlines and PEI slam to expose the full fram + jsr _DrawFinalPass ; jsr _ApplyBG1XPos ; Update the direct page value based on the horizontal position @@ -209,11 +219,11 @@ _RenderScanlines ; jsr _BltRange ; bra :done -:no_ovrly - ldx #0 ; Blit the full virtual buffer to the screen - ldy ScreenHeight - jsr _BltRange -:done +;:no_ovrly +; ldx #0 ; Blit the full virtual buffer to the screen +; ldy ScreenHeight +; jsr _BltRange +;:done ; ldx #0 ; ldy ScreenHeight diff --git a/src/Tool.s b/src/Tool.s index d442127..814b09c 100644 --- a/src/Tool.s +++ b/src/Tool.s @@ -99,6 +99,7 @@ _CallTable adrl _TSGetAddress-1 adrl _TSCompileSpriteStamp-1 + adrl _TSSetAddress-1 _CTEnd _GTEAddSprite MAC @@ -302,6 +303,12 @@ _TSRender bra :done :no_shadowing + bit #RENDER_PER_SCANLINE + beq :no_scanline + jsr _RenderScanlines + bra :done + +:no_scanline jsr _Render :done @@ -865,27 +872,45 @@ _TSSetBG1Scale sta BG1Scaling _TSExit #0;#2 +; Pointer GetAddress(tblId) _TSGetAddress -:output equ FirstParam+0 -:tblId equ FirstParam+4 +:tblId equ FirstParam+0 +:output equ FirstParam+2 _TSEntry lda #0 sta :output,s sta :output+2,s - lda :value,s + lda :tblId,s cmp #scanlineHorzOffset bne :out - lda #StartXMod164Arr + lda StartXMod164Tbl sta :output,s - lda #^StartXMod164Arr + lda StartXMod164Tbl+2 sta :output+2,s :out _TSExit #0;#2 +; SetAddress(tblId, Pointer) +_TSSetAddress +:ptr equ FirstParam+0 +:tblId equ FirstParam+4 + + _TSEntry + lda :tblId,s + cmp #scanlineHorzOffset + bne :out + + lda :ptr,s + sta StartXMod164Tbl + lda :ptr+2,s + sta StartXMod164Tbl+2 +:out + _TSExit #0;#6 + ; CompileSpriteStamp(spriteId, vbuffAddr) _TSCompileSpriteStamp :vbuff equ FirstParam @@ -916,7 +941,7 @@ _TSCompileSpriteStamp put Sprite2.s put SpriteRender.s put Render.s - put blitter/Scanline.s +; put blitter/Scanline.s put render/Render.s put render/Fast.s put render/Slow.s diff --git a/src/blitter/Horz.s b/src/blitter/Horz.s index 3655e53..5e3f4aa 100644 --- a/src/blitter/Horz.s +++ b/src/blitter/Horz.s @@ -50,11 +50,7 @@ _RestoreBG0Opcodes :virt_line_x2 equ tmp1 :lines_left_x2 equ tmp2 -:draw_count_x2 equ tmp3 :exit_offset equ tmp4 -:stk_save equ tmp5 - - phb ; Save data bank asl sta :virt_line_x2 ; Keep track of it @@ -66,6 +62,14 @@ _RestoreBG0Opcodes lda LastPatchOffset ; If zero, there are no saved opcodes sta :exit_offset +_RestoreBG0OpcodesAlt +:virt_line_x2 equ tmp1 +:lines_left_x2 equ tmp2 +:draw_count_x2 equ tmp3 +:exit_offset equ tmp4 +:stk_save equ tmp5 + + phb ; Save data bank tsc sta :stk_save @@ -144,18 +148,8 @@ _ApplyBG0XPosPre rts _ApplyBG0XPos - -:stk_save equ tmp0 :virt_line_x2 equ tmp1 :lines_left_x2 equ tmp2 -:draw_count_x2 equ tmp3 -:exit_offset equ tmp4 -:entry_offset equ tmp5 -:exit_bra equ tmp6 -:exit_address equ tmp7 -:base_address equ tmp8 -:opcode equ tmp9 -:odd_entry_offset equ tmp10 ; If there are saved opcodes that have not been restored, do not run this routine lda LastPatchOffset @@ -232,6 +226,21 @@ _ApplyBG0XPos ; +-----------+ lda StartXMod164 + +; Alternate entry point if the virt_line_x2 and lines_left_x2 and XMod164 values are passed in externally +_ApplyBG0XPosAlt +:stk_save equ tmp0 +:virt_line_x2 equ tmp1 +:lines_left_x2 equ tmp2 +:draw_count_x2 equ tmp3 +:exit_offset equ tmp4 +:entry_offset equ tmp5 +:exit_bra equ tmp6 +:exit_address equ tmp7 +:base_address equ tmp8 +:opcode equ tmp9 +:odd_entry_offset equ tmp10 + bit #$0001 jne :odd_case ; Specialized routines for even/odd cases @@ -368,7 +377,7 @@ _ApplyBG0XPos sbc #164 tax - lda Col2CodeOffset-1,x + lda Col2CodeOffset-1,x ; Odd offset to get the value in the high byte and #$FF00 ora #$00AF sta :opcode @@ -445,361 +454,148 @@ _ApplyBG0XPos plb rts +_RestoreScanlineBG0Opcodes +:virt_line_x2 equ tmp1 +:lines_left_x2 equ tmp2 +:exit_offset equ tmp4 + +; Avoid local var collisions +:virt_line_pos_x2 equ tmp11 +:total_left_x2 equ tmp12 +:current_count_x2 equ tmp13 +:ptr equ tmp14 + + asl + sta :virt_line_pos_x2 + tay + + txa + asl + sta :total_left_x2 + + lda StartXMod164Tbl + sta :ptr + lda StartXMod164Tbl+2 + sta :ptr+2 + +; Patch our the ranges from the StartXMod164Tbl array starting at the first virtual line +:loop + lda [:ptr],y + and #$FF00 ; Determine how many sequential lines to restore + xba + inc + asl + min :total_left_x2 ; Don't draw more than the number of lines that are left to process + sta :current_count_x2 ; Save a copy for later + + sta :lines_left_x2 ; Set the parameter + sty :virt_line_x2 ; Set the parameter + lda LastOffsetTbl,y + sta :exit_offset + jsr _RestoreBG0OpcodesAlt + + clc + lda :virt_line_pos_x2 + adc :current_count_x2 + cmp #208*2 ; Do the modulo check in this loop + bcc *+5 + sbc #208*2 + sta :virt_line_pos_x2 + tay + + lda :total_left_x2 + sec + sbc :current_count_x2 + sta :total_left_x2 + bne :loop + + rts + ; This is a variant of the above routine that allows each x-position to be set independently from a table of value. This is ; quite a bit slower than the other routine since we cannot store constant values for each line. ; -; We still want to perform operation in blocks of 16 to avoid repeatedly setting the data bank register for each line. In -; order to accomplish this, the even/odd cases are split into separate code blocks and the unrolled loop will patch up -; all of the memory locations on each line, rather than doing each patch one at a time. This may actually be more efficient -; since it eliminates several jmp (abs,x) / tax instructions and removed some register reloading. +; This routine operates at a higher level and does not try to be super optimized for the case where every line has a different +; set of parameters. Instead, we optimize for the case where there are a few large ranges of the screen moving at different +; rates, e.g. a fixed status bar area on top, a slow-scrolling area in the middle and a fast are in the foreground. ; -; The two unrolled loop elements are: +; The table that drives this is dense and has the following format for each word ; -; Even: -; lda: $0000,x ; Load from X = BTableLow + exit_offset -; sta: OPCODE_SAVE,y ; Save the two byte in another area of the line code -; lda :exit_bra[n] -; sta $0000,x ; Replace the two bytes with a BRA instruction to exit the blitter -; lda :opcode[n] -; sta: CODE_ENTRY_OPCODE,y ; CODE_ENTRY_OPCODE and CODE_ENTRY are adjacent -- could make this a single 16-bit store +; Bits 0 - 7: X mod 164 value +; Bits 8 - 15: Number of scanline to persist this mod value ; -; Odd: -; Same as above, plus... -; lda :odd_entry_offset[n] ; [8-bit] Get back into the code after fixing up the odd edge -; sta: ODD_ENTRY,y -; lda: $0001,x ; Save the high word in case the last instruction is PEA and we need to load the top byte -; sta: OPCODE_HIGH_SAVE,y -; -_ApplyBG0XPosPerScanline -:stk_save equ tmp0 +; So, if the first 10 entries has a mod value of 5, they would look like: $0905, $0805, $0705, ... $0105, $0005 +; +; This allows the code to start an an arbitrary location and immeditely sync up with the modulo list. It also allows +; the code to easily skip ranges of constant values using the existing _ApplyBG0XPos function as a subroutine. +_ApplyScanlineBG0XPos + +; Copies of the local variables in _ApplyBG0XPos :virt_line_x2 equ tmp1 :lines_left_x2 equ tmp2 -:draw_count_x2 equ tmp3 :exit_offset equ tmp4 -:entry_offset equ tmp5 -:exit_bra equ tmp6 -:exit_address equ tmp7 -:base_address equ tmp8 -:opcode equ tmp9 -:odd_entry_offset equ tmp10 -; If there are saved opcodes that have not been restored, do not run this routine - lda LastPatchOffset - beq :ok +; Avoid local var collision with _ApplyBG0XPos +:virt_line_pos_x2 equ tmp11 +:total_left_x2 equ tmp12 +:current_count_x2 equ tmp13 +:ptr equ tmp14 + + lda StartXMod164Tbl + sta :ptr + lda StartXMod164Tbl+2 + sta :ptr+2 + ora :ptr + bne *+3 ; null pointer check rts -; In this routine, basically every horizontal parameter is based off of the :virt_line_x2 index -:ok lda StartYMod208 ; This is the base line of the virtual screen asl - sta :virt_line_x2 ; Keep track of it + sta :virt_line_pos_x2 + tay lda ScreenHeight asl - sta :lines_left_x2 - -; Sketch out the core structural elements of the loop + bank management - - phb ; Save the existing bank - tsc - sta :stk_save + sta :total_left_x2 +; Patch our the ranges from the StartXMod164Tbl array starting at the first virtual line :loop - ldx :virt_line_x2 - - txa - and #$001E - eor #$FFFF - sec - adc #2*16 ; 2 * (16 - virt_line % 16). This get us aligned to 16-line boundaries - min :lines_left_x2 ; Make sure we handle cases where lines_left < aligned remainder - sta :draw_count_x2 ; We are drawing this many lines on this iteration starting at _virt_line_x2 - - ldal BTableHigh,x ; Set the bank - pha - plb - - jsr :DoScanlineRange ; Patch in the code field for this range (Bank is set) - - lda :draw_count_x2 - clc ; advance to the virtual line after the segment we just - adc :virt_line_x2 ; filled in - sta :virt_line_x2 - - lda :lines_left_x2 ; subtract the number of lines we just completed - sec - sbc :draw_count_x2 - sta :lines_left_x2 - jne :loop - - lda :stk_save - tcs - plb - rts - -; Run through and build an array of scanline data and place it in temporary zero page space. Need a total of 48 bytes. -:BuildScanlineData - -; First step, run though and create the tables for the copy routine - lda StartXMod164Tbl,x - bit #$0001 -; bne :bsd_odd - - tay - lda CodeFieldEvenBRA-2,y ; The exit point comes after the left edge (reverse order due to stack) - sta :exit_bra,x - lda Col2CodeOffset-2,y - sta :exit_offset,x - - -:DoScanlineRange - ldx :virt_line_x2 - -; First, calculate the exit point - - ldal StartXMod164Tbl,x ; Get the origin for this line - bit #$0001 - bne :is_odd ; Quickly switch to specialized even/odd routines - -; For even offsets, the index is x - 2 -; For odd offsets, the index is x - 1 -; -; So, for both we can do (x - 1) & $FFFE = dec / and #$FFFE = lsr / asl + clears the carry - -; This is an even-aligned line - -; dec ; Move to the previous address for entry (a - 1) % 164 -; dec ; Optimization: Coule eliminate this with a double-width tbale for CodeFieldEvenBRA -; bpl *+5 -; lda #162 - - tay - lda CodeFieldEvenBRA-2,y - sta :exit_bra ; Store are exit_offset + - lda Col2CodeOffset-2,y - sta :exit_offset - -; tya -; adc ScreenWidth -; cmp #164 ; Keep the value in range -; bcc *+5 -; sbc #164 -; tay - - lda Col2CodeOffset-2-1,y ; -2 for even case , -1 to load value into high byte - and #$FF00 -; sta :entry_offset - ora #$004C ; set the entry_jmp opcode to JMP - sta :opcode -; stz :odd_entry_offset ; mark as an even case - - ldal BTableLow,x ; Get the address of the code field line - tay ; Save it to use as the base address - clc - adc :exit_offset ; Add some offsets to get the base address in the code field line + lda [:ptr],y tax - clc -; This is the core even patch loop. The y-register tracks the base address of the starting line. Set the x-register -; based on the per-line exit_offset and eveything else references other data + and #$FF00 ; Determine how many sequential lines have this mod value + xba + inc + asl + min :total_left_x2 ; Don't draw more than the number of lines that are left to process + sta :current_count_x2 ; Save a copy for later -; tya -; adc :exit_offset+{]line*2} -; tax -; lda: {]line*$1000},x -; sta: OPCODE_SAVE+{]line*$1000},y -; lda :exit_bra+{]line*2} ; Copy this value into all of the lines -; sta: {]line*$1000},x -; lda :entry_offset+{]line*2} ; Pre-merged with the appropriate opcode + offset -; sta: CODE_ENTRY_OPCODE+{]line*$1000},y + sta :lines_left_x2 ; Set the parameter + sty :virt_line_x2 ; Set the parameter + txa ; Put the X mod 164 value in the accumulator + and #$00FF + jsr _ApplyBG0XPosAlt - bra :prep_complete - -; This is an odd-aligned line -:is_odd - dec ; Remove the least-significant byte (must stay positive) - tay - lda CodeFieldOddBRA,y - sta :exit_bra - lda Col2CodeOffset,y - sta :exit_offset + lda :exit_offset ; Get the direct address in the code field that was overwritten + ldy :virt_line_pos_x2 + sta LastOffsetTbl,y ; Stash it for use by the per-scanline resotre function tya - adc ScreenWidth - cmp #164 ; Keep the value in range - bcc *+5 - sbc #164 - tay - lda Col2CodeOffset,y - sta :entry_offset ; Will be used to load the data - lda Col2CodeOffset-2,y - sta :odd_entry_offset ; will be the actual location to jump to - lda #$00AF ; set the entry_jmp opcode to LDAL - sta :opcode - -:prep_complete - ldal BTableLow,x ; Get the address of the code field line - tay ; Save it to use as the base address clc - adc :exit_offset ; Add some offsets to get the base address in the code field line + adc :current_count_x2 + cmp #208*2 ; Do the modulo check in this loop + bcc *+5 + sbc #208*2 + sta :virt_line_pos_x2 + tay -; sta :exit_address -; sty :base_address - - -; ldy :base_address -; ldx :exit_address ; Save from this location (not needed in fast mode) -; SaveOpcode ; X = :exit_address on return - tax - lda: $0000,x - sta: OPCODE_SAVE+$0000,y - - -; txy ; ldy :exit_address -- starting at this address -; ldx :draw_count_x2 ; Do this many lines - lda :exit_bra ; Copy this value into all of the lines -; SetConst ; All registers are preserved - sta: $0000,x - -; Next, patch in the CODE_ENTRY value, which is the low byte of a JMP instruction. This is an -; 8-bit operation and, since the PEA code is bank aligned, we use the entry_offset value directly - - sep #$20 - - lda :entry_offset -; ldy :base_address -; SetCodeEntry ; All registers are preserved - sta: CODE_ENTRY+$0000,y - -; Now, patch in the opcode - - lda :opcode -; SetCodeEntryOpcode ; All registers are preserved - sta: CODE_ENTRY_OPCODE+$0000,y - -; If this is an odd entry, also set the odd_entry low byte and save the operand high byte - - lda :odd_entry_offset - jeq :not_odd - -; SetOddCodeEntry ; All registers are preserved - sta: ODD_ENTRY+$0000,y -; SaveHighOperand :exit_address ; Only used once, so "inline" it - ldx :exit_address - lda: $0002,x - sta: OPCODE_HIGH_SAVE+$0000,y - -:not_odd - rep #$21 ; clear the carry - - lda :virt_line_x2 ; advance to the virtual line after - adc :draw_count_x2 ; filled in - sta :virt_line_x2 - - lda :lines_left_x2 ; subtract the number of lines we just completed + lda :total_left_x2 sec - sbc :draw_count_x2 - sta :lines_left_x2 - - jne :loop + sbc :current_count_x2 + sta :total_left_x2 + bne :loop rts - -; DoEvenRange -; -; Does all the core operations for an even range (16-bit accumulator and registers) -; -; X = number of lines * 2, 0 to 32 -; Y = starting line * $1000 -; A = code field location * $1000 -DoEvenRange mac - asl ; mult the offset by 2 and clear the carry at the same time - adc #dispTbl - stal patch+1 -patch jmp $0000 -dispTbl jmp bottom - db 1 - jmp x01 - db 1 - jmp x02 - db 1 - jmp x03 - db 1 - jmp x04 - db 1 - jmp x05 - db 1 - jmp x06 - db 1 - jmp x07 - db 1 - jmp x08 - db 1 - jmp x09 - db 1 - jmp x10 - db 1 - jmp x11 - db 1 - jmp x12 - db 1 - jmp x13 - db 1 - jmp x14 - db 1 - jmp x15 - db 1 -x16 tya - adc :exit_offset+$1E - tax - lda: $F000,x - sta: OPCODE_SAVE+$F000,y - lda :exit_bra+$1E - sta: $F000,x - lda :entry_offset+$1E ; Pre-merged with the appropriate opcode + offset - sta: CODE_ENTRY_OPCODE+$F000,y - -x15 tya - adc :exit_offset+$1E - tax - lda: $E000,x - sta: OPCODE_SAVE+$E000,y - lda :exit_bra+$1C - sta: $E000,x - lda :entry_offset+$1C - sta: CODE_ENTRY_OPCODE+$E000,y - -x14 lda $D002,x - sta OPCODE_HIGH_SAVE+$D000,y -x13 lda $C002,x - sta OPCODE_HIGH_SAVE+$C000,y -x12 lda $B002,x - sta OPCODE_HIGH_SAVE+$B000,y -x11 lda $A002,x - sta OPCODE_HIGH_SAVE+$A000,y -x10 lda $9002,x - sta OPCODE_HIGH_SAVE+$9000,y -x09 lda $8002,x - sta OPCODE_HIGH_SAVE+$8000,y -x08 lda $7002,x - sta OPCODE_HIGH_SAVE+$7000,y -x07 lda $6002,x - sta OPCODE_HIGH_SAVE+$6000,y -x06 lda $5002,x - sta OPCODE_HIGH_SAVE+$5000,y -x05 lda $4002,x - sta OPCODE_HIGH_SAVE+$4000,y -x04 lda $3002,x - sta OPCODE_HIGH_SAVE+$3000,y -x03 lda $2002,x - sta OPCODE_HIGH_SAVE+$2000,y -x02 lda $1002,x - sta OPCODE_HIGH_SAVE+$1000,y -x01 lda: $0002,x - sta: OPCODE_HIGH_SAVE+$0000,y -bottom <<< - ; SaveHighOperand ; ; Save the high byte of the 3-byte code field instruction into the odd handler at the end diff --git a/src/static/TileStore.s b/src/static/TileStore.s index 6bc53cf..b5767af 100644 --- a/src/static/TileStore.s +++ b/src/static/TileStore.s @@ -108,6 +108,10 @@ TileStoreLookup ENT Col2CodeOffset ENT lup 82 dw CODE_TOP+{{81-]step}*PER_TILE_SIZE} +]step equ ]step+1 + --^ + lup 82 ; Make is a double-length table so we can add the ScreenWidth without testing for wrap-around + dw CODE_TOP+{{81-]step}*PER_TILE_SIZE} ]step equ ]step+1 --^ dw CODE_TOP+{81*PER_TILE_SIZE} @@ -386,6 +390,10 @@ BG1YOffsetTable ENT ; Per-scanline offsets for BG0 StartXMod164Tbl ENT + dw 0,0 + +LastOffsetTbl ENT + ds 416 ; Other Toolset variables OneSecondCounter ENT @@ -566,7 +574,7 @@ Scale15 dw $003C,$003C,$003C,$003E,$003E,$003E,$003E,$0040,$0040,$0040,$0040,$ blt_return stk_save -StartXMod164Arr ENT - ds 416*2 -LastPatchOffsetArr ENT - ds 416*2 +;StartXMod164Arr ENT +; ds 416*2 +;LastPatchOffsetArr ENT +; ds 416*2 From 5cfefc350c52ed73cfe09f35c473216750147ed3 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Thu, 9 Mar 2023 16:17:55 -0600 Subject: [PATCH 61/68] Improve per-scanline demo --- demos/kfest-2022/demo-1/App.Main.s | 159 +++++++++++++++++++++-------- 1 file changed, 117 insertions(+), 42 deletions(-) diff --git a/demos/kfest-2022/demo-1/App.Main.s b/demos/kfest-2022/demo-1/App.Main.s index 44d6d02..4ebcea9 100644 --- a/demos/kfest-2022/demo-1/App.Main.s +++ b/demos/kfest-2022/demo-1/App.Main.s @@ -38,6 +38,9 @@ MaxBG0Y equ 22 frameCount equ 24 OldOneSecondCounter equ 26 appTmp0 equ 28 +seg1x equ 30 +seg2x equ 32 +seg3x equ 34 phk plb @@ -51,12 +54,6 @@ appTmp0 equ 28 lda #ENGINE_MODE_USER_TOOL ; Engine in Fast Mode as a User Tool jsr GTEStartUp ; Load and install the GTE User Tool -; Initialize local variables - - stz StartX - stz StartY - stz frameCount - ; Load a tileset pea 0 @@ -72,11 +69,25 @@ appTmp0 equ 28 ; Set up our level data - jsr BG0SetUp +; jsr BG0SetUp + pea 416 + pea 30 + pea ^App_TileMapBG0 + pea App_TileMapBG0+{10*416} + _GTESetBG0TileMapInfo + jsr SetLimits - pea #80 - pei MaxBG0Y +; Initialize local variables + + lda #56 + sta StartX + lda #0 + sta StartY + stz frameCount + + pei StartX + pei StartY _GTESetBG0Origin lda #193 ; Tile ID of '0' @@ -89,8 +100,9 @@ appTmp0 equ 28 ; Set up the per-scanline rendering - lda #0 + lda StartX jsr InitOffsets + pea #scanlineHorzOffset pea #^BG0Offsets pea #BG0Offsets @@ -114,13 +126,14 @@ EvtLoop :do_more cmp #'d' bne :not_d - lda StartX - cmp MaxBG0X - bcc *+5 - brl :do_render - inc StartX - lda StartX +; lda StartX +; cmp MaxBG0X +; bcc *+5 +; brl :do_render + + jsr DecRanges jsr SetOffsets + ; pei StartX ; pei StartY ; _GTESetBG0Origin @@ -129,12 +142,13 @@ EvtLoop cmp #'a' bne :not_a - lda StartX - bne *+5 - brl :do_render - dec StartX - lda StartX +; lda StartX +; bne *+5 +; brl :do_render + + jsr IncRanges jsr SetOffsets + ; pei StartX ; pei StartY ; _GTESetBG0Origin @@ -255,38 +269,99 @@ SetLimits rts -SetOffsets - and #$00FF - brl _SetOffsets +DecRanges + lda seg1x + bne *+5 + lda #164 + dec + sta seg1x + bit #1 + bne :out + lda seg2x + bne *+5 + lda #164 + dec + sta seg2x + bit #1 + bne :out + lda seg3x + bne *+5 + lda #164 + dec + sta seg3x +:out + rts + +IncRanges + lda seg1x + inc + cmp #164 + bcc *+5 + lda #0 + sta seg1x + bit #1 + bne :out + lda seg2x + inc + cmp #164 + bcc *+5 + lda #0 + sta seg2x + bit #1 + bne :out + lda seg3x + inc + cmp #164 + bcc *+5 + lda #0 + sta seg3x +:out + rts + InitOffsets - and #$00FF - sta appTmp0 + pha ldx #0 + ldy #40 + jsr _InitRange + ldx #40 ldy #80 jsr _InitRange - ldx #80 - ldy #80 - jsr _InitRange - ldx #160 - ldy #48 + ldx #120 + ldy #88 jsr _InitRange - lda appTmp0 -_SetOffsets - ldx #160 - ldy #48 - jsr _SetRange + pla + sta seg1x + jsr SetOffset1 lsr - ldx #80 + sta seg2x + jsr SetOffset2 + lsr + sta seg3x + jmp SetOffset3 + +SetOffsets + lda seg1x + jsr SetOffset1 + lda seg2x + jsr SetOffset2 + lda seg3x + jmp SetOffset3 + +SetOffset1 + ldx #120 + ldy #88 + jmp _SetRange +SetOffset2 + ldx #40 ldy #80 - jsr _SetRange - lsr + jmp _SetRange +SetOffset3 ldx #0 - ldy #80 - jsr _SetRange - rts + ldy #40 + jmp _SetRange _SetRange pha From 9021ee4506708dc3e922b5ee13b8bab8e5a437b9 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Fri, 10 Mar 2023 15:50:42 -0600 Subject: [PATCH 62/68] WIP of BG1 scanline effects A static BG1 is stable with BG0 offset values. A seam in BG1 needs to be closed up by taking into account the BG1XOrigin value when setting the :shift_value. Also, several routines were hard-coded for the scanline case. These hanges need to be reverted and properly parametereized. --- demos/kfest-2022/demo-1/App.Main.s | 52 ++++- src/Render.s | 11 +- src/Tool.s | 4 +- src/blitter/BG1.s | 356 +++++++++++++++++++++++++++-- 4 files changed, 403 insertions(+), 20 deletions(-) diff --git a/demos/kfest-2022/demo-1/App.Main.s b/demos/kfest-2022/demo-1/App.Main.s index 4ebcea9..73a9dc2 100644 --- a/demos/kfest-2022/demo-1/App.Main.s +++ b/demos/kfest-2022/demo-1/App.Main.s @@ -41,6 +41,7 @@ appTmp0 equ 28 seg1x equ 30 seg2x equ 32 seg3x equ 34 +seg4x equ 36 ; BG1 x-pos phk plb @@ -51,9 +52,15 @@ seg3x equ 34 _MTStartUp ; GTE requires the miscellaneous toolset to be running - lda #ENGINE_MODE_USER_TOOL ; Engine in Fast Mode as a User Tool + lda #ENGINE_MODE_USER_TOOL+ENGINE_MODE_TWO_LAYER ; Engine in Fast Mode as a User Tool jsr GTEStartUp ; Load and install the GTE User Tool +; Initialize the graphics screen playfield + + pea #160 + pea #200 + _GTESetScreenMode + ; Load a tileset pea 0 @@ -67,6 +74,9 @@ seg3x equ 34 pea #TileSetPalette _GTESetPalette + pea $0 + _GTEClearBG1Buffer + ; Set up our level data ; jsr BG0SetUp @@ -76,7 +86,13 @@ seg3x equ 34 pea App_TileMapBG0+{10*416} _GTESetBG0TileMapInfo + stz seg1x + stz seg2x + stz seg3x + stz seg4x + jsr SetLimits + jsr DoLoadBG1 ; Initialize local variables @@ -315,6 +331,14 @@ IncRanges bcc *+5 lda #0 sta seg3x + bit #1 + bne :out + lda seg4x + inc + cmp #160 + bcc *+5 + lda #0 + sta seg4x :out rts @@ -348,7 +372,13 @@ SetOffsets lda seg2x jsr SetOffset2 lda seg3x - jmp SetOffset3 + jsr SetOffset3 + + pei seg4x + pea 0 + _GTESetBG1Origin + + rts SetOffset1 ldx #120 @@ -408,6 +438,24 @@ _InitRange :done rts +; Load a binary file in the BG1 buffer +DoLoadBG1 + jsr AllocBank ; Alloc 64KB for Load/Unpack + sta BankLoad ; Store "Bank Pointer" + ldx #BG1DataFile ; Load the background file into the bank + jsr LoadFile + + pea #164 ; Fill everything + pea #200 + pea #256 + lda BankLoad + pha + pea $0000 + pea $0000 ; default flags + _GTECopyPicToBG1 + rts + +BG1DataFile strl '1/bg1.bin' BG0Offsets ds 416 PUT ../StartUp.s diff --git a/src/Render.s b/src/Render.s index 73959e6..b0ee933 100644 --- a/src/Render.s +++ b/src/Render.s @@ -156,8 +156,16 @@ _DoOverlay ; Use the per-scanline tables to set the screen. This is really meant to be used without the built-in tilemap ; support and is more of a low-level way to control the background rendering _RenderScanlines + lda BG1YTable ; Make sure we're in the right mode + cmp #$00A0 + beq :ytbl_ok + lda #1 + jsr _ResetBG1YTable + lda BG1YTable +:ytbl_ok + jsr _ApplyBG0YPos ; Set stack addresses for the virtual lines to the physical screen - jsr _ApplyBG1YPos ; Set the y-register values of the blitter + jsr _ApplyScanlineBG1YPos ; Set the y-register values of the blitter ; _ApplyBG0Xpos need to be split because we have to set the offsets, then draw in any updated tiles, and ; finally patch out the code field. Right now, the BRA operand is getting overwritten by tile data. @@ -170,6 +178,7 @@ _RenderScanlines ; jsr _ApplyTiles ; This function actually draws the new tiles into the code field jsr _ApplyScanlineBG0XPos ; Patch the code field instructions with exit BRA opcode + jsr _ApplyScanlineBG1XPos jsr _BuildShadowList ; Create the rages based on the sorted sprite y-values diff --git a/src/Tool.s b/src/Tool.s index 814b09c..87c430d 100644 --- a/src/Tool.s +++ b/src/Tool.s @@ -500,6 +500,7 @@ _TSCopyPicToBG1 :src_width equ tmp6 :src_height equ tmp7 :src_stride equ tmp8 +:src_flags equ tmp9 lda :width,s sta :src_width @@ -509,7 +510,8 @@ _TSCopyPicToBG1 sta :src_stride ldy BG1DataBank ; Pick the target data bank -; lda :flags,s + lda :flags,s + sta :src_flags ; bit #$0001 ; beq *+4 ; ldy BG1AltBank diff --git a/src/blitter/BG1.s b/src/blitter/BG1.s index bbc5d31..d73ac1c 100644 --- a/src/blitter/BG1.s +++ b/src/blitter/BG1.s @@ -12,6 +12,7 @@ _InitBG1 _CopyBinToBG1 :src_width equ tmp6 :src_height equ tmp7 +:src_flags equ tmp9 clc adc #8 ; Advance over the header @@ -21,10 +22,46 @@ _CopyBinToBG1 sta :src_width lda #208 sta :src_height + stz :src_flags pla jmp _CopyToBG1 +; Reset the BG1 Y-table depending on the rendering mode +; +; A = mode +; 0 = default (base = $1800, stride = 256) +; 1 = scanline (base = $A0, stride = 324) +_ResetBG1YTable +:base equ tmp0 +:stride equ tmp1 + cmp #1 ; scanline mode? + bne :default + lda #$A0 + sta :base + lda #324 + sta :stride + bra :begin +:default + lda #$1800 + sta :base + lda #256 + sta :stride +:begin + ldx #0 + lda :base +:loop + sta BG1YTable,x + sta BG1YTable+{208*2},x + + clc + adc :stride + + inx + inx + cpx #{208*2} + bcc :loop + rts ; Copy a IIgs $C1 picture into BG1. Assumes the file is the correct size (320 x 200) ; @@ -35,6 +72,7 @@ _CopyPicToBG1 :src_width equ tmp6 :src_height equ tmp7 :src_stride equ tmp8 +:src_flags equ tmp9 pha lda #160 @@ -43,6 +81,7 @@ _CopyPicToBG1 lda #200 sta :src_height pla + stz :src_flags jmp _CopyToBG1 ; Generic routine to copy image data into BG1 @@ -54,39 +93,52 @@ _CopyToBG1 :src_width equ tmp6 :src_height equ tmp7 :src_stride equ tmp8 +:src_flags equ tmp9 +:dstptr2 equ tmp10 sta :srcptr stx :srcptr+2 sty :dstptr+2 ; Everything goes into this bank + sty :dstptr2+2 + + lda #$00A0 + sta :dstptr + clc + adc #164 ; leave a 4-byte gap in the middle + sta :dstptr2 + +; "Normal" BG1 mode as a stride of 164 bytes and mirrors the BG0 size (328 x 208) +; In "Scanline" mode, the BG1 is treated as a 320x200 bitfield with each horizontal line doubled + + lda :src_width + min #160 + sta :src_width + + lda :src_height + min #200 + sta :src_height stz :line_cnt :rloop - lda :line_cnt ; get the pointer to the code field line - asl - tax - - lda BG1YTable,x - sta :dstptr - ldy #0 ; move forward in the image data and image data :cloop lda [:srcptr],y sta [:dstptr],y + sta [:dstptr2],y +:skip iny iny cpy :src_width bcc :cloop - ldy #164 - lda [:srcptr] ; Duplicate the last couple of words in the extra space at the end of the line - sta [:dstptr],y - - ldy #2 - lda [:srcptr],y - ldy #166 - sta [:dstptr],y + lda :dstptr + clc + adc #324 + sta :dstptr + adc #164 + sta :dstptr2 lda :srcptr clc @@ -140,6 +192,34 @@ _ApplyBG1XPosPre sta BG1StartXMod164 rts +; Save as _ApplyBG1XPos, but we pretend that StartXMod164 is always zero and deal with the per-line offset adjustment in +; _ApplyScanlineBG1YPos. The tweak here is that the buffer is only 160 bytes wide in scanine mode, instead of 164 bytes wide +_ApplyScanlineBG1XPos + lda BG1StartXMod164 ; How far into the BG1 buffer is the left edge? + tay + + phd ; save the direct page because we are going to switch to the + lda BlitterDP ; blitter direct page space and fill in the addresses + tcd + + ldx #0 + tya +:loop + sta 00,x ; store the value + inc + inc + cmp #164 + bcc *+5 + sbc #164 + + inx + inx + cpx #164 + bcc :loop + + pld + rts + _ApplyBG1XPos lda #162 sec @@ -196,6 +276,155 @@ _ClearBG1Buffer plb rts +; Variation to take care of horizontal adjustments within the BG1 buffer to compensate for the +; per-scanline BG0 displacement. It is up to the caller to manage the memeory layout to make +; this visually work. +; +; In the scanline mode we have to be able to adjust the base address of each BG1 line up to +; a full screen, so scanline mode treats bank as a 640x200 pixel bitmap (64000 byte). +; +; This is just a limitation of scanline displacement mode that there is no extra vertical space. +_ApplyScanlineBG1YPos +:stk_save equ tmp0 +:virt_line_x2 equ tmp1 +:lines_left_x2 equ tmp2 +:draw_count_x2 equ tmp3 +:ytbl_idx_x2 equ tmp4 +:shift_value equ tmp5 + +; Avoid local var collision +:ytbl_idx_pos_x2 equ tmp10 +:virt_line_pos_x2 equ tmp11 +:total_left_x2 equ tmp12 +:current_count_x2 equ tmp13 +:ptr equ tmp14 + + lda StartXMod164Tbl + sta :ptr + lda StartXMod164Tbl+2 + sta :ptr+2 + ora :ptr + + lda BG1StartY + jsr Mod208 + sta BG1StartYMod208 + asl + sta :ytbl_idx_pos_x2 ; Start copying from the first entry in the table + + lda StartYMod208 ; This is the base line of the virtual screen + asl + sta :virt_line_pos_x2 + tay + + lda ScreenHeight + asl + sta :total_left_x2 + +:loop0 + lda [:ptr],y + tax + + and #$FF00 ; Determine how many sequential lines have this mod value + xba + inc + asl + min :total_left_x2 ; Don't draw more than the number of lines that are left to process + sta :current_count_x2 ; Save a copy for later + + sta :lines_left_x2 ; Set the parameter + lda :ytbl_idx_pos_x2 ; Set the parameter + sta :ytbl_idx_x2 + sty :virt_line_x2 ; Set the parameter + txa ; Put the X mod 164 value in the offset value + and #$00FF + sta :shift_value + + jsr :_ApplyConstBG1YPos ; Shift this range by a constant amount + + clc + lda :virt_line_pos_x2 + adc :current_count_x2 + cmp #208*2 ; Do the modulo check in this loop + bcc *+5 + sbc #208*2 + sta :virt_line_pos_x2 + tay + + clc + lda :ytbl_idx_pos_x2 + adc :current_count_x2 + sta :ytbl_idx_pos_x2 + + lda :total_left_x2 + sec + sbc :current_count_x2 + sta :total_left_x2 + bne :loop0 + + rts + +:_ApplyConstBG1YPos + lda #164 + sec + sbc :shift_value +; bpl *+6 +; clc +; adc #160 +; clc +; adc :shift_value + sta :shift_value +; cmp #160 +; beq *+4 +; brk $55 + + phb ; Save the existing bank + tsc + sta :stk_save + +:loop + ldx :virt_line_x2 + + ldal BTableHigh,x ; Get the bank + pha + plb + + ldal BTableLow,x ; Get the address of the first code field line + tay + + txa ; Calculate number of lines to draw on this iteration + and #$001E + eor #$FFFF + sec + adc #32 + min :lines_left_x2 + sta :draw_count_x2 + tax + + lda :ytbl_idx_x2 ; Read from this location in the BG1YTable + clc + CopyBG1YTableToBG1Addr3 :shift_value +; jsr CopyBG1YTableToBG1Addr + + lda :virt_line_x2 ; advance to the virtual line after + adc :draw_count_x2 ; filled in + sta :virt_line_x2 + + lda :ytbl_idx_x2 + adc :draw_count_x2 + sta :ytbl_idx_x2 + + lda :lines_left_x2 ; subtract the number of lines we just completed + sec + sbc :draw_count_x2 + sta :lines_left_x2 + + jne :loop + + lda :stk_save + tcs + plb + rts + ; Everytime either BG1 or BG0 Y-position changes, we have to update the Y-register ; value in all of the code fields (within the visible screen) _ApplyBG1YPos @@ -353,8 +582,103 @@ CopyBG1YTableToBG1Addr sta: BG1_ADDR+$0000,y :none rts +; Unrolled copy routine to move BG1YTable entries into BG1_ADDR position +; with a constant shift applied +; +; A = index into the BG1YTable array (x2) +; Y = starting line * $1000 +; X = number of lines (x2) +; ]1 = offset +CopyBG1YTableToBG1Addr3 mac + jmp (tbl,x) +tbl da none + da do01,do02,do03,do04 + da do05,do06,do07,do08 + da do09,do10,do11,do12 + da do13,do14,do15,do16 +do15 tax + jmp x15 +do14 tax + jmp x14 +do13 tax + jmp x13 +do12 tax + jmp x12 +do11 tax + jmp x11 +do10 tax + jmp x10 +do09 tax + jmp x09 +do08 tax + jmp x08 +do07 tax + jmp x07 +do06 tax + jmp x06 +do05 tax + jmp x05 +do04 tax + jmp x04 +do03 tax + jmp x03 +do02 tax + jmp x02 +do01 tax + jmp x01 +do16 tax + ldal BG1YTable+30,x + adc ]1 + sta BG1_ADDR+$F000,y +x15 ldal BG1YTable+28,x + adc ]1 + sta BG1_ADDR+$E000,y +x14 ldal BG1YTable+26,x + adc ]1 + sta BG1_ADDR+$D000,y +x13 ldal BG1YTable+24,x + adc ]1 + sta BG1_ADDR+$C000,y +x12 ldal BG1YTable+22,x + adc ]1 + sta BG1_ADDR+$B000,y +x11 ldal BG1YTable+20,x + adc ]1 + sta BG1_ADDR+$A000,y +x10 ldal BG1YTable+18,x + adc ]1 + sta BG1_ADDR+$9000,y +x09 ldal BG1YTable+16,x + adc ]1 + sta BG1_ADDR+$8000,y +x08 ldal BG1YTable+14,x + adc ]1 + sta BG1_ADDR+$7000,y +x07 ldal BG1YTable+12,x + adc ]1 + sta BG1_ADDR+$6000,y +x06 ldal BG1YTable+10,x + adc ]1 + sta BG1_ADDR+$5000,y +x05 ldal BG1YTable+08,x + adc ]1 + sta: BG1_ADDR+$4000,y +x04 ldal BG1YTable+06,x + adc ]1 + sta BG1_ADDR+$3000,y +x03 ldal BG1YTable+04,x + adc ]1 + sta BG1_ADDR+$2000,y +x02 ldal BG1YTable+02,x + adc ]1 + sta BG1_ADDR+$1000,y +x01 ldal BG1YTable+00,x + adc ]1 + sta: BG1_ADDR+$0000,y +none <<< + ; Unrolled copy routine to move BG1YTable entries into BG1_ADDR position with an additional -; shift. This has to be split into two +; shifton every line. This has to be split into two ; ; A = index into the BG1YTable array (x2) ; Y = starting line * $1000 From 7dd690ac046d16718cb590960412cb77fd1f2b9c Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Fri, 10 Mar 2023 19:00:26 -0600 Subject: [PATCH 63/68] Implement fix for scanline mode compensation in BG1 --- src/blitter/BG1.s | 51 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/src/blitter/BG1.s b/src/blitter/BG1.s index d73ac1c..90e7c95 100644 --- a/src/blitter/BG1.s +++ b/src/blitter/BG1.s @@ -37,9 +37,9 @@ _ResetBG1YTable :stride equ tmp1 cmp #1 ; scanline mode? bne :default - lda #$A0 + lda #0 sta :base - lda #324 + lda #327 sta :stride bra :begin :default @@ -96,22 +96,25 @@ _CopyToBG1 :src_flags equ tmp9 :dstptr2 equ tmp10 +; scanline mode is tricky -- there's not enough space to make two full copies of a 328x200 bitmap buffer, but we can +; *barely* fit a (164 + 163) x 200 buffer. And, since the zero offset could use either end, this covers all of the cases. + sta :srcptr stx :srcptr+2 sty :dstptr+2 ; Everything goes into this bank sty :dstptr2+2 - lda #$00A0 + lda #0 ; Start a byte 1 because odd offsets might go back 1 byte and don't want to wrap around sta :dstptr clc - adc #164 ; leave a 4-byte gap in the middle + adc #164 ; The first part is 1-byte short, the second part is a full 164 bytes sta :dstptr2 ; "Normal" BG1 mode as a stride of 164 bytes and mirrors the BG0 size (328 x 208) ; In "Scanline" mode, the BG1 is treated as a 320x200 bitfield with each horizontal line doubled lda :src_width - min #160 + min #164 sta :src_width lda :src_height @@ -121,12 +124,22 @@ _CopyToBG1 stz :line_cnt :rloop ldy #0 ; move forward in the image data and image data +; Handle first word as a special case + + lda [:srcptr],y + sta [:dstptr2],y ; copy directly into the 164-byte buffer + iny + xba + sep #$20 + sta [:dstptr],y ; only copy the high byte because the previous line occupies the low byte + rep #$20 + iny + :cloop lda [:srcptr],y sta [:dstptr],y sta [:dstptr2],y -:skip iny iny @@ -135,7 +148,7 @@ _CopyToBG1 lda :dstptr clc - adc #324 + adc #327 sta :dstptr adc #164 sta :dstptr2 @@ -203,7 +216,8 @@ _ApplyScanlineBG1XPos tcd ldx #0 - tya +; tya + lda #0 :loop sta 00,x ; store the value inc @@ -364,12 +378,25 @@ _ApplyScanlineBG1YPos rts :_ApplyConstBG1YPos - lda #164 - sec - sbc :shift_value + + lda #164 + sec + sbc :shift_value + clc + adc BG1StartXMod164 + cmp #164+1 + bcc *+5 + sbc #164 + +; sec +; sbc BG1StartXMod164 ; bpl *+6 ; clc -; adc #160 +; adc #164 +; cmp #164 +; bcc *+3 +; sbc #164 + ; clc ; adc :shift_value sta :shift_value From d31bd306495c6174b444e478a5baa6b229944dd3 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Sat, 11 Mar 2023 03:41:12 -0600 Subject: [PATCH 64/68] Implement full per-scanline offset support for BG1 --- macros/GTE.Macs.s | 1 + src/Defs.s | 4 +++- src/Tool.s | 26 ++++++++++++++++++++++++-- src/static/TileStore.s | 6 +++++- 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/macros/GTE.Macs.s b/macros/GTE.Macs.s index 0e9e976..a51873f 100644 --- a/macros/GTE.Macs.s +++ b/macros/GTE.Macs.s @@ -174,6 +174,7 @@ OVERLAY_BELOW equ $4000 ; Overlay is drawn below scanline sprite ; GetAddress table IDs scanlineHorzOffset equ $0001 +scanlineHorzOffset2 equ $0002 ; Tile constants ; TILE_RESERVED_BIT equ $8000 diff --git a/src/Defs.s b/src/Defs.s index c642db1..d3e737e 100644 --- a/src/Defs.s +++ b/src/Defs.s @@ -195,7 +195,8 @@ DIRTY_BIT_BG1_REFRESH equ $0020 DIRTY_BIT_SPRITE_ARRAY equ $0040 ; GetAddress table IDs -scanlineHorzOffset equ $0001 ; table of 416 words, a double-array of scanline offset values. Must be 0, 163 +scanlineHorzOffset equ $0001 ; Table of 416 words, a double-array of scanline offset values. Values must be in range [0, 163] +scanlineHorzOffset2 equ $0002 ; Table of 416 words, a double-array of scanline offset values. Values must be in range [0, 163] ; Script definition YIELD equ $8000 @@ -297,6 +298,7 @@ _DirectListBottom EXT StartXMod164Tbl EXT LastOffsetTbl EXT +BG1StartXMod164Tbl EXT ; Tool error codes NO_TIMERS_AVAILABLE equ 10 diff --git a/src/Tool.s b/src/Tool.s index 87c430d..0a9c440 100644 --- a/src/Tool.s +++ b/src/Tool.s @@ -886,13 +886,23 @@ _TSGetAddress lda :tblId,s cmp #scanlineHorzOffset - bne :out + bne :next_1 lda StartXMod164Tbl sta :output,s lda StartXMod164Tbl+2 sta :output+2,s + bra :out +:next_1 cmp #scanlineHorzOffset2 + bne :next_2 + + lda BG1StartXMod164Tbl + sta :output,s + lda BG1StartXMod164Tbl+2 + sta :output+2,s + bra :out +:next_2 :out _TSExit #0;#2 @@ -904,12 +914,24 @@ _TSSetAddress _TSEntry lda :tblId,s cmp #scanlineHorzOffset - bne :out + bne :next_1 lda :ptr,s sta StartXMod164Tbl lda :ptr+2,s sta StartXMod164Tbl+2 + bra :out + +:next_1 + cmp #scanlineHorzOffset2 + bne :next_2 + + lda :ptr,s + sta BG1StartXMod164Tbl + lda :ptr+2,s + sta BG1StartXMod164Tbl+2 + bra :out +:next_2 :out _TSExit #0;#6 diff --git a/src/static/TileStore.s b/src/static/TileStore.s index b5767af..ee60cee 100644 --- a/src/static/TileStore.s +++ b/src/static/TileStore.s @@ -388,13 +388,17 @@ BG1YOffsetTable ENT ; dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 --^ -; Per-scanline offsets for BG0 +; Pointer to per-scanline offsets for BG0 StartXMod164Tbl ENT dw 0,0 LastOffsetTbl ENT ds 416 +; Pointer to per-scanline offsets for BG1 +BG1StartXMod164Tbl ENT + dw 0,0 + ; Other Toolset variables OneSecondCounter ENT dw 0 From 065603a758c5f4b2c9d1b63b184f9fd9db9d1a80 Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Sat, 11 Mar 2023 03:41:41 -0600 Subject: [PATCH 65/68] Core updates for BG1 scanline support --- src/blitter/BG1.s | 188 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 160 insertions(+), 28 deletions(-) diff --git a/src/blitter/BG1.s b/src/blitter/BG1.s index 90e7c95..0fb7ecd 100644 --- a/src/blitter/BG1.s +++ b/src/blitter/BG1.s @@ -307,6 +307,7 @@ _ApplyScanlineBG1YPos :shift_value equ tmp5 ; Avoid local var collision +:ptr2 equ tmp8 :ytbl_idx_pos_x2 equ tmp10 :virt_line_pos_x2 equ tmp11 :total_left_x2 equ tmp12 @@ -317,7 +318,12 @@ _ApplyScanlineBG1YPos sta :ptr lda StartXMod164Tbl+2 sta :ptr+2 - ora :ptr + + lda BG1StartXMod164Tbl + sta :ptr2 + lda BG1StartXMod164Tbl+2 + sta :ptr2+2 + ora :ptr2 lda BG1StartY jsr Mod208 @@ -379,30 +385,19 @@ _ApplyScanlineBG1YPos :_ApplyConstBG1YPos - lda #164 - sec - sbc :shift_value - clc - adc BG1StartXMod164 - cmp #164+1 - bcc *+5 - sbc #164 + lda #164 + sec + sbc :shift_value + clc + adc BG1StartXMod164 + cmp #164+1 + bcc *+5 + sbc #164 + sta :shift_value ; Base shift value -; sec -; sbc BG1StartXMod164 -; bpl *+6 -; clc -; adc #164 -; cmp #164 -; bcc *+3 -; sbc #164 - -; clc -; adc :shift_value - sta :shift_value -; cmp #160 -; beq *+4 -; brk $55 + cmp #165 + bcc *+4 + brk $04 phb ; Save the existing bank tsc @@ -428,9 +423,9 @@ _ApplyScanlineBG1YPos tax lda :ytbl_idx_x2 ; Read from this location in the BG1YTable - clc - CopyBG1YTableToBG1Addr3 :shift_value -; jsr CopyBG1YTableToBG1Addr +; clc +; CopyBG1YTableToBG1Addr3 :shift_value + CopyBG1YTableToBG1Addr4 :shift_value;blttmp lda :virt_line_x2 ; advance to the virtual line after adc :draw_count_x2 ; filled in @@ -704,8 +699,43 @@ x01 ldal BG1YTable+00,x sta: BG1_ADDR+$0000,y none <<< +; Copy routine to move BG1YTable entries into BG1_ADDR position with an additional +; shift on every line form the user-provided BG1StartXMod164Tbl. +; +; A = index into the BG1YTable array (x2) +; Y = starting line * $1000 +; X = number of lines (x2) +; +; ]1 = constant shift value +; ]2 = temp storage space +CopyBG1YTableToBG1Addr4 mac + phy ; save the registers + phx + phb + pha + jsr _SetDataBank ; Set to toolbox data bank + + clc + lda 1,s ; virtual_index_x2 + adc BG1StartXMod164Tbl ; Get the starting address in the array for this chunk + tay + + lda BG1StartXMod164Tbl+1 ; Set the bank to the array location + pha + plb + plb + + pla ; POp back the original value + ApplyBG1ModXToShift ]1;]2 ; Copy the array into direct page storage and apply the shift + + plb ; Restore the code field bank + plx ; x is used directly in this routine + ply + ApplyBG1ShiftToCode ]2 + <<< + ; Unrolled copy routine to move BG1YTable entries into BG1_ADDR position with an additional -; shifton every line. This has to be split into two +; shift on every line. This has to be split into two ; ; A = index into the BG1YTable array (x2) ; Y = starting line * $1000 @@ -855,3 +885,105 @@ ApplyBG1OffsetValues :do01 ldal BG1YCache+00 sta: BG1_ADDR+$0000,y :none rts + +; Apply the per-scanline shift from the BG1StartXMod164Tbl pointer. Save the relevant values to the +; direct page since the array could be in any bank. +; +; This does bounds checking to make sure the shift value remains in the valid range +; +; ]1 = source array offset +; ]2 = constant shift value +; ]3 = destination address +_BG1ShiftTemplate mac + lda ]1,y ; Load the value from the array + adc ]2 ; Add to the direct page shift_value + cmp #165 ; If below this value, we're good + bcc *+6 + sbc #164 + clc + adcl BG1YTable+]1,x + sta ]3+]1 + <<< + +AToX mac + tax + brl ]1 + <<< + +ApplyBG1ModXToShift mac + jmp (agmxts_tbl,x) +agmxts_tbl da none + da do01,do02,do03,do04 + da do05,do06,do07,do08 + da do09,do10,do11,do12 + da do13,do14,do15,do16 +do16 AToX o16 +do15 AToX o15 +do14 AToX o14 +do13 AToX o13 +do12 AToX o12 +do11 AToX o11 +do10 AToX o10 +do09 AToX o09 +do08 AToX o08 +do07 AToX o07 +do06 AToX o06 +do05 AToX o05 +do04 AToX o04 +do03 AToX o03 +do02 AToX o02 +do01 AToX o01 + +o16 _BG1ShiftTemplate 30;]1;]2 +o15 _BG1ShiftTemplate 28;]1;]2 +o14 _BG1ShiftTemplate 26;]1;]2 +o13 _BG1ShiftTemplate 24;]1;]2 +o12 _BG1ShiftTemplate 22;]1;]2 +o11 _BG1ShiftTemplate 20;]1;]2 +o10 _BG1ShiftTemplate 18;]1;]2 +o09 _BG1ShiftTemplate 16;]1;]2 +o08 _BG1ShiftTemplate 14;]1;]2 +o07 _BG1ShiftTemplate 12;]1;]2 +o06 _BG1ShiftTemplate 10;]1;]2 +o05 _BG1ShiftTemplate 8;]1;]2 +o04 _BG1ShiftTemplate 6;]1;]2 +o03 _BG1ShiftTemplate 4;]1;]2 +o02 _BG1ShiftTemplate 2;]1;]2 +o01 _BG1ShiftTemplate 0;]1;]2 +none <<< + +; After the values are saved, the data bank can be repointed at the current code bank and the values copied in +; from the direct page +; +; ]1 = offset in temp buffer +; ]2 = address of temp buffer +; ]3 = 4k offset in code buffer +_BG1ShiftToCodeTemplate mac + lda ]2+]1 + sta: BG1_ADDR+]3,y + <<< + +ApplyBG1ShiftToCode mac + jmp (abstc_tbl,x) +abstc_tbl da none + da do01,do02,do03,do04 + da do05,do06,do07,do08 + da do09,do10,do11,do12 + da do13,do14,do15,do16 +do16 _BG1ShiftToCodeTemplate 30;]1;$F000 +do15 _BG1ShiftToCodeTemplate 28;]1;$E000 +do14 _BG1ShiftToCodeTemplate 26;]1;$D000 +do13 _BG1ShiftToCodeTemplate 24;]1;$C000 +do12 _BG1ShiftToCodeTemplate 22;]1;$B000 +do11 _BG1ShiftToCodeTemplate 20;]1;$A000 +do10 _BG1ShiftToCodeTemplate 18;]1;$9000 +do09 _BG1ShiftToCodeTemplate 16;]1;$8000 +do08 _BG1ShiftToCodeTemplate 14;]1;$7000 +do07 _BG1ShiftToCodeTemplate 12;]1;$6000 +do06 _BG1ShiftToCodeTemplate 10;]1;$5000 +do05 _BG1ShiftToCodeTemplate 8;]1;$4000 +do04 _BG1ShiftToCodeTemplate 6;]1;$3000 +do03 _BG1ShiftToCodeTemplate 4;]1;$2000 +do02 _BG1ShiftToCodeTemplate 2;]1;$1000 +do01 _BG1ShiftToCodeTemplate 0;]1;$0000 +none <<< \ No newline at end of file From 7aec32ced56b0454b7a7e0ae9f97285ca93c032d Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Sat, 11 Mar 2023 03:42:23 -0600 Subject: [PATCH 66/68] Update demo to leverage BG1 scanline support --- demos/kfest-2022/demo-1/App.Main.s | 67 +++++++++++++++++------- demos/kfest-2022/demo-1/build-image.bat | 1 + demos/kfest-2022/demo-1/gen/bg1.bin | Bin 0 -> 53256 bytes 3 files changed, 48 insertions(+), 20 deletions(-) create mode 100644 demos/kfest-2022/demo-1/gen/bg1.bin diff --git a/demos/kfest-2022/demo-1/App.Main.s b/demos/kfest-2022/demo-1/App.Main.s index 73a9dc2..b4ac952 100644 --- a/demos/kfest-2022/demo-1/App.Main.s +++ b/demos/kfest-2022/demo-1/App.Main.s @@ -42,6 +42,7 @@ seg1x equ 30 seg2x equ 32 seg3x equ 34 seg4x equ 36 ; BG1 x-pos +frameCountTotal equ 38 phk plb @@ -101,6 +102,7 @@ seg4x equ 36 ; BG1 x-pos lda #0 sta StartY stz frameCount + stz frameCountTotal pei StartX pei StartY @@ -124,6 +126,11 @@ seg4x equ 36 ; BG1 x-pos pea #BG0Offsets _GTESetAddress + pea #scanlineHorzOffset2 + pea #^BG1Offsets + pea #BG1Offsets + _GTESetAddress + pea $0000 ; one regular render to fill the screen with the tilemap _GTERender @@ -142,32 +149,15 @@ EvtLoop :do_more cmp #'d' bne :not_d -; lda StartX -; cmp MaxBG0X -; bcc *+5 -; brl :do_render - jsr DecRanges jsr SetOffsets - -; pei StartX -; pei StartY -; _GTESetBG0Origin brl :do_render :not_d cmp #'a' bne :not_a -; lda StartX -; bne *+5 -; brl :do_render - jsr IncRanges jsr SetOffsets - -; pei StartX -; pei StartY -; _GTESetBG0Origin brl :do_render :not_a @@ -195,12 +185,16 @@ EvtLoop :not_w :do_render + jsr SetBG1Animation ; Update the per-scanline BG1 offsets + pea #RENDER_PER_SCANLINE +; pea #0 _GTERender ; Update the performance counters inc frameCount + inc frameCountTotal pha _GTEGetSeconds pla @@ -335,7 +329,7 @@ IncRanges bne :out lda seg4x inc - cmp #160 + cmp #164 bcc *+5 lda #0 sta seg4x @@ -355,6 +349,7 @@ InitOffsets ldx #120 ldy #88 jsr _InitRange + jsr _InitBG1 pla sta seg1x @@ -364,7 +359,9 @@ InitOffsets jsr SetOffset2 lsr sta seg3x - jmp SetOffset3 + jsr SetOffset3 + jsr SetBG1Offsets + rts SetOffsets lda seg1x @@ -373,11 +370,22 @@ SetOffsets jsr SetOffset2 lda seg3x jsr SetOffset3 - + +SetBG1Offsets pei seg4x pea 0 _GTESetBG1Origin + rts +SetBG1Animation + pea #scanlineHorzOffset2 + pea #^BG1Offsets + lda frameCountTotal + and #$000F + asl + adc #BG1Offsets + pha + _GTESetAddress rts SetOffset1 @@ -416,6 +424,24 @@ _SetRange pla rts +_offsets dw 0,0,0,1,1,2,3,3,4,4,4,3,3,2,1,1 +_InitBG1 + ldx #0 + ldy #0 +:loop lda _offsets,y + sta BG1Offsets,x + iny + iny + cpy #31 + bcc *+5 + ldy #0 + + inx + inx + cpx #448 + bcc :loop + rts + _InitRange txa asl @@ -457,6 +483,7 @@ DoLoadBG1 BG1DataFile strl '1/bg1.bin' BG0Offsets ds 416 +BG1Offsets ds 448 ; Make this a bit larger so we can just update a pointer PUT ../StartUp.s PUT ../../shell/Overlay.s diff --git a/demos/kfest-2022/demo-1/build-image.bat b/demos/kfest-2022/demo-1/build-image.bat index f67a791..0da0d47 100644 --- a/demos/kfest-2022/demo-1/build-image.bat +++ b/demos/kfest-2022/demo-1/build-image.bat @@ -14,4 +14,5 @@ REM Cadius does not overwrite files, so clear the root folder first REM Now copy files and folders as needed %CADIUS% ADDFILE %IMAGE% %FOLDER% .\GTEDemo1 +%CADIUS% ADDFILE %IMAGE% %FOLDER% .\gen\bg1.bin %CADIUS% ADDFILE %IMAGE% %FOLDER% ..\..\..\src\Tool160 diff --git a/demos/kfest-2022/demo-1/gen/bg1.bin b/demos/kfest-2022/demo-1/gen/bg1.bin new file mode 100644 index 0000000000000000000000000000000000000000..579f830ae5ee4d95eb9644f41efdb3737446433c GIT binary patch literal 53256 zcmeHQJ9Zp94t-mjU^X!4NE6r{suLYA>n)*`=qPk1hgKrjUIrj}Nf4i6{n~2z4Fj=A z0w69g$YOoE^!MNY{?EVu``2H0JJV_M(=SS|-@o78J)OJsNa^|cd1tTt)t{fwXLe+- zClUT1lwQA*p9=r^>FI!8cjG7Yoc6mC;g9$~-vs{!eu{w0uEC7(ga0pipxfW46af1= z-Q_VUH>Y+7K!hLsx30<%Wd1)Ef18uM1nlx9!hg&BOHTGK#u5Ho=D*Q@e&p47PXI*t z!N2G$Pk=oC_nvlW5^qkDep-%c05+StyNmFHe}n(yHvpYWdspKK|LyYM(VzLhY!844 z|LyYM<3I1*jz#!ym;WyOcW=ic{I|=0k3a9nw@-iw|IPBR!hi2}EW&@Y{44zXugClm z0RL^{UyeTd{I9})*Xfv`zrKF&_W@)AWO;z$sS&|DVl&0gF+f0C+8D0pR~+{I9$O25{sQ0AKSG0Q|Sgzdrr( z{9k0RDjg zr$2%JN_#s<{PVbA|Ks!jc&7d4&N~kK=75R+_4A)$>Xa4$UIBsM=bw6C-`_sKO55OH z&&NrF=W<&B^7W6)|1-^w_5CRX`-%qtdOke(c>y@JCh*S>m}(;UH_ShK*C&6d8%S}) zXMpZPm;!*7L`wI)&BA|I>Gu=V@@NK4Zgnpo^WS+?3Z6khvcO*#fKo^N|K#!Di^FaN zO1$;GdHwixcy8~v+FC7d@MAu9PQtqfYp^4^4M5ugl)4{9Fx?-3J<2`)&t5-H*LQck zf>2r<0!H58$NbNR^je`B2FRD?7IA)oqoKk0w+DU_u6%xl{fecA1?i8 zj~I!%9cTVewW7h#_Xp|#xcqzlXe?CzQms$`TpR&a<;WZSg^#`X6aTmfo+b%D-yeYM zKL5)mKy!ZCC5t29s)|ECAMn-&W}~=r%?G^Pw;O>!yS8+H00SKKrB$@XJ|C;`XZ}I^smD(zhgX~hg8qct;i2$-(KV|lFX}SJfDa6SaYjJ{(8Pba2QVr6 z%kFTtKhuw`kaVWUmKQ4{Yg~DQzwlw|v$v1ZU^)h1l@tGb37AJG{}mExcW|Ff`uy8| zOvnA3bPEEYg9Q1mk{v4iXXi3#@z<_P0+l>0{3qmwep(&){y?(p$D8fP;P2=pw@0S{ zU*6y^eDuLN-HRM9RJYcIX|4u&x z{A6aZ3GR_XzON;Jz(2Ou1$oMx>nsl(LoEFB3D6a(3xLPJ(~p6#`57$$fxN+A_@Mr1 zJXJDIjNbR+C!t>Wmm7rljsLDEryo=hM>S#(Tyiu2>3#12e>wxC zEl`a&YkRgvJ3hLN7|82te?G>ZRQ%;RKS56^&wqXpd@414Ru_O4Z*eDHi*kHuCXiRv zb^gm~?_Ty5pMdVIJm&{Wn*W7=NT4O>bqDY%__vompakeN{>r~Q{jmeMuj@bTEzUJ@ zc>##k19@GI^}pvoz8(jDlFv7K3(b}P0DtD6@NeW_EoZQEi3T8&H~7m$+KYb?|KAD! zaN_!i44%yYa{NW!;P=*l8VuiycK!?bM}U;LK$i9gceDlm9Q?1wU-=L4Q#=10?4Qj) zUjlCAKZ@HZP9u3!@6Z46f&}#H_y_;N^2ZxMzCUokb^b?wFUDVR8aw{{53k1~{8;}Z z{AvDwCH$X*|8QN6@c&u-hv8qJ{=5bIzdwWjkp2+=AI1O7^*G{x>bHM<{h#*#wSDSS zng4gUI{%kmk4N~x|9m@bfXX@?t=mz(S+@svB6(BK>v0_J#+?Y?0{&Bctl(d5$yIT1 z9&vFJ$-16~@qs5bKc`=kT>LZ_X89NG%lTJ$b@4F%%aWF!(~n2M!~aI-f;s+W`(pm@ zHDFafivPO_X;BD7_~-a%{Agdyzk+Lu2l3zF=jZgJ2=MTeZ{Ozlm+edWAJIRu^P~r? z#EY&6`JAU6`d|Pe{NQ)gzLftV{$u!;^rxpZqg61%cQpT+K2ttq{yz}wB2fU)I}Eew zB*byZ@qIM^2CuF-gnx}DJ*C-%|5Ng>=r8Z_Z^C~x|9YKL^bdbWVDwA8boHA4^pxi7 zCj3Y9KV1I~nE!@;K1&bwfo8~P5xB@9{@IQN61~ z*Ee(g^SuJJFXrES9|0loOb7etzXxTw0C-9hCGb0HAMqxJzPlyS6?hzW^Y4W}zsE7Z z1&Z*2-%)$a8zU6x)nPQBNeodjpPTt#@KbEc#3z7o4@}@9e0%xV@98V}_VujF|2*v4 zYS#aZgx4mS@^f0<==h$ z7x**p^&9-)e+aw?X#NrY<~csUsp+HwHp0J)|8}mU0Ju1v+s{a19a&00E=f9($rm24lF!&4q_rN#G z)%icdpLy(0K@zh(7Q?b*|KH<}-s?B`3!lBV8HA=5@c(A^e|G*$oDu%*{5Kbq_rZJp zN~&G|nFcuqE&TQR5B@cNhyM<8R}cfUeg5|Vh$eRv+)EM0!l(F6qy%1$g;v17^BiBV z{~hG6An_p@?U!zcA4}yz`F}Y7;z~G;1bC{%mjm#Gag6wXJ81v6l-H$l@Y~Aw z0TAI|I{!6(=)rE(uGfF#=auIFSp@+6EVS25^RMM8l=}jdMSg;R%oZ)D%Tr0v8@0o3mOYGZkT)XpNvM|5oBaJ`4-7s{e6QRfyhtr2y0qSm#31T zH)@C7Ft_|?lficcfnL$u%s*B|DZQ&hutvmd4>6$)1xW= zghEQaT#Jj&FrM-hGeSS|Q}d+dbh%iz_kYn)a&5PBQx-a2Rc}O~{*EB#zckT~V|~?9 zyiDJ5%D>YqMzowRL-9KN!#eWxY%+VcgnvbU`hiRN3|)jn^Q7f;8J15aB@)WQEFstu1PLw{Bf4)R-yt*#dGeDCoOF(~pPnKr&-A2L>9&x3t<#d@; zQi9&8ly!!7*mZLbipHxp!DTW-3jhajlfx3&nWS&H&FY`LR;mO4FskKr8D^k2YG;Tw zQ72~FHeO-6%hT@@7=Mwgw&VfX4e+Nk0FR&RC*9KmPcD9HclF3a=(+8}u5^>XvSsjB zUR_JnPyUP)`0wqZ#Q5j+z1BCnrwblE{M_#8O_ZSLwM)D3Fy{{zf92n^#Ql^n3D5CQ zpRbGXL*KK`euBrf_@Otl+v7i5{FVR7P1H|b0E(QlhvJ<-{o4ZK`AN#(z@vws+dVyY z6nb8}vu6jqJifD9$PLsZ8o_zY<{GSbe@b5WD z_%nZme}4Xl_@VEaXZ+ytrui4&5kwrB+yhACm-r`rulWP`e+>C2U%iyq8QQ_j^Z)4X z{>UKoPmb{q;NPx)IR88TaaG~3en-&oo+}tKh}R~TpWYH`T2hd@k8J9Q~plh zTmQM;)g%9CT)X!_h0FAT4DtJaIRNyU>ys?=ap8ZapY;0#$Z7RdCc7j3s2x1I_zBcV zZ`9shq*Esbf8l@L4sC#nTxSmjvOCfb+9_0zN!`oAQ;QGqhVeD{$NcB#6Idr;DChU^ zKEO90r-z|uFZvNcT!A;ZZSZUU7ureoDtc%8SM0zKZ+s4guLc0?!&?5yCyJhyB0G#< zz&HCl*n$43nZ(h-@cRM4xUc0Oe#6Pgj)EWJhrWX!Q|GuGPE(F?U(3IqNRb`F-}$Za z!4C9wd-~74orMDmVhO;wujLVF&seznVUW72!L^eJ%g+ zdt^sDtntAP{Lt-M|EMzj#<;JY|IYUb-0MH>uf_*E@I$w2{iDjjk8xkiKlG7DcC^15 zpVrsyTK}jr`o*||f7pM*fy%Xi#*UQNn}2GH^wSOGbbGItkme3NeuUqeH}tUMUZ`rHwLP?tY*{|DCB#(#|?7$~{^Trgnu^#AOO^eVtBR>7yp z6V=hGVqN~~b0wVrVJ7O;_aD!1#SeLaU-|Frt6B;G`q*b4lXqnR4(`bxU$SlbTX`$@ z?O}E;{%QvXN`CjH_y1IT76*!c@`~2L??v?aQT;?#^{~1~A987ZkLJG~hvHN-P>!md z-W~dfZN2}lzNu6JK-?Ueo?nX7lvUoS1Aa^e_cdPEuJMS34bk zrk`ej@ZHgOs-|D*bz0be7Y248zQAhAD{m41-N*Xk{cE)&@#Aw@Uz*dWuJ=@Ms(3zi z7eepN!oH&y)qmx!@DJ-E>`|3+*IBX&JDqT1zYhVc?}h*L3&V&f6?%M?oj1t;t{i?5 z^pv!JksqfbU$O;$=bkXWu-n;LUSu%BsUtnU($0s#7tau=|F(~a zfS39$e)9n6@fCJH2!0y?#;^U0hGCQ6gnx$rsH^MOlV6;uqi@>3sPj|ONPi*`TTcO? z$G6$}F#2l%Fn;Zy1(9pE`8~&f)YI>%&ty_h8~9)2pIu+;IDR1g2mr>vn*Viv$Mb*9 zFdi?P0)X+ap8xB7iRb@1J4Z`b{Hyt2=ZP6##Q(Z5TG#0U>9jW?IpbfXyU}kmzc$*5 z+}c`S@vr57C2wYYZwWtPG3!$_pj-Xc;|n`cKfkMfqQv;Me^LKi{nqR2Ry&bjTk9Er z_&Wl}=vKcmzPP^LYR7SDR~5tO1ph|HPDwiLnMa~s`%Uvtn6!VL^P;d3|Dzt?jdp}5 zhaA=iY1+TY`bNK>_4sbI6S=juzTQgL{zV2i`u(EE7j{;jMH2;mQVb7mc{&Y0DMepv%mQ_ z@}%LP_Z#EL*E>Z24FA)+e7+97Yv=HbTuW&^|MPyc{gPg|gBkwW&_|@?7yHHu{*4?t zCF%U Date: Sun, 12 Mar 2023 15:39:41 -0500 Subject: [PATCH 67/68] Sync up header files and add back CopyToBG1 behavior as a selectable feature --- ORCACDefs/gte.h | 19 +++++++++++- macros/GTE.Macs.s | 5 +++- src/Defs.s | 4 +++ src/Render.s | 73 +++++------------------------------------------ src/blitter/BG1.s | 69 ++++++++++++++++++++++++++++++++++++++++---- 5 files changed, 96 insertions(+), 74 deletions(-) diff --git a/ORCACDefs/gte.h b/ORCACDefs/gte.h index e0103d2..9b294f7 100644 --- a/ORCACDefs/gte.h +++ b/ORCACDefs/gte.h @@ -135,6 +135,23 @@ extern pascal Word GTEClearOverlay() inline(0x23A0, tool_dispatcher); #define RENDER_BG1_HORZ_OFFSET 0x0002 #define RENDER_BG1_VERT_OFFSET 0x0004 #define RENDER_BG1_ROTATION 0x0008 +#define RENDER_PER_SCANLINE 0x0010 +#define RENDER_WITH_SHADOWING 0x0020 +#define RENDER_SPRITES_SORTED 0x0040 + +/* Overlay flags */ +#define OVERLAY_MASKED 0x0000 /* Overlay has a mask, so the background must be draw first */ +#define OVERLAY_SOLID 0x8000 /* Overlay covers the scan line and is fully opaque */ +#define OVERLAY_ABOVE 0x0000 /* Overlay is drawn above scanline sprites */ +#define OVERLAY_BELOW 0x4000 /* Overlay is drawn below scanline sprites */ + +/* GetAddress table IDs */ +#define scanlineHorzOffset 0x0001 +#define scanlineHorzOffset2 0x0002 + +/* CopyPicToBG1 flags */ +#define COPY_PIC_NORMAL 0x0000 /* Copy into BG1 buffer in "normal mode" */ +#define COPY_PIC_SCANLINE 0x0001 /* Copy in a way to support BG1 + RENDER_PER_SCANLINE. */ /* GTE Tile Constants */ #define TILE_PRIORITY_BIT 0x4000 /* Put tile on top of sprite */ @@ -147,6 +164,7 @@ extern pascal Word GTEClearOverlay() inline(0x23A0, tool_dispatcher); #define TILE_CTRL_MASK 0xFE00 /* GTE Sprite Constants */ +#define GTE_SPRITE_COMPILES 0x4000 #define GTE_SPRITE_HIDE 0x2000 #define GTE_SPRITE_16X16 0x1800 #define GTE_SPRITE_16X8 0x1000 @@ -155,7 +173,6 @@ extern pascal Word GTEClearOverlay() inline(0x23A0, tool_dispatcher); #define GTE_SPRITE_VFLIP 0x0400 #define GTE_SPRITE_HFLIP 0x0200 - /* GTE Sprint Stamp Storage Parameters */ #define GTE_VBUFF_STRIDE_BYTES (12 * 4) /* Each line has 4 slots of 16 pixels + 8 buffer pixels */ #define GTE_VBUFF_TILE_ROW_BYTES (8 * GTE_VBUFF_STRIDE_BYTES) /* Each row is comprised of 8 lines */ diff --git a/macros/GTE.Macs.s b/macros/GTE.Macs.s index a51873f..a022808 100644 --- a/macros/GTE.Macs.s +++ b/macros/GTE.Macs.s @@ -176,6 +176,10 @@ OVERLAY_BELOW equ $4000 ; Overlay is drawn below scanline sprite scanlineHorzOffset equ $0001 scanlineHorzOffset2 equ $0002 +; CopyPicToBG1 flags +COPY_PIC_NORMAL equ $0000 ; Copy into BG1 buffer in "normal mode" +COPY_PIC_SCANLINE equ $0001 ; Copy in a way to support BG1 + RENDER_PER_SCANLINE. + ; Tile constants ; TILE_RESERVED_BIT equ $8000 TILE_PRIORITY_BIT equ $4000 ; Put tile on top of sprite @@ -187,7 +191,6 @@ TILE_HFLIP_BIT equ $0200 TILE_ID_MASK equ $01FF TILE_CTRL_MASK equ $FE00 - ; Sprite constants SPRITE_COMPILED equ $4000 ; This is a compiled sprite SPRITE_HIDE equ $2000 diff --git a/src/Defs.s b/src/Defs.s index d3e737e..10e4529 100644 --- a/src/Defs.s +++ b/src/Defs.s @@ -198,6 +198,10 @@ DIRTY_BIT_SPRITE_ARRAY equ $0040 scanlineHorzOffset equ $0001 ; Table of 416 words, a double-array of scanline offset values. Values must be in range [0, 163] scanlineHorzOffset2 equ $0002 ; Table of 416 words, a double-array of scanline offset values. Values must be in range [0, 163] +; CopyPicToBG1 flags +COPY_PIC_NORMAL equ $0000 ; Copy into BG1 buffer in "normal mode" treating the buffer as a 164x208 pixmap with stride of 256 +COPY_PIC_SCANLINE equ $0001 ; Copy in a way to support BG1 + RENDER_PER_SCANLINE. Pixmap is double-width, 327x200 with stride of 327 + ; Script definition YIELD equ $8000 JUMP equ $4000 diff --git a/src/Render.s b/src/Render.s index b0ee933..da2b71b 100644 --- a/src/Render.s +++ b/src/Render.s @@ -156,12 +156,10 @@ _DoOverlay ; Use the per-scanline tables to set the screen. This is really meant to be used without the built-in tilemap ; support and is more of a low-level way to control the background rendering _RenderScanlines - lda BG1YTable ; Make sure we're in the right mode - cmp #$00A0 + lda BG1YTable ; Make sure we're in the right mode (0 = scanline mode, $1800 = normal mode) beq :ytbl_ok lda #1 jsr _ResetBG1YTable - lda BG1YTable :ytbl_ok jsr _ApplyBG0YPos ; Set stack addresses for the virtual lines to the physical screen @@ -173,12 +171,8 @@ _RenderScanlines jsr _ApplyBG0XPosPre jsr _ApplyBG1XPosPre -; jsr _RenderSprites ; Once the BG0 X and Y positions are committed, update sprite data - -; jsr _ApplyTiles ; This function actually draws the new tiles into the code field - - jsr _ApplyScanlineBG0XPos ; Patch the code field instructions with exit BRA opcode - jsr _ApplyScanlineBG1XPos + jsr _ApplyScanlineBG0XPos ; Patch the code field instructions with exit BRA opcode + jsr _ApplyScanlineBG1XPos jsr _BuildShadowList ; Create the rages based on the sorted sprite y-values @@ -187,57 +181,8 @@ _RenderScanlines jsr _DrawDirectSprites ; Draw the sprites directly to the Bank $01 graphics buffer (skipping the render-to-tile step) jsr _ShadowOn ; Turn shadowing back on -; jsr _DrawComplementList ; Alternate drawing scanlines and PEI slam to expose the full fram jsr _DrawFinalPass -; jsr _ApplyBG1XPos ; Update the direct page value based on the horizontal position - -; The code fields are locked in now and ready to be rendered. See if there is an overlay or any -; other reason to render with shadowing off. Otherwise, just do things quickly. - -; lda Overlays -; beq :no_ovrly - -; jsr _ShadowOff - -; Shadowing is turned off. Render all of the scan lines that need a second pass. One -; optimization that can be done here is that the lines can be rendered in any order -; since it is not shown on-screen yet. - -; ldx Overlays+2 ; Blit the full virtual buffer to the screen -; ldy Overlays+4 -; jsr _BltRange - -; Turn shadowing back on - -; jsr _ShadowOn - -; Now render all of the remaining lines in top-to-bottom (or bottom-to-top) order - -; ldx #0 -; ldy Overlays+2 -; beq :skip -; jsr _BltRange -:skip -; jsr _DoOverlay - -; ldx Overlays+4 -; cpx ScreenHeight -; beq :done -; ldy ScreenHeight -; jsr _BltRange -; bra :done - -;:no_ovrly -; ldx #0 ; Blit the full virtual buffer to the screen -; ldy ScreenHeight -; jsr _BltRange -;:done - -; ldx #0 -; ldy ScreenHeight -; jsr _BltSCB - lda StartYMod208 ; Restore the fields back to their original state ldx ScreenHeight jsr _RestoreScanlineBG0Opcodes @@ -693,7 +638,6 @@ _DrawFinalPass bmi :empty lda _Sprites+SPRITE_CLIP_TOP,x ; Load the first object's top edge -; sta :curr_top beq :loop ; If it's at the top edge of the screen, proceed. Othrewise _BltRange the top range ldx #0 @@ -761,6 +705,7 @@ _DrawFinalPass tax ldy _Sprites+SPRITE_CLIP_TOP,x ; Draw the background in between ldx :curr_bottom +; brk $34 jsr _BltRange plx bra :loop @@ -804,6 +749,8 @@ _DrawFinalPass adc ScreenX0 ldx :curr_top ldy :curr_bottom +; brk $33 + :disp jsl $000000 rts @@ -826,8 +773,6 @@ _DrawComplementList lda _DirectListTop,x ldy _DirectListBottom,x tax -; lda #0 -; jsr DebugSCBs jsr _BltRange plx @@ -841,8 +786,6 @@ _DrawComplementList phx ldy _DirectListTop,x tax -; lda #1 -; jsr DebugSCBs jsr _PEISlam plx bra :blt_range @@ -852,13 +795,11 @@ _DrawComplementList bcs :out ; screen, then expose that range tax ldy ScreenHeight -; lda #1 -; jsr DebugSCBs jsr _PEISlam :out rts -; Helper to set a palette index on a range of SCBs to help show whicih actions are applied to which lines +; Helper to set a palette index on a range of SCBs to help show which actions are applied to which lines DebugSCBs phx phy diff --git a/src/blitter/BG1.s b/src/blitter/BG1.s index 0fb7ecd..4891fb6 100644 --- a/src/blitter/BG1.s +++ b/src/blitter/BG1.s @@ -22,7 +22,8 @@ _CopyBinToBG1 sta :src_width lda #208 sta :src_height - stz :src_flags + lda #COPY_PIC_NORMAL + sta :src_flags pla jmp _CopyToBG1 @@ -31,7 +32,7 @@ _CopyBinToBG1 ; ; A = mode ; 0 = default (base = $1800, stride = 256) -; 1 = scanline (base = $A0, stride = 324) +; 1 = scanline (base = $0, stride = 327) _ResetBG1YTable :base equ tmp0 :stride equ tmp1 @@ -80,8 +81,9 @@ _CopyPicToBG1 sta :src_stride lda #200 sta :src_height + lda #COPY_PIC_NORMAL + sta :src_flags pla - stz :src_flags jmp _CopyToBG1 ; Generic routine to copy image data into BG1 @@ -104,15 +106,27 @@ _CopyToBG1 sty :dstptr+2 ; Everything goes into this bank sty :dstptr2+2 +; "Normal" BG1 mode as a stride of 164 bytes and mirrors the BG0 size (328 x 208) +; In "Scanline" mode, the BG1 is treated as a 328x200 bitfield with each horizontal line doubled + + lda :src_flags + cmp #COPY_PIC_NORMAL + bne *+5 + jmp :_CopyToBG1Normal + + cmp #COPY_PIC_SCANLINE + bne *+5 + jmp :_CopyToBG1SCanline + + rts ; Flag do not match a known copy mode + +:_CopyToBG1SCanline lda #0 ; Start a byte 1 because odd offsets might go back 1 byte and don't want to wrap around sta :dstptr clc adc #164 ; The first part is 1-byte short, the second part is a full 164 bytes sta :dstptr2 -; "Normal" BG1 mode as a stride of 164 bytes and mirrors the BG0 size (328 x 208) -; In "Scanline" mode, the BG1 is treated as a 320x200 bitfield with each horizontal line doubled - lda :src_width min #164 sta :src_width @@ -164,6 +178,49 @@ _CopyToBG1 bcc :rloop rts +:_CopyToBG1Normal + stz :line_cnt +:rloop2 + lda :line_cnt ; get the pointer to the code field line + asl + tax + + lda BG1YTable,x + sta :dstptr + clc + adc #164 + sta :dstptr2 + + ldy #0 ; move forward in the image data and image data +:cloop2 + lda [:srcptr],y + sta [:dstptr],y + + iny + iny + + cpy :src_width + bcc :cloop2 + + ldy #0 + lda [:dstptr],y ; Duplicate the last couple of words in the extra space at the end of the line + sta [:dstptr2],y + + ldy #2 + lda [:dstptr],y + sta [:dstptr2],y + + lda :srcptr + clc + adc :src_stride + sta :srcptr + + inc :line_cnt + lda :line_cnt + cmp :src_height + bcc :rloop2 + rts + _SetBG1XPos cmp BG1StartX beq :out ; Easy, if nothing changed, then nothing changes From e6ab9a22e1395d13e6bad7bd6b501bda941b93cf Mon Sep 17 00:00:00 2001 From: Lucas Scharenbroich Date: Sun, 12 Mar 2023 15:40:22 -0500 Subject: [PATCH 68/68] Quick change to make sure sprites work on top of scanline offset mode --- demos/kfest-2022/demo-1/App.Main.s | 61 +++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/demos/kfest-2022/demo-1/App.Main.s b/demos/kfest-2022/demo-1/App.Main.s index b4ac952..4e1e275 100644 --- a/demos/kfest-2022/demo-1/App.Main.s +++ b/demos/kfest-2022/demo-1/App.Main.s @@ -43,6 +43,10 @@ seg2x equ 32 seg3x equ 34 seg4x equ 36 ; BG1 x-pos frameCountTotal equ 38 +PlayerX equ 40 +PlayerY equ 42 +PlayerXVel equ 44 +PlayerYVel equ 46 phk plb @@ -116,6 +120,41 @@ frameCountTotal equ 38 sta OldOneSecondCounter jsr UdtOverlay +; Create some sprites + lda #16 + sta PlayerX + + lda MaxGlobalY + sec + sbc #48 ; 32 for tiles, 16 for sprite + lda #48 ; 32 for tiles, 16 for sprite + sta PlayerY + stz PlayerXVel + stz PlayerYVel + +HERO_SIZE equ {SPRITE_16X16} +HERO_FLAGS equ HERO_SIZE ; no extra H/V bits for now +HERO_FRAME_1 equ HERO_SIZE+145 +HERO_VBUFF_1 equ VBUFF_SPRITE_START+0*VBUFF_SPRITE_STEP +HERO_SLOT equ 1 + + pea HERO_FRAME_1 + pea HERO_VBUFF_1 + _GTECreateSpriteStamp + + pha ; Space for result + pea HERO_SIZE + pea HERO_VBUFF_1 + _GTECompileSpriteStamp + pla + + pea HERO_SLOT ; Put the player in slot 1 + pea HERO_FLAGS+SPRITE_COMPILED ; mark this as a compiled sprite (can only use in RENDER_WITH_SHADOWING mode) + pha ; pass in the token of the compiled stamp + pei PlayerX + pei PlayerY + _GTEAddSprite + ; Set up the per-scanline rendering lda StartX @@ -131,7 +170,7 @@ frameCountTotal equ 38 pea #BG1Offsets _GTESetAddress - pea $0000 ; one regular render to fill the screen with the tilemap + pea #RENDER_WITH_SHADOWING ; one regular render to fill the screen with the tilemap _GTERender ; Set up a very specific test. First, we draw a sprite into the sprite plane, and then @@ -187,6 +226,17 @@ EvtLoop :do_render jsr SetBG1Animation ; Update the per-scanline BG1 offsets + jsr _GetVBLTicks + and #$00FC + lsr + lsr + sta PlayerX + + pea HERO_SLOT + pei PlayerX + pei PlayerY + _GTEMoveSprite ; Move the sprite to this local position + pea #RENDER_PER_SCANLINE ; pea #0 _GTERender @@ -221,6 +271,13 @@ qtRec adrl $0000 ; Color palette MyDirectPage ds 2 +_GetVBLTicks + PushLong #0 + _GetTick + pla + plx + rts + SetLimits pha ; Allocate space for width (in tiles), height (in tiles), pointer pha @@ -477,7 +534,7 @@ DoLoadBG1 lda BankLoad pha pea $0000 - pea $0000 ; default flags + pea COPY_PIC_SCANLINE ; Copy in a mode that supports per-scanline offsets _GTECopyPicToBG1 rts