diff --git a/BuGS.xcodeproj/project.pbxproj b/BuGS.xcodeproj/project.pbxproj index c0aa455..b3200a0 100644 --- a/BuGS.xcodeproj/project.pbxproj +++ b/BuGS.xcodeproj/project.pbxproj @@ -20,7 +20,6 @@ 9D1716A52491C49300C83148 /* system601.2mg in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1716A42491C49300C83148 /* system601.2mg */; }; 9D1716A72491C49300C83148 /* tail.mk in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1716A62491C49300C83148 /* tail.mk */; }; 9D1716AA2491C49300C83148 /* BuGS.xcscheme in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9D1716A92491C49300C83148 /* BuGS.xcscheme */; }; - 9DC4D7C124BE9F7100BACF4B /* tiles.c in Sources */ = {isa = PBXBuildFile; fileRef = 9DC4D7C024BE9F7100BACF4B /* tiles.c */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -80,6 +79,7 @@ 9D33970124AF9D55003222B3 /* sprites.macros */ = {isa = PBXFileReference; lastKnownFileType = text; path = sprites.macros; sourceTree = ""; }; 9D47CBE02547BEDB00CDA5CB /* gameMushroom.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = gameMushroom.s; sourceTree = ""; }; 9D47CC14254A698900CDA5CB /* gamePlayer.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = gamePlayer.s; sourceTree = ""; }; + 9D47CCBA25525C1A00CDA5CB /* tileData.pl */ = {isa = PBXFileReference; lastKnownFileType = text.script.perl; path = tileData.pl; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.perl; }; 9D62AF3B249871A300348F45 /* colour.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = colour.s; sourceTree = ""; }; 9D62AF3F2499CD1E00348F45 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 9D62AF402499CD3A00348F45 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; @@ -87,6 +87,7 @@ 9D8AF0B82535543000C10E3C /* score.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = score.s; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.asm.orcam; }; 9D8FFC602491CA28005C9327 /* game.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = game.s; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.asm.orcam; }; 9D8FFC612491CAF0005C9327 /* game.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = game.h; sourceTree = ""; }; + 9D9F07F92553AB3800875B29 /* TODO.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = TODO.md; sourceTree = ""; }; 9DB1505024C3801100558B87 /* gameFlea.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = gameFlea.s; sourceTree = ""; }; 9DB1505124C6875C00558B87 /* gameScorpion.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = gameScorpion.s; sourceTree = ""; }; 9DB1505224C7495400558B87 /* globals.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = globals.s; sourceTree = ""; }; @@ -95,8 +96,6 @@ 9DB1505524D3BFCE00558B87 /* global.macros */ = {isa = PBXFileReference; lastKnownFileType = text; path = global.macros; sourceTree = ""; }; 9DC4D7BD24B7652100BACF4B /* ship.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = ship.s; sourceTree = ""; }; 9DC4D7BE24B80C9600BACF4B /* shot.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = shot.s; sourceTree = ""; }; - 9DC4D7BF24BE9F7100BACF4B /* tiles.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tiles.h; sourceTree = ""; }; - 9DC4D7C024BE9F7100BACF4B /* tiles.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = tiles.c; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -115,6 +114,7 @@ children = ( 9D62AF3F2499CD1E00348F45 /* LICENSE */, 9D62AF402499CD3A00348F45 /* README.md */, + 9D9F07F92553AB3800875B29 /* TODO.md */, 9D17168D2491C49300C83148 /* BuGS */, 9D1716852491C49300C83148 /* Products */, ); @@ -135,8 +135,6 @@ children = ( 9D17168E2491C49300C83148 /* main.c */, 9D1716902491C49300C83148 /* main.h */, - 9DC4D7BF24BE9F7100BACF4B /* tiles.h */, - 9DC4D7C024BE9F7100BACF4B /* tiles.c */, 9D8FFC602491CA28005C9327 /* game.s */, 9D8FFC612491CAF0005C9327 /* game.h */, 9DB1505024C3801100558B87 /* gameFlea.s */, @@ -151,6 +149,7 @@ 9D2FF6DA24C4C79A000181E5 /* random.s */, 9DB1505224C7495400558B87 /* globals.s */, 9DB1505524D3BFCE00558B87 /* global.macros */, + 9D47CCBA25525C1A00CDA5CB /* tileData.pl */, 9D3396F324AECACC003222B3 /* sprites */, 9D1716912491C49300C83148 /* main.rez */, 9D1716932491C49300C83148 /* Makefile */, @@ -319,7 +318,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 9DC4D7C124BE9F7100BACF4B /* tiles.c in Sources */, 9D1716942491C49300C83148 /* Makefile in Sources */, 9D17168F2491C49300C83148 /* main.c in Sources */, ); diff --git a/BuGS.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist b/BuGS.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist index dc9e153..2596fb4 100644 --- a/BuGS.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/BuGS.xcodeproj/xcuserdata/jrand.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ Binary.xcscheme_^#shared#^_ orderHint - 3 + 2 BuGS.xcscheme_^#shared#^_ @@ -17,12 +17,12 @@ DiskImage.xcscheme_^#shared#^_ orderHint - 2 + 1 doNotBuild.xcscheme_^#shared#^_ orderHint - 1 + 3 diff --git a/BuGS/Makefile b/BuGS/Makefile index 28f1608..e3dc93b 100644 --- a/BuGS/Makefile +++ b/BuGS/Makefile @@ -30,7 +30,7 @@ TARGETTYPE=desktop # Add any other directories where you are putting C or assembly source # files to this list: -SRCDIRS+=sprites +SRCDIRS+=sprites $(GENDIR) # If you put your main entry point for your project in a file called main.c # Then you don't need to change this value. If you want to call your entry @@ -113,12 +113,16 @@ MESSAGE_CENTER=false # All of your commands associated with a rule _must_ start with a tab # character. Xcode makes it a bit tough to type a tab character by # default. Press option-tab within Xcode to insert a tab character. -gen: +gen: $(GENDIR)/tileData.s + +$(GENDIR)/tileData.s: tileData.pl Makefile + tileData.pl "$(GENDIR)" # For any files you generated in the gen target above, you should # add rules in genclean to remove those generated files when you # clean your build. genclean: + $(RM) $(GENDIR)/tileData.s $(GENDIR)/tileData.h # Do not change anything else below here... include make/tail.mk diff --git a/BuGS/game.s b/BuGS/game.s index b5ad584..1f1b617 100644 --- a/BuGS/game.s +++ b/BuGS/game.s @@ -23,6 +23,7 @@ game start using globalData + using tileData jsl setupScreen diff --git a/BuGS/gameFlea.s b/BuGS/gameFlea.s index 9fe083d..202eea1 100644 --- a/BuGS/gameFlea.s +++ b/BuGS/gameFlea.s @@ -12,6 +12,7 @@ gameFlea start using globalData + using tileData FLEA_STATE_NONE equ 0 FLEA_STATE_FALLING equ 1 diff --git a/BuGS/gameMushroom.s b/BuGS/gameMushroom.s index de0c96d..aaa252b 100644 --- a/BuGS/gameMushroom.s +++ b/BuGS/gameMushroom.s @@ -12,6 +12,7 @@ gameMushroom start using globalData + using tileData STARTING_NUM_MUSHROOMS equ 30 diff --git a/BuGS/gamePlayer.s b/BuGS/gamePlayer.s index 802da59..fab2ab2 100644 --- a/BuGS/gamePlayer.s +++ b/BuGS/gamePlayer.s @@ -12,6 +12,7 @@ gamePlayer start using globalData + using tileData PLAYER_TILES_HIGH equ 7 diff --git a/BuGS/gameScorpion.s b/BuGS/gameScorpion.s index 6a597bb..4c69d2f 100644 --- a/BuGS/gameScorpion.s +++ b/BuGS/gameScorpion.s @@ -12,6 +12,7 @@ gameScorpion start using globalData + using tileData SCORPION_STATE_NONE equ 0 diff --git a/BuGS/gameSegments.s b/BuGS/gameSegments.s index 107d973..8c00efe 100644 --- a/BuGS/gameSegments.s +++ b/BuGS/gameSegments.s @@ -12,6 +12,7 @@ gameSegments start using globalData + using tileData SEGMENT_MAX_NUM equ 12 diff --git a/BuGS/gameSpider.s b/BuGS/gameSpider.s index 373c8cb..f22c72a 100644 --- a/BuGS/gameSpider.s +++ b/BuGS/gameSpider.s @@ -12,6 +12,7 @@ gameSpider start using globalData + using tileData SPIDER_STATE_NONE equ 0 SPIDER_STATE_EXPLODING equ 1 diff --git a/BuGS/globals.s b/BuGS/globals.s index d870dce..acb334e 100644 --- a/BuGS/globals.s +++ b/BuGS/globals.s @@ -27,39 +27,6 @@ SEGMENT_DIR_RIGHT equ 1 SEGMENT_SPEED_FAST equ 0 SEGMENT_SPEED_SLOW equ 1 -; A spider only travels in the bottom N rows. This defines that number. -SPIDER_MAX_NUM_POSSIBLE_ROWS equ 10 -SPIDER_STARTING_TOP_ROW equ GAME_NUM_TILES_TALL-SPIDER_MAX_NUM_POSSIBLE_ROWS -SPIDER_STARTING_TOP_ROW_OFFSET equ SPIDER_STARTING_TOP_ROW*GAME_NUM_TILES_WIDE*SIZEOF_TILE_INFO - -SCREEN_BYTES_PER_ROW gequ 160 - -SIZEOF_TILE_INFO gequ 2 - -TILE_PIXEL_WIDTH gequ 8 -TILE_PIXEL_HEIGHT gequ 8 - -TILE_BYTE_WIDTH gequ TILE_PIXEL_WIDTH/2 - -GAME_NUM_TILES_WIDE gequ 25 -GAME_NUM_TILES_TALL gequ 25 - -NUM_GAME_TILES gequ GAME_NUM_TILES_WIDE*GAME_NUM_TILES_TALL - -RHS_NUM_TILES_WIDE gequ 2 -NUM_RHS_NON_GAME_TILES gequ RHS_NUM_TILES_WIDE*GAME_NUM_TILES_TALL -RHS_FIRST_TILE gequ NUM_GAME_TILES -RHS_FIRST_TILE_OFFSET gequ RHS_FIRST_TILE*SIZEOF_TILE_INFO - -LHS_NUM_TILES_WIDE gequ 13 -NUM_LHS_NON_GAME_TILES gequ LHS_NUM_TILES_WIDE*GAME_NUM_TILES_TALL -LHS_FIRST_TILE gequ RHS_FIRST_TILE+NUM_RHS_NON_GAME_TILES -LHS_FIRST_TILE_OFFSET gequ LHS_FIRST_TILE*SIZEOF_TILE_INFO - -NUM_NON_GAME_TILES gequ NUM_RHS_NON_GAME_TILES+NUM_LHS_NON_GAME_TILES - -TOTAL_NUM_TILES gequ NUM_GAME_TILES+NUM_NON_GAME_TILES - INVALID_TILE_NUM gequ $ffff TILE_STATE_CLEAN gequ 0 diff --git a/BuGS/level.s b/BuGS/level.s index 346f7b5..ebf86b8 100644 --- a/BuGS/level.s +++ b/BuGS/level.s @@ -12,6 +12,7 @@ level start using globalData + using tileData NEXT_LEVEL_FRAME_COUNT equ 60 diff --git a/BuGS/main.c b/BuGS/main.c index 4aae96a..3527af7 100644 --- a/BuGS/main.c +++ b/BuGS/main.c @@ -16,7 +16,7 @@ #include "main.h" #include "game.h" -#include "tiles.h" +#include "tileData.h" /* Defines and macros */ @@ -34,11 +34,11 @@ unsigned int randomSeed; /* Implementation */ -tTileOffset randomMushroomOffset(void) +word randomMushroomOffset(void) { /* We do not put mushrooms in the bottom tile so we subtract the width here to find a tile number above that last line */ - return (rand() % (NUM_GAME_TILES - GAME_NUM_TILES_WIDE)) * sizeof(word); + return (rand() % (NUM_GAME_TILES - GAME_NUM_TILES_WIDE)) * SIZEOF_TILE_INFO; } @@ -70,10 +70,7 @@ int main(void) InitMouse(0); SetMouse(transparent); - - initTiles(); - initNonGameTiles(); - + game(); ShutDownTools(refIsHandle, toolStartupRef); diff --git a/BuGS/score.s b/BuGS/score.s index 3139366..c520e95 100644 --- a/BuGS/score.s +++ b/BuGS/score.s @@ -13,6 +13,7 @@ score start using globalData + using tileData TILE_SCORE_7TH_ROW equ LHS_FIRST_TILE+7*LHS_NUM_TILES_WIDE TILE_SCORE_ONES equ TILE_SCORE_7TH_ROW-2 diff --git a/BuGS/tileData.pl b/BuGS/tileData.pl new file mode 100755 index 0000000..32e0b3f --- /dev/null +++ b/BuGS/tileData.pl @@ -0,0 +1,447 @@ +#!/usr/bin/perl +# tileData.pl +# BuGS +# +# Created by Jeremy Rand on 2020-11-03. +# Copyright © 2020 Jeremy Rand. All rights reserved. + +use strict; +use integer; + + +# main + + +die "$0: Expected one argument pointing to the gen directory" if ($#ARGV != 0); + +my $gGenDir = $ARGV[0]; +our %gEquates; + +# These are global equates which will also become defines in the C header file. Also, these will drive the other +# data that is generated by this script. + +$gEquates{"SCREEN_PIXELS_WIDE"} = 320; +$gEquates{"SCREEN_PIXELS_TALL"} = 200; +$gEquates{"SCREEN_PIXELS_PER_BYTE"} = 2; +$gEquates{"SCREEN_BYTES_PER_ROW"} = $gEquates{"SCREEN_PIXELS_WIDE"} / $gEquates{"SCREEN_PIXELS_PER_BYTE"}; + +$gEquates{"TILE_PIXEL_WIDTH"} = 8; +$gEquates{"TILE_PIXEL_HEIGHT"} = 8; +$gEquates{"TILE_BYTE_WIDTH"} = $gEquates{"TILE_PIXEL_WIDTH"} / $gEquates{"SCREEN_PIXELS_PER_BYTE"}; + +$gEquates{"TOTAL_TILES_WIDE"} = $gEquates{"SCREEN_PIXELS_WIDE"} / $gEquates{"TILE_PIXEL_WIDTH"}; +$gEquates{"TOTAL_TILES_TALL"} = $gEquates{"SCREEN_PIXELS_TALL"} / $gEquates{"TILE_PIXEL_HEIGHT"}; +$gEquates{"TOTAL_NUM_TILES"} = $gEquates{"TOTAL_TILES_WIDE"} * $gEquates{"TOTAL_TILES_TALL"}; + +$gEquates{"GAME_NUM_TILES_WIDE"} = 25; +$gEquates{"GAME_NUM_TILES_TALL"} = $gEquates{"TOTAL_TILES_TALL"}; +$gEquates{"NUM_GAME_TILES"} = $gEquates{"GAME_NUM_TILES_WIDE"} * $gEquates{"GAME_NUM_TILES_TALL"}; + +$gEquates{"SIZEOF_TILE_INFO"} = 2; + +$gEquates{"RHS_NUM_TILES_WIDE"} = 2; +$gEquates{"NUM_RHS_NON_GAMES_TILES"} = $gEquates{"RHS_NUM_TILES_WIDE"} * $gEquates{"TOTAL_TILES_TALL"}; +$gEquates{"RHS_FIRST_TILE"} = $gEquates{"NUM_GAME_TILES"}; +$gEquates{"RHS_FIRST_TILE_OFFSET"} = $gEquates{"RHS_FIRST_TILE"} * $gEquates{"SIZEOF_TILE_INFO"}; + +$gEquates{"LHS_NUM_TILES_WIDE"} = $gEquates{"TOTAL_TILES_WIDE"} - $gEquates{"GAME_NUM_TILES_WIDE"} - $gEquates{"RHS_NUM_TILES_WIDE"}; +$gEquates{"NUM_LHS_NON_GAMES_TILES"} = $gEquates{"LHS_NUM_TILES_WIDE"} * $gEquates{"TOTAL_TILES_TALL"}; +$gEquates{"LHS_FIRST_TILE"} = $gEquates{"RHS_FIRST_TILE"} + $gEquates{"NUM_RHS_NON_GAMES_TILES"}; +$gEquates{"LHS_FIRST_TILE_OFFSET"} = $gEquates{"LHS_FIRST_TILE"} * $gEquates{"SIZEOF_TILE_INFO"}; + +$gEquates{"NUM_NON_GAME_TILES"} = $gEquates{"NUM_RHS_NON_GAMES_TILES"} + $gEquates{"NUM_LHS_NON_GAMES_TILES"}; + +$gEquates{"SPIDER_MAX_NUM_POSSIBLE_ROWS"} = 10; +$gEquates{"SPIDER_STARTING_TOP_ROW"} = $gEquates{"GAME_NUM_TILES_TALL"} - $gEquates{"SPIDER_MAX_NUM_POSSIBLE_ROWS"}; +$gEquates{"SPIDER_STARTING_TOP_ROW_OFFSET"} = $gEquates{"SPIDER_STARTING_TOP_ROW"} * $gEquates{"GAME_NUM_TILES_WIDE"} * $gEquates{"SIZEOF_TILE_INFO"}; + + +our @gTileDirty = ("TILE_STATE_CLEAN") x $gEquates{"TOTAL_NUM_TILES"}; +our @gTileScreenOffset = (0) x $gEquates{"TOTAL_NUM_TILES"}; +our @gTileType = ("TILE_EMPTY") x $gEquates{"TOTAL_NUM_TILES"}; +our @gTileAbove = ("INVALID_TILE_NUM") x $gEquates{"TOTAL_NUM_TILES"}; +our @gTileBelow = ("INVALID_TILE_NUM") x $gEquates{"TOTAL_NUM_TILES"}; +our @gTileLeft = ("INVALID_TILE_NUM") x $gEquates{"TOTAL_NUM_TILES"}; +our @gTileRight = ("INVALID_TILE_NUM") x $gEquates{"TOTAL_NUM_TILES"}; +our @gTileBitOffset = (0) x $gEquates{"NUM_GAME_TILES"}; +our @gTileBitMask = (0) x $gEquates{"NUM_GAME_TILES"}; +our @gDirtyNonGameTiles = ("INVALID_TILE_NUM") x $gEquates{"NUM_NON_GAME_TILES"}; +our $gNumDirtyNonGameTiles = 0; + + +sub printTileData +{ + my ($symbol, @data) = @_; + + print TILEDATA_S << "EOF"; + + +$symbol anop +EOF + + for my $tileNum (0 .. $#data) + { + print TILEDATA_S " dc i2'$data[$tileNum]'\t; Tile number $tileNum\n"; + } +} + + +sub gameXYToTileOffset +{ + my ($x, $y) = @_; + + return (($y * $gEquates{"GAME_NUM_TILES_WIDE"}) + $x) * $gEquates{"SIZEOF_TILE_INFO"}; +} + + +sub rhsXYToTileOffset +{ + my ($x, $y) = @_; + + return ($gEquates{"RHS_FIRST_TILE"} + ($y * $gEquates{"RHS_NUM_TILES_WIDE"}) + $x) * $gEquates{"SIZEOF_TILE_INFO"}; +} + + +sub lhsXYToTileNum +{ + my ($x, $y) = @_; + + return $gEquates{"LHS_FIRST_TILE"} + ($y * $gEquates{"LHS_NUM_TILES_WIDE"}) + $x; +} + + +sub lhsXYToTileOffset +{ + my ($x, $y) = @_; + + return lhsXYToTileNum($x, $y) * $gEquates{"SIZEOF_TILE_INFO"}; +} + + +sub addDirtyNonGameTile +{ + my ($tileNum) = @_; + + if ($gTileDirty[$tileNum] eq "TILE_STATE_CLEAN") + { + my $tileOffset = $tileNum * $gEquates{"SIZEOF_TILE_INFO"}; + my $dirtyIndex = $gNumDirtyNonGameTiles / $gEquates{"SIZEOF_TILE_INFO"}; + + $gTileDirty[$tileNum] = "TILE_STATE_DIRTY"; + $gDirtyNonGameTiles[$dirtyIndex] = $tileOffset; + $gNumDirtyNonGameTiles += $gEquates{"SIZEOF_TILE_INFO"}; + } +} + + +sub addLhsGameTile +{ + my ($x, $y, $tileType) = @_; + my $tileNum = lhsXYToTileNum($x, $y); + $gTileType[$tileNum] = $tileType; + addDirtyNonGameTile($tileNum); +} + + +sub addLhsGameString +{ + my ($x, $y, $string) = @_; + + foreach my $char (split('', $string)) { + if ($char =~ /^[0-9]$/) + { + addLhsGameTile($x, $y, "TILE_NUMBER_$char"); + } + elsif ($char eq ":") + { + addLhsGameTile($x, $y, "TILE_SYMBOL_COLON"); + } + elsif ($char ne " ") + { + addLhsGameTile($x, $y, "TILE_LETTER_$char"); + } + $x++; + } +} + + +sub screenAddressForTileAtXY +{ + my ($x, $y) = @_; + + return 0x2000 + ($gEquates{"SCREEN_BYTES_PER_ROW"} * $y) + ($x / $gEquates{"SCREEN_PIXELS_PER_BYTE"}) + 3; +} + + +sub initTiles +{ + my($tileX, $tileY, $lastOffset); + my $tileIndex = 0; + my $bitOffset = 0; + my $bitMask = 1; + my $rhsTileIndex = $gEquates{"RHS_FIRST_TILE"}; + my $lhsTileIndex = $gEquates{"LHS_FIRST_TILE"}; + + for ($tileY = 0; $tileY < $gEquates{"TOTAL_TILES_TALL"}; $tileY++) + { + $lastOffset = screenAddressForTileAtXY(0, $tileY * $gEquates{"TILE_PIXEL_HEIGHT"}); + + for ($tileX = 0; $tileX < $gEquates{"LHS_NUM_TILES_WIDE"}; $tileX++) + { + $gTileScreenOffset[$lhsTileIndex] = $lastOffset; + + if ($tileY != 0) + { + $gTileAbove[$lhsTileIndex] = lhsXYToTileOffset($tileX, $tileY - 1); + } + + if ($tileY != $gEquates{"TOTAL_TILES_TALL"} - 1) + { + $gTileBelow[$lhsTileIndex] = lhsXYToTileOffset($tileX, $tileY + 1); + } + + if ($tileX != 0) + { + $gTileLeft[$lhsTileIndex] = lhsXYToTileOffset($tileX - 1, $tileY); + } + + if ($tileX == $gEquates{"LHS_NUM_TILES_WIDE"} - 1) + { + $gTileRight[$lhsTileIndex] = gameXYToTileOffset(0, $tileY); + } + else + { + $gTileRight[$lhsTileIndex] = lhsXYToTileOffset($tileX + 1, $tileY); + } + + $lhsTileIndex++; + + $lastOffset += $gEquates{"TILE_BYTE_WIDTH"}; + } + + for ($tileX = 0; $tileX < $gEquates{"GAME_NUM_TILES_WIDE"}; $tileX++) + { + $gTileScreenOffset[$tileIndex] = $lastOffset; + $gTileBitOffset[$tileIndex] = $bitOffset; + $gTileBitMask[$tileIndex] = $bitMask; + + if ($tileY != 0) + { + $gTileAbove[$tileIndex] = gameXYToTileOffset($tileX, $tileY - 1); + } + + if ($tileY != $gEquates{"TOTAL_TILES_TALL"} - 1) + { + $gTileBelow[$tileIndex] = gameXYToTileOffset($tileX, $tileY + 1); + } + + if ($tileX == 0) + { + $gTileLeft[$tileIndex] = lhsXYToTileOffset($gEquates{"LHS_NUM_TILES_WIDE"} - 1, $tileY); + } + else + { + $gTileLeft[$tileIndex] = gameXYToTileOffset($tileX - 1, $tileY); + } + + if ($tileX == $gEquates{"GAME_NUM_TILES_WIDE"} - 1) + { + $gTileRight[$tileIndex] = rhsXYToTileOffset(0, $tileY); + } + else + { + $gTileRight[$tileIndex] = gameXYToTileOffset($tileX + 1, $tileY); + } + + $tileIndex++; + + if ($bitMask == 0x8000) + { + $bitOffset += $gEquates{"SIZEOF_TILE_INFO"} = 2; + $bitMask = 1; + } + else + { + $bitMask <<= 1; + } + + $lastOffset += $gEquates{"TILE_BYTE_WIDTH"}; + } + + for ($tileX = 0; $tileX < $gEquates{"RHS_NUM_TILES_WIDE"}; $tileX++) + { + $gTileScreenOffset[$rhsTileIndex] = $lastOffset; + + if ($tileY != 0) + { + $gTileAbove[$rhsTileIndex] = rhsXYToTileOffset($tileX, $tileY - 1); + } + + if ($tileY != $gEquates{"TOTAL_TILES_TALL"} - 1) + { + $gTileBelow[$rhsTileIndex] = rhsXYToTileOffset($tileX, $tileY + 1); + } + + if ($tileX == 0) + { + $gTileLeft[$rhsTileIndex] = gameXYToTileOffset($gEquates{"GAME_NUM_TILES_WIDE"} - 1, $tileY); + } + else + { + $gTileLeft[$rhsTileIndex] = rhsXYToTileOffset($tileX - 1, $tileY); + } + + if ($tileX != $gEquates{"RHS_NUM_TILES_WIDE"} - 1) + { + $gTileRight[$rhsTileIndex] = rhsXYToTileOffset($tileX + 1, $tileY); + } + + $rhsTileIndex++; + + $lastOffset += $gEquates{"TILE_BYTE_WIDTH"}; + } + } +} + + +sub initNonGameTiles +{ + my $x; + my $y; + + $x = $gEquates{"LHS_NUM_TILES_WIDE"} / 2; + $y = 0; + addLhsGameTile($x, $y, "TILE_LETTER_B"); + $x++; + addLhsGameTile($x, $y, "TILE_LETTER_WHITE_U"); + $x++; + addLhsGameTile($x, $y, "TILE_LETTER_GREEN_G"); + $x++; + addLhsGameTile($x, $y, "TILE_LETTER_GREEN_S"); + + $x = 0; + $y = 3; + addLhsGameString($x, $y, "PLAYER 1"); + + $x = 2; + $y = 5; + addLhsGameString($x, $y, "SCORE:"); + + $x = $gEquates{"LHS_NUM_TILES_WIDE"} - 2; + $y = 6; + addLhsGameString($x, $y, "0"); + + $x = 2; + $y = 8; + addLhsGameString($x, $y, "LIVES:"); + + $x = $gEquates{"LHS_NUM_TILES_WIDE"} - 2; + $y = 9; + for (my $i = 0; $i < 3; $i++) + { + addLhsGameTile($x, $y, "TILE_PLAYER"); + $x--; + } + + $x = 0; + $y = 12; + addLhsGameString($x, $y, "HIGH SCORE:"); + + $x = $gEquates{"LHS_NUM_TILES_WIDE"} - 2; + $y = 13; + addLhsGameString($x, $y, "0"); + + $x = 0; + $y = 16; + addLhsGameString($x, $y, "PLAYER 2"); + + $x = 2; + $y = 18; + addLhsGameString($x, $y, "SCORE:"); + + $x = $gEquates{"LHS_NUM_TILES_WIDE"} - 2; + $y = 19; + addLhsGameString($x, $y, "0"); + + $x = 2; + $y = 21; + addLhsGameString($x, $y, "LIVES:"); + + $x = $gEquates{"LHS_NUM_TILES_WIDE"} - 2; + $y = 22; + for (my $i = 0; $i < 3; $i++) + { + addLhsGameTile($x, $y, "TILE_PLAYER"); + $x--; + } +} + + +initTiles(); +initNonGameTiles(); + +# Generate the tileData.s file + +open(TILEDATA_S, "> $gGenDir/tileData.s") or die "$0: Unable to open $gGenDir/tileData.s for writing, $!"; +print TILEDATA_S << "EOF"; + case on + mcopy tilesData.macros + keep tilesData + +tileData data + using globalData + +EOF + +foreach my $equate (sort keys %gEquates) +{ + print TILEDATA_S "$equate\tgequ " . $gEquates{$equate} . "\n"; +} + +printTileData("tileDirty", @gTileDirty); +printTileData("tileScreenOffset", @gTileScreenOffset); +printTileData("tileType", @gTileType); +printTileData("tileAbove", @gTileAbove); +printTileData("tileBelow", @gTileBelow); +printTileData("tileLeft", @gTileLeft); +printTileData("tileRight", @gTileRight); +printTileData("tileBitOffset", @gTileBitOffset); +printTileData("tileBitMask", @gTileBitMask); +printTileData("dirtyNonGameTiles", @gDirtyNonGameTiles); + + +print TILEDATA_S << "EOF"; + + +numDirtyNonGameTiles dc i2'$gNumDirtyNonGameTiles' + + end + +EOF + +close(TILEDATA_S); + + +# Generate the tileData.h file + +open(TILEDATA_H, "> $gGenDir/tileData.h") or die "$0: Unable to open $gGenDir/tileData.h for writing, $!"; +print TILEDATA_H << "EOF"; + +#ifndef _GUARD_PROJECTBuGS_FILEtileData_ +#define _GUARD_PROJECTBuGS_FILEtileData_ + +EOF + +foreach my $equate (sort keys %gEquates) +{ + print TILEDATA_H "#define $equate " . $gEquates{$equate} . "\n"; +} + + +print TILEDATA_H << "EOF"; + +#endif /* define _GUARD_PROJECTBuGS_FILEtileData_ */ + +EOF + +close(TILEDATA_H); diff --git a/BuGS/tiles.c b/BuGS/tiles.c deleted file mode 100644 index 1e79def..0000000 --- a/BuGS/tiles.c +++ /dev/null @@ -1,432 +0,0 @@ -/* - * tiles.c - * BuGS - * - * Created by Jeremy Rand on 2020-07-14. - * Copyright © 2020 Jeremy Rand. All rights reserved. - */ - -#include - -#include "tiles.h" - - -/* Defines */ - -#define TILE_WIDTH 8 -#define TILE_HEIGHT 8 - -#define SCREEN_WIDTH 320 -#define SCREEN_HEIGHT 200 - -#define GAME_LEFT_MOST_X_POS (13 * TILE_WIDTH) /* 13 tiles from the left */ -#define GAME_TOP_MOST_Y_POS (0 * TILE_HEIGHT) - -#define GAME_X_Y_TO_TILE_OFFSET(X, Y) \ - ((((Y) * GAME_NUM_TILES_WIDE) + (X)) * sizeof(word)) - -#define RHS_X_Y_TO_TILE_OFFSET(X, Y) \ - ((RHS_FIRST_TILE + ((Y) * RHS_NUM_TILES_WIDE) + (X)) * sizeof(word)) - -#define LHS_X_Y_TO_TILE_OFFSET(X, Y) \ - ((LHS_FIRST_TILE + ((Y) * LHS_NUM_TILES_WIDE) + (X)) * sizeof(word)) - -#define SCREEN_ADDRESS_FOR_TILE_AT_X_Y(X, Y) \ - (0x2000 + (0xa0 * (Y)) + ((X) / 2) + 3) - -#define STARTING_NUM_PLAYERS 3 - -#define ADD_DIRTY_NON_GAME_TILE(tileNum) \ - if (!tileDirty[tileNum]) { \ - tileDirty[tileNum] = 1; \ - dirtyNonGameTiles[numDirtyNonGameTiles / 2] = ((tileNum) * sizeof(word)); \ - numDirtyNonGameTiles += 2; \ - } - -/* Globals */ - -word tileDirty[TOTAL_NUM_TILES]; -word tileScreenOffset[TOTAL_NUM_TILES]; -tTileType tileType[TOTAL_NUM_TILES]; -tTileOffset tileAbove[TOTAL_NUM_TILES]; -tTileOffset tileBelow[TOTAL_NUM_TILES]; -tTileOffset tileLeft[TOTAL_NUM_TILES]; -tTileOffset tileRight[TOTAL_NUM_TILES]; -word tileBitOffset[NUM_GAME_TILES]; -word tileBitMask[NUM_GAME_TILES]; - -tTileOffset dirtyNonGameTiles[NUM_NON_GAME_TILES]; -word numDirtyNonGameTiles; - - -/* Implementation */ - -void initTiles(void) -{ - word tileX; - word tileY; - word lastOffset; - word tileIndex = 0; - word bitOffset = 0; - word bitMask = 1; - word rhsTileIndex = RHS_FIRST_TILE; - word lhsTileIndex = LHS_FIRST_TILE; - - for (tileY = 0; tileY < GAME_NUM_TILES_TALL; tileY++) - { - lastOffset = SCREEN_ADDRESS_FOR_TILE_AT_X_Y(0, tileY * TILE_HEIGHT); - - for (tileX = 0; tileX < LHS_NUM_TILES_WIDE; tileX++) - { - tileDirty[lhsTileIndex] = 0; - tileScreenOffset[lhsTileIndex] = lastOffset; - tileType[lhsTileIndex] = TILE_EMPTY; - - if (tileY == 0) - tileAbove[lhsTileIndex] = INVALID_TILE_NUM; - else - tileAbove[lhsTileIndex] = LHS_X_Y_TO_TILE_OFFSET(tileX, tileY - 1); - - if (tileY == GAME_NUM_TILES_TALL - 1) - tileBelow[lhsTileIndex] = INVALID_TILE_NUM; - else - tileBelow[lhsTileIndex] = LHS_X_Y_TO_TILE_OFFSET(tileX, tileY + 1); - - if (tileX == 0) - tileLeft[lhsTileIndex] = INVALID_TILE_NUM; - else - tileLeft[lhsTileIndex] = LHS_X_Y_TO_TILE_OFFSET(tileX - 1, tileY); - - if (tileX == LHS_NUM_TILES_WIDE - 1) - tileRight[lhsTileIndex] = GAME_X_Y_TO_TILE_OFFSET(0, tileY); - else - tileRight[lhsTileIndex] = LHS_X_Y_TO_TILE_OFFSET(tileX + 1, tileY); - - lhsTileIndex++; - - lastOffset += 4; - } - - for (tileX = 0; tileX < GAME_NUM_TILES_WIDE; tileX++) - { - tileDirty[tileIndex] = 0; - tileScreenOffset[tileIndex] = lastOffset; - tileType[tileIndex] = TILE_EMPTY; - tileBitOffset[tileIndex] = bitOffset; - tileBitMask[tileIndex] = bitMask; - - if (tileY == 0) - tileAbove[tileIndex] = INVALID_TILE_NUM; - else - tileAbove[tileIndex] = GAME_X_Y_TO_TILE_OFFSET(tileX, tileY - 1); - - if (tileY == GAME_NUM_TILES_TALL - 1) - tileBelow[tileIndex] = INVALID_TILE_NUM; - else - tileBelow[tileIndex] = GAME_X_Y_TO_TILE_OFFSET(tileX, tileY + 1); - - if (tileX == 0) - tileLeft[tileIndex] = LHS_X_Y_TO_TILE_OFFSET(LHS_NUM_TILES_WIDE - 1, tileY); - else - tileLeft[tileIndex] = GAME_X_Y_TO_TILE_OFFSET(tileX - 1, tileY); - - if (tileX == GAME_NUM_TILES_WIDE - 1) - tileRight[tileIndex] = RHS_X_Y_TO_TILE_OFFSET(0, tileY); - else - tileRight[tileIndex] = GAME_X_Y_TO_TILE_OFFSET(tileX + 1, tileY); - - tileIndex++; - - if (bitMask == 0x8000) - { - bitOffset += sizeof(word); - bitMask = 1; - } - else - { - bitMask <<= 1; - } - - lastOffset += 4; - } - - for (tileX = 0; tileX < RHS_NUM_TILES_WIDE; tileX++) - { - tileDirty[rhsTileIndex] = 0; - tileScreenOffset[rhsTileIndex] = lastOffset; - tileType[rhsTileIndex] = TILE_EMPTY; - - if (tileY == 0) - tileAbove[rhsTileIndex] = INVALID_TILE_NUM; - else - tileAbove[rhsTileIndex] = RHS_X_Y_TO_TILE_OFFSET(tileX, tileY - 1); - - if (tileY == GAME_NUM_TILES_TALL - 1) - tileBelow[rhsTileIndex] = INVALID_TILE_NUM; - else - tileBelow[rhsTileIndex] = RHS_X_Y_TO_TILE_OFFSET(tileX, tileY + 1); - - if (tileX == 0) - tileLeft[rhsTileIndex] = GAME_X_Y_TO_TILE_OFFSET(GAME_NUM_TILES_WIDE - 1, tileY); - else - tileLeft[rhsTileIndex] = RHS_X_Y_TO_TILE_OFFSET(tileX - 1, tileY); - - if (tileX == RHS_NUM_TILES_WIDE - 1) - tileRight[rhsTileIndex] = INVALID_TILE_NUM; - else - tileRight[rhsTileIndex] = RHS_X_Y_TO_TILE_OFFSET(tileX + 1, tileY); - - rhsTileIndex++; - - lastOffset += 4; - } - } - - numDirtyNonGameTiles = 0; -} - - -void initNonGameTiles(void) -{ - unsigned int i; - tTileNum tileNum; - - tileNum = LHS_FIRST_TILE + (LHS_NUM_TILES_WIDE / 2); - tileType[tileNum] = TILE_LETTER_B; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_WHITE_U; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_GREEN_G; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_GREEN_S; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum = LHS_FIRST_TILE + (3 * LHS_NUM_TILES_WIDE); - tileType[tileNum] = TILE_LETTER_P; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_L; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_A; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_Y; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_E; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_R; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileNum++; - tileType[tileNum] = TILE_NUMBER_1; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum = LHS_FIRST_TILE + (5 * LHS_NUM_TILES_WIDE) + 2; - tileType[tileNum] = TILE_LETTER_S; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_C; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_O; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_R; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_E; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_SYMBOL_COLON; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum = LHS_FIRST_TILE + (7 * LHS_NUM_TILES_WIDE) - 2; - tileType[tileNum] = TILE_NUMBER_0; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum = LHS_FIRST_TILE + (8 * LHS_NUM_TILES_WIDE) + 2; - tileType[tileNum] = TILE_LETTER_L; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_I; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_V; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_E; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_S; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_SYMBOL_COLON; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum = LHS_FIRST_TILE + (10 * LHS_NUM_TILES_WIDE) - 2; - for (i = 0; i < STARTING_NUM_PLAYERS; i++) - { - tileType[tileNum] = TILE_PLAYER; - ADD_DIRTY_NON_GAME_TILE(tileNum); - tileNum--; - } - - tileNum = LHS_FIRST_TILE + (12 * LHS_NUM_TILES_WIDE); - tileType[tileNum] = TILE_LETTER_H; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_I; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_G; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_H; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileNum++; - tileType[tileNum] = TILE_LETTER_S; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_C; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_O; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_R; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_E; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_SYMBOL_COLON; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum = LHS_FIRST_TILE + (14 * LHS_NUM_TILES_WIDE) - 2; - tileType[tileNum] = TILE_NUMBER_0; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum = LHS_FIRST_TILE + (16 * LHS_NUM_TILES_WIDE); - tileType[tileNum] = TILE_LETTER_P; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_L; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_A; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_Y; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_E; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_R; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileNum++; - tileType[tileNum] = TILE_NUMBER_2; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum = LHS_FIRST_TILE + (18 * LHS_NUM_TILES_WIDE) + 2; - tileType[tileNum] = TILE_LETTER_S; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_C; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_O; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_R; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_E; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_SYMBOL_COLON; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum = LHS_FIRST_TILE + (20 * LHS_NUM_TILES_WIDE) - 2; - tileType[tileNum] = TILE_NUMBER_0; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum = LHS_FIRST_TILE + (21 * LHS_NUM_TILES_WIDE) + 2; - tileType[tileNum] = TILE_LETTER_L; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_I; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_V; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_E; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_LETTER_S; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum++; - tileType[tileNum] = TILE_SYMBOL_COLON; - ADD_DIRTY_NON_GAME_TILE(tileNum); - - tileNum = LHS_FIRST_TILE + (23 * LHS_NUM_TILES_WIDE) - 2; - for (i = 0; i < STARTING_NUM_PLAYERS; i++) - { - tileType[tileNum] = TILE_PLAYER; - ADD_DIRTY_NON_GAME_TILE(tileNum); - tileNum--; - } -} diff --git a/BuGS/tiles.h b/BuGS/tiles.h deleted file mode 100644 index 61338ad..0000000 --- a/BuGS/tiles.h +++ /dev/null @@ -1,130 +0,0 @@ -/* - * tiles.h - * BuGS - * - * Created by Jeremy Rand on 2020-07-14. - * Copyright © 2020 Jeremy Rand. All rights reserved. - */ - -#ifndef _GUARD_PROJECTBuGS_FILEtiles_ -#define _GUARD_PROJECTBuGS_FILEtiles_ - - -#include - - -/* Defines */ - -#define GAME_NUM_TILES_WIDE 25 -#define GAME_NUM_TILES_TALL 25 - -#define NUM_GAME_TILES (GAME_NUM_TILES_WIDE * GAME_NUM_TILES_TALL) - -#define RHS_NUM_TILES_WIDE 2 -#define NUM_RHS_NON_GAME_TILES (RHS_NUM_TILES_WIDE * GAME_NUM_TILES_TALL) -#define RHS_FIRST_TILE NUM_GAME_TILES - -#define LHS_NUM_TILES_WIDE 13 -#define NUM_LHS_NON_GAME_TILES (LHS_NUM_TILES_WIDE * GAME_NUM_TILES_TALL) -#define LHS_FIRST_TILE (RHS_FIRST_TILE + NUM_RHS_NON_GAME_TILES) - -#define NUM_NON_GAME_TILES (NUM_RHS_NON_GAME_TILES + NUM_LHS_NON_GAME_TILES) - -#define TOTAL_NUM_TILES (NUM_GAME_TILES + NUM_NON_GAME_TILES) - -#define INVALID_TILE_NUM 0xffff - - -/* Types */ - -typedef word tTileNum; -typedef word tTileOffset; /* A tile offset is a tile number times the sizeof(tTile). */ - - -typedef enum { - TILE_EMPTY = 0, - TILE_MUSHROOM1 = 1 * 4, - TILE_MUSHROOM2 = 2 * 4, - TILE_MUSHROOM3 = 3 * 4, - TILE_MUSHROOM4 = 4 * 4, - TILE_POISON_MUSHROOM1 = 9 * 4, - TILE_POISON_MUSHROOM2 = 10 * 4, - TILE_POISON_MUSHROOM3 = 11 * 4, - TILE_POISON_MUSHROOM4 = 12 * 4, - - TILE_SYMBOL_C = 5 * 4, - TILE_SYMBOL_P = 6 * 4, - TILE_SYMBOL_DOT = 7 * 4, - TILE_SYMBOL_COLON = 8 * 4, - - TILE_LETTER_A = 13 * 4, - TILE_LETTER_B = 14 * 4, - TILE_LETTER_C = 15 * 4, - TILE_LETTER_D = 16 * 4, - TILE_LETTER_E = 17 * 4, - TILE_LETTER_F = 18 * 4, - TILE_LETTER_G = 19 * 4, - TILE_LETTER_H = 20 * 4, - TILE_LETTER_I = 21 * 4, - TILE_LETTER_J = 22 * 4, - TILE_LETTER_K = 23 * 4, - TILE_LETTER_L = 24 * 4, - TILE_LETTER_M = 25 * 4, - TILE_LETTER_N = 26 * 4, - TILE_LETTER_O = 27 * 4, - TILE_LETTER_P = 28 * 4, - TILE_LETTER_Q = 29 * 4, - TILE_LETTER_R = 30 * 4, - TILE_LETTER_S = 31 * 4, - TILE_LETTER_T = 32 * 4, - TILE_LETTER_U = 33 * 4, - TILE_LETTER_V = 34 * 4, - TILE_LETTER_W = 35 * 4, - TILE_LETTER_X = 36 * 4, - TILE_LETTER_Y = 37 * 4, - TILE_LETTER_Z = 38 * 4, - - TILE_NUMBER_0 = 39 * 4, - TILE_NUMBER_1 = 40 * 4, - TILE_NUMBER_2 = 41 * 4, - TILE_NUMBER_3 = 42 * 4, - TILE_NUMBER_4 = 43 * 4, - TILE_NUMBER_5 = 44 * 4, - TILE_NUMBER_6 = 45 * 4, - TILE_NUMBER_7 = 46 * 4, - TILE_NUMBER_8 = 47 * 4, - TILE_NUMBER_9 = 48 * 4, - - TILE_SOLID1 = 49 * 4, - TILE_SOLID2 = 50 * 4, - TILE_SOLID3 = 51 * 4, - - TILE_PLAYER = 52 * 4, - TILE_LETTER_WHITE_U = 53 * 4, - TILE_LETTER_GREEN_G = 54 * 4, - TILE_LETTER_GREEN_S = 55 * 4, -} tTileType; - - -/* Globals */ - -extern word tileDirty[TOTAL_NUM_TILES]; -extern word tileScreenOffset[TOTAL_NUM_TILES]; -extern tTileType tileType[TOTAL_NUM_TILES]; -extern tTileOffset tileAbove[TOTAL_NUM_TILES]; -extern tTileOffset tileBelow[TOTAL_NUM_TILES]; -extern tTileOffset tileLeft[TOTAL_NUM_TILES]; -extern tTileOffset tileRight[TOTAL_NUM_TILES]; -extern word tileBitOffset[NUM_GAME_TILES]; -extern word tileBitMask[NUM_GAME_TILES]; - -extern tTileOffset dirtyNonGameTiles[NUM_NON_GAME_TILES]; -extern word numDirtyNonGameTiles; - - -/* API */ - -extern void initTiles(void); - - -#endif /* define _GUARD_PROJECTBuGS_FILEtiles_ */ diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..c20f3fd --- /dev/null +++ b/TODO.md @@ -0,0 +1,4 @@ +TODO +======= + +* When a centipede segment is added on the right, if there is a mushroom either right at the edge or maybe on tile from the edge (not sure which), the segment seems to turn around and travel up along the edge of the screen. Not sure if this can happen on the left side also. This is likely a problem with the mushroom collision detection and a segment which is mostly off-screen should probably ignore blocking mushrooms until on-screen.