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); }