Replace the C code which built tables at game launch time with a script which generates these tables at build time. This reduces the start time of the application and saves code space and is a necessary step before adding some new tables to handle the mouse efficiently.

This commit is contained in:
Jeremy Rand 2020-11-04 22:48:18 -05:00
parent c45c3503d6
commit bb66ef4b03
18 changed files with 477 additions and 613 deletions

View File

@ -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 = "<group>"; };
9D47CBE02547BEDB00CDA5CB /* gameMushroom.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = gameMushroom.s; sourceTree = "<group>"; };
9D47CC14254A698900CDA5CB /* gamePlayer.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = gamePlayer.s; sourceTree = "<group>"; };
9D47CCBA25525C1A00CDA5CB /* tileData.pl */ = {isa = PBXFileReference; lastKnownFileType = text.script.perl; path = tileData.pl; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.perl; };
9D62AF3B249871A300348F45 /* colour.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = colour.s; sourceTree = "<group>"; };
9D62AF3F2499CD1E00348F45 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; };
9D62AF402499CD3A00348F45 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
@ -87,6 +87,7 @@
9D8AF0B82535543000C10E3C /* score.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = score.s; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.asm.orcam; };
9D8FFC602491CA28005C9327 /* game.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = game.s; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.asm.orcam; };
9D8FFC612491CAF0005C9327 /* game.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = game.h; sourceTree = "<group>"; };
9D9F07F92553AB3800875B29 /* TODO.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = TODO.md; sourceTree = "<group>"; };
9DB1505024C3801100558B87 /* gameFlea.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = gameFlea.s; sourceTree = "<group>"; };
9DB1505124C6875C00558B87 /* gameScorpion.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = gameScorpion.s; sourceTree = "<group>"; };
9DB1505224C7495400558B87 /* globals.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = globals.s; sourceTree = "<group>"; };
@ -95,8 +96,6 @@
9DB1505524D3BFCE00558B87 /* global.macros */ = {isa = PBXFileReference; lastKnownFileType = text; path = global.macros; sourceTree = "<group>"; };
9DC4D7BD24B7652100BACF4B /* ship.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = ship.s; sourceTree = "<group>"; };
9DC4D7BE24B80C9600BACF4B /* shot.s */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.asm; path = shot.s; sourceTree = "<group>"; };
9DC4D7BF24BE9F7100BACF4B /* tiles.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = tiles.h; sourceTree = "<group>"; };
9DC4D7C024BE9F7100BACF4B /* tiles.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = tiles.c; sourceTree = "<group>"; };
/* 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 */,
);

View File

@ -7,7 +7,7 @@
<key>Binary.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>3</integer>
<integer>2</integer>
</dict>
<key>BuGS.xcscheme_^#shared#^_</key>
<dict>
@ -17,12 +17,12 @@
<key>DiskImage.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>2</integer>
<integer>1</integer>
</dict>
<key>doNotBuild.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>1</integer>
<integer>3</integer>
</dict>
</dict>
</dict>

View File

@ -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

View File

@ -23,6 +23,7 @@
game start
using globalData
using tileData
jsl setupScreen

View File

@ -12,6 +12,7 @@
gameFlea start
using globalData
using tileData
FLEA_STATE_NONE equ 0
FLEA_STATE_FALLING equ 1

View File

@ -12,6 +12,7 @@
gameMushroom start
using globalData
using tileData
STARTING_NUM_MUSHROOMS equ 30

View File

@ -12,6 +12,7 @@
gamePlayer start
using globalData
using tileData
PLAYER_TILES_HIGH equ 7

View File

@ -12,6 +12,7 @@
gameScorpion start
using globalData
using tileData
SCORPION_STATE_NONE equ 0

View File

@ -12,6 +12,7 @@
gameSegments start
using globalData
using tileData
SEGMENT_MAX_NUM equ 12

View File

@ -12,6 +12,7 @@
gameSpider start
using globalData
using tileData
SPIDER_STATE_NONE equ 0
SPIDER_STATE_EXPLODING equ 1

View File

@ -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

View File

@ -12,6 +12,7 @@
level start
using globalData
using tileData
NEXT_LEVEL_FRAME_COUNT equ 60

View File

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

View File

@ -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

447
BuGS/tileData.pl Executable file
View File

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

View File

@ -1,432 +0,0 @@
/*
* tiles.c
* BuGS
*
* Created by Jeremy Rand on 2020-07-14.
* Copyright © 2020 Jeremy Rand. All rights reserved.
*/
#include <string.h>
#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--;
}
}

View File

@ -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 <types.h>
/* 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_ */

4
TODO.md Normal file
View File

@ -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.