Added the minesweeper game.
10
.gitignore
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# Python cache files.
|
||||||
|
*/__pycache__/
|
||||||
|
|
||||||
|
# Build files.
|
||||||
|
*/bin/
|
||||||
|
*/obj/
|
||||||
|
convimg.out
|
||||||
|
|
||||||
|
# Other stuff.
|
||||||
|
.DS_Store
|
||||||
3
Minesweeper/.clangd
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
CompileFlags: # Add the include folder.
|
||||||
|
Add:
|
||||||
|
- "--include-directory=C:\\Users\\kyley\\Desktop\\Coding\\TiCalculatorModding\\Libraries\\CE_C-C++_Toolchain_11.0\\include"
|
||||||
7
Minesweeper/.gitignore
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
obj/
|
||||||
|
bin/
|
||||||
|
src/gfx/*.c
|
||||||
|
src/gfx/*.h
|
||||||
|
src/gfx/*.8xv
|
||||||
|
.DS_Store
|
||||||
|
convimg.out
|
||||||
45
Minesweeper/24to16color.py
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
import sys
|
||||||
|
|
||||||
|
INPUT_R = 8
|
||||||
|
INPUT_G = 8
|
||||||
|
INPUT_B = 8
|
||||||
|
|
||||||
|
OUTPUT_R = 5
|
||||||
|
OUTPUT_G = 6
|
||||||
|
OUTPUT_B = 5
|
||||||
|
|
||||||
|
def convert(color_in: int) -> int:
|
||||||
|
global INPUT_R, INPUT_G, INPUT_B
|
||||||
|
global OUTPUT_R, OUTPUT_G, OUTPUT_B
|
||||||
|
|
||||||
|
in_r_max = 2 ** INPUT_R - 1
|
||||||
|
in_g_max = 2 ** INPUT_G - 1
|
||||||
|
in_b_max = 2 ** INPUT_B - 1
|
||||||
|
|
||||||
|
out_r_max = 2 ** OUTPUT_R - 1
|
||||||
|
out_g_max = 2 ** OUTPUT_G - 1
|
||||||
|
out_b_max = 2 ** OUTPUT_B - 1
|
||||||
|
|
||||||
|
in_b = color_in & in_b_max
|
||||||
|
in_g = (color_in >> INPUT_B) & in_g_max
|
||||||
|
in_r = (color_in >> INPUT_B + INPUT_G) & in_r_max
|
||||||
|
|
||||||
|
r_float = in_r / float(in_r_max)
|
||||||
|
g_float = in_g / float(in_g_max)
|
||||||
|
b_float = in_b / float(in_b_max)
|
||||||
|
|
||||||
|
out_r = int(r_float * out_r_max)
|
||||||
|
out_g = int(g_float * out_g_max)
|
||||||
|
out_b = int(b_float * out_b_max)
|
||||||
|
|
||||||
|
color_out = out_b + (out_g << OUTPUT_B) + (out_r << (OUTPUT_B + OUTPUT_G))
|
||||||
|
return color_out
|
||||||
|
|
||||||
|
if len(sys.argv) < 2:
|
||||||
|
print("Requires color argument.")
|
||||||
|
elif len(sys.argv) > 2:
|
||||||
|
print("Too many arguments!")
|
||||||
|
else:
|
||||||
|
input_col = int(sys.argv[1], 16)
|
||||||
|
output_col = convert(input_col)
|
||||||
|
print(hex(output_col))
|
||||||
94
Minesweeper/colorconv.py
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
import math
|
||||||
|
import sys
|
||||||
|
|
||||||
|
def print_usage():
|
||||||
|
print("Usage: colorconv.py <from> <to> <color_from>")
|
||||||
|
print("")
|
||||||
|
print(" <from>: The color format to convert from.")
|
||||||
|
print(" <to>: The color format to convert to.")
|
||||||
|
print(" <color_from>: The color to convert the format of.")
|
||||||
|
print("")
|
||||||
|
print(" Color formats are formatted as their individual channels.")
|
||||||
|
print(" Ex.")
|
||||||
|
print(" r8g8b8")
|
||||||
|
print(" r5g6b5")
|
||||||
|
print("")
|
||||||
|
print(" Color data is represented as a number. Must be hexadecimal.")
|
||||||
|
print(" The output is a single color value in hexadecimal.")
|
||||||
|
|
||||||
|
def total_format_bytes(format: tuple[int, int, int]):
|
||||||
|
bits = sum(format)
|
||||||
|
return math.ceil(bits / 8)
|
||||||
|
|
||||||
|
def determine_format(format: str) -> tuple[int, int, int]:
|
||||||
|
r_ind: int = format.index("r")
|
||||||
|
g_ind: int = format.index("g")
|
||||||
|
b_ind: int = format.index("b")
|
||||||
|
|
||||||
|
r_sub: str = format[(r_ind + 1):g_ind]
|
||||||
|
g_sub: str = format[(g_ind + 1):b_ind]
|
||||||
|
b_sub: str = format[(b_ind + 1):]
|
||||||
|
|
||||||
|
r_val = int(r_sub)
|
||||||
|
g_val = int(g_sub)
|
||||||
|
b_val = int(b_sub)
|
||||||
|
|
||||||
|
return (r_val, g_val, b_val)
|
||||||
|
|
||||||
|
def convert_color(format_in: tuple[int, int, int], format_out: tuple[int, int, int], color_in):
|
||||||
|
in_r_max = 2 ** format_in[0] - 1
|
||||||
|
in_g_max = 2 ** format_in[1] - 1
|
||||||
|
in_b_max = 2 ** format_in[2] - 1
|
||||||
|
|
||||||
|
out_r_max = 2 ** format_out[0] - 1
|
||||||
|
out_g_max = 2 ** format_out[1] - 1
|
||||||
|
out_b_max = 2 ** format_out[2] - 1
|
||||||
|
|
||||||
|
in_r: int
|
||||||
|
in_g: int
|
||||||
|
in_b: int
|
||||||
|
|
||||||
|
if isinstance(color_in, int):
|
||||||
|
in_b = color_in & in_b_max
|
||||||
|
in_g = (color_in >> format_in[2]) & in_g_max
|
||||||
|
in_r = (color_in >> (format_in[2] + format_in[1])) & in_r_max
|
||||||
|
else:
|
||||||
|
in_r = color_in[0]
|
||||||
|
in_g = color_in[1]
|
||||||
|
in_b = color_in[2]
|
||||||
|
|
||||||
|
r_float = in_r / float(in_r_max)
|
||||||
|
g_float = in_g / float(in_g_max)
|
||||||
|
b_float = in_b / float(in_b_max)
|
||||||
|
|
||||||
|
out_r = int(r_float * out_r_max)
|
||||||
|
out_g = int(g_float * out_g_max)
|
||||||
|
out_b = int(b_float * out_b_max)
|
||||||
|
|
||||||
|
color_out = out_b + (out_g << format_out[2]) + (out_r << (format_out[2] + format_out[1]))
|
||||||
|
return color_out
|
||||||
|
|
||||||
|
def main(argv: list[str]):
|
||||||
|
argc: int = len(argv)
|
||||||
|
if argc < 4:
|
||||||
|
print_usage()
|
||||||
|
return
|
||||||
|
elif argc > 4:
|
||||||
|
print("Too many arguments!\n")
|
||||||
|
print_usage()
|
||||||
|
return
|
||||||
|
|
||||||
|
# The first argument is this file. Happens when calling python.exe.
|
||||||
|
format_in_str: str = argv[1]
|
||||||
|
format_out_str: str = argv[2]
|
||||||
|
color_str: str = argv[3]
|
||||||
|
|
||||||
|
format_in: tuple[int, int, int] = determine_format(format_in_str)
|
||||||
|
format_out: tuple[int, int, int] = determine_format(format_out_str)
|
||||||
|
color = int(color_str, 16)
|
||||||
|
|
||||||
|
result: int = convert_color(format_in, format_out, color)
|
||||||
|
formatter: str = "0x{:0" + str(total_format_bytes(format_out) * 2) + "X}"
|
||||||
|
print(formatter.format(result))
|
||||||
|
|
||||||
|
if __name__ == "__main__": main(sys.argv)
|
||||||
BIN
Minesweeper/icon.png
Normal file
|
After Width: | Height: | Size: 761 B |
56
Minesweeper/imageconv.py
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
from colorconv import determine_format, convert_color, total_format_bytes
|
||||||
|
import sys
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
|
def print_usage():
|
||||||
|
print("Usage: colorconv.py <to> <image>")
|
||||||
|
print("")
|
||||||
|
print(" <to>: The color format to convert to.")
|
||||||
|
print(" <image>: The color to convert the format of.")
|
||||||
|
print("")
|
||||||
|
print(" Color formats are formatted as their individual channels.")
|
||||||
|
print(" Ex.")
|
||||||
|
print(" r8g8b8")
|
||||||
|
print(" r5g6b5")
|
||||||
|
print("")
|
||||||
|
print(" Image data is represented as a path to an image file.")
|
||||||
|
print(" The output is printed code that represents the sprite.")
|
||||||
|
|
||||||
|
def convert_image(format_out: tuple[int, int, int], image: Image.Image) -> str:
|
||||||
|
output = "{\n"
|
||||||
|
counter = 0
|
||||||
|
size = image.size[0] * image.size[1]
|
||||||
|
pixels = image.getdata()
|
||||||
|
formatter: str = "0x{:0" + str(total_format_bytes(format_out) * 2) + "X}"
|
||||||
|
for y in range(image.size[1]):
|
||||||
|
output += " "
|
||||||
|
for x in range(image.size[0]):
|
||||||
|
num = convert_color([8, 8, 8], format_out, pixels[y * image.size[0] + x])
|
||||||
|
output += formatter.format(num)
|
||||||
|
if counter < size - 1: output += ", "
|
||||||
|
counter += 1
|
||||||
|
output += "\n"
|
||||||
|
output += "}"
|
||||||
|
return output
|
||||||
|
|
||||||
|
def main(argv: list[str]):
|
||||||
|
argc: int = len(argv)
|
||||||
|
if argc < 3:
|
||||||
|
print_usage()
|
||||||
|
return
|
||||||
|
elif argc > 3:
|
||||||
|
print("Too many arguments!\n")
|
||||||
|
print_usage()
|
||||||
|
return
|
||||||
|
|
||||||
|
# The first argument is this file. Happens when calling python.exe.
|
||||||
|
format_out_str: str = argv[1]
|
||||||
|
image_path: str = argv[2]
|
||||||
|
|
||||||
|
format_out: tuple[int, int, int] = determine_format(format_out_str)
|
||||||
|
image = Image.open(image_path).convert("RGB")
|
||||||
|
|
||||||
|
result = convert_image(format_out, image)
|
||||||
|
print(result)
|
||||||
|
|
||||||
|
if __name__ == "__main__": main(sys.argv)
|
||||||
16
Minesweeper/makefile
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# ----------------------------
|
||||||
|
# Makefile Options
|
||||||
|
# ----------------------------
|
||||||
|
|
||||||
|
NAME = MINESWEE
|
||||||
|
ICON = icon.png
|
||||||
|
DESCRIPTION = "Minesweeper by Kyle Gilbert"
|
||||||
|
COMPRESSED = NO
|
||||||
|
ARCHIVED = NO
|
||||||
|
|
||||||
|
CFLAGS = -Wall -Wextra -Oz
|
||||||
|
CXXFLAGS = -Wall -Wextra -Oz
|
||||||
|
|
||||||
|
# ----------------------------
|
||||||
|
|
||||||
|
include $(shell cedev-config --makefile)
|
||||||
BIN
Minesweeper/sprites/eight.png
Normal file
|
After Width: | Height: | Size: 164 B |
BIN
Minesweeper/sprites/five.png
Normal file
|
After Width: | Height: | Size: 160 B |
BIN
Minesweeper/sprites/flag.png
Normal file
|
After Width: | Height: | Size: 165 B |
BIN
Minesweeper/sprites/four.png
Normal file
|
After Width: | Height: | Size: 157 B |
BIN
Minesweeper/sprites/mine.png
Normal file
|
After Width: | Height: | Size: 174 B |
BIN
Minesweeper/sprites/one.png
Normal file
|
After Width: | Height: | Size: 160 B |
BIN
Minesweeper/sprites/seven.png
Normal file
|
After Width: | Height: | Size: 153 B |
BIN
Minesweeper/sprites/six.png
Normal file
|
After Width: | Height: | Size: 164 B |
BIN
Minesweeper/sprites/three.png
Normal file
|
After Width: | Height: | Size: 160 B |
BIN
Minesweeper/sprites/two.png
Normal file
|
After Width: | Height: | Size: 167 B |
66
Minesweeper/src/libext.h
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class vector
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
int _size;
|
||||||
|
T* ptr;
|
||||||
|
|
||||||
|
public:
|
||||||
|
vector()
|
||||||
|
{
|
||||||
|
_size = 0;
|
||||||
|
ptr = new T[0];
|
||||||
|
}
|
||||||
|
~vector()
|
||||||
|
{
|
||||||
|
delete[] ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
const T& at(int index) const
|
||||||
|
{
|
||||||
|
return ptr[index];
|
||||||
|
}
|
||||||
|
T& at(int index)
|
||||||
|
{
|
||||||
|
return ptr[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
void add(T item)
|
||||||
|
{
|
||||||
|
T* new_ptr = new T[_size + 1];
|
||||||
|
memcpy(new_ptr, ptr, _size * sizeof(T));
|
||||||
|
new_ptr[_size] = item;
|
||||||
|
|
||||||
|
delete[] ptr;
|
||||||
|
ptr = new_ptr;
|
||||||
|
_size++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void remove_at(int index)
|
||||||
|
{
|
||||||
|
T* new_ptr = new T[_size - 1];
|
||||||
|
memcpy(new_ptr, ptr, index * sizeof(T)); // Before
|
||||||
|
memcpy(new_ptr + index, ptr + index + 1, (_size - index) * sizeof(T)); // After
|
||||||
|
|
||||||
|
delete[] ptr;
|
||||||
|
ptr = new_ptr;
|
||||||
|
_size--;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int size() const
|
||||||
|
{
|
||||||
|
return _size;
|
||||||
|
}
|
||||||
|
|
||||||
|
const T& operator[](int index) const
|
||||||
|
{
|
||||||
|
return ptr[index];
|
||||||
|
}
|
||||||
|
T& operator[](int index)
|
||||||
|
{
|
||||||
|
return ptr[index];
|
||||||
|
}
|
||||||
|
};
|
||||||
648
Minesweeper/src/main.cpp
Normal file
@ -0,0 +1,648 @@
|
|||||||
|
#pragma region Boilerplate
|
||||||
|
|
||||||
|
#pragma region Disregard
|
||||||
|
// Removes some errors. Weird.
|
||||||
|
typedef int int24_t;
|
||||||
|
typedef unsigned int uint24_t;
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
|
#include <sys/lcd.h>
|
||||||
|
#include <sys/rtc.h>
|
||||||
|
#include <ti/getcsc.h>
|
||||||
|
#include <ti/getkey.h>
|
||||||
|
#include <ti/screen.h>
|
||||||
|
#include <ti/ui.h>
|
||||||
|
#include <ti/vars.h>
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
|
#include "libext.h"
|
||||||
|
#include "sprites.h"
|
||||||
|
|
||||||
|
// Useful macros.
|
||||||
|
#define VRAM_START ((uint16_t*)0xD40000)
|
||||||
|
#define SCREEN_WIDTH 320
|
||||||
|
#define SCREEN_HEIGHT 240
|
||||||
|
#define HEADER_SIZE 30
|
||||||
|
#define VRAM_SIZE (SCREEN_WIDTH * SCREEN_HEIGHT)
|
||||||
|
|
||||||
|
#define GET_TILE_INDEX(c, r) ((r) * game.columns + (c))
|
||||||
|
#define GET_TILE_AT(c, r) (tiles[(r) * game.columns + (c)])
|
||||||
|
|
||||||
|
enum DirectionType : uint8_t
|
||||||
|
{
|
||||||
|
DIR_UP,
|
||||||
|
DIR_LEFT,
|
||||||
|
DIR_RIGHT,
|
||||||
|
DIR_DOWN
|
||||||
|
};
|
||||||
|
struct GameInfo
|
||||||
|
{
|
||||||
|
uint8_t columns = 16; // Width
|
||||||
|
uint8_t rows = 12; // Height
|
||||||
|
uint16_t mines = 48;
|
||||||
|
};
|
||||||
|
struct ScreenInfo
|
||||||
|
{
|
||||||
|
int8_t scroll_x = 0;
|
||||||
|
int8_t scroll_y = 0;
|
||||||
|
|
||||||
|
int8_t selection_x = 0;
|
||||||
|
int8_t selection_y = 0;
|
||||||
|
};
|
||||||
|
enum TileFlags : uint8_t
|
||||||
|
{
|
||||||
|
TILE_NO_FLAGS = 0x00,
|
||||||
|
TILE_IS_MINE = 0x01,
|
||||||
|
TILE_REVEALED = 0x02,
|
||||||
|
TILE_FLAGGED = 0x04
|
||||||
|
};
|
||||||
|
struct TileInfo
|
||||||
|
{
|
||||||
|
TileFlags flags = TILE_NO_FLAGS;
|
||||||
|
uint8_t mines_around = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
GameInfo game;
|
||||||
|
ScreenInfo screen;
|
||||||
|
TileInfo* tiles = nullptr;
|
||||||
|
int tile_count;
|
||||||
|
bool lost = false, won = false;
|
||||||
|
int remaining_tiles;
|
||||||
|
|
||||||
|
void initialize()
|
||||||
|
{
|
||||||
|
game = GameInfo();
|
||||||
|
screen = ScreenInfo();
|
||||||
|
|
||||||
|
srand(rtc_Time());
|
||||||
|
}
|
||||||
|
void setup_tiles()
|
||||||
|
{
|
||||||
|
if (tiles != nullptr) delete[] tiles;
|
||||||
|
tile_count = game.columns * game.rows;
|
||||||
|
tiles = new TileInfo[tile_count];
|
||||||
|
|
||||||
|
if (game.mines >= tile_count) game.mines = tile_count;
|
||||||
|
remaining_tiles = tile_count - game.mines;
|
||||||
|
|
||||||
|
// Randomize mine positions.
|
||||||
|
for (int i = 0; i < game.mines; i++)
|
||||||
|
{
|
||||||
|
_choose_pos:
|
||||||
|
int mine_pos = rand() % tile_count;
|
||||||
|
|
||||||
|
// Using = instead of & and | because we're setting up for the first time.
|
||||||
|
TileInfo& tile = tiles[mine_pos];
|
||||||
|
if (tile.flags & TILE_IS_MINE) goto _choose_pos; // Mine already there, try again.
|
||||||
|
tile.flags = TILE_IS_MINE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Another loop. Calculate the amount of mines around each tile.
|
||||||
|
for (int r = 0; r < game.columns; r++)
|
||||||
|
{
|
||||||
|
for (int c = 0; c < game.rows; c++)
|
||||||
|
{
|
||||||
|
TileInfo& tile = GET_TILE_AT(r, c);
|
||||||
|
if (tile.flags & TILE_IS_MINE) continue; // This is a mine, we know what that means.
|
||||||
|
|
||||||
|
int adjacent_rows[8] =
|
||||||
|
{
|
||||||
|
r - 1,
|
||||||
|
r - 1,
|
||||||
|
r,
|
||||||
|
r + 1,
|
||||||
|
r + 1,
|
||||||
|
r + 1,
|
||||||
|
r,
|
||||||
|
r - 1
|
||||||
|
};
|
||||||
|
int adjacent_columns[8] =
|
||||||
|
{
|
||||||
|
c,
|
||||||
|
c + 1,
|
||||||
|
c + 1,
|
||||||
|
c + 1,
|
||||||
|
c,
|
||||||
|
c - 1,
|
||||||
|
c - 1,
|
||||||
|
c - 1
|
||||||
|
};
|
||||||
|
for (int i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
int ind_row = adjacent_rows[i],
|
||||||
|
ind_column = adjacent_columns[i];
|
||||||
|
if (ind_row < 0 || ind_row >= game.columns ||
|
||||||
|
ind_column < 0 || ind_column >= game.rows) continue; // Tile is hugging the side, ignore this one.
|
||||||
|
TileInfo& adjTile = GET_TILE_AT(ind_row, ind_column);
|
||||||
|
if (adjTile.flags & TILE_IS_MINE) tile.mines_around++; // Mine around here.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Colors and Formatting
|
||||||
|
constexpr uint16_t background_color = 0xB5D6; // #BDBDBD
|
||||||
|
|
||||||
|
constexpr uint16_t tile_shadow_color = 0x7BEF;
|
||||||
|
constexpr uint16_t tile_highlight_color = 0xFFFF;
|
||||||
|
constexpr uint8_t tile_size = 20;
|
||||||
|
constexpr uint8_t tile_3d_effect_size = 3;
|
||||||
|
|
||||||
|
constexpr uint8_t arrow_size = 14;
|
||||||
|
constexpr uint8_t arrow_distance = 10;
|
||||||
|
constexpr uint16_t arrow_color = 0x000;
|
||||||
|
|
||||||
|
constexpr uint16_t selection_color = 0xF800;
|
||||||
|
constexpr uint16_t win_selection_color = 0x07E0;
|
||||||
|
constexpr uint16_t selection_width = 3;
|
||||||
|
|
||||||
|
void draw_sprite(int row, int column, uint16_t* sprite, int sprite_width, int sprite_height)
|
||||||
|
{
|
||||||
|
uint16_t pos_x = row + screen.scroll_x,
|
||||||
|
pos_y = column + screen.scroll_y;
|
||||||
|
|
||||||
|
int pix_x = pos_x * tile_size,
|
||||||
|
pix_y = pos_y * tile_size;
|
||||||
|
|
||||||
|
if (pix_x < 0 || pix_x >= SCREEN_WIDTH ||
|
||||||
|
pix_y < 0 || pix_y >= SCREEN_HEIGHT) return; // Sprite is off-screen.
|
||||||
|
|
||||||
|
// Find middle of tile and offset by sprite size.
|
||||||
|
pix_x += (tile_size - sprite_width) / 2;
|
||||||
|
pix_y += (tile_size - sprite_height) / 2;
|
||||||
|
|
||||||
|
uint16_t* vram = VRAM_START + pix_y * SCREEN_WIDTH + pix_x;
|
||||||
|
for (int y = 0; y < sprite_height; y++)
|
||||||
|
{
|
||||||
|
for (int x = 0; x < sprite_width; x++)
|
||||||
|
{
|
||||||
|
memcpy(vram, sprite, sprite_width * sizeof(uint16_t));
|
||||||
|
}
|
||||||
|
vram += SCREEN_WIDTH;
|
||||||
|
sprite += sprite_width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void render_background()
|
||||||
|
{
|
||||||
|
// Can't use memset!
|
||||||
|
// The upper byte gets replaced by the lower one.
|
||||||
|
|
||||||
|
// Draw sequential lines to make things faster.
|
||||||
|
uint16_t* vram = VRAM_START;
|
||||||
|
for (int x = 0; x < SCREEN_WIDTH; x++) vram[x] = background_color;
|
||||||
|
|
||||||
|
for (int y = 1; y < SCREEN_HEIGHT; y++)
|
||||||
|
{
|
||||||
|
memcpy(vram + SCREEN_WIDTH, vram, SCREEN_WIDTH * sizeof(uint16_t));
|
||||||
|
vram += SCREEN_WIDTH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void render_tile_3d_effect(int row, int column)
|
||||||
|
{
|
||||||
|
uint16_t pos_x = row + screen.scroll_x,
|
||||||
|
pos_y = column + screen.scroll_y;
|
||||||
|
|
||||||
|
int pix_x = pos_x * tile_size,
|
||||||
|
pix_y = pos_y * tile_size;
|
||||||
|
|
||||||
|
// First render the highlight with two rectangles.
|
||||||
|
uint16_t* vram = VRAM_START + pix_y * SCREEN_WIDTH + pix_x + tile_3d_effect_size;
|
||||||
|
for (int x = 0; x < tile_size - tile_3d_effect_size; x++) vram[x] = tile_highlight_color;
|
||||||
|
|
||||||
|
// Copy line for horizontal part.
|
||||||
|
for (int y = 0; y < tile_3d_effect_size - 1; y++)
|
||||||
|
{
|
||||||
|
memcpy(vram + SCREEN_WIDTH, vram, (tile_size - tile_3d_effect_size) * sizeof(uint16_t));
|
||||||
|
vram += SCREEN_WIDTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy line for vertical part.
|
||||||
|
uint16_t* vram_side = vram + (tile_size - tile_3d_effect_size * 2);
|
||||||
|
for (int y = 0; y < tile_size - tile_3d_effect_size * 2; y++)
|
||||||
|
{
|
||||||
|
memcpy(vram_side + SCREEN_WIDTH, vram_side, tile_3d_effect_size * sizeof(uint16_t));
|
||||||
|
vram_side += SCREEN_WIDTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now render the shadow with two rectangles.
|
||||||
|
vram = VRAM_START + (pix_y + tile_size - tile_3d_effect_size) * SCREEN_WIDTH + pix_x + tile_3d_effect_size - 3;
|
||||||
|
for (int x = 0; x < tile_size - 3; x++) vram[x] = tile_shadow_color;
|
||||||
|
|
||||||
|
// Copy line for horizontal part.
|
||||||
|
for (int y = 0; y < tile_3d_effect_size - 1; y++)
|
||||||
|
{
|
||||||
|
memcpy(vram + SCREEN_WIDTH, vram, tile_size * sizeof(uint16_t));
|
||||||
|
vram += SCREEN_WIDTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy line for vertical part.
|
||||||
|
vram_side = vram - (tile_3d_effect_size - 1) * SCREEN_WIDTH;
|
||||||
|
for (int y = 0; y < tile_size - tile_3d_effect_size * 2; y++)
|
||||||
|
{
|
||||||
|
memcpy(vram_side - SCREEN_WIDTH, vram_side, tile_3d_effect_size * sizeof(uint16_t));
|
||||||
|
vram_side -= SCREEN_WIDTH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void render_tile_selection(int row, int column, uint16_t color)
|
||||||
|
{
|
||||||
|
uint16_t pos_x = row + screen.scroll_x,
|
||||||
|
pos_y = column + screen.scroll_y;
|
||||||
|
|
||||||
|
int pix_x = pos_x * tile_size,
|
||||||
|
pix_y = pos_y * tile_size;
|
||||||
|
|
||||||
|
if (pix_x < 0 || pix_x >= SCREEN_WIDTH ||
|
||||||
|
pix_y < 0 || pix_y >= SCREEN_HEIGHT) return; // Selection is off-screen.
|
||||||
|
|
||||||
|
// Render selection with three rectangles.
|
||||||
|
uint16_t* vram = VRAM_START + pix_y * SCREEN_WIDTH + pix_x;
|
||||||
|
for (int x = 0; x < tile_size; x++) vram[x] = color;
|
||||||
|
|
||||||
|
// Copy line for top part.
|
||||||
|
for (int y = 1; y < selection_width; y++)
|
||||||
|
{
|
||||||
|
memcpy(vram + SCREEN_WIDTH, vram, tile_size * sizeof(uint16_t));
|
||||||
|
vram += SCREEN_WIDTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy line for left part.
|
||||||
|
uint16_t* vram_side = vram + SCREEN_WIDTH;
|
||||||
|
for (int y = 0; y < tile_size - selection_width * 2; y++)
|
||||||
|
{
|
||||||
|
memcpy(vram_side, vram, selection_width * sizeof(uint16_t));
|
||||||
|
vram_side += SCREEN_WIDTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy line for right part.
|
||||||
|
vram_side = vram + SCREEN_WIDTH + (tile_size - selection_width);
|
||||||
|
for (int y = 0; y < tile_size - selection_width * 2; y++)
|
||||||
|
{
|
||||||
|
memcpy(vram_side, vram, selection_width * sizeof(uint16_t));
|
||||||
|
vram_side += SCREEN_WIDTH;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy line for bottom part.
|
||||||
|
uint16_t* new_vram = vram + SCREEN_WIDTH * (tile_size - selection_width * 2 + 1);
|
||||||
|
for (int y = 0; y < selection_width; y++)
|
||||||
|
{
|
||||||
|
memcpy(new_vram, vram, tile_size * sizeof(uint16_t));
|
||||||
|
new_vram += SCREEN_WIDTH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void render_tile(int row, int column)
|
||||||
|
{
|
||||||
|
constexpr int tiles_visible_x = SCREEN_WIDTH / tile_size,
|
||||||
|
tiles_visible_y = SCREEN_HEIGHT / tile_size;
|
||||||
|
|
||||||
|
const TileInfo& tile = GET_TILE_AT(row, column);
|
||||||
|
|
||||||
|
int16_t pos_x = row + screen.scroll_x,
|
||||||
|
pos_y = column + screen.scroll_y;
|
||||||
|
|
||||||
|
if (pos_x < 0 || pos_x >= tiles_visible_x ||
|
||||||
|
pos_y < 0 || pos_y >= tiles_visible_y) return; // Off screen.
|
||||||
|
|
||||||
|
// No need to render the tile background because it's
|
||||||
|
// just the regular background.
|
||||||
|
if (tile.flags & TILE_REVEALED)
|
||||||
|
{
|
||||||
|
if (tile.flags & TILE_IS_MINE)
|
||||||
|
{
|
||||||
|
// Uh oh.
|
||||||
|
draw_sprite(row, column, (uint16_t*)sprite_mine, 14, 14);
|
||||||
|
}
|
||||||
|
else if (tile.mines_around > 0)
|
||||||
|
{
|
||||||
|
// Draw number icon.
|
||||||
|
uint16_t* sprite;
|
||||||
|
switch (tile.mines_around)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
sprite = (uint16_t*)sprite_one;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
sprite = (uint16_t*)sprite_two;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
sprite = (uint16_t*)sprite_three;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
sprite = (uint16_t*)sprite_four;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 5:
|
||||||
|
sprite = (uint16_t*)sprite_five;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
sprite = (uint16_t*)sprite_six;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 7:
|
||||||
|
sprite = (uint16_t*)sprite_seven;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 8:
|
||||||
|
sprite = (uint16_t*)sprite_eight;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
draw_sprite(row, column, sprite, 14, 14);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
render_tile_3d_effect(row, column);
|
||||||
|
if (tile.flags & TILE_FLAGGED)
|
||||||
|
{
|
||||||
|
draw_sprite(row, column, (uint16_t*)sprite_flag, 12, 12);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we lost, show all the mines.
|
||||||
|
if (lost && (tile.flags & TILE_IS_MINE))
|
||||||
|
{
|
||||||
|
draw_sprite(row, column, (uint16_t*)sprite_mine, 14, 14);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void render_arrow(DirectionType dir)
|
||||||
|
{
|
||||||
|
uint16_t* vram = VRAM_START;
|
||||||
|
switch (dir)
|
||||||
|
{
|
||||||
|
case DIR_UP:
|
||||||
|
vram += SCREEN_WIDTH / 2 + arrow_distance * SCREEN_WIDTH;
|
||||||
|
for (int y = 1; y <= arrow_size; y++)
|
||||||
|
{
|
||||||
|
vram += y % 2 == 1 ? SCREEN_WIDTH - 1 : SCREEN_WIDTH;
|
||||||
|
for (int x = 0; x < 2 * ceil(y / 2.0); x++) vram[x] = arrow_color;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DIR_LEFT:
|
||||||
|
vram += SCREEN_WIDTH * SCREEN_HEIGHT / 2 + arrow_distance;
|
||||||
|
for (int x = 1; x <= arrow_size; x++)
|
||||||
|
{
|
||||||
|
vram += x % 2 == 1 ? -SCREEN_WIDTH + 1 : 1;
|
||||||
|
for (int y = 0; y < 2 * ceil(x / 2.0); y++) vram[SCREEN_WIDTH * y] = arrow_color;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DIR_RIGHT:
|
||||||
|
vram += SCREEN_WIDTH * SCREEN_HEIGHT / 2 + (SCREEN_WIDTH - arrow_distance);
|
||||||
|
for (int x = 1; x <= arrow_size; x++)
|
||||||
|
{
|
||||||
|
vram -= x % 2 == 1 ? SCREEN_WIDTH + 1 : 1;
|
||||||
|
for (int y = 0; y < 2 * ceil(x / 2.0); y++) vram[SCREEN_WIDTH * y] = arrow_color;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DIR_DOWN:
|
||||||
|
vram += SCREEN_WIDTH / 2 + (SCREEN_HEIGHT - arrow_distance) * SCREEN_WIDTH;
|
||||||
|
for (int y = 1; y <= arrow_size; y++)
|
||||||
|
{
|
||||||
|
vram -= y % 2 == 1 ? SCREEN_WIDTH + 1 : SCREEN_WIDTH;
|
||||||
|
for (int x = 0; x < 2 * ceil(y / 2.0); x++) vram[x] = arrow_color;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default: return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void full_render()
|
||||||
|
{
|
||||||
|
constexpr int tiles_visible_x = SCREEN_WIDTH / tile_size,
|
||||||
|
tiles_visible_y = SCREEN_HEIGHT / tile_size;
|
||||||
|
|
||||||
|
render_background();
|
||||||
|
for (int r = 0; r < game.columns; r++)
|
||||||
|
{
|
||||||
|
for (int c = 0; c < game.rows; c++)
|
||||||
|
{
|
||||||
|
render_tile(r, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
render_tile_selection(screen.selection_x, screen.selection_y, selection_color);
|
||||||
|
|
||||||
|
int min_tile_visible_x = -screen.scroll_x,
|
||||||
|
max_tile_visible_x = tiles_visible_x - screen.scroll_x;
|
||||||
|
int min_tile_visible_y = -screen.scroll_y,
|
||||||
|
max_tile_visible_y = tiles_visible_y - screen.scroll_y;
|
||||||
|
|
||||||
|
if (min_tile_visible_y > 0) render_arrow(DIR_UP);
|
||||||
|
if (min_tile_visible_x > 0) render_arrow(DIR_LEFT);
|
||||||
|
if (max_tile_visible_x < game.columns) render_arrow(DIR_RIGHT);
|
||||||
|
if (max_tile_visible_y < game.rows) render_arrow(DIR_DOWN);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool check_completion()
|
||||||
|
{
|
||||||
|
return remaining_tiles == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void reveal_tile(int row, int column)
|
||||||
|
{
|
||||||
|
// We have a vector of tile pointers. we loop until every tile in the vector
|
||||||
|
// is revealed. if it's revealed, remove it, otherwise add its neighbors and repeat.
|
||||||
|
// This is double its possible size because I don't want to use additional memory for
|
||||||
|
// storing the row and column for the tile.
|
||||||
|
|
||||||
|
TileInfo& tile = GET_TILE_AT(row, column);
|
||||||
|
if (tile.flags & TILE_IS_MINE)
|
||||||
|
{
|
||||||
|
if (tile.flags & TILE_FLAGGED) return; // Clicked on a mine, but it was flagged already. Don't show.
|
||||||
|
|
||||||
|
// Otherwise, licked on a mine, we have lost.
|
||||||
|
lost = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (tile.flags & TILE_REVEALED) return; // Already revealed.
|
||||||
|
|
||||||
|
vector<int> tile_rows = vector<int>(),
|
||||||
|
tile_columns = vector<int>();
|
||||||
|
tile_rows.add(row);
|
||||||
|
tile_columns.add(column);
|
||||||
|
while (tile_rows.size() > 0)
|
||||||
|
{
|
||||||
|
int active_row = tile_rows.at(0),
|
||||||
|
active_column = tile_columns.at(0);
|
||||||
|
TileInfo& active = GET_TILE_AT(active_row, active_column);
|
||||||
|
if ((active.flags & TILE_REVEALED) ||
|
||||||
|
(active.flags & TILE_FLAGGED))
|
||||||
|
{
|
||||||
|
// Already revealed or flagged and can't reveal, remove.
|
||||||
|
tile_rows.remove_at(0);
|
||||||
|
tile_columns.remove_at(0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (active.flags & TILE_IS_MINE)
|
||||||
|
{
|
||||||
|
// Mine, so just reveal.
|
||||||
|
active.flags = (TileFlags)(active.flags | TILE_REVEALED);
|
||||||
|
tile_rows.remove_at(0);
|
||||||
|
tile_columns.remove_at(0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get neighbors and add them here too.
|
||||||
|
// If this current tile is a zero tile, reveal all tiles around it.
|
||||||
|
// Otherwise, only reveal zero tiles nearby, don't reveal other
|
||||||
|
// non-zero tiles.
|
||||||
|
int adjacent_rows[8] =
|
||||||
|
{
|
||||||
|
active_row - 1,
|
||||||
|
active_row - 1,
|
||||||
|
active_row,
|
||||||
|
active_row + 1,
|
||||||
|
active_row + 1,
|
||||||
|
active_row + 1,
|
||||||
|
active_row,
|
||||||
|
active_row - 1
|
||||||
|
};
|
||||||
|
int adjacent_columns[8] =
|
||||||
|
{
|
||||||
|
active_column,
|
||||||
|
active_column + 1,
|
||||||
|
active_column + 1,
|
||||||
|
active_column + 1,
|
||||||
|
active_column,
|
||||||
|
active_column - 1,
|
||||||
|
active_column - 1,
|
||||||
|
active_column - 1,
|
||||||
|
};
|
||||||
|
for (int i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
int ind_row = adjacent_rows[i],
|
||||||
|
ind_column = adjacent_columns[i];
|
||||||
|
if (ind_row < 0 || ind_row >= game.columns ||
|
||||||
|
ind_column < 0 || ind_column >= game.rows) continue; // Tile is hugging the side, ignore this one.
|
||||||
|
TileInfo& adjTile = GET_TILE_AT(ind_row, ind_column);
|
||||||
|
|
||||||
|
if (adjTile.flags & TILE_IS_MINE) continue; // Tile is mine, ignore.
|
||||||
|
if (adjTile.flags & TILE_REVEALED) continue; // Already revealed, ignore.
|
||||||
|
if (active.mines_around > 0 && adjTile.mines_around > 0) continue; // Non-zero tile can't reveal other non-zero tiles, ignore.
|
||||||
|
tile_rows.add(ind_row);
|
||||||
|
tile_columns.add(ind_column);
|
||||||
|
}
|
||||||
|
|
||||||
|
active.flags = (TileFlags)(active.flags | TILE_REVEALED);
|
||||||
|
tile_rows.remove_at(0);
|
||||||
|
tile_columns.remove_at(0);
|
||||||
|
remaining_tiles--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void flag_tile(int row, int column)
|
||||||
|
{
|
||||||
|
TileInfo& tile = GET_TILE_AT(row, column);
|
||||||
|
if (tile.flags & TILE_REVEALED) return; // Already revealed, ignore.
|
||||||
|
tile.flags = (TileFlags)(tile.flags ^ TILE_FLAGGED);
|
||||||
|
}
|
||||||
|
|
||||||
|
void display_win()
|
||||||
|
{
|
||||||
|
// Highlight mines in green.
|
||||||
|
for (int r = 0; r < game.columns; r++)
|
||||||
|
{
|
||||||
|
for (int c = 0; c < game.rows; c++)
|
||||||
|
{
|
||||||
|
TileInfo& tile = GET_TILE_AT(r, c);
|
||||||
|
if (!(tile.flags & TILE_IS_MINE)) continue; // Ignore non-mines.
|
||||||
|
render_tile_selection(r, c, win_selection_color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
// TODO: only full render once. check for empty space and fill that when scrolling.
|
||||||
|
// TODO: replace the check for out-of-bounds cells with a more optimized for loop.
|
||||||
|
// this should probably be for 2.0, not this one.
|
||||||
|
|
||||||
|
// Initialize
|
||||||
|
initialize();
|
||||||
|
setup_tiles();
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
full_render();
|
||||||
|
|
||||||
|
if (check_completion() || won)
|
||||||
|
{
|
||||||
|
won = true;
|
||||||
|
display_win();
|
||||||
|
}
|
||||||
|
|
||||||
|
_getkey:
|
||||||
|
uint16_t key = os_GetKey();
|
||||||
|
|
||||||
|
switch (key)
|
||||||
|
{
|
||||||
|
case k_Up:
|
||||||
|
if (lost || won) goto _getkey; // Lost, can't do anything.
|
||||||
|
screen.scroll_y++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case k_Down:
|
||||||
|
if (lost || won) goto _getkey; // Lost, can't do anything.
|
||||||
|
screen.scroll_y--;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case k_Right:
|
||||||
|
if (lost || won) goto _getkey; // Lost, can't do anything.
|
||||||
|
screen.scroll_x--;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case k_Left:
|
||||||
|
if (lost || won) goto _getkey; // Lost, can't do anything.
|
||||||
|
screen.scroll_x++;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case k_4:
|
||||||
|
if (lost || won) goto _getkey; // Lost, can't do anything.
|
||||||
|
screen.selection_x--;
|
||||||
|
if (screen.selection_x < 0) screen.selection_x = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case k_6:
|
||||||
|
if (lost || won) goto _getkey; // Lost, can't do anything.
|
||||||
|
screen.selection_x++;
|
||||||
|
if (screen.selection_x >= game.columns) screen.selection_x = game.columns - 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case k_8:
|
||||||
|
if (lost || won) goto _getkey; // Lost, can't do anything.
|
||||||
|
screen.selection_y--;
|
||||||
|
if (screen.selection_y < 0) screen.selection_y = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case k_2:
|
||||||
|
if (lost || won) goto _getkey; // Lost, can't do anything.
|
||||||
|
screen.selection_y++;
|
||||||
|
if (screen.selection_y >= game.rows) screen.selection_y = game.rows - 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case k_Enter:
|
||||||
|
if (lost || won) goto _getkey; // Lost, can't do anything.
|
||||||
|
reveal_tile(screen.selection_x, screen.selection_y);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case k_DecPnt:
|
||||||
|
if (lost || won) goto _getkey; // Lost, can't do anything.
|
||||||
|
flag_tile(screen.selection_x, screen.selection_y);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case k_Clear: return 0; // End.
|
||||||
|
default: goto _getkey; // Don't re-render if we press the wrong key.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
162
Minesweeper/src/sprites.cpp
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
#include "sprites.h"
|
||||||
|
|
||||||
|
const uint16_t sprite_flag[144] = {
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xF800, 0xF800, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xF800, 0xF800, 0xF800, 0xF800, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xF800, 0xF800, 0xF800, 0xF800, 0xF800, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xF800, 0xF800, 0xF800, 0xF800, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xF800, 0xF800, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0x0000, 0x0000, 0x0000, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t sprite_mine[196] = {
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0xB5D6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB5D6, 0x0000, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0xB5D6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB5D6, 0x0000, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6
|
||||||
|
};
|
||||||
|
|
||||||
|
const uint16_t sprite_one[196] = {
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x001E, 0x001E, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x001E, 0x001E, 0x001E, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x001E, 0x001E, 0x001E, 0x001E, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x001E, 0x001E, 0x001E, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x001E, 0x001E, 0x001E, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x001E, 0x001E, 0x001E, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x001E, 0x001E, 0x001E, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0x001E, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6
|
||||||
|
};
|
||||||
|
const uint16_t sprite_two[196] = {
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x03E0, 0x03E0, 0x03E0, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x03E0, 0x03E0, 0x03E0, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x03E0, 0x03E0, 0x03E0, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0x03E0, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6
|
||||||
|
};
|
||||||
|
const uint16_t sprite_three[196] = {
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xF000, 0xF000, 0xF000, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xF000, 0xF000, 0xF000, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xF000, 0xF000, 0xF000, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xF000, 0xF000, 0xF000, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xF000, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6
|
||||||
|
};
|
||||||
|
const uint16_t sprite_four[196] = {
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x000F, 0x000F, 0x000F, 0xB5D6, 0x000F, 0x000F, 0x000F, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x000F, 0x000F, 0x000F, 0xB5D6, 0x000F, 0x000F, 0x000F, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0x000F, 0x000F, 0x000F, 0xB5D6, 0xB5D6, 0x000F, 0x000F, 0x000F, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0x000F, 0x000F, 0x000F, 0xB5D6, 0xB5D6, 0x000F, 0x000F, 0x000F, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0x000F, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x000F, 0x000F, 0x000F, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x000F, 0x000F, 0x000F, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x000F, 0x000F, 0x000F, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x000F, 0x000F, 0x000F, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6
|
||||||
|
};
|
||||||
|
const uint16_t sprite_five[196] = {
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x7800, 0x7800, 0x7800, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x7800, 0x7800, 0x7800, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x7800, 0x7800, 0x7800, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x7800, 0x7800, 0x7800, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0x7800, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6
|
||||||
|
};
|
||||||
|
const uint16_t sprite_six[196] = {
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x03EF, 0x03EF, 0x03EF, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x03EF, 0x03EF, 0x03EF, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x03EF, 0x03EF, 0x03EF, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x03EF, 0x03EF, 0x03EF, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x03EF, 0x03EF, 0x03EF, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x03EF, 0x03EF, 0x03EF, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0x03EF, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6
|
||||||
|
};
|
||||||
|
const uint16_t sprite_seven[196] = {
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0x0000, 0x0000, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0x0000, 0x0000, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0x0000, 0x0000, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0x0000, 0x0000, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0x0000, 0x0000, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0x0000, 0x0000, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0x0000, 0x0000, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x0000, 0x0000, 0x0000, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6
|
||||||
|
};
|
||||||
|
const uint16_t sprite_eight[196] = {
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x7BEF, 0x7BEF, 0x7BEF, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x7BEF, 0x7BEF, 0x7BEF, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x7BEF, 0x7BEF, 0x7BEF, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x7BEF, 0x7BEF, 0x7BEF, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x7BEF, 0x7BEF, 0x7BEF, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x7BEF, 0x7BEF, 0x7BEF, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x7BEF, 0x7BEF, 0x7BEF, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0x7BEF, 0x7BEF, 0x7BEF, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0x7BEF, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6,
|
||||||
|
0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6, 0xB5D6
|
||||||
|
};
|
||||||
14
Minesweeper/src/sprites.h
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
extern const uint16_t sprite_flag[144]; // This one is 12x12!
|
||||||
|
extern const uint16_t sprite_mine[196];
|
||||||
|
|
||||||
|
extern const uint16_t sprite_one[196];
|
||||||
|
extern const uint16_t sprite_two[196];
|
||||||
|
extern const uint16_t sprite_three[196];
|
||||||
|
extern const uint16_t sprite_four[196];
|
||||||
|
extern const uint16_t sprite_five[196];
|
||||||
|
extern const uint16_t sprite_six[196];
|
||||||
|
extern const uint16_t sprite_seven[196];
|
||||||
|
extern const uint16_t sprite_eight[196];
|
||||||
14
README.md
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# Computer Studies Projects
|
||||||
|
|
||||||
|
Just a few assignments I made for my 12th grade computer studies class. You get to pick your projects, so these are mine.
|
||||||
|
|
||||||
|
I have about 1-2 weeks for each project. Check the Git commits for specific dates or whatever.
|
||||||
|
|
||||||
|
## Projects
|
||||||
|
|
||||||
|
- Minesweeper/
|
||||||
|
- I made Minesweeper for the TI-84 calculator. I tried to be somewhat true to the original Windows one.
|
||||||
|
- 2 is down, 4 is left, 6 is right, 8 is up for your selection. Enter is to mine and the decimal point places a flag. The arrow keys move the board.
|
||||||
|
- No additional libraries were used, only the built in TI libraries and the [TI CE toolchain](https://github.com/CE-Programming/toolchain).
|
||||||
|
- Doesn't run great. It uses 16-bit color mode, so the graphics are somewhat slow to render. I attempted to find the way to switch to 4-bit color mode, but I didn't find enough useful info (the best I've found so far is to dissect the GraphX assembly code). Still runs decent though, I've made as many optimizations as I easily could with the renderer, and everything else is fast.
|
||||||
|
- **WARNING**: This one can't be built without reconfiguring the `.clangd` file to include the path to the toolchain.
|
||||||