diff --git a/028.game2/Makefile b/028.game2/Makefile
index 82fc201..9e3e03e 100644
--- a/028.game2/Makefile
+++ b/028.game2/Makefile
@@ -9,9 +9,21 @@ BASE_ADDRESS=4000
NUM_COLORS=8
BOOTBLOCK_ASM=alpine_bootblock.s
-OBJS=out/init.o out/utils.o out/image.o out/blit.o out/joystick.o out/pig.o
+OBJS=out/init.o out/utils.o out/image.o out/blit.o out/joystick.o out/pig.o out/items.o
-IMAGES=foreground.png background.png panel.png sprite_pig_up.png sprite_pig_left_jump.png sprite_pig_up_jump.png sprite_pig_down_jump.png sprite_pig_right_jump.png sprite_pig_down.png sprite_pig_left.png sprite_pig_right.png
+IMAGES=foreground.png \
+ background.png \
+ panel.png \
+ sprite_pig_up.png \
+ sprite_pig_down.png \
+ sprite_pig_left.png \
+ sprite_pig_right.png \
+ sprite_pig_left_jump.png \
+ sprite_pig_up_jump.png \
+ sprite_pig_down_jump.png \
+ sprite_pig_right_jump.png \
+ sprite_coin1.png
+
IMAGEDATA=$(addprefix out/, $(IMAGES:.png=.bin))
VASM_EXTRA_ARGS=-DNUM_COLORS=$(NUM_COLORS)
@@ -40,39 +52,23 @@ out/tilemap-palette.s: assets/tilemap.png
out/panel.bin: assets/panel.png
$(IMAGECON) --input $< $(IMAGECON_ARGS) --colors 16 --output-bitplanes --output-palette --full-color-palette-file --output-palette-asm --output-palette --output-png --output-copperlist --output out/panel --use-palette=assets/panel.pal
-out/sprite_pig_up.bin: assets/sprite_pig_up.png
- $(IMAGECON) --input $< $(IMAGECON_ARGS) --colors 4 --output-bitplanes --output-palette --full-color-palette-file --output-palette-asm --output-palette --output-png --output-copperlist --output out/sprite_pig_up --palette-offset 16 --use-palette=assets/pig.pal
-
-out/sprite_pig_down.bin: assets/sprite_pig_down.png
- $(IMAGECON) --input $< $(IMAGECON_ARGS) --colors 4 --output-bitplanes --output-palette --full-color-palette-file --output-palette-asm --output-palette --output-png --output-copperlist --output out/sprite_pig_down --palette-offset 16 --use-palette=assets/pig.pal
-
-out/sprite_pig_left.bin: assets/sprite_pig_left.png
- $(IMAGECON) --input $< $(IMAGECON_ARGS) --colors 4 --output-bitplanes --output-palette --full-color-palette-file --output-palette-asm --output-palette --output-png --output-copperlist --output out/sprite_pig_left --palette-offset 16 --use-palette=assets/pig.pal
-
-out/sprite_pig_right.bin: assets/sprite_pig_right.png
- $(IMAGECON) --input $< $(IMAGECON_ARGS) --colors 4 --output-bitplanes --output-palette --full-color-palette-file --output-palette-asm --output-palette --output-png --output-copperlist --output out/sprite_pig_right --palette-offset 16 --use-palette=assets/pig.pal
-
-
-out/sprite_pig_right_jump.bin: assets/sprite_pig_right_jump.png
- $(IMAGECON) --input $< $(IMAGECON_ARGS) --colors 4 --output-bitplanes --output-palette --full-color-palette-file --output-palette-asm --output-palette --output-png --output-copperlist --output out/sprite_pig_right_jump --palette-offset 16 --use-palette=assets/pig.pal
-
-out/sprite_pig_down_jump.bin: assets/sprite_pig_down_jump.png
- $(IMAGECON) --input $< $(IMAGECON_ARGS) --colors 4 --output-bitplanes --output-palette --full-color-palette-file --output-palette-asm --output-palette --output-png --output-copperlist --output out/sprite_pig_down_jump --palette-offset 16 --use-palette=assets/pig.pal
-
-out/sprite_pig_up_jump.bin: assets/sprite_pig_up_jump.png
- $(IMAGECON) --input $< $(IMAGECON_ARGS) --colors 4 --output-bitplanes --output-palette --full-color-palette-file --output-palette-asm --output-palette --output-png --output-copperlist --output out/sprite_pig_up_jump --palette-offset 16 --use-palette=assets/pig.pal
-
-out/sprite_pig_left_jump.bin: assets/sprite_pig_left_jump.png
- $(IMAGECON) --input $< $(IMAGECON_ARGS) --colors 4 --output-bitplanes --output-palette --full-color-palette-file --output-palette-asm --output-palette --output-png --output-copperlist --output out/sprite_pig_left_jump --palette-offset 16 --use-palette=assets/pig.pal
+out/sprite_pig_%.bin: assets/sprite_pig_%.png
+ $(IMAGECON) --input $< $(IMAGECON_ARGS) --colors 4 --output-bitplanes --output-palette --full-color-palette-file --output-palette-asm --output-palette --output-png --output-copperlist --output out/sprite_pig_$* --palette-offset 16 --use-palette=assets/pig.pal
+out/sprite_coin%.bin: assets/sprite_coin%.png
+ $(IMAGECON) --input $< $(IMAGECON_ARGS) --colors 4 --output-bitplanes --output-palette --full-color-palette-file --output-palette-asm --output-palette --output-png --output-copperlist --output out/sprite_coin$* --palette-offset 20 --use-palette=assets/coin.pal
out/foreground-map.s: foreground.tmx
../tools/mapgen/out/mapgen --depth=3 --input=foreground.tmx
mv foreground-map.s out
+ rm items-map.s
+ mv items-indexes.s out
+ rm foreground-indexes.s
out/background-map.s: background.tmx
../tools/mapgen/out/mapgen --depth=3 --input=background.tmx
mv background-map.s out
+ rm background-indexes.s
out/blit.o: constants.i macros.i
out/main.o: out/background-map.s out/foreground-map.s $(IMAGEDATA) constants.i macros.i Makefile link.script.x assets/palette.pal out/tilemap-palette.s
diff --git a/028.game2/assets/coin.pal b/028.game2/assets/coin.pal
new file mode 100644
index 0000000..240c405
--- /dev/null
+++ b/028.game2/assets/coin.pal
@@ -0,0 +1,4 @@
+000 000 000 255
+255 255 011 255
+255 255 255 255
+252 115 009 255
diff --git a/028.game2/assets/items.png b/028.game2/assets/items.png
new file mode 100644
index 0000000..c164bb5
Binary files /dev/null and b/028.game2/assets/items.png differ
diff --git a/028.game2/assets/sprite_coin1.png b/028.game2/assets/sprite_coin1.png
new file mode 100644
index 0000000..a8e9833
Binary files /dev/null and b/028.game2/assets/sprite_coin1.png differ
diff --git a/028.game2/assets/sprite_pig_down_jump.png b/028.game2/assets/sprite_pig_down_jump.png
new file mode 100644
index 0000000..f25c0a8
Binary files /dev/null and b/028.game2/assets/sprite_pig_down_jump.png differ
diff --git a/028.game2/assets/sprite_pig_left_jump.png b/028.game2/assets/sprite_pig_left_jump.png
new file mode 100644
index 0000000..8bd4bb5
Binary files /dev/null and b/028.game2/assets/sprite_pig_left_jump.png differ
diff --git a/028.game2/assets/sprite_pig_right_jump.png b/028.game2/assets/sprite_pig_right_jump.png
new file mode 100644
index 0000000..5a3d8d4
Binary files /dev/null and b/028.game2/assets/sprite_pig_right_jump.png differ
diff --git a/028.game2/assets/sprite_pig_up_jump.png b/028.game2/assets/sprite_pig_up_jump.png
new file mode 100644
index 0000000..b4fc1be
Binary files /dev/null and b/028.game2/assets/sprite_pig_up_jump.png differ
diff --git a/028.game2/foreground.tmx b/028.game2/foreground.tmx
index a0eb894..ed2543e 100644
--- a/028.game2/foreground.tmx
+++ b/028.game2/foreground.tmx
@@ -3,9 +3,17 @@
+
+
+
eJxjZGBg0GXEjhlH5eguZwekmYBYDAs9Kkd/OS0c8qNyAyM3GNPISJYbjGlkJMsNxjQykuUGYxoZyXKaDLjbYKNy9JcDAIrySzM=
+
+
+ eJxjYBgFo2AU4AKOjMTJgdjI2AmPvlEwMAA9vnCB0bgb3ABf3I2CUTAKRsEoGBoAABJBAtk=
+
+
diff --git a/028.game2/game1.s b/028.game2/game1.s
index 880c8cf..a0fc890 100644
--- a/028.game2/game1.s
+++ b/028.game2/game1.s
@@ -9,8 +9,9 @@
xdef foregroundOffscreen
xdef foregroundScrollX
xdef backgroundScrollX
-
-
+ xdef map
+ xdef itemsMap
+ xdef mapSize
xdef moving
byteMap:
@@ -97,18 +98,15 @@ GameLoop:
.s2:
jsr ProcessJoystick
-
bsr Update
bsr RenderNextForegroundFrame
bsr RenderNextBackgroundFrame
- ;; move.w #$f00,COLOR00(a6)
+ if 0
+ move.w #$f00,COLOR00(a6)
+ endif
+
bra GameLoop
-
-
-
-
-
Update:
;; right
@@ -129,7 +127,8 @@ Update:
beq .c1
move.l foregroundScrollPixels,d0
add.l d0,foregroundScrollX
- sub.w #1,spriteX
+
+ jsr ScrollSprites
move.l foregroundScrollX,d0
lsr.l #FOREGROUND_SCROLL_SHIFT_CONVERT,d0 ; convert to pixels
@@ -232,6 +231,7 @@ RenderNextForegroundFrame:
move.l d3,d2
bsr RenderForegroundTile
bsr ClearForegroundTile
+ jsr RenderItemSprite
add.l #2,a2
dbra d3,.loop
rts
@@ -410,6 +410,7 @@ tileMapCopperPalettePtr:
InstallSpriteColorPalette:
include "out/sprite_pig_up-palette.s"
+ include "out/sprite_coin1-palette.s"
rts
InstallColorPalette:
@@ -480,6 +481,12 @@ panel:
map:
include "out/foreground-map.s"
dc.w $FFFF
+itemsMap:
+ include "out/items-indexes.s"
+ dc.w $FFFF
+mapSize:
+ dc.l itemsMap-map
+
backgroundMap:
include "out/background-map.s"
dc.w $FFFF
diff --git a/028.game2/items.s b/028.game2/items.s
new file mode 100644
index 0000000..90e1853
--- /dev/null
+++ b/028.game2/items.s
@@ -0,0 +1,74 @@
+ include "includes.i"
+
+ xdef SetupItemSpriteData
+ xdef ScrollItemSprites
+ xdef RenderItemSprite
+
+ScrollItemSprites:
+ sub.w #1,itemX
+ rts
+
+SetupItemSpriteData:
+ move.l currentItemSprite,a0
+ cmp.l #deadSprite,a0
+ bne .setupSprite
+ bra .c1
+.setupSprite:
+ move.w itemLagX,d0
+ move.w itemX,itemLagX
+ add.w #32,d0
+ move.w d0,d1
+ andi #1,d1
+ move.b d1,3(a0) ;spriteControl
+ lsr.l #1,d0
+ move.b d0,1(a0) ;spriteHStart
+ move.w itemY,d0
+ move.b d0,(a0) ;spriteVStart
+ move.w itemYEnd,d0
+ move.b d0,2(a0) ;spriteVStop
+.c1:
+ move.l a0,SPR2PTH(a6)
+ rts
+
+RenderItemSprite:
+ ;; d2 - y tile index ?
+ movem.l d2-d3,-(sp)
+ move.l foregroundScrollX,d0
+ lsr.w #FOREGROUND_SCROLL_SHIFT_CONVERT,d0 ; convert to pixels
+ andi.w #$f,d0
+ cmp.b #15,d0
+ bne .dontAddSprite
+ move.l a2,a3
+ add.l mapSize,a3
+ cmpi.w #0,(a3)
+ beq .dontAddSprite
+ move.l #spriteCoin1,currentItemSprite
+ move.w #337,itemX
+ mulu.w #16,d2
+ move.w #255-12,d3
+ sub.w d2,d3
+ move.w d3,itemY
+ add.w #16,d3
+ move.w d3,itemYEnd
+.dontAddSprite:
+ movem.l (sp)+,d2-d3
+ rts
+
+spriteCoin1:
+ dc.w 0,0
+ dc.w 0,0
+ incbin "out/sprite_coin1.bin"
+ dc.l 0
+
+
+currentItemSprite:
+ dc.l deadSprite
+itemX:
+ dc.w $E0
+itemLagX:
+ dc.w 0
+itemY:
+ dc.w $a4
+itemYEnd:
+ dc.w $b4
+
\ No newline at end of file
diff --git a/028.game2/pig.s b/028.game2/pig.s
index c54b95c..b08d964 100644
--- a/028.game2/pig.s
+++ b/028.game2/pig.s
@@ -4,11 +4,18 @@
xdef ProcessJoystick
xdef InitialisePig
xdef SetupSpriteData
- xdef spriteX
+ xdef ScrollSprites
+ xdef deadSprite
+
InitialisePig:
move.w #$c0,spriteX
rts
+
+ScrollSprites:
+ sub.w #1,spriteX
+ bra ScrollItemSprites
+ rts
UpdatePig:
;; right
@@ -126,8 +133,9 @@ SetupSpriteData:
move.b d0,2(a0) ;spriteVStop
move.l a0,SPR0PTH(a6)
+ jsr SetupItemSpriteData
+
move.l #deadSprite,SPR1PTH(a6)
- move.l #deadSprite,SPR2PTH(a6)
move.l #deadSprite,SPR3PTH(a6)
move.l #deadSprite,SPR4PTH(a6)
move.l #deadSprite,SPR5PTH(a6)
@@ -175,7 +183,7 @@ spritePigRightJump:
dc.w 0,0
dc.w 0,0
incbin "out/sprite_pig_right_jump.bin"
- dc.l 0
+ dc.l 0
currentSpriteOffset:
dc.l 0
diff --git a/tools/mapgen/mapgen.c b/tools/mapgen/mapgen.c
index da708e9..36c7430 100755
--- a/tools/mapgen/mapgen.c
+++ b/tools/mapgen/mapgen.c
@@ -18,10 +18,30 @@ get_tile_address(tmx_map *m, unsigned int gid)
if (config.verbose) {
printf("get_tile_address %d\n", gid);
}
-
- tmx_tileset* ts = m->ts_head;
+
+ int ts_count = 0;
+ tmx_tileset** ta;
+
+ {
+ tmx_tileset* t = m->ts_head;
+ while (t != 0) {
+ t = t->next;
+ ts_count++;
+ }
+
+ ta = malloc(sizeof(tmx_tileset)*ts_count);
+ t = m->ts_head;
+ int c = ts_count;
+ while (t != 0) {
+ ta[--c] = t;
+ t = t->next;
+ }
+ }
+
+
unsigned baseAddress = 0;
- while (ts != 0) {
+ for (int y = 0; y < ts_count; y++) {
+ tmx_tileset* ts = ta[y];
for (unsigned int i = 0; i < ts->tilecount; i++) {
tmx_tile* t = ts->tiles;
if (t[i].id+ts->firstgid == gid) {
@@ -33,13 +53,55 @@ get_tile_address(tmx_map *m, unsigned int gid)
}
}
baseAddress += ((ts->image->width/8) * config.bitDepth * ts->image->height);
- ts = ts->next;
}
return 0;
}
+static unsigned
+get_tile_index(tmx_map *m, unsigned int gid)
+{
+ if (config.verbose) {
+ printf("get_tile_address %d\n", gid);
+ }
+
+ int ts_count = 0;
+ tmx_tileset** ta;
+
+ {
+ tmx_tileset* t = m->ts_head;
+ while (t != 0) {
+ t = t->next;
+ ts_count++;
+ }
+
+ ta = malloc(sizeof(tmx_tileset)*ts_count);
+ t = m->ts_head;
+ int c = ts_count;
+ while (t != 0) {
+ ta[--c] = t;
+ t = t->next;
+ }
+ }
+
+
+ for (int y = 0; y < ts_count; y++) {
+ tmx_tileset* ts = ta[y];
+ for (unsigned int i = 0; i < ts->tilecount; i++) {
+ tmx_tile* t = ts->tiles;
+ if (t[i].id+ts->firstgid == gid) {
+ if (config.verbose) {
+ printf("%s - index = %d\n", ts->name, t[i].id);
+ }
+ return t[i].id;
+ }
+ }
+ }
+
+ return 0;
+}
+
static void
output_map_asm(tmx_map *m, tmx_layer *l)
{
@@ -66,10 +128,37 @@ output_map_asm(tmx_map *m, tmx_layer *l)
}
+static void
+output_map_indexes(tmx_map *m, tmx_layer *l)
+{
+ if (!l) {
+ abort_("output_map_indexes: empty layer");
+ }
+
+ FILE* fp = file_openWrite("%s-indexes.s", l->name);
+
+ if (l->type == L_LAYER && l->content.gids) {
+ for (unsigned int x = 0; x < m->width; x++) {
+ for (unsigned int y = 0; y < m->height; y++) {
+ fprintf(fp, "\tdc.w %d\n", get_tile_index(m, l->content.gids[(y*m->width)+x] & TMX_FLIP_BITS_REMOVAL));
+ }
+ }
+ }
+ fclose(fp);
+
+ if (l) {
+ if (l->next) {
+ output_map_indexes(m, l->next);
+ }
+ }
+}
+
+
static void
process_map(tmx_map *m)
{
output_map_asm(m, m->ly_head);
+ output_map_indexes(m, m->ly_head);
}