Merge pull request #4 from luksamuk/palette-rearrange

Rearrange palettes, add parallax, fix springs, add diagonal springs
This commit is contained in:
Lucas Vieira 2024-10-25 01:11:22 -03:00 committed by GitHub
commit 09e17d3bbb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
44 changed files with 1122 additions and 285 deletions

View file

@ -6,6 +6,7 @@ COL16SRC := $(shell ls ./assets/levels/**/tiles16.tsx)
MAP128SRC := $(shell ls ./assets/levels/**/tilemap128.tmx)
LVLSRC := $(shell ls ./assets/levels/**/Z*.tmx)
MDLSRC := $(shell ls ./assets/models/**/*.rsd)
PRLSRC := $(shell ls ./assets/levels/**/parallax.toml)
MAP16OUT := $(addsuffix MAP16.MAP,$(dir $(MAP16SRC)))
COL16OUT := $(addsuffix MAP16.COL,$(dir $(COL16SRC)))
@ -13,6 +14,7 @@ MAP128OUT := $(addsuffix MAP128.MAP,$(dir $(COL16SRC)))
LVLOUT := $(addsuffix .LVL,$(basename $(LVLSRC)))
OMPOUT := $(addsuffix .OMP,$(basename $(LVLSRC)))
MDLOUT := $(addsuffix .mdl,$(basename $(MDLSRC)))
PRLOUT := $(addsuffix PRL.PRL,$(dir $(PRLSRC)))
.PHONY: clean ./build/engine.cue run configure chd cook iso elf debug cooktest purge rebuild repack packrun
@ -95,9 +97,10 @@ mdls: $(MDLOUT)
map16: $(MAP16OUT) $(COL16OUT)
map128: $(MAP128OUT)
lvl: $(LVLOUT)
prl: $(PRLOUT)
objs: $(OMPOUT)
cook: mdls map16 map128 lvl objs
cook: mdls map16 map128 lvl objs prl
cleancook:
rm -rf assets/models/**/*.mdl \
@ -106,6 +109,7 @@ cleancook:
assets/levels/**/*.LVL \
assets/levels/**/*.OMP \
assets/levels/**/*.OTD \
assets/levels/**/*.PRL \
assets/levels/**/collision16.json \
assets/levels/**/tilemap128.csv \
assets/levels/**/tilemap128_solid.csv \
@ -152,3 +156,8 @@ cleancook:
# (Depends on files such as Z1.tmx, Z2.tmx, etc., generated on Tiled)
%.OMP: %.tmx
./tools/cookobj/cookobj.py $<
# Level parallax data
# (Depends on a specific file named parallax.toml within level directory)
%/PRL.PRL: %/parallax.toml
./tools/buildprl/buildprl.py $<

View file

@ -1,11 +1,13 @@
[TIM Files]
File_0=Z:\home\alchemist\git\engine-psx\assets\levels\R0\tiles.TIM
File_1=Z:\home\alchemist\git\engine-psx\assets\levels\R1\tiles.TIM
File_2=Z:\home\alchemist\git\engine-psx\assets\levels\R2\tiles.TIM
File_3=Z:\home\alchemist\git\engine-psx\assets\sprites\SONIC.TIM
File_4=Z:\home\alchemist\git\engine-psx\assets\levels\COMMON\obj.TIM
[Locked Images]
File_0=Z:\home\alchemist\git\engine-psx\assets\sprites\SONIC.TIM
File_0=Z:\home\alchemist\git\engine-psx\assets\levels\COMMON\obj.TIM
File_1=Z:\home\alchemist\git\engine-psx\assets\levels\R0\BG0.TIM
File_2=Z:\home\alchemist\git\engine-psx\assets\levels\R0\tiles.TIM
File_3=Z:\home\alchemist\git\engine-psx\assets\levels\R1\tiles.TIM
File_4=Z:\home\alchemist\git\engine-psx\assets\levels\R1\BG0.TIM
File_5=Z:\home\alchemist\git\engine-psx\assets\levels\R2\BG0.TIM
File_6=Z:\home\alchemist\git\engine-psx\assets\levels\R2\BG1.TIM
File_7=Z:\home\alchemist\git\engine-psx\assets\levels\R2\tiles.TIM
File_8=Z:\home\alchemist\git\engine-psx\assets\sprites\SONIC.TIM
[Graphics Mode]
Width=320
Height=240

View file

@ -3,6 +3,7 @@
*.COL
*.OMP
*.OTD
*.PRL
*.psxlvl
**/collision16.json
**/tilemap128.csv

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Before After
Before After

BIN
assets/levels/R0/BG0.TIM Normal file

Binary file not shown.

BIN
assets/levels/R0/BG0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

Binary file not shown.

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.11.0" orientation="orthogonal" renderorder="right-down" width="255" height="31" tilewidth="128" tileheight="128" infinite="0" backgroundcolor="#3f007f" nextlayerid="5" nextobjectid="142">
<map version="1.10" tiledversion="1.11.0" orientation="orthogonal" renderorder="right-down" width="255" height="31" tilewidth="128" tileheight="128" infinite="0" backgroundcolor="#3f007f" nextlayerid="5" nextobjectid="155">
<tileset firstgid="1" source="128x128.tsx"/>
<tileset firstgid="45" source="../COMMON/objects_common.tsx"/>
<tileset firstgid="49" source="../COMMON/objects_common.tsx"/>
<layer id="1" name="LAYER0" width="255" height="31">
<data encoding="csv">
23,0,0,0,7,12,12,12,12,12,38,9,39,12,12,12,12,12,12,12,12,12,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,12,12,12,23,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,12 +9,12 @@
23,0,0,0,0,0,0,0,0,0,0,0,20,20,33,2,2,5,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,23,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,12,38,9,39,3,0,0,0,6,2,2,32,32,32,0,12,12,12,12,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,23,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,8,0,0,0,7,12,12,12,12,12,12,0,0,24,30,12,0,7,12,12,12,13,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,23,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,0,0,0,0,0,0,0,0,0,7,12,0,0,0,0,24,0,0,0,0,0,7,12,13,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,23,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,0,0,45,0,0,0,0,0,0,7,12,0,0,0,0,24,0,0,0,0,0,7,12,13,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,12,12,23,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,3,0,0,0,4,12,3,43,42,0,12,0,0,4,17,12,0,0,0,0,0,0,12,12,12,13,5,0,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,12,12,23,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,12,13,2,14,12,12,38,0,9,9,9,0,0,9,18,9,0,0,0,0,0,0,7,12,12,12,12,3,0,0,0,0,0,0,0,0,0,0,6,2,14,12,12,17,17,6,2,2,2,2,2,5,0,10,39,23,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,0,0,0,0,0,0,20,31,20,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,7,12,12,9,17,6,2,2,28,12,9,11,0,0,0,0,0,4,12,0,0,0,0,12,12,3,0,0,23,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,0,0,0,6,30,30,32,32,32,2,2,2,14,12,12,12,12,12,12,13,2,5,0,0,0,0,0,0,0,0,0,4,8,0,0,0,0,0,0,0,0,0,0,4,12,0,20,20,20,20,12,12,38,0,0,23,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,0,9,9,11,0,0,0,0,0,10,9,9,9,9,9,9,11,0,0,0,0,10,9,9,9,9,9,9,9,9,9,11,0,0,0,0,0,0,0,0,0,0,4,9,0,0,0,24,19,19,12,8,0,0,4,23,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,0,9,9,11,0,0,0,0,0,10,9,9,9,9,9,9,11,0,0,0,0,10,9,9,9,9,9,9,9,9,9,11,0,0,0,0,0,0,0,0,0,0,4,9,0,0,0,24,0,0,12,8,0,0,4,23,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,14,12,0,19,2,5,25,18,20,12,0,0,4,12,23,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,18,9,9,9,9,9,18,20,12,12,13,19,0,12,0,0,39,12,23,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,3,0,0,6,2,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,14,12,12,12,2,2,2,2,2,2,5,0,6,2,19,19,17,12,3,0,0,10,26,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@ -39,127 +39,140 @@
</layer>
<group id="4" name="OBJECTS">
<objectgroup id="3" name="COMMON">
<object id="1" gid="56" x="8100" y="1984" width="64" height="64"/>
<object id="2" gid="53" x="512" y="384" width="64" height="64"/>
<object id="3" gid="53" x="896" y="512" width="64" height="64"/>
<object id="7" gid="53" x="2464" y="384" width="64" height="64"/>
<object id="9" gid="46" x="2002" y="576" width="64" height="64">
<object id="1" gid="60" x="8100" y="1984" width="64" height="64"/>
<object id="2" gid="57" x="512" y="384" width="64" height="64"/>
<object id="3" gid="57" x="896" y="512" width="64" height="64"/>
<object id="7" gid="57" x="2464" y="384" width="64" height="64"/>
<object id="9" gid="50" x="2002" y="576" width="64" height="64">
<properties>
<property name="Kind" value="SHIELD"/>
</properties>
</object>
<object id="10" gid="46" x="1972" y="576" width="64" height="64">
<object id="10" gid="50" x="1972" y="576" width="64" height="64">
<properties>
<property name="Kind" value="RING"/>
</properties>
</object>
<object id="11" gid="49" x="1056.25" y="1055.88" width="64" height="64"/>
<object id="13" gid="55" x="1054.75" y="927.546" width="64" height="64"/>
<object id="14" gid="55" x="1054.75" y="856.212" width="64" height="64"/>
<object id="15" gid="55" x="1033.75" y="869.545" width="64" height="64"/>
<object id="16" gid="55" x="1076.75" y="869.545" width="64" height="64"/>
<object id="17" gid="46" x="1362.38" y="896" width="64" height="64">
<object id="11" gid="53" x="1056.25" y="1055.88" width="64" height="64"/>
<object id="13" gid="59" x="1054.75" y="927.546" width="64" height="64"/>
<object id="14" gid="59" x="1054.75" y="856.212" width="64" height="64"/>
<object id="15" gid="59" x="1033.75" y="869.545" width="64" height="64"/>
<object id="16" gid="59" x="1076.75" y="869.545" width="64" height="64"/>
<object id="17" gid="50" x="1362.38" y="896" width="64" height="64">
<properties>
<property name="Kind" value="INVINCIBILITY"/>
</properties>
</object>
<object id="18" gid="46" x="1329.38" y="896" width="64" height="64">
<object id="18" gid="50" x="1329.38" y="896" width="64" height="64">
<properties>
<property name="Kind" value="RING"/>
</properties>
</object>
<object id="19" gid="46" x="401.25" y="959.75" width="64" height="64">
<object id="19" gid="50" x="401.25" y="959.75" width="64" height="64">
<properties>
<property name="Kind" value="SPEEDSHOES"/>
</properties>
</object>
<object id="20" gid="46" x="433.25" y="959.75" width="64" height="64">
<object id="20" gid="50" x="433.25" y="959.75" width="64" height="64">
<properties>
<property name="Kind" value="RING"/>
</properties>
</object>
<object id="21" gid="46" x="2066" y="768" width="64" height="64">
<object id="21" gid="50" x="2066" y="768" width="64" height="64">
<properties>
<property name="Kind" value="SUPER"/>
</properties>
</object>
<object id="22" gid="53" x="5791" y="1792" width="64" height="64"/>
<object id="23" gid="53" x="2714" y="511" width="64" height="64"/>
<object id="34" gid="45" x="3249.33" y="741.167" width="64" height="64"/>
<object id="35" gid="45" x="3273.33" y="752.167" width="64" height="64"/>
<object id="36" gid="45" x="3297.33" y="764.167" width="64" height="64"/>
<object id="40" gid="53" x="351.212" y="1291.18" width="64" height="64"/>
<object id="41" gid="53" x="4126" y="1027" width="64" height="64"/>
<object id="49" gid="45" x="5306" y="1488.5" width="64" height="64"/>
<object id="50" gid="45" x="5330" y="1476.5" width="64" height="64"/>
<object id="51" gid="45" x="5354" y="1465.5" width="64" height="64"/>
<object id="67" gid="45" x="5575.5" y="1306" width="64" height="64"/>
<object id="68" gid="45" x="5593.5" y="1287" width="64" height="64"/>
<object id="69" gid="45" x="5612.5" y="1269" width="64" height="64"/>
<object id="73" gid="45" x="4098.5" y="1248" width="64" height="64"/>
<object id="74" gid="45" x="4116.5" y="1229" width="64" height="64"/>
<object id="75" gid="45" x="4135.5" y="1211" width="64" height="64"/>
<object id="77" gid="53" x="929" y="1728" width="64" height="64"/>
<object id="78" gid="53" x="1313" y="1920" width="64" height="64"/>
<object id="79" gid="53" x="1568" y="1856" width="64" height="64"/>
<object id="80" gid="53" x="1825.5" y="1920.5" width="64" height="64"/>
<object id="81" gid="53" x="2080" y="1855.5" width="64" height="64"/>
<object id="82" gid="53" x="2337" y="1919.5" width="64" height="64"/>
<object id="83" gid="53" x="2592.5" y="1856" width="64" height="64"/>
<object id="85" gid="53" x="3106.5" y="1919.5" width="64" height="64"/>
<object id="86" gid="53" x="4064.67" y="1790.67" width="64" height="64"/>
<object id="87" gid="53" x="5152" y="960" width="64" height="64"/>
<object id="88" gid="53" x="5859.33" y="895.333" width="64" height="64"/>
<object id="89" gid="53" x="6558" y="960.667" width="64" height="64"/>
<object id="90" gid="53" x="5974" y="1248.67" width="64" height="64"/>
<object id="91" gid="46" x="6464" y="1248" width="64" height="64">
<object id="22" gid="57" x="5791" y="1792" width="64" height="64"/>
<object id="23" gid="57" x="2714" y="511" width="64" height="64"/>
<object id="34" gid="49" x="3249.33" y="741.167" width="64" height="64"/>
<object id="35" gid="49" x="3273.33" y="752.167" width="64" height="64"/>
<object id="36" gid="49" x="3297.33" y="764.167" width="64" height="64"/>
<object id="40" gid="57" x="351.212" y="1291.18" width="64" height="64"/>
<object id="41" gid="57" x="4126" y="1027" width="64" height="64"/>
<object id="49" gid="49" x="5306" y="1488.5" width="64" height="64"/>
<object id="50" gid="49" x="5330" y="1476.5" width="64" height="64"/>
<object id="51" gid="49" x="5354" y="1465.5" width="64" height="64"/>
<object id="67" gid="49" x="5575.5" y="1306" width="64" height="64"/>
<object id="68" gid="49" x="5593.5" y="1287" width="64" height="64"/>
<object id="69" gid="49" x="5612.5" y="1269" width="64" height="64"/>
<object id="73" gid="49" x="4098.5" y="1248" width="64" height="64"/>
<object id="74" gid="49" x="4116.5" y="1229" width="64" height="64"/>
<object id="75" gid="49" x="4135.5" y="1211" width="64" height="64"/>
<object id="77" gid="57" x="929" y="1728" width="64" height="64"/>
<object id="78" gid="57" x="1313" y="1920" width="64" height="64"/>
<object id="79" gid="57" x="1568" y="1856" width="64" height="64"/>
<object id="80" gid="57" x="1825.5" y="1920.5" width="64" height="64"/>
<object id="81" gid="57" x="2080" y="1855.5" width="64" height="64"/>
<object id="82" gid="57" x="2337" y="1919.5" width="64" height="64"/>
<object id="83" gid="57" x="2592.5" y="1856" width="64" height="64"/>
<object id="85" gid="57" x="3106.5" y="1919.5" width="64" height="64"/>
<object id="86" gid="57" x="4064.67" y="1790.67" width="64" height="64"/>
<object id="87" gid="57" x="5152" y="960" width="64" height="64"/>
<object id="88" gid="57" x="5859.33" y="895.333" width="64" height="64"/>
<object id="89" gid="57" x="6558" y="960.667" width="64" height="64"/>
<object id="90" gid="57" x="5974" y="1248.67" width="64" height="64"/>
<object id="91" gid="50" x="6464" y="1248" width="64" height="64">
<properties>
<property name="Kind" value="1UP"/>
</properties>
</object>
<object id="93" gid="53" x="5909" y="1469" width="64" height="64"/>
<object id="95" gid="53" x="5086" y="1726" width="64" height="64"/>
<object id="98" gid="45" x="6409" y="2007.5" width="64" height="64"/>
<object id="99" gid="45" x="6433" y="2018.5" width="64" height="64"/>
<object id="100" gid="45" x="6457" y="2030.5" width="64" height="64"/>
<object id="101" gid="45" x="6803" y="1821.5" width="64" height="64"/>
<object id="102" gid="45" x="6827" y="1832.5" width="64" height="64"/>
<object id="103" gid="45" x="6851" y="1844.5" width="64" height="64"/>
<object id="104" gid="45" x="6901.16" y="1520.83" width="64" height="64"/>
<object id="105" gid="45" x="6919.16" y="1501.83" width="64" height="64"/>
<object id="106" gid="45" x="6938.16" y="1483.83" width="64" height="64"/>
<object id="110" gid="45" x="6822.83" y="1083.5" width="64" height="64"/>
<object id="111" gid="45" x="6840.83" y="1101.5" width="64" height="64"/>
<object id="112" gid="45" x="6859.83" y="1120.5" width="64" height="64"/>
<object id="114" gid="53" x="1952.34" y="768.337" width="64" height="64"/>
<object id="116" gid="53" x="3169.33" y="1277.33" width="64" height="64"/>
<object id="117" gid="53" x="1695" y="352" width="64" height="64"/>
<object id="120" gid="46" x="4769" y="1024" width="64" height="64">
<object id="93" gid="57" x="5909" y="1469" width="64" height="64"/>
<object id="95" gid="57" x="5086" y="1726" width="64" height="64"/>
<object id="98" gid="49" x="6409" y="2007.5" width="64" height="64"/>
<object id="99" gid="49" x="6433" y="2018.5" width="64" height="64"/>
<object id="100" gid="49" x="6457" y="2030.5" width="64" height="64"/>
<object id="101" gid="49" x="6803" y="1821.5" width="64" height="64"/>
<object id="102" gid="49" x="6827" y="1832.5" width="64" height="64"/>
<object id="103" gid="49" x="6851" y="1844.5" width="64" height="64"/>
<object id="104" gid="49" x="6901.16" y="1520.83" width="64" height="64"/>
<object id="105" gid="49" x="6919.16" y="1501.83" width="64" height="64"/>
<object id="106" gid="49" x="6938.16" y="1483.83" width="64" height="64"/>
<object id="110" gid="49" x="6822.83" y="1083.5" width="64" height="64"/>
<object id="111" gid="49" x="6840.83" y="1101.5" width="64" height="64"/>
<object id="112" gid="49" x="6859.83" y="1120.5" width="64" height="64"/>
<object id="114" gid="57" x="1952.34" y="768.337" width="64" height="64"/>
<object id="116" gid="57" x="3169.33" y="1277.33" width="64" height="64"/>
<object id="117" gid="57" x="1695" y="352" width="64" height="64"/>
<object id="120" gid="50" x="4769" y="1024" width="64" height="64">
<properties>
<property name="Kind" value="RING"/>
</properties>
</object>
<object id="121" gid="45" x="275.5" y="1578.5" width="64" height="64"/>
<object id="122" gid="45" x="293.5" y="1596.5" width="64" height="64"/>
<object id="123" gid="45" x="312.5" y="1615.5" width="64" height="64"/>
<object id="124" gid="49" x="120" y="384" width="64" height="64"/>
<object id="125" gid="46" x="48" y="128" width="64" height="64">
<object id="121" gid="49" x="275.5" y="1578.5" width="64" height="64"/>
<object id="122" gid="49" x="293.5" y="1596.5" width="64" height="64"/>
<object id="123" gid="49" x="312.5" y="1615.5" width="64" height="64"/>
<object id="124" gid="53" x="120" y="384" width="64" height="64"/>
<object id="125" gid="50" x="48" y="128" width="64" height="64">
<properties>
<property name="Kind" value="1UP"/>
</properties>
</object>
<object id="126" gid="49" x="1904.25" y="927.75" width="64" height="64"/>
<object id="127" gid="55" x="1901.09" y="836.909" width="64" height="64"/>
<object id="129" gid="45" x="1818.17" y="836.5" width="64" height="64"/>
<object id="130" gid="45" x="1836.17" y="817.5" width="64" height="64"/>
<object id="131" gid="45" x="1855.17" y="799.5" width="64" height="64"/>
<object id="133" gid="45" x="1422.83" y="402.5" width="64" height="64"/>
<object id="134" gid="45" x="1440.83" y="383.5" width="64" height="64"/>
<object id="135" gid="45" x="1459.83" y="365.5" width="64" height="64"/>
<object id="136" gid="49" x="1904" y="576" width="64" height="64"/>
<object id="137" gid="49" x="1264.38" y="896" width="64" height="64"/>
<object id="138" gid="57" x="288" y="384" width="64" height="64"/>
<object id="139" gid="53" x="2304" y="1152" width="64" height="64"/>
<object id="126" gid="53" x="1904.25" y="927.75" width="64" height="64"/>
<object id="127" gid="59" x="1901.09" y="836.909" width="64" height="64"/>
<object id="129" gid="49" x="1818.17" y="836.5" width="64" height="64"/>
<object id="130" gid="49" x="1836.17" y="817.5" width="64" height="64"/>
<object id="131" gid="49" x="1855.17" y="799.5" width="64" height="64"/>
<object id="133" gid="49" x="1422.83" y="402.5" width="64" height="64"/>
<object id="134" gid="49" x="1440.83" y="383.5" width="64" height="64"/>
<object id="135" gid="49" x="1459.83" y="365.5" width="64" height="64"/>
<object id="136" gid="53" x="1904" y="576" width="64" height="64"/>
<object id="137" gid="53" x="1264.38" y="896" width="64" height="64"/>
<object id="138" gid="61" x="324" y="384" width="64" height="64"/>
<object id="139" gid="57" x="2304" y="1152" width="64" height="64"/>
<object id="142" gid="55" x="448" y="689" width="64" height="64"/>
<object id="143" gid="1073741879" x="448" y="784" width="64" height="64"/>
<object id="144" gid="2147483703" x="384" y="688" width="64" height="64"/>
<object id="145" gid="3221225527" x="384" y="784" width="64" height="64"/>
<object id="146" gid="53" x="416" y="672" width="64" height="64"/>
<object id="147" gid="1073741877" x="416" y="800" width="64" height="64"/>
<object id="148" gid="53" x="480" y="673" width="64" height="64" rotation="90"/>
<object id="149" gid="53" x="416" y="736" width="64" height="64" rotation="-90"/>
<object id="150" gid="53" x="6304" y="1440" width="64" height="64"/>
<object id="151" gid="53" x="6528" y="1680" width="64" height="64" rotation="-90"/>
<object id="152" gid="53" x="6528" y="1840" width="64" height="64" rotation="-90"/>
<object id="153" gid="54" x="6144" y="1810" width="64" height="64" rotation="90"/>
<object id="154" gid="2147483703" x="2119" y="1152" width="64" height="64"/>
</objectgroup>
</group>
</map>

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.11.0" orientation="orthogonal" renderorder="right-down" width="255" height="31" tilewidth="128" tileheight="128" infinite="0" backgroundcolor="#3f007f" nextlayerid="5" nextobjectid="52">
<map version="1.10" tiledversion="1.11.0" orientation="orthogonal" renderorder="right-down" width="255" height="31" tilewidth="128" tileheight="128" infinite="0" backgroundcolor="#3f007f" nextlayerid="5" nextobjectid="58">
<tileset firstgid="1" source="128x128.tsx"/>
<tileset firstgid="45" source="../COMMON/objects_common.tsx"/>
<tileset firstgid="49" source="../COMMON/objects_common.tsx"/>
<layer id="1" name="LAYER0" width="255" height="31">
<data encoding="csv">
24,0,0,10,9,12,12,12,9,9,9,9,9,9,9,9,9,9,9,9,12,8,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,12,12,12,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@ -39,62 +39,67 @@
</layer>
<group id="3" name="OBJECTS">
<objectgroup id="4" name="COMMON">
<object id="1" gid="56" x="7584" y="1408" width="64" height="64"/>
<object id="2" gid="53" x="799" y="511.5" width="64" height="64"/>
<object id="7" gid="46" x="2800" y="384" width="64" height="64">
<object id="1" gid="60" x="7584" y="1408" width="64" height="64"/>
<object id="2" gid="57" x="799" y="511.5" width="64" height="64"/>
<object id="7" gid="50" x="2800" y="384" width="64" height="64">
<properties>
<property name="Kind" value="RING"/>
</properties>
</object>
<object id="10" gid="49" x="128" y="592" width="64" height="64" rotation="90"/>
<object id="19" gid="55" x="305" y="929" width="64" height="64"/>
<object id="20" gid="46" x="1185" y="896" width="64" height="64">
<object id="10" gid="53" x="128" y="592" width="64" height="64" rotation="90"/>
<object id="20" gid="50" x="1185" y="896" width="64" height="64">
<properties>
<property name="Kind" value="1UP"/>
</properties>
</object>
<object id="21" gid="53" x="1055" y="1159" width="64" height="64"/>
<object id="22" gid="53" x="1887" y="1030" width="64" height="64"/>
<object id="23" gid="46" x="3088" y="192" width="64" height="64">
<object id="21" gid="57" x="1055" y="1159" width="64" height="64"/>
<object id="22" gid="57" x="1887" y="1030" width="64" height="64"/>
<object id="23" gid="50" x="3088" y="192" width="64" height="64">
<properties>
<property name="Kind" value="SHIELD"/>
</properties>
</object>
<object id="24" gid="46" x="801" y="416" width="64" height="64">
<object id="24" gid="50" x="801" y="416" width="64" height="64">
<properties>
<property name="Kind" value="RING"/>
</properties>
</object>
<object id="25" gid="48" x="3355" y="320" width="64" height="64"/>
<object id="26" gid="57" x="256" y="640" width="64" height="64"/>
<object id="28" gid="50" x="2304" y="1040" width="64" height="64" rotation="-90"/>
<object id="29" gid="45" x="1175.33" y="611.167" width="64" height="64"/>
<object id="30" gid="45" x="1199.33" y="622.167" width="64" height="64"/>
<object id="31" gid="45" x="1223.33" y="634.167" width="64" height="64"/>
<object id="32" gid="45" x="920" y="796.5" width="64" height="64"/>
<object id="33" gid="45" x="944" y="807.5" width="64" height="64"/>
<object id="34" gid="45" x="968" y="819.5" width="64" height="64"/>
<object id="35" gid="45" x="1809.33" y="799.167" width="64" height="64"/>
<object id="36" gid="45" x="1833.33" y="810.167" width="64" height="64"/>
<object id="37" gid="45" x="1857.33" y="822.167" width="64" height="64"/>
<object id="38" gid="53" x="3108.67" y="720" width="64" height="64"/>
<object id="39" gid="53" x="2975.33" y="521.333" width="64" height="64"/>
<object id="40" gid="53" x="3106.67" y="323.333" width="64" height="64"/>
<object id="41" gid="53" x="2713.33" y="322" width="64" height="64"/>
<object id="42" gid="45" x="3616.17" y="443.5" width="64" height="64"/>
<object id="43" gid="45" x="3634.17" y="461.5" width="64" height="64"/>
<object id="44" gid="45" x="3653.17" y="480.5" width="64" height="64"/>
<object id="45" gid="45" x="4722.83" y="1040.17" width="64" height="64"/>
<object id="46" gid="45" x="4740.83" y="1058.17" width="64" height="64"/>
<object id="47" gid="45" x="4759.83" y="1077.17" width="64" height="64"/>
<object id="48" gid="45" x="4147" y="627.5" width="64" height="64"/>
<object id="49" gid="45" x="4171" y="638.5" width="64" height="64"/>
<object id="50" gid="45" x="4195" y="650.5" width="64" height="64"/>
<object id="51" gid="46" x="7442" y="1216" width="64" height="64">
<object id="25" gid="52" x="3355" y="320" width="64" height="64"/>
<object id="26" gid="61" x="256" y="640" width="64" height="64"/>
<object id="28" gid="54" x="2304" y="1040" width="64" height="64" rotation="-90"/>
<object id="29" gid="49" x="1175.33" y="611.167" width="64" height="64"/>
<object id="30" gid="49" x="1199.33" y="622.167" width="64" height="64"/>
<object id="31" gid="49" x="1223.33" y="634.167" width="64" height="64"/>
<object id="32" gid="49" x="920" y="796.5" width="64" height="64"/>
<object id="33" gid="49" x="944" y="807.5" width="64" height="64"/>
<object id="34" gid="49" x="968" y="819.5" width="64" height="64"/>
<object id="35" gid="49" x="1809.33" y="799.167" width="64" height="64"/>
<object id="36" gid="49" x="1833.33" y="810.167" width="64" height="64"/>
<object id="37" gid="49" x="1857.33" y="822.167" width="64" height="64"/>
<object id="38" gid="57" x="3108.67" y="720" width="64" height="64"/>
<object id="39" gid="57" x="2975.33" y="521.333" width="64" height="64"/>
<object id="40" gid="57" x="3106.67" y="323.333" width="64" height="64"/>
<object id="41" gid="57" x="2713.33" y="322" width="64" height="64"/>
<object id="42" gid="49" x="3616.17" y="443.5" width="64" height="64"/>
<object id="43" gid="49" x="3634.17" y="461.5" width="64" height="64"/>
<object id="44" gid="49" x="3653.17" y="480.5" width="64" height="64"/>
<object id="45" gid="49" x="4722.83" y="1040.17" width="64" height="64"/>
<object id="46" gid="49" x="4740.83" y="1058.17" width="64" height="64"/>
<object id="47" gid="49" x="4759.83" y="1077.17" width="64" height="64"/>
<object id="48" gid="49" x="4147" y="627.5" width="64" height="64"/>
<object id="49" gid="49" x="4171" y="638.5" width="64" height="64"/>
<object id="50" gid="49" x="4195" y="650.5" width="64" height="64"/>
<object id="51" gid="50" x="7442" y="1216" width="64" height="64">
<properties>
<property name="Kind" value="1UP"/>
</properties>
</object>
<object id="52" gid="2147483703" x="6864" y="1249" width="64" height="64"/>
<object id="53" gid="55" x="3184" y="256" width="64" height="64"/>
<object id="54" gid="55" x="880" y="448" width="64" height="64"/>
<object id="55" gid="2147483703" x="720" y="448" width="64" height="64"/>
<object id="56" gid="56" x="304" y="909" width="64" height="64"/>
<object id="57" gid="1073741877" x="720" y="640" width="64" height="64"/>
</objectgroup>
</group>
</map>

View file

@ -0,0 +1,27 @@
[part1]
width = 256
height = 128
u0 = 0
v0 = 0
scrollx = 0.25
y0 = 0
single = false
[part2]
width = 256
height = 128
u0 = 0
v0 = 0
scrollx = 0.25
y0 = 128
single = false
[part3]
width = 256
height = 128
u0 = 0
v0 = 0
scrollx = 0.25
y0 = 256
single = false

View file

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.11.0" orientation="orthogonal" renderorder="right-down" width="32" height="88" tilewidth="16" tileheight="16" infinite="0" nextlayerid="4" nextobjectid="1">
<map version="1.10" tiledversion="1.11.0" orientation="orthogonal" renderorder="right-down" width="32" height="96" tilewidth="16" tileheight="16" infinite="0" nextlayerid="4" nextobjectid="1">
<tileset firstgid="1" source="tiles16.tsx"/>
<layer id="1" name="solid" width="32" height="88">
<layer id="1" name="solid" width="32" height="96">
<data encoding="csv">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,29,0,0,0,0,0,0,0,0,0,0,0,0,30,11,
@ -90,10 +90,18 @@
0,0,0,0,10,11,11,12,0,0,0,0,10,11,11,12,0,0,0,0,0,0,0,0,11,11,11,11,11,11,70,71,
0,0,0,0,10,11,11,12,0,0,0,0,10,11,11,12,0,0,0,0,0,0,0,0,11,11,11,11,70,71,0,0,
0,0,0,0,10,11,11,12,0,0,0,0,10,11,11,12,0,0,0,0,0,0,0,0,11,11,70,71,0,0,0,0,
0,0,0,0,18,19,19,20,0,0,0,0,18,19,19,20,0,0,0,0,0,0,0,0,70,71,0,0,0,0,0,0
0,0,0,0,18,19,19,20,0,0,0,0,18,19,19,20,0,0,0,0,0,0,0,0,70,71,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,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,11,0,0,0,0,0,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,11,11,11,0,0,0,0,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,11,11,11,0,0,0,0,0,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,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</data>
</layer>
<layer id="2" name="oneway" width="32" height="88" opacity="0.9">
<layer id="2" name="oneway" width="32" height="96" opacity="0.9">
<data encoding="csv">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@ -182,10 +190,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</data>
</layer>
<layer id="3" name="none" width="32" height="88" opacity="0.5">
<layer id="3" name="none" width="32" height="96" opacity="0.5">
<data encoding="csv">
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@ -274,6 +290,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</data>
</layer>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Before After
Before After

BIN
assets/levels/R1/BG0.TIM Normal file

Binary file not shown.

BIN
assets/levels/R1/BG0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.11.0" orientation="orthogonal" renderorder="right-down" width="255" height="31" tilewidth="128" tileheight="128" infinite="0" backgroundcolor="#913b3b" nextlayerid="5" nextobjectid="41">
<map version="1.10" tiledversion="1.11.0" orientation="orthogonal" renderorder="right-down" width="255" height="31" tilewidth="128" tileheight="128" infinite="0" backgroundcolor="#913b3b" nextlayerid="5" nextobjectid="75">
<editorsettings>
<export target="Z2.json" format="json"/>
</editorsettings>
@ -7,27 +7,27 @@
<tileset firstgid="57" source="../COMMON/objects_common.tsx"/>
<layer id="1" name="LAYER0" width="255" height="31">
<data encoding="csv">
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,19,9,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,18,19,29,16,6,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,18,22,29,0,0,16,6,7,0,0,0,0,0,0,0,0,0,0,44,9,45,0,0,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,18,22,29,0,0,0,0,16,49,20,23,12,3,18,36,50,20,16,16,12,12,29,0,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,25,25,23,26,26,23,23,23,23,0,0,46,21,0,19,21,0,44,9,9,24,29,22,27,0,0,0,12,16,16,16,16,16,16,16,49,24,0,12,12,29,0,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,25,25,25,25,25,24,9,9,43,12,12,12,26,26,26,26,43,12,12,0,0,0,26,26,0,25,25,16,25,25,0,27,0,0,0,0,28,0,12,12,29,0,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,16,25,25,25,22,27,27,0,0,0,44,9,26,26,26,47,0,0,30,0,12,12,29,0,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,0,36,15,0,0,0,46,9,43,16,16,0,0,0,0,12,49,24,24,24,12,12,29,0,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,53,53,9,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,2,16,6,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,2,0,0,16,6,7,0,0,0,0,0,0,0,0,0,0,44,9,45,0,0,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,2,0,0,0,0,16,42,26,43,12,3,18,36,50,20,16,16,12,12,21,0,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,25,25,23,26,26,23,23,23,23,0,0,0,0,0,19,21,0,44,9,9,9,2,21,0,0,0,0,12,0,0,0,16,16,16,16,49,24,0,12,12,0,19,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,25,25,25,25,25,24,9,9,43,12,12,49,26,26,26,26,43,12,12,0,0,0,26,26,0,25,25,16,25,25,0,27,0,0,0,0,28,0,12,12,21,0,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,16,25,25,25,22,27,27,0,0,0,44,9,26,26,26,47,0,0,30,0,12,12,0,20,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,0,36,15,0,0,0,46,9,43,16,16,0,0,0,0,12,49,24,24,24,12,12,21,0,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,0,0,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,28,12,29,0,0,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,6,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,16,31,44,43,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,12,12,6,7,0,46,26,26,43,12,12,6,45,0,0,0,0,0,0,46,51,43,12,12,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,12,12,6,7,0,46,26,26,43,12,12,6,45,0,0,0,0,0,0,46,0,43,12,12,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,12,12,12,12,12,12,0,0,12,12,12,12,12,12,12,12,12,12,12,12,0,12,12,12,29,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,12,12,12,12,12,12,0,0,12,12,12,12,12,12,12,12,12,12,12,12,0,29,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,12,12,12,12,12,12,0,0,12,12,12,12,12,12,12,12,12,12,12,12,0,29,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,12,12,12,12,12,12,0,0,12,12,12,12,12,12,12,12,12,12,12,12,0,29,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,12,12,12,12,12,12,0,0,12,12,12,12,12,12,12,12,12,12,12,12,0,13,27,27,27,15,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,12,12,12,12,12,12,0,0,12,12,12,12,12,12,12,12,12,12,12,12,24,2,0,0,0,12,12,12,12,12,12,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,12,12,12,12,12,12,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,12,0,0,0,12,12,12,12,12,12,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,12,12,12,12,12,12,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,12,0,0,0,12,12,12,12,12,12,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,12,12,12,12,12,12,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,12,0,0,0,12,12,12,12,12,12,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,12,12,12,12,12,12,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,12,0,0,0,12,12,12,12,12,12,12,12,12,12,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,12,12,12,12,12,12,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,12,0,0,0,12,3,25,25,25,25,25,25,25,25,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,12,12,12,12,12,12,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,12,0,0,0,12,12,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,12,12,12,12,12,12,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,12,0,0,0,12,12,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,12,12,12,12,12,12,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,12,0,0,0,12,12,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12,0,0,0,0,0,12,12,12,12,12,12,12,0,0,0,0,12,12,12,12,12,12,12,12,0,0,12,12,12,12,12,12,12,12,12,12,12,12,12,12,0,0,0,12,12,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@ -42,7 +42,7 @@
</layer>
<group id="3" name="OBJECTS">
<objectgroup id="4" name="COMMON">
<object id="2" gid="68" x="6560" y="2048" width="64" height="64"/>
<object id="2" gid="68" x="6560" y="2080" width="64" height="64"/>
<object id="3" gid="58" x="113" y="672" width="64" height="64">
<properties>
<property name="Kind" value="SHIELD"/>
@ -54,30 +54,29 @@
<object id="7" gid="65" x="1150" y="578" width="64" height="64"/>
<object id="8" gid="61" x="896" y="656" width="64" height="64" rotation="90"/>
<object id="9" gid="62" x="1664" y="656" width="64" height="64" rotation="90"/>
<object id="10" gid="65" x="2528" y="577.333" width="64" height="64"/>
<object id="11" gid="65" x="2782.67" y="62" width="64" height="64"/>
<object id="12" gid="58" x="3712" y="512" width="64" height="64">
<object id="10" gid="65" x="2014" y="577.333" width="64" height="64"/>
<object id="11" gid="65" x="2852.92" y="64.75" width="64" height="64"/>
<object id="12" gid="58" x="4208" y="512" width="64" height="64">
<properties>
<property name="Kind" value="RING"/>
<property name="Kind" value="1UP"/>
</properties>
</object>
<object id="13" gid="65" x="3968" y="384" width="64" height="64"/>
<object id="14" gid="65" x="4250.67" y="511.333" width="64" height="64"/>
<object id="14" gid="65" x="3743.34" y="454" width="64" height="64"/>
<object id="15" gid="65" x="4762.67" y="545.333" width="64" height="64"/>
<object id="16" gid="65" x="5018" y="318.667" width="64" height="64"/>
<object id="17" gid="67" x="5440" y="496" width="64" height="64"/>
<object id="18" gid="67" x="5440" y="722" width="64" height="64"/>
<object id="19" gid="67" x="5440" y="1015" width="64" height="64"/>
<object id="17" gid="67" x="5426" y="532" width="64" height="64"/>
<object id="18" gid="67" x="5428" y="786" width="64" height="64"/>
<object id="19" gid="67" x="5264" y="940.333" width="64" height="64"/>
<object id="20" gid="67" x="5024" y="1453" width="64" height="64"/>
<object id="21" gid="65" x="2972" y="1400" width="64" height="64"/>
<object id="22" gid="65" x="4128" y="720.667" width="64" height="64"/>
<object id="23" gid="65" x="3872.67" y="672.667" width="64" height="64"/>
<object id="24" gid="58" x="3712" y="672" width="64" height="64">
<object id="24" gid="58" x="3697" y="672" width="64" height="64">
<properties>
<property name="Kind" value="SPEEDSHOES"/>
</properties>
</object>
<object id="25" gid="58" x="3520" y="672" width="64" height="64">
<object id="25" gid="58" x="3537" y="672" width="64" height="64">
<properties>
<property name="Kind" value="INVINCIBILITY"/>
</properties>
@ -86,16 +85,40 @@
<object id="27" gid="65" x="3354.67" y="958" width="64" height="64"/>
<object id="28" gid="65" x="2584" y="776" width="64" height="64"/>
<object id="29" gid="65" x="2584" y="752" width="64" height="64"/>
<object id="30" gid="65" x="3116.67" y="590" width="64" height="64"/>
<object id="31" gid="65" x="3116.67" y="566" width="64" height="64"/>
<object id="32" gid="65" x="3040" y="704" width="64" height="64"/>
<object id="33" gid="67" x="2660" y="446" width="64" height="64"/>
<object id="34" gid="67" x="2656" y="261.333" width="64" height="64"/>
<object id="30" gid="65" x="2959.67" y="572" width="64" height="64"/>
<object id="31" gid="65" x="2959.67" y="548" width="64" height="64"/>
<object id="32" gid="65" x="3040" y="683" width="64" height="64"/>
<object id="36" gid="65" x="3212.17" y="1255.17" width="64" height="64"/>
<object id="37" gid="65" x="3212.17" y="1231.17" width="64" height="64"/>
<object id="38" gid="65" x="5019.5" y="2076.5" width="64" height="64"/>
<object id="38" gid="65" x="5019.5" y="2048.5" width="64" height="64"/>
<object id="39" gid="67" x="4928" y="741" width="64" height="64"/>
<object id="40" gid="69" x="180" y="544" width="64" height="64"/>
<object id="41" gid="63" x="2544" y="448" width="64" height="64"/>
<object id="42" gid="63" x="2544" y="256" width="64" height="64"/>
<object id="44" gid="2147483711" x="2768" y="576" width="64" height="64"/>
<object id="45" gid="2147483711" x="2768" y="368.5" width="64" height="64"/>
<object id="46" gid="2147483711" x="2768" y="160" width="64" height="64"/>
<object id="48" gid="57" x="2576.5" y="429" width="64" height="64"/>
<object id="49" gid="57" x="2594.5" y="410" width="64" height="64"/>
<object id="50" gid="57" x="2613.5" y="392" width="64" height="64"/>
<object id="51" gid="57" x="2574" y="241.5" width="64" height="64"/>
<object id="52" gid="57" x="2592" y="222.5" width="64" height="64"/>
<object id="53" gid="57" x="2611" y="204.5" width="64" height="64"/>
<object id="57" gid="57" x="2705.5" y="529.5" width="64" height="64"/>
<object id="58" gid="57" x="2723.5" y="547.5" width="64" height="64"/>
<object id="59" gid="57" x="2742.5" y="566.5" width="64" height="64"/>
<object id="60" gid="57" x="2705.5" y="320.75" width="64" height="64"/>
<object id="61" gid="57" x="2723.5" y="338.75" width="64" height="64"/>
<object id="62" gid="57" x="2742.5" y="357.75" width="64" height="64"/>
<object id="63" gid="57" x="2704.75" y="112" width="64" height="64"/>
<object id="64" gid="57" x="2722.75" y="130" width="64" height="64"/>
<object id="65" gid="57" x="2741.75" y="149" width="64" height="64"/>
<object id="66" gid="1073741885" x="4991.67" y="1280.33" width="64" height="64"/>
<object id="68" gid="1073741885" x="5023.67" y="1280.33" width="64" height="64"/>
<object id="69" gid="1073741885" x="5055.67" y="1280.33" width="64" height="64"/>
<object id="70" gid="67" x="5265.33" y="664.667" width="64" height="64"/>
<object id="72" gid="61" x="3041" y="704" width="64" height="64"/>
<object id="73" gid="60" x="4685" y="928" width="64" height="64"/>
</objectgroup>
</group>
</map>

View file

@ -0,0 +1,17 @@
[buildings]
width = 256
height = 211
u0 = 0
v0 = 0
scrollx = 0.25
y0 = 0
single = false
[water]
width = 256
height = 45
u0 = 0
v0 = 211
scrollx = 0.35
y0 = 211
single = false

View file

@ -111,10 +111,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,5,3,3,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,13,11,11,14,
0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,13,11,11,14,
0,0,0,0,0,0,0,0,0,0,0,0,19,19,19,19,19,19,19,19,0,0,0,0,0,0,0,0,13,11,11,14
</data>
</layer>
<layer id="2" name="oneway" width="32" height="112">
@ -227,8 +227,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,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
19,19,19,19,19,19,19,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
</data>

BIN
assets/levels/R2/BG0.TIM Normal file

Binary file not shown.

BIN
assets/levels/R2/BG0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

BIN
assets/levels/R2/BG1.TIM Normal file

Binary file not shown.

BIN
assets/levels/R2/BG1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 KiB

Binary file not shown.

View file

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.11.0" orientation="orthogonal" renderorder="right-down" width="255" height="31" tilewidth="128" tileheight="128" infinite="0" backgroundcolor="#3868c8" nextlayerid="10" nextobjectid="163">
<map version="1.10" tiledversion="1.11.0" orientation="orthogonal" renderorder="right-down" width="255" height="31" tilewidth="128" tileheight="128" infinite="0" backgroundcolor="#3868c8" nextlayerid="10" nextobjectid="172">
<editorsettings>
<export target="../../../../../Z1.json" format="json"/>
</editorsettings>
@ -12,9 +12,9 @@
12,31,32,10,32,10,32,10,23,30,30,33,34,73,74,74,75,76,38,39,96,93,29,102,31,36,58,60,32,38,39,13,41,0,0,0,0,0,72,5,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,43,129,129,40,95,94,15,104,25,55,25,25,43,129,40,30,33,34,53,0,0,54,76,14,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,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,25,25,25,25,108,15,104,0,55,9,9,45,25,25,25,25,25,46,0,0,45,25,43,126,0,0,0,0,0,91,92,0,0,0,0,0,91,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,15,104,111,56,62,62,35,0,35,0,9,0,0,0,0,0,0,45,46,0,9,127,128,0,87,88,109,110,85,109,110,87,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,15,104,111,56,62,62,35,0,35,0,9,0,0,0,0,0,0,45,46,0,9,127,128,0,87,88,0,0,0,0,0,87,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,15,104,2,2,2,2,33,34,38,39,13,7,35,0,0,119,0,87,88,0,13,125,126,0,0,91,92,0,0,0,0,0,0,0,9,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,15,104,129,130,129,130,129,129,130,40,30,30,33,34,31,118,31,31,133,134,30,79,6,35,0,87,88,42,0,0,0,0,99,101,13,0,0,13,0,24,0,7,0,35,0,69,70,71,72,0,0,0,0,0,0,0,0,0,0,0,0,35,0,9,0,9,0,9,0,9,0,9,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,15,104,129,130,129,130,129,129,130,40,30,30,33,34,31,118,31,31,133,134,30,79,6,35,0,87,88,42,0,0,0,0,99,101,13,0,0,13,0,24,0,7,0,35,0,69,70,71,72,109,110,0,0,0,0,0,0,0,0,0,0,35,0,9,0,9,0,9,0,9,0,9,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,107,106,105,25,25,25,25,25,25,25,25,25,25,25,25,25,120,25,25,25,25,25,43,89,33,34,31,31,38,39,0,96,93,15,12,32,10,4,32,22,23,29,30,29,33,34,73,74,75,76,53,35,0,0,24,103,0,119,0,119,0,99,57,0,13,0,13,0,13,0,13,0,13,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,5,16,130,129,15,129,130,40,29,95,94,15,16,130,129,130,129,15,129,129,129,129,129,129,130,129,129,130,89,33,34,22,23,102,36,118,36,118,36,114,61,29,30,29,30,29,30,29,30,29,30,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,0,0,0,0,0,47,26,25,25,25,25,25,25,25,98,97,15,16,129,129,129,129,129,129,129,129,129,129,129,129,129,44,116,115,106,106,106,106,106,55,131,55,131,55,106,105,25,25,25,25,25,25,25,25,25,25,131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
@ -63,15 +63,11 @@
<object id="27" gid="149" x="4065" y="388" width="64" height="64"/>
<object id="28" gid="149" x="4289.67" y="453.667" width="64" height="64"/>
<object id="34" gid="147" x="3056" y="768" width="64" height="64"/>
<object id="44" gid="149" x="3206" y="646" width="64" height="64"/>
<object id="45" gid="149" x="3206" y="673" width="64" height="64"/>
<object id="48" gid="142" x="3055.75" y="324" width="64" height="64">
<properties>
<property name="Kind" value="RING"/>
</properties>
</object>
<object id="49" gid="147" x="6256" y="928" width="64" height="64"/>
<object id="50" gid="149" x="6361" y="883" width="64" height="64"/>
<object id="55" gid="142" x="6887" y="640" width="64" height="64">
<properties>
<property name="Kind" value="RING"/>
@ -94,9 +90,6 @@
</object>
<object id="59" gid="149" x="5920" y="638" width="64" height="64"/>
<object id="60" gid="149" x="6042" y="638" width="64" height="64"/>
<object id="61" gid="149" x="6240" y="688" width="64" height="64"/>
<object id="62" gid="149" x="6415.88" y="656" width="64" height="64"/>
<object id="63" gid="149" x="6625.5" y="688" width="64" height="64"/>
<object id="68" gid="145" x="5203" y="769" width="64" height="64"/>
<object id="69" gid="142" x="6016" y="896" width="64" height="64">
<properties>
@ -127,7 +120,7 @@
<object id="99" gid="143" x="10383.3" y="1218" width="64" height="64"/>
<object id="100" gid="143" x="10415.3" y="1218" width="64" height="64"/>
<object id="101" gid="143" x="10447.3" y="1218" width="64" height="64"/>
<object id="102" gid="142" x="4994.52" y="452.39" width="64" height="64">
<object id="102" gid="142" x="5009" y="453" width="64" height="64">
<properties>
<property name="Kind" value="1UP"/>
</properties>
@ -194,6 +187,13 @@
<object id="160" gid="141" x="2763.75" y="352.75" width="64" height="64"/>
<object id="161" gid="141" x="2769.25" y="320.75" width="64" height="64"/>
<object id="162" gid="141" x="2719.75" y="398.25" width="64" height="64"/>
<object id="164" gid="141" x="3112.5" y="723" width="64" height="64"/>
<object id="165" gid="141" x="3130.5" y="704" width="64" height="64"/>
<object id="166" gid="141" x="3149.5" y="686" width="64" height="64"/>
<object id="168" gid="148" x="2288" y="256.5" width="64" height="64"/>
<object id="169" gid="146" x="4736" y="980" width="64" height="64" rotation="-90"/>
<object id="170" gid="151" x="6161.33" y="718.667" width="64" height="64"/>
<object id="171" gid="148" x="6256" y="928" width="64" height="64"/>
</objectgroup>
</group>
</map>

View file

@ -0,0 +1,137 @@
[sky1]
width = 256
height = 32
u0 = 0
v0 = 360 # 104 @ BG1
scrollx = 0
speedx = 0.14
y0 = 0
single = false
[sky2]
width = 256
height = 16
u0 = 0
v0 = 392
scrollx = 0
speedx = 0.16
y0 = 32
single = false
[sky3]
width = 256
height = 16
u0 = 0
v0 = 408
scrollx = 0
speedx = 0.18
y0 = 48
single = false
# =============
[island1]
width = 256
height = 44
u0 = 0
v0 = 0
scrollx = 0.2
y0 = 36
single = false
# =============
[island2]
height = 40
scrollx = 0.25
y0 = 80
single = false
[[island2.parts]]
u0 = 0
v0 = 44
width = 256
# =============
# Water starts at BG1.
# Anything with v0 >= 256 is at BG1
[water1]
width = 32
height = 3
u0 = 0
v0 = 256
scrollx = 0.27
y0 = 120
single = false
[water2]
width = 32
height = 4
u0 = 0
v0 = 259
scrollx = 0.285
y0 = 123
single = false
[water3]
width = 32
height = 8
u0 = 0
v0 = 263
scrollx = 0.3
y0 = 127
single = false
[water4]
width = 32
height = 12
u0 = 0
v0 = 271
scrollx = 0.315
y0 = 135
single = false
[water5]
width = 32
height = 16
u0 = 0
v0 = 283
scrollx = 0.33
y0 = 147
single = false
[water6]
width = 32
height = 17
u0 = 0
v0 = 299
scrollx = 0.345
y0 = 163
single = false
[water7]
width = 32
height = 22
u0 = 0
v0 = 316
scrollx = 0.36
y0 = 180
single = false
[water8]
width = 32
height = 22
u0 = 0
v0 = 338
scrollx = 0.375
y0 = 202
single = false
[water9]
width = 32
height = 22
u0 = 0
v0 = 338
scrollx = 0.39
y0 = 224
single = false

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Before After
Before After

View file

@ -0,0 +1,65 @@
[island]
width = 256
height = 48
u0 = 0
v0 = 62
scrollx = 0x0000
y0 = 170
single = true
# =============
[cloud]
width = 256
height = 37
u0 = 0
v0 = 25
scrollx = 0x019a
y0 = 181
single = false
# =============
[water1]
width = 64
height = 6
u0 = 0
v0 = 0
scrollx = 0x0666
y0 = 216
single = false
[water2]
width = 64
height = 5
u0 = 0
v0 = 6
scrollx = 0x0800
y0 = 222
single = false
[water3]
width = 62
height = 5
u0 = 0
v0 = 11
scrollx = 0x099a
y0 = 227
single = false
[water4]
width = 64
height = 5
u0 = 0
v0 = 16
scrollx = 0x0b33
y0 = 232
single = false
[water5]
width = 66
height = 4
u0 = 0
v0 = 20
scrollx = 0x0ccd
y0 = 237
single = false

Binary file not shown.

64
include/parallax.h Normal file
View file

@ -0,0 +1,64 @@
#ifndef PARALLAX_H
#define PARALLAX_H
#include <stdint.h>
#include "camera.h"
/* .PRL file layout
==================
number of strips: u8
Array of strips:
number of parts: u8
do not repeat (single)?: u8
horizontal scroll factor: s16
Y position: s16
Array of parts:
u0: u8
v0: u8
texture index (BG0 or BG1): u8
width: u16
height: u16
*/
// Holds a single parallax strip part.
// Parts are a horizontal slice of a single strip.
typedef struct {
uint8_t u0;
uint8_t v0;
uint8_t bgindex;
uint16_t width;
uint16_t height;
// Calculated on load
uint16_t offsetx;
} ParallaxPart;
// Holds a single parallax strip for a level.
// A strip may be a horizontally-repeating quad, or it
// may be composed of more than one quad that forms a bigger strip.
typedef struct {
uint8_t num_parts;
uint8_t is_single;
int32_t scrollx;
int32_t speedx;
int16_t y0;
ParallaxPart *parts;
// Calculated on load
uint16_t width;
// State
int32_t rposx;
} ParallaxStrip;
// Holds all parallax strips for a level
typedef struct {
uint8_t num_strips;
ParallaxStrip *strips;
} Parallax;
void load_parallax(Parallax *parallax, const char *filename);
void parallax_draw(Parallax *prl, Camera *camera,
uint8_t tx_mode, int32_t px, int32_t py, int32_t cx, int32_t cy);
#endif

21
iso.xml
View file

@ -69,6 +69,12 @@
<file name="TILES.TIM"
type="data"
source="${PROJECT_SOURCE_DIR}/assets/levels/R0/TILES.TIM" />
<file name="BG0.TIM"
type="data"
source="${PROJECT_SOURCE_DIR}/assets/levels/R0/BG0.TIM" />
<file name="PRL.PRL"
type="data"
source="${PROJECT_SOURCE_DIR}/assets/levels/R0/PRL.PRL" />
</dir>
<dir name="R1">
@ -96,6 +102,12 @@
<file name="TILES.TIM"
type="data"
source="${PROJECT_SOURCE_DIR}/assets/levels/R1/TILES.TIM" />
<file name="BG0.TIM"
type="data"
source="${PROJECT_SOURCE_DIR}/assets/levels/R1/BG0.TIM" />
<file name="PRL.PRL"
type="data"
source="${PROJECT_SOURCE_DIR}/assets/levels/R1/PRL.PRL" />
</dir>
<dir name="R2">
@ -117,6 +129,15 @@
<file name="TILES.TIM"
type="data"
source="${PROJECT_SOURCE_DIR}/assets/levels/R2/TILES.TIM" />
<file name="BG0.TIM"
type="data"
source="${PROJECT_SOURCE_DIR}/assets/levels/R2/BG0.TIM" />
<file name="BG1.TIM"
type="data"
source="${PROJECT_SOURCE_DIR}/assets/levels/R2/BG1.TIM" />
<file name="PRL.PRL"
type="data"
source="${PROJECT_SOURCE_DIR}/assets/levels/R2/PRL.PRL" />
</dir>
</dir> <!-- LEVELS -->

View file

@ -77,8 +77,8 @@ load_chara(Chara *chara, const char *filename, TIM_IMAGE *tim)
/* tim->crect->x, tim->crect->y, */
/* tim->crect->w, tim->crect->h, */
/* getClut(tim->crect->x, tim->crect->y)); */
chara->crectx = 320;
chara->crecty = 256;
chara->crectx = 0;
chara->crecty = 480;
chara->prectx = 320;
chara->precty = 0; // why not loading correctly???

View file

@ -199,8 +199,8 @@ load_lvl(LevelData *lvl, const char *filename)
// not loading correctly, but we don't really need them
lvl->prectx = 448;
lvl->precty = 0;
lvl->crectx = 320;
lvl->crecty = 257;
lvl->crectx = 0;
lvl->crecty = 482;
//lvl->clutmode = 0; // NOTE: This was set to tim->mode previously.
lvl->_unused1 = 0;
@ -515,12 +515,12 @@ render_lvl(
cy = (cam_y >> 12);
if(lvl->num_layers > 0)
_render_layer(lvl, map128, map16, cx, cy, OT_LENGTH - 1, 0);
_render_layer(lvl, map128, map16, cx, cy, OT_LENGTH - 3, 0);
DR_TPAGE *tpage = get_next_prim();
increment_prim(sizeof(DR_TPAGE));
setDrawTPage(tpage, 0, 1, getTPage(lvl->clutmode & 0x3, 1, lvl->prectx, lvl->precty));
sort_prim(tpage, OT_LENGTH - 1);
sort_prim(tpage, OT_LENGTH - 3);
// Render objects on nearest window
_render_obj_window(lvl, tbl, cx, cy);

View file

@ -21,6 +21,16 @@
#include "memalloc.h"
#include "screen.h"
/*
Locations of common textures on frame buffer:
================================================
Player 1: 320x0; CLUT: 0x480
Common objects: 576x0; CLUT: 0x481
Level tiles: 448x0; CLUT: 0x482 (if exists)
Level BG0: 448x256; CLUT: 0x483 (4-bit only)
Level BG1: 512x256; CLUT: 0x484 (4-bit only)
*/
int debug_mode = 0;
int

View file

@ -24,6 +24,8 @@ alloc_arena_free(ArenaAllocator *arena)
void *
alloc_arena_malloc(ArenaAllocator *arena, size_t size)
{
if(size == 0) return NULL;
// Align size so we don't get unaligned memory access
size += 8 - (size % 8);

View file

@ -266,10 +266,10 @@ begin_render_routine:
// COMMON OBJECTS have the following VRAM coords:
// Sprites: 576x0
// CLUT: 576x256
// CLUT: 0x481
poly->tpage = getTPage(0, 0, 576, 0);
poly->clut = getClut(576, 256);
poly->clut = getClut(0, 481);
sort_prim(poly, state->id == OBJ_RING ? 3 : 4);

View file

@ -30,6 +30,7 @@ static void _ring_update(ObjectState *state, ObjectTableEntry *typedata, VECTOR
static void _goal_sign_update(ObjectState *state, ObjectTableEntry *typedata, VECTOR *pos);
static void _monitor_update(ObjectState *state, ObjectTableEntry *typedata, VECTOR *pos);
static void _spring_update(ObjectState *state, ObjectTableEntry *, VECTOR *pos, uint8_t is_red);
static void _spring_diagonal_update(ObjectState *state, ObjectTableEntry *, VECTOR *pos, uint8_t is_red);
static void _checkpoint_update(ObjectState *state, ObjectTableEntry *, VECTOR *pos);
// Player hitbox information. Calculated once per frame.
@ -80,12 +81,14 @@ object_update(ObjectState *state, ObjectTableEntry *typedata, VECTOR *pos)
switch(state->id) {
default: break;
case OBJ_RING: _ring_update(state, typedata, pos); break;
case OBJ_GOAL_SIGN: _goal_sign_update(state, typedata, pos); break;
case OBJ_MONITOR: _monitor_update(state, typedata, pos); break;
case OBJ_SPRING_YELLOW: _spring_update(state, typedata, pos, 0); break;
case OBJ_SPRING_RED: _spring_update(state, typedata, pos, 1); break;
case OBJ_CHECKPOINT: _checkpoint_update(state, typedata, pos); break;
case OBJ_RING: _ring_update(state, typedata, pos); break;
case OBJ_GOAL_SIGN: _goal_sign_update(state, typedata, pos); break;
case OBJ_MONITOR: _monitor_update(state, typedata, pos); break;
case OBJ_SPRING_YELLOW: _spring_update(state, typedata, pos, 0); break;
case OBJ_SPRING_RED: _spring_update(state, typedata, pos, 1); break;
case OBJ_SPRING_YELLOW_DIAGONAL: _spring_diagonal_update(state, typedata, pos, 0); break;
case OBJ_SPRING_RED_DIAGONAL: _spring_diagonal_update(state, typedata, pos, 1); break;
case OBJ_CHECKPOINT: _checkpoint_update(state, typedata, pos); break;
}
}
@ -229,75 +232,116 @@ _spring_update(ObjectState *state, ObjectTableEntry *, VECTOR *pos, uint8_t is_r
hitbox_collision(player_vx, player_vy, player_width, player_height,
solidity_vx, solidity_vy, solidity_w, solidity_h);
switch(collision_side) {
default: return;
case OBJ_SIDE_LEFT:
if(state->flipmask & MASK_FLIP_ROTCT) {
if(player.grnd) player.vel.vz = is_red ? -0x10000 : -0xa000;
else player.vel.vx = is_red ? -0x10000 : -0xa000;
player.ctrllock = 16;
player.anim_dir = -1;
state->anim_state.animation = 1;
sound_play_vag(sfx_sprn, 0);
} else {
player.ev_right = (CollisionEvent) {
.collided = 1,
.coord = solidity_vx + 1,
.angle = 0
};
}
break;
case OBJ_SIDE_RIGHT:
if(state->flipmask & MASK_FLIP_ROTCW) {
if(player.grnd) player.vel.vz = is_red ? 0x10000 : 0xa000;
else player.vel.vx = is_red ? 0x10000 : 0xa000;
player.ctrllock = 16;
player.anim_dir = 1;
state->anim_state.animation = 1;
sound_play_vag(sfx_sprn, 0);
} else {
player.ev_left = (CollisionEvent) {
.collided = 1,
.coord = (solidity_vx + 15),
.angle = 0
};
}
break;
case OBJ_SIDE_TOP:
if(state->flipmask == 0) {
player.grnd = 0;
player.vel.vy = is_red ? -0x10000 : -0xa000;
player.angle = 0;
player.action = 0;
state->anim_state.animation = 1;
player_set_animation_direct(&player, ANIM_WALKING);
sound_play_vag(sfx_sprn, 0);
} else {
player.ev_grnd1 = player.ev_grnd2 = (CollisionEvent) {
.collided = 1,
.coord = solidity_vy + 8,
.angle = 0
};
}
break;
case OBJ_SIDE_BOTTOM:
if(state->flipmask & MASK_FLIP_FLIPY) {
player.grnd = 0;
player.vel.vy = is_red ? 0x10000 : 0xa000;
player.angle = 0;
player.action = 0;
state->anim_state.animation = 1;
player_set_animation_direct(&player, ANIM_WALKING);
sound_play_vag(sfx_sprn, 0);
} else {
player.ev_ceil1 = player.ev_ceil2 = (CollisionEvent) {
.collided = 1,
.coord = solidity_vy + solidity_h,
.angle = 0
};
}
break;
// Simple spring collision.
// In this case, springs are not solid, and the player's spring action
// relate to where the spring is pointing at.
if(collision_side == OBJ_SIDE_NONE)
return;
else if(state->flipmask & MASK_FLIP_ROTCT) { // Left-pointing spring
if(player.grnd) player.vel.vz = is_red ? -0x10000 : -0xa000;
else player.vel.vx = is_red ? -0x10000 : -0xa000;
player.ctrllock = 16;
player.anim_dir = -1;
state->anim_state.animation = 1;
sound_play_vag(sfx_sprn, 0);
} else if(state->flipmask & MASK_FLIP_ROTCW) { // Right-pointing spring
if(player.grnd) player.vel.vz = is_red ? 0x10000 : 0xa000;
else player.vel.vx = is_red ? 0x10000 : 0xa000;
player.ctrllock = 16;
player.anim_dir = 1;
state->anim_state.animation = 1;
sound_play_vag(sfx_sprn, 0);
} else if(state->flipmask == 0) { // Top-pointing spring
player.grnd = 0;
player.vel.vy = is_red ? -0x10000 : -0xa000;
player.vel.vz = 0;
player.angle = 0;
player.action = 0;
state->anim_state.animation = 1;
player_set_animation_direct(&player, ANIM_WALKING);
sound_play_vag(sfx_sprn, 0);
} else if(state->flipmask & MASK_FLIP_FLIPY) { // Bottom-pointing spring
player.grnd = 0;
player.vel.vy = is_red ? 0x10000 : 0xa000;
player.vel.vz = 0;
player.angle = 0;
player.action = 0;
state->anim_state.animation = 1;
player_set_animation_direct(&player, ANIM_WALKING);
sound_play_vag(sfx_sprn, 0);
}
// Complex spring collision. Commented out. Doesn't work properly.
/* switch(collision_side) { */
/* default: return; */
/* case OBJ_SIDE_LEFT: */
/* if(state->flipmask & MASK_FLIP_ROTCT) { */
/* if(player.grnd) player.vel.vz = is_red ? -0x10000 : -0xa000; */
/* else player.vel.vx = is_red ? -0x10000 : -0xa000; */
/* player.ctrllock = 16; */
/* player.anim_dir = -1; */
/* state->anim_state.animation = 1; */
/* sound_play_vag(sfx_sprn, 0); */
/* } else { */
/* player.ev_right = (CollisionEvent) { */
/* .collided = 1, */
/* .coord = solidity_vx + 1, */
/* .angle = 0 */
/* }; */
/* } */
/* break; */
/* case OBJ_SIDE_RIGHT: */
/* if(state->flipmask & MASK_FLIP_ROTCW) { */
/* if(player.grnd) player.vel.vz = is_red ? 0x10000 : 0xa000; */
/* else player.vel.vx = is_red ? 0x10000 : 0xa000; */
/* player.ctrllock = 16; */
/* player.anim_dir = 1; */
/* state->anim_state.animation = 1; */
/* sound_play_vag(sfx_sprn, 0); */
/* } else { */
/* player.ev_left = (CollisionEvent) { */
/* .collided = 1, */
/* .coord = (solidity_vx + 15), */
/* .angle = 0 */
/* }; */
/* } */
/* break; */
/* case OBJ_SIDE_TOP: */
/* if(state->flipmask == 0) { */
/* player.grnd = 0; */
/* player.vel.vy = is_red ? -0x10000 : -0xa000; */
/* player.angle = 0; */
/* player.action = 0; */
/* state->anim_state.animation = 1; */
/* player_set_animation_direct(&player, ANIM_WALKING); */
/* sound_play_vag(sfx_sprn, 0); */
/* } else { */
/* player.ev_grnd1 = player.ev_grnd2 = (CollisionEvent) { */
/* .collided = 1, */
/* .coord = solidity_vy + 8, */
/* .angle = 0 */
/* }; */
/* } */
/* break; */
/* case OBJ_SIDE_BOTTOM: */
/* if(state->flipmask & MASK_FLIP_FLIPY) { */
/* player.grnd = 0; */
/* player.vel.vy = is_red ? 0x10000 : 0xa000; */
/* player.angle = 0; */
/* player.action = 0; */
/* state->anim_state.animation = 1; */
/* player_set_animation_direct(&player, ANIM_WALKING); */
/* sound_play_vag(sfx_sprn, 0); */
/* } else { */
/* player.ev_ceil1 = player.ev_ceil2 = (CollisionEvent) { */
/* .collided = 1, */
/* .coord = solidity_vy + solidity_h, */
/* .angle = 0 */
/* }; */
/* } */
/* break; */
/* } */
} else if(state->anim_state.animation == OBJ_ANIMATION_NO_ANIMATION) {
state->anim_state.animation = 0;
state->anim_state.frame = 0;
@ -322,3 +366,71 @@ _checkpoint_update(ObjectState *state, ObjectTableEntry *, VECTOR *pos)
}
}
}
#define SPRND_ST_R 0x0000b500 // 11.3125
#define SPRND_ST_Y 0x00007120 // 7.0703125
static void
_spring_diagonal_update(ObjectState *state, ObjectTableEntry *, VECTOR *pos, uint8_t is_red)
{
// For diagonal springs, interaction should occur if and only if the player
// is colliding with its top.
if(state->anim_state.animation == 0) {
int32_t solidity_vx = pos->vx - 16;
int32_t solidity_vy = pos->vy - 32; // Spring is 32x32 solid
int32_t solidity_w = 32;
int32_t solidity_h = 32;
// Spring hitbox is actually calculated relative to player's X position
// within it.
// The hitbox is always low on the bottom 10 pixels of the spring,
// unless the player is at any given X coordinate of it; if so, the
// hitbox height increases/decreases to give a diagonal effect.
// This way, the player will always collide with a hitbox that looks
// like a diagonal trapezium.
int32_t shrink = 0;
int32_t delta = 0;
if(state->flipmask & MASK_FLIP_FLIPX) {
delta = solidity_w - (player_vx - solidity_vx);
} else {
delta = player_vx - solidity_vx + 16;
}
if(delta > 10 && delta < 33) {
shrink = delta - 10;
} else shrink = 22;
solidity_h -= shrink;
if(state->flipmask & MASK_FLIP_FLIPY) {
solidity_vy -= 32;
} else solidity_vy += shrink;
ObjectCollision collision_side =
hitbox_collision(player_vx, player_vy, player_width, player_height,
solidity_vx, solidity_vy, solidity_w, solidity_h);
if(collision_side == OBJ_SIDE_NONE) return;
player.grnd = 0;
player.vel.vx = is_red ? SPRND_ST_R : SPRND_ST_Y;
player.vel.vy = is_red ? SPRND_ST_R : SPRND_ST_Y;
player.vel.vz = 0;
if(!(state->flipmask & MASK_FLIP_FLIPY)) player.vel.vy *= -1;
if(state->flipmask & MASK_FLIP_FLIPX) {
player.vel.vx *= -1;
player.anim_dir = -1; // Flip on X: point player left
} else player.anim_dir = 1; // No flip on X: point player right
player.angle = 0;
player.action = 0;
state->anim_state.animation = 1;
player_set_animation_direct(&player, ANIM_WALKING);
sound_play_vag(sfx_sprn, 0);
} else if(state->anim_state.animation == OBJ_ANIMATION_NO_ANIMATION) {
state->anim_state.animation = 0;
state->anim_state.frame = 0;
}
}

121
src/parallax.c Normal file
View file

@ -0,0 +1,121 @@
#include <stdio.h>
#include "parallax.h"
#include "util.h"
#include "memalloc.h"
#include "camera.h"
#include "render.h"
extern ArenaAllocator _level_arena;
extern uint8_t level_fade;
void
load_parallax(Parallax *parallax, const char *filename)
{
uint8_t *bytes;
uint32_t b, length;
// If we fail to read the file, prepare it so we get no surprises
// when rendering a parallax structure
parallax->num_strips = 0;
parallax->strips = NULL;
b = 0;
bytes = file_read(filename, &length);
if(bytes == NULL) {
printf("Error reading PRL file %s from the CD. Using defaults\n", filename);
return;
}
parallax->num_strips = get_byte(bytes, &b);
parallax->strips = alloc_arena_malloc(
&_level_arena,
sizeof(ParallaxStrip) * parallax->num_strips);
for(uint8_t i = 0; i < parallax->num_strips; i++) {
ParallaxStrip *strip = &parallax->strips[i];
strip->width = 0;
strip->num_parts = get_byte(bytes, &b);
strip->is_single = get_byte(bytes, &b);
strip->scrollx = get_long_be(bytes, &b);
strip->speedx = get_long_be(bytes, &b);
strip->y0 = get_short_be(bytes, &b);
strip->rposx = 0;
strip->parts = alloc_arena_malloc(
&_level_arena,
sizeof(ParallaxPart) * strip->num_parts);
for(uint8_t j = 0; j < strip->num_parts; j++) {
ParallaxPart *part = &strip->parts[j];
part->u0 = get_byte(bytes, &b);
part->v0 = get_byte(bytes, &b);
part->bgindex = get_byte(bytes, &b);
part->width = get_short_be(bytes, &b);
part->height = get_short_be(bytes, &b);
part->offsetx = (j == 0)
? 0
: (strip->parts[j-1].offsetx + strip->parts[j-1].width);
strip->width += part->width;
}
}
free(bytes);
}
void
parallax_draw(Parallax *prl, Camera *camera,
uint8_t tx_mode, int32_t px, int32_t py, int32_t cx, int32_t cy)
{
// Camera left boundary (fixed 20.12 format)
int32_t camera_vx = (camera->pos.vx - (CENTERX << 12));
// Strips are draw bottom to top so we can have further stuff
// (e.g. clouds) drawn on back
for(int8_t si = prl->num_strips - 1; si >= 0; si--) {
ParallaxStrip *strip = &prl->strips[si];
// Cast multiplication to avoid sign extension on bit shift
// This gets the mult. result but also removes the decimal part
int32_t stripx = (uint32_t)(camera_vx * strip->scrollx) >> 24;
// Update strip relative position when there's speed involved
strip->rposx -= strip->speedx;
if((strip->rposx >> 12) < -((int32_t)strip->width))
strip->rposx = 0;
for(uint8_t pi = 0; pi < strip->num_parts; pi++) {
ParallaxPart *part = &strip->parts[pi];
// Calculate part X position based on factor and camera (int format)
int32_t vx = ((int32_t)part->offsetx) - stripx + (strip->rposx >> 12);
// Given that each part is a horizontal piece of a strip, we assume
// that these parts repeat at every (strip width), so just draw
// all equal parts now at once, until we exhaust the screen width
for(int32_t wx = vx;
wx < (int32_t)(SCREEN_XRES + part->width);
wx += part->width)
{
// Don't draw if strip is outside screen
if((wx + part->width) < 0) continue;
// TODO: 6 or 8 Depends on CLUT!!!
uint16_t curr_px = (uint16_t)(px + ((uint32_t)part->bgindex << 6));
uint16_t curr_cy = (uint16_t)(cy + part->bgindex);
POLY_FT4 *poly = (POLY_FT4 *)get_next_prim();
increment_prim(sizeof(POLY_FT4));
setPolyFT4(poly);
setRGB0(poly, level_fade, level_fade, level_fade);
poly->tpage = getTPage(tx_mode & 0x3, 0, curr_px, py);
poly->clut = getClut(cx, curr_cy);
setXYWH(poly, wx, strip->y0, part->width, part->height);
setUVWH(poly, part->u0, part->v0, part->width - 1, part->height - 1);
sort_prim(poly, OT_LENGTH - 2); // Layer 5: Background
// If drawing a single time, stop now
if(strip->is_single) break;
}
}
}
}

View file

@ -16,6 +16,7 @@
#include "timer.h"
#include "model.h"
#include "object.h"
#include "parallax.h"
extern int debug_mode;
@ -78,10 +79,14 @@ static void level_load_player();
static void level_load_level();
static void level_set_clearcolor();
// TODO!!!
typedef struct {
/* Model ring; */
uint8_t level_transition;
Parallax parallax;
uint8_t parallax_tx_mode;
int32_t parallax_px;
int32_t parallax_py;
int32_t parallax_cx;
int32_t parallax_cy;
} screen_level_data;
void
@ -98,7 +103,7 @@ screen_level_load()
camera_init(&camera);
level_load_player();
level_load_level();
level_load_level(data);
camera_set(&camera, player.pos.vx, player.pos.vy);
reset_elapsed_frames();
@ -234,6 +239,10 @@ screen_level_draw(void *d)
/* render_model(&data->ring); */
render_lvl(&leveldata, &map128, &map16, &obj_table_common, camera.pos.vx, camera.pos.vy);
parallax_draw(&data->parallax, &camera,
data->parallax_tx_mode,
data->parallax_px, data->parallax_py,
data->parallax_cx, data->parallax_cy);
// Gouraud-shaded cube
/* RotMatrix(&rotation, &world); */
@ -345,7 +354,7 @@ level_load_player()
}
static void
level_load_level()
level_load_level(screen_level_data *data)
{
paused = 0;
@ -361,8 +370,9 @@ level_load_level()
TIM_IMAGE tim;
uint32_t filelength;
/* === LEVEL TILES === */
// Load level tiles
snprintf(filename0, 255, "%s\\TILES.TIM;1", basepath);
printf("Loading %s...\n", filename0);
uint8_t *timfile = file_read(filename0, &filelength);
if(timfile) {
@ -390,6 +400,40 @@ level_load_level()
}
}
/* === PARALLAX === */
// Load level parallax data
snprintf(filename0, 255, "%s\\PRL.PRL;1", basepath);
printf("Loading parallax data...\n");
load_parallax(&data->parallax, filename0);
printf("Loaded parallax strips: %d\n", data->parallax.num_strips);
// Load level parallax textures
snprintf(filename0, 255, "%s\\BG0.TIM;1", basepath);
printf("Loading %s...\n", filename0);
timfile = file_read(filename0, &filelength);
if(timfile) {
load_texture(timfile, &tim);
// Background compression must be the same for both background
// images. Also, they must be one texture page apart (64 bytes)
// horizontally, and their clut must be vertically aligned
data->parallax_tx_mode = tim.mode;
data->parallax_px = 448;
data->parallax_py = 256;
data->parallax_cx = 0;
data->parallax_cy = 483;
free(timfile);
} else printf("Warning: Level BG0 not found, ignoring\n");
snprintf(filename0, 255, "%s\\BG1.TIM;1", basepath);
printf("Loading %s...\n", filename0);
timfile = file_read(filename0, &filelength);
if(timfile) {
load_texture(timfile, &tim);
free(timfile);
} else printf("Warning: Level BG1 not found, ignoring\n");
snprintf(filename0, 255, "%s\\MAP16.MAP;1", basepath);
snprintf(filename1, 255, "%s\\MAP16.COL;1", basepath);
printf("Loading %s and %s...\n", filename0, filename1);
@ -402,9 +446,10 @@ level_load_level()
printf("Loading %s...\n", filename0);
load_lvl(&leveldata, filename0);
/* === OBJECTS === */
// Load common objects
printf("Loading common object texture...\n");
file_read("\\LEVELS\\COMMON\\OBJ.TIM;1", &filelength);
timfile = file_read("\\LEVELS\\COMMON\\OBJ.TIM;1", &filelength);
if(timfile) {
load_texture(timfile, &tim);
free(timfile);
@ -421,17 +466,12 @@ level_load_level()
load_object_placement(filename0, &leveldata);
/* === RENDERING PREPARATION === */
// Pre-allocate and initialize level primitive buffer
prepare_renderer(&leveldata);
level_debrief();
// Level 0 Zone 2 actually has background sound effects
/* if(level == 1) { */
/* SoundEffect sfx_rain = sound_load_vag("\\SFX\\RAIN.VAG;1"); */
/* sound_play_vag(sfx_rain, 1); */
/* } */
// Start playback after we don't need the CD anymore.
snprintf(filename0, 255, "\\BGM\\BGM%03u.XA;1", (level / CHANNELS_PER_BGM) + 1);
music_channel = level % CHANNELS_PER_BGM;
@ -443,10 +483,11 @@ level_load_level()
static void
level_set_clearcolor()
{
if(level == 2 || level == 3)
set_clear_color(LERPC(level_fade, 145), LERPC(level_fade, 59), LERPC(level_fade, 59));
else if(level == 4 || level == 5)
if(level == 2 || level == 3) // R1
set_clear_color(LERPC(level_fade, 26), LERPC(level_fade, 104), LERPC(level_fade, 200));
else if(level == 4 || level == 5) // R2 (GHZ)
set_clear_color(LERPC(level_fade, 36), LERPC(level_fade, 0), LERPC(level_fade, 180));
// R0
else set_clear_color(LERPC(level_fade, 63), LERPC(level_fade, 0), LERPC(level_fade, 127));
}

View file

@ -151,7 +151,7 @@ screen_levelselect_draw(void *d)
if(debug_mode) {
uint32_t elapsed_sectors;
sound_xa_get_elapsed_sectors(&elapsed_sectors);
FntPrint(-1, "BRANCH: %-21s %4s %3d\n",
FntPrint(-1, "%-29s %4s %3d\n",
GIT_COMMIT,
GetVideoMode() == MODE_PAL ? "PAL" : "NTSC",
get_frame_rate());

View file

@ -371,7 +371,7 @@ screen_title_draw(void *d)
if(debug_mode) {
uint32_t elapsed_sectors;
sound_xa_get_elapsed_sectors(&elapsed_sectors);
FntPrint(-1, "BRANCH: %-21s %4s %3d\n",
FntPrint(-1, "%-29s %4s %3d\n",
GIT_COMMIT,
GetVideoMode() == MODE_PAL ? "PAL" : "NTSC",
get_frame_rate());

View file

@ -115,8 +115,10 @@ load_texture(uint8_t *data, TIM_IMAGE *tim)
{
GetTimInfo((const uint32_t *)data, tim);
LoadImage(tim->prect, tim->paddr);
DrawSync(0);
if(tim->mode & 0x8) {
LoadImage(tim->crect, tim->caddr);
DrawSync(0);
}
}

116
tools/buildprl/buildprl.py Executable file
View file

@ -0,0 +1,116 @@
#!/bin/env python
import sys
import toml
from os.path import realpath, dirname, basename
from dataclasses import dataclass, field
from ctypes import c_ubyte, c_byte, c_short, c_ushort, c_int
from pprint import pp
c_short = c_short.__ctype_be__
c_ushort = c_ushort.__ctype_be__
c_int = c_int.__ctype_be__
def tofixed(value: float, scale: int) -> int:
return int(value * (1 << scale))
def tofixed12(value: float) -> int:
return tofixed(value, 12)
@dataclass
class ParallaxPart:
u0: int = 0
v0: int = 0
bg_index: int = 0
width: int = 0
height: int = 0
def write_to(self, f):
f.write(c_ubyte(self.u0))
f.write(c_ubyte(self.v0))
f.write(c_ubyte(self.bg_index))
f.write(c_ushort(self.width))
f.write(c_ushort(self.height))
@dataclass
class ParallaxStrip:
single: bool = False
scrollx: float = 0
speedx: float = 0
y0: int = 0
parts: [ParallaxPart] = field(default_factory=list)
def write_to(self, f):
f.write(c_ubyte(len(self.parts)))
f.write(c_ubyte(int(self.single)))
f.write(c_int(tofixed12(self.scrollx)))
f.write(c_int(tofixed12(self.speedx)))
f.write(c_short(self.y0))
for p in self.parts:
p.write_to(f)
@dataclass
class Parallax:
strips: [ParallaxStrip] = field(default_factory=list)
def write(self, out_path):
with open(out_path, "wb") as f:
f.write(c_ubyte(len(self.strips)))
for s in self.strips:
s.write_to(f)
def parse(data) -> Parallax:
p = Parallax()
for name, strip_data in data.items():
strip = ParallaxStrip()
strip.single = strip_data.get("single", False)
strip.scrollx = strip_data.get("scrollx", 0)
strip.speedx = strip_data.get("speedx", 0)
strip.y0 = strip_data.get("y0")
height = strip_data.get("height") # Reserved
parts = strip_data.get("parts")
if not parts:
# This is a single-piece strip
part = ParallaxPart()
v0 = strip_data.get("v0")
part.bg_index = int(v0 / 256)
part.u0 = strip_data.get("u0")
part.v0 = v0 % 256
part.width = strip_data.get("width")
part.height = height
strip.parts.append(part)
else:
for part_data in parts:
part = ParallaxPart()
v0 = part_data.get("v0")
part.bg_index = int(v0 / 256)
part.u0 = part_data.get("u0")
part.v0 = v0 % 256
part.width = part_data.get("width")
part.height = height
strip.parts.append(part)
p.strips.append(strip)
return p
def main():
toml_path = realpath(sys.argv[1])
data = toml.load(toml_path)
parallax = parse(data)
# /assets/levels/R2/parallax.toml -> /assets/levels/R2/PRL.PRL
toml_dir = dirname(toml_path)
out_path = toml_dir + "/PRL.PRL"
parallax.write(out_path)
if __name__ == "__main__":
main()

25
tools/layouts/prl.hexpat Normal file
View file

@ -0,0 +1,25 @@
// -*- mode: c; -*-
struct ParallaxPart {
u8 u0;
u8 v0;
u8 tex_idx;
be u16 width;
be u16 height;
};
struct ParallaxStrip {
u8 num_parts;
u8 is_single;
be s32 scrollx;
be s32 speedx;
be s16 y0;
ParallaxPart parts[num_parts];
};
struct Parallax {
u8 num_strips;
ParallaxStrip strips[num_strips];
};
Parallax parallax @ 0x0;