mirror of https://github.com/jeremysrand/BuGS.git
622 lines
20 KiB
Perl
Executable File
622 lines
20 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
# genData.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_ADDRESS"} = 0x2000;
|
|
$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"};
|
|
$gEquates{"SPIDER_DISTANCE_900"} = $gEquates{"SCREEN_BYTES_PER_ROW"} * $gEquates{"TILE_PIXEL_HEIGHT"} * 2;
|
|
$gEquates{"SPIDER_DISTANCE_600"} = $gEquates{"SCREEN_BYTES_PER_ROW"} * $gEquates{"TILE_PIXEL_HEIGHT"} * 5;
|
|
|
|
$gEquates{"PLAYER_TILES_HIGH"} = 7;
|
|
$gEquates{"MOUSE_MAX_X"} = (($gEquates{"GAME_NUM_TILES_WIDE"} - 1) * $gEquates{"TILE_PIXEL_WIDTH"}) + 1;
|
|
$gEquates{"MOUSE_MAX_Y"} = (($gEquates{"PLAYER_TILES_HIGH"} - 1) * $gEquates{"TILE_PIXEL_HEIGHT"}) + 1;
|
|
$gEquates{"STARTING_MOUSE_X"} = $gEquates{"MOUSE_MAX_X"} / 2;
|
|
$gEquates{"STARTING_MOUSE_Y"} = $gEquates{"MOUSE_MAX_Y"} - 1;
|
|
|
|
$gEquates{"P1_SCORE_ONES_OFFSET"} = ($gEquates{"LHS_FIRST_TILE"} + ($gEquates{"LHS_NUM_TILES_WIDE"} * 6) + ($gEquates{"LHS_NUM_TILES_WIDE"} - 2)) * $gEquates{"SIZEOF_TILE_INFO"};
|
|
$gEquates{"P1_SCORE_TENS_OFFSET"} = $gEquates{"P1_SCORE_ONES_OFFSET"} - $gEquates{"SIZEOF_TILE_INFO"};
|
|
$gEquates{"P1_SCORE_HUNDREDS_OFFSET"} = $gEquates{"P1_SCORE_TENS_OFFSET"} - $gEquates{"SIZEOF_TILE_INFO"};
|
|
$gEquates{"P1_SCORE_THOUSANDS_OFFSET"} = $gEquates{"P1_SCORE_HUNDREDS_OFFSET"} - $gEquates{"SIZEOF_TILE_INFO"};
|
|
$gEquates{"P1_SCORE_FIRST_OFFSET"} = ($gEquates{"LHS_FIRST_TILE"} + ($gEquates{"LHS_NUM_TILES_WIDE"} * 6)) * $gEquates{"SIZEOF_TILE_INFO"};
|
|
|
|
$gEquates{"P1_LIVES_OFFSET"} = ($gEquates{"LHS_FIRST_TILE"} + ($gEquates{"LHS_NUM_TILES_WIDE"} * 9) + ($gEquates{"LHS_NUM_TILES_WIDE"} - 2)) * $gEquates{"SIZEOF_TILE_INFO"};
|
|
|
|
$gEquates{"P2_SCORE_ONES_OFFSET"} = ($gEquates{"LHS_FIRST_TILE"} + ($gEquates{"LHS_NUM_TILES_WIDE"} * 19) + ($gEquates{"LHS_NUM_TILES_WIDE"} - 2)) * $gEquates{"SIZEOF_TILE_INFO"};
|
|
$gEquates{"P2_SCORE_TENS_OFFSET"} = $gEquates{"P2_SCORE_ONES_OFFSET"} - $gEquates{"SIZEOF_TILE_INFO"};
|
|
$gEquates{"P2_SCORE_HUNDREDS_OFFSET"} = $gEquates{"P2_SCORE_TENS_OFFSET"} - $gEquates{"SIZEOF_TILE_INFO"};
|
|
$gEquates{"P2_SCORE_THOUSANDS_OFFSET"} = $gEquates{"P2_SCORE_HUNDREDS_OFFSET"} - $gEquates{"SIZEOF_TILE_INFO"};
|
|
$gEquates{"P2_SCORE_FIRST_OFFSET"} = ($gEquates{"LHS_FIRST_TILE"} + ($gEquates{"LHS_NUM_TILES_WIDE"} * 19)) * $gEquates{"SIZEOF_TILE_INFO"};
|
|
|
|
$gEquates{"P2_LIVES_OFFSET"} = ($gEquates{"LHS_FIRST_TILE"} + ($gEquates{"LHS_NUM_TILES_WIDE"} * 22) + ($gEquates{"LHS_NUM_TILES_WIDE"} - 2)) * $gEquates{"SIZEOF_TILE_INFO"};
|
|
|
|
$gEquates{"HIGH_SCORE_ONES_OFFSET"} = ($gEquates{"LHS_FIRST_TILE"} + ($gEquates{"LHS_NUM_TILES_WIDE"} * 13) + ($gEquates{"LHS_NUM_TILES_WIDE"} - 2)) * $gEquates{"SIZEOF_TILE_INFO"};
|
|
|
|
$gEquates{"NUM_FLEA_FREQS"} = 120;
|
|
|
|
$gEquates{"NUM_HIGH_SCORES"} = 10;
|
|
|
|
|
|
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 @gTileRightVolume = (0) x $gEquates{"TOTAL_NUM_TILES"};
|
|
our @gDirtyNonGameTiles = ("INVALID_TILE_NUM") x $gEquates{"NUM_NON_GAME_TILES"};
|
|
our $gNumDirtyNonGameTiles = 0;
|
|
|
|
our @gFleaFreqs = (0) x $gEquates{"NUM_FLEA_FREQS"};
|
|
|
|
our @gMouseYAddress = (0) x $gEquates{"MOUSE_MAX_Y"};
|
|
our @gMouseYTileAbove = (0) x $gEquates{"MOUSE_MAX_Y"};
|
|
our @gMouseYTileBelow = (0) x $gEquates{"MOUSE_MAX_Y"};
|
|
our @gMouseXTileLeft = (0) x $gEquates{"MOUSE_MAX_X"};
|
|
our @gMouseXTileRight = (0) x $gEquates{"MOUSE_MAX_X"};
|
|
our @gScreenToTileOffset = (0) x ($gEquates{"SCREEN_PIXELS_TALL"} * $gEquates{"SCREEN_BYTES_PER_ROW"} / $gEquates{"SIZEOF_TILE_INFO"});
|
|
|
|
|
|
sub printTileData
|
|
{
|
|
my ($fh, $symbol, @data) = @_;
|
|
|
|
print $fh "\n";
|
|
print $fh "\n";
|
|
print $fh "$symbol anop\n";
|
|
|
|
for my $index (0 .. $#data)
|
|
{
|
|
print $fh " dc i2'$data[$index]'\t; Index $index\n";
|
|
}
|
|
}
|
|
|
|
|
|
sub gameXYToTileOffset
|
|
{
|
|
my ($x, $y) = @_;
|
|
|
|
return (($y * $gEquates{"GAME_NUM_TILES_WIDE"}) + $x) * $gEquates{"SIZEOF_TILE_INFO"};
|
|
}
|
|
|
|
|
|
sub rhsXYToTileNum
|
|
{
|
|
my ($x, $y) = @_;
|
|
|
|
return $gEquates{"RHS_FIRST_TILE"} + ($y * $gEquates{"RHS_NUM_TILES_WIDE"}) + $x;
|
|
}
|
|
|
|
|
|
sub rhsXYToTileOffset
|
|
{
|
|
my ($x, $y) = @_;
|
|
|
|
return rhsXYToTileNum($x, $y) * $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 addRhsGameTile
|
|
{
|
|
my ($x, $y, $tileType) = @_;
|
|
my $tileNum = rhsXYToTileNum($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 $gEquates{"SCREEN_ADDRESS"} + ($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"};
|
|
my $screenOffset = 0;
|
|
|
|
for ($tileY = 0; $tileY < $gEquates{"TOTAL_TILES_TALL"}; $tileY++)
|
|
{
|
|
$screenOffset = ($tileY * $gEquates{"TILE_PIXEL_HEIGHT"} * $gEquates{"SCREEN_BYTES_PER_ROW"} / $gEquates{"SIZEOF_TILE_INFO"});
|
|
$lastOffset = screenAddressForTileAtXY(0, $tileY * $gEquates{"TILE_PIXEL_HEIGHT"});
|
|
|
|
for ($tileX = 0; $tileX < $gEquates{"LHS_NUM_TILES_WIDE"}; $tileX++)
|
|
{
|
|
$gTileScreenOffset[$lhsTileIndex] = $lastOffset;
|
|
|
|
for (my $word = 0; $word < ($gEquates{"TILE_BYTE_WIDTH"} / $gEquates{"SIZEOF_TILE_INFO"}); $word++)
|
|
{
|
|
for (my $y = 0; $y < $gEquates{"TILE_PIXEL_HEIGHT"}; $y++)
|
|
{
|
|
$gScreenToTileOffset[$screenOffset + ($y * $gEquates{"SCREEN_BYTES_PER_ROW"} / $gEquates{"SIZEOF_TILE_INFO"})] = $lhsTileIndex * $gEquates{"SIZEOF_TILE_INFO"};
|
|
}
|
|
$screenOffset++;
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
$gTileRightVolume[$lhsTileIndex] = 0;
|
|
|
|
$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;
|
|
|
|
for (my $word = 0; $word < ($gEquates{"TILE_BYTE_WIDTH"} / $gEquates{"SIZEOF_TILE_INFO"}); $word++)
|
|
{
|
|
for (my $y = 0; $y < $gEquates{"TILE_PIXEL_HEIGHT"}; $y++)
|
|
{
|
|
$gScreenToTileOffset[$screenOffset + ($y * $gEquates{"SCREEN_BYTES_PER_ROW"} / $gEquates{"SIZEOF_TILE_INFO"})] = $tileIndex * $gEquates{"SIZEOF_TILE_INFO"};
|
|
}
|
|
$screenOffset++;
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
$gTileRightVolume[$tileIndex] = $tileX * 255 / ($gEquates{"GAME_NUM_TILES_WIDE"} - 1);
|
|
|
|
$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;
|
|
|
|
for (my $word = 0; $word < ($gEquates{"TILE_BYTE_WIDTH"} / $gEquates{"SIZEOF_TILE_INFO"}); $word++)
|
|
{
|
|
for (my $y = 0; $y < $gEquates{"TILE_PIXEL_HEIGHT"}; $y++)
|
|
{
|
|
$gScreenToTileOffset[$screenOffset + ($y * $gEquates{"SCREEN_BYTES_PER_ROW"} / $gEquates{"SIZEOF_TILE_INFO"})] = $rhsTileIndex * $gEquates{"SIZEOF_TILE_INFO"};
|
|
}
|
|
$screenOffset++;
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
$gTileRightVolume[$rhsTileIndex] = 255;
|
|
|
|
$rhsTileIndex++;
|
|
|
|
$lastOffset += $gEquates{"TILE_BYTE_WIDTH"};
|
|
}
|
|
}
|
|
|
|
# Calculate the memory address of the 0th row of the player's mouse position.
|
|
$lastOffset = $gEquates{"SCREEN_ADDRESS"} + ($gEquates{"LHS_NUM_TILES_WIDE"} * $gEquates{"TILE_BYTE_WIDTH"}) + (($gEquates{"GAME_NUM_TILES_TALL"} - $gEquates{"PLAYER_TILES_HIGH"}) * $gEquates{"TILE_PIXEL_HEIGHT"} * $gEquates{"SCREEN_BYTES_PER_ROW"});
|
|
$tileX = 0;
|
|
$tileY = $gEquates{"GAME_NUM_TILES_TALL"} - $gEquates{"PLAYER_TILES_HIGH"} - 1;
|
|
for (my $y = 0; $y < $gEquates{"MOUSE_MAX_Y"}; $y++)
|
|
{
|
|
$gMouseYAddress[$y] = $lastOffset;
|
|
$lastOffset += $gEquates{"SCREEN_BYTES_PER_ROW"};
|
|
|
|
if (($y % $gEquates{"TILE_PIXEL_HEIGHT"}) == 0)
|
|
{
|
|
$tileY++;
|
|
}
|
|
|
|
$gMouseYTileAbove[$y] = gameXYToTileOffset($tileX, $tileY);
|
|
if (($y % $gEquates{"TILE_PIXEL_HEIGHT"}) == 0)
|
|
{
|
|
$gMouseYTileBelow[$y] = gameXYToTileOffset($tileX, $tileY);
|
|
}
|
|
else
|
|
{
|
|
$gMouseYTileBelow[$y] = gameXYToTileOffset($tileX, $tileY + 1);
|
|
}
|
|
}
|
|
|
|
$tileX = -1;
|
|
$tileY = 0;
|
|
for (my $x = 0; $x < $gEquates{"MOUSE_MAX_X"}; $x++)
|
|
{
|
|
if (($x % $gEquates{"TILE_PIXEL_WIDTH"}) == 0)
|
|
{
|
|
$tileX++;
|
|
}
|
|
|
|
$gMouseXTileLeft[$x] = gameXYToTileOffset($tileX, $tileY);
|
|
if (($x % $gEquates{"TILE_PIXEL_WIDTH"}) == 0)
|
|
{
|
|
$gMouseXTileRight[$x] = gameXYToTileOffset($tileX, $tileY);
|
|
}
|
|
else
|
|
{
|
|
$gMouseXTileRight[$x] = gameXYToTileOffset($tileX + 1, $tileY);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
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 = 2;
|
|
$y = 8;
|
|
addLhsGameString($x, $y, "LIVES:");
|
|
|
|
$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 = 2;
|
|
$y = 21;
|
|
addLhsGameString($x, $y, "LIVES:");
|
|
|
|
for (my $tileY = 0; $tileY < $gEquates{"TOTAL_TILES_TALL"}; $tileY++)
|
|
{
|
|
addLhsGameTile($gEquates{"LHS_NUM_TILES_WIDE"} - 1, $tileY, "TILE_RIGHT_BAR");
|
|
addRhsGameTile(0, $tileY, "TILE_LEFT_BAR");
|
|
}
|
|
}
|
|
|
|
|
|
sub initFleaFreqs
|
|
{
|
|
$gFleaFreqs[0] = (197 * 256 * 32) / ( 2 * 1645);
|
|
|
|
for (my $i = 1; $i < $gEquates{"NUM_FLEA_FREQS"}; $i++)
|
|
{
|
|
$gFleaFreqs[$i] = ($gFleaFreqs[$i - 1] * 100000000) / 101161944;
|
|
}
|
|
}
|
|
|
|
|
|
initTiles();
|
|
initNonGameTiles();
|
|
initFleaFreqs();
|
|
|
|
# Generate the tileData.s file
|
|
open my $fh, ">", "$gGenDir/tileData.s" or die "$0: Unable to open $gGenDir/tileData.s for writing, $!";
|
|
my $text = << "EOF";
|
|
case on
|
|
mcopy tilesData.macros
|
|
keep tilesData
|
|
|
|
tileData data
|
|
using globalData
|
|
|
|
EOF
|
|
print $fh $text;
|
|
|
|
foreach my $equate (sort keys %gEquates)
|
|
{
|
|
print $fh "$equate\tgequ " . $gEquates{$equate} . "\n";
|
|
}
|
|
|
|
printTileData($fh, "tileDirty", @gTileDirty);
|
|
printTileData($fh, "tileScreenOffset", @gTileScreenOffset);
|
|
printTileData($fh, "tileType", @gTileType);
|
|
printTileData($fh, "tileAbove", @gTileAbove);
|
|
printTileData($fh, "tileBelow", @gTileBelow);
|
|
printTileData($fh, "tileLeft", @gTileLeft);
|
|
printTileData($fh, "tileRight", @gTileRight);
|
|
printTileData($fh, "tileBitOffset", @gTileBitOffset);
|
|
printTileData($fh, "tileBitMask", @gTileBitMask);
|
|
printTileData($fh, "tileRightVolume", @gTileRightVolume);
|
|
printTileData($fh, "dirtyNonGameTiles", @gDirtyNonGameTiles);
|
|
printTileData($fh, "fleaFreqs", @gFleaFreqs);
|
|
printTileData($fh, "mouseYAddress", @gMouseYAddress);
|
|
printTileData($fh, "mouseYTileAbove", @gMouseYTileAbove);
|
|
printTileData($fh, "mouseYTileBelow", @gMouseYTileBelow);
|
|
printTileData($fh, "mouseXTileLeft", @gMouseXTileLeft);
|
|
printTileData($fh, "mouseXTileRight", @gMouseXTileRight);
|
|
|
|
|
|
$text = << "EOF";
|
|
|
|
|
|
numDirtyNonGameTiles dc i2'$gNumDirtyNonGameTiles'
|
|
|
|
end
|
|
EOF
|
|
print $fh $text;
|
|
close($fh);
|
|
|
|
# Generate the screenData.s file
|
|
|
|
open $fh, ">", "$gGenDir/screenData.s" or die "$0: Unable to open $gGenDir/screenData.s for writing, $!";
|
|
$text = << "EOF";
|
|
case on
|
|
mcopy screenData.macros
|
|
keep screenData
|
|
|
|
screenData data screenDataSeg
|
|
|
|
EOF
|
|
print $fh $text;
|
|
|
|
printTileData($fh, "screenToTileOffset", @gScreenToTileOffset);
|
|
|
|
$text = << "EOF";
|
|
|
|
end
|
|
EOF
|
|
print $fh $text;
|
|
close($fh);
|
|
|
|
# Generate the playerData.s file
|
|
open $fh, ">", "$gGenDir/playerData.s" or die "$0: Unable to open $gGenDir/playerData.s for writing, $!";
|
|
my $dataSize = 2 * $gEquates{"NUM_GAME_TILES"};
|
|
$text = << "EOF";
|
|
case on
|
|
mcopy playerData.macros
|
|
keep playerData
|
|
|
|
playerData data playerDataSeg
|
|
|
|
player1Tiles ds $dataSize
|
|
player2Tiles ds $dataSize
|
|
|
|
end
|
|
EOF
|
|
print $fh $text;
|
|
close($fh);
|
|
|
|
# Generate the tileData.h file
|
|
|
|
open $fh, ">", "$gGenDir/tileData.h" or die "$0: Unable to open $gGenDir/tileData.h for writing, $!";
|
|
$text = << "EOF";
|
|
|
|
#ifndef _GUARD_PROJECTBuGS_FILEtileData_
|
|
#define _GUARD_PROJECTBuGS_FILEtileData_
|
|
|
|
EOF
|
|
print $fh $text;
|
|
|
|
foreach my $equate (sort keys %gEquates)
|
|
{
|
|
print $fh "#define $equate " . $gEquates{$equate} . "\n";
|
|
}
|
|
|
|
|
|
$text = << "EOF";
|
|
|
|
#endif /* define _GUARD_PROJECTBuGS_FILEtileData_ */
|
|
EOF
|
|
print $fh $text;
|
|
close($fh);
|