DONE
This commit is contained in:
Julia 2024-05-19 01:56:14 -05:00
parent 1a84049b1e
commit 73597a9ac0
25 changed files with 105 additions and 82 deletions

View file

@ -6,7 +6,7 @@ from pathlib import Path
GCC = "gcc"
ARGS = "-fdiagnostics-color -pthread -Wall -std=c17 -pedantic -g"
ARGS = "-fdiagnostics-color -pthread -Wall -std=c17 -pedantic -Os"
SOURCE_DIR = Path("source/")

File diff suppressed because one or more lines are too long

View file

@ -1 +1 @@
["7d30e573f96a566ed9510833b95d5520", "5ce28b2bf9d7c5750ea290f80fbd1264", "f315479de287d3cccdfa665c1e8c58bd", "0d65896ce70d098bdf4cb3587ca74508", "72e1b62b85eac654ed094a8ecf009416", "cd22e396133a64303ecae95280f8ba1a", "7d7451ae7d88f4d1f84055180f9e84a7"]
["7d7451ae7d88f4d1f84055180f9e84a7", "7d30e573f96a566ed9510833b95d5520", "f6611a0f07f78cc4fd52df267e0d3d25", "f315479de287d3cccdfa665c1e8c58bd", "0eaec40fe47b9cb31ff5a70f7bfee15a", "ec4912a725a2bc606bd76ba34159435c", "184f2c12e4c8c2365b4e6ca95df9be16", "08bf0c5c8dd2f8b3842cfc802719a95c", "29f6d19bcc5a1897b220a192ef6fc3cc", "1d88301163b019760c3dc8396ce2aa4b", "0d65896ce70d098bdf4cb3587ca74508", "cd22e396133a64303ecae95280f8ba1a", "9f0597e7cacc7c918163affc5f3d9841", "72e1b62b85eac654ed094a8ecf009416"]

View file

@ -1 +1 @@
["dd2f269c19f28201dce9133ab27198af"]
["b0b3fe164a3dd9c9fac4a4df58f4eaa1"]

BIN
debug.exe

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

0
rewritesrc/silly.zig Normal file
View file

View file

@ -1,14 +0,0 @@
_,_ _,_
}\>' ``'-./\.-''` '</{
}\> ,-''``''-. </{
}\> ,' `. </{
}\/ /\ /\ \/{
} ( /__',( __\ )\{
,;' ) \|^ | `|^ |/ ( \{
}/ /_[],`' `',[]_\ \{
}/ ( )\`-.`..-'/( ) \{
`''--\(_.-'/\'-._)/--''`
\ /L]\ /
;',_/ \_,';
'.'',__,''.'
\_.' '._/

View file

@ -118,11 +118,9 @@ usize TerminalPrint(struct Terminal *term)
usize len = 7;
memcpy(term->str, "\x1b[H\x1b[0m", 7);
usize i = 0;
struct Char4 *ch4 = term->buf;
for (usize y = 0; y < term->hgt; y++) {
for (usize x = 0; x < term->wid; x++, i++) {
struct Char4 *ch4 = &term->buf[i];
for (usize x = 0; x < term->wid; x++, ch4++) {
// DEBUG
if (ch4->ch == 0)
ch4->ch = '#';
@ -136,3 +134,8 @@ usize TerminalPrint(struct Terminal *term)
term->str[len] = 0;
return len;
}
struct Char4 *TerminalGet(struct Terminal *term, usize x, usize y)
{
return term->buf + term->wid * y + x;
}

View file

@ -30,3 +30,5 @@ bool CreateTerminal(struct Terminal *term, usize wid, usize hgt);
void FreeTerminal(struct Terminal *term);
usize TerminalPrint(struct Terminal *term);
struct Char4 *TerminalGet(struct Terminal *term, usize x, usize y);

View file

@ -1,5 +1,6 @@
#include "fumotris.h"
#include <stdlib.h>
#include <string.h>
struct Fumotris {
@ -28,23 +29,30 @@ void shuffle(struct Fumotris *fumo)
}
}
void check_clear()
bool check_clear(struct Tetra *board, usize y)
{
for (usize x = 0; x < board->wid; x++) {
if (board->blks[board->wid * y + x] == 0)
return false;
}
return true;
}
void shift_down(struct Tetra *board, usize y)
{
memmove(board->blks + board->wid, board->blks, board->wid * y);
}
void place(struct Fumotris *fumo)
{
TetraOverlay(&fumo->piece, &fumo->board);
usize lines_cleared = fumo->piece.hgt;
usize lines_cleared = 0;
for (usize y = fumo->piece.y; y < fumo->piece.y + fumo->piece.hgt; y++) {
for (usize x = 0; x < fumo->board.wid; x++) {
if (fumo->board.blks[fumo->board.wid * y + x] == 0) {
lines_cleared -= 1;
break;
}
if (check_clear(&fumo->board, y)) {
lines_cleared += 1;
shift_down(&fumo->board, y);
}
}
@ -66,7 +74,25 @@ void FumotrisStart(struct Instance *inst, struct Fumotris *fumo)
{
ControllerBindMulti(&inst->ctrl, BINDS_N, CONTROLS, CODES, TYPES);
CreateTerminal(&fumo->term, 20, 20);
CreateTerminal(&fumo->term, 64, 26);
FILE *file;
file = fopen("fumo.txt", "r");
if (file) {
signed char ch;
usize x = 0;
usize y = 0;
while ((ch = getc(file)) != EOF) {
if (ch == '\n') {
x = 0;
y += 1;
continue;
}
fumo->term.buf[fumo->term.wid * y + x++] = (struct Char4) { .ch = ch, .color.fg = 15 };
}
fclose(file);
}
for (usize i = 0; i < 7; i++)
fumo->bag[i] = templates[i];
@ -120,9 +146,11 @@ nsec FumotrisFall(struct Instance *inst, struct Fumotris *fumo)
void FumotrisDraw(struct Instance *inst, struct Fumotris *fumo)
{
TetraTerminalClear(&fumo->board, &fumo->term);
TetraTerminalDraw(&fumo->board, &fumo->term);
TetraTerminalDraw(&fumo->piece, &fumo->term);
TetraTerminalClear(&fumo->board, &fumo->term, 3, 5);
TetraTerminalDraw(&fumo->board, &fumo->term, 3, 5);
TetraTerminalDrawGhost(&fumo->piece, &fumo->board, &fumo->term, 3, 5);
TetraTerminalDraw(&fumo->piece, &fumo->term, 3, 5);
TerminalPrint(&fumo->term);
puts(fumo->term.str);
@ -130,6 +158,8 @@ void FumotrisDraw(struct Instance *inst, struct Fumotris *fumo)
int main()
{
system("color");
struct Instance inst;
CreateFumoInstance(&inst);
@ -145,26 +175,3 @@ int main()
return 0;
}
| | NEXT LINES
| [][][]. . . . . . . |
| [][][]. . . . . . . | SCORE
| [][][][]. . . . . . |
| [][][]. . . . . . [] |
| []. . [][]. . . . [] |
| [][][][][][]. . . [] |
| . . [][]. . . . . [] |
| [][][][]. [][]. [][] |
| [][][][][][][]. [][] |
| [][][][][][][][][][] |
| [][][][][][][][][][] |
| [][][][][][][][][][] |
| [][][][][][][][][][] |
| [][][][][][][]. [][] |
| . [][][][][][]. . [] |
| [][][]. [][][][]. [] |
| [][][][][][][][]. [] |
| [][][][][][][][]. [] |
| . [][][][][][][][][] |
| . [][][][][][][][][] |
|________________________|

View file

@ -59,14 +59,14 @@ usize rotate_index(usize i, usize wid, u8 rot)
return 0;
}
bool TetraIsCollision(struct Tetra *t, struct Tetra *board)
bool TetraIsCollision(struct Tetra *piece, struct Tetra *board)
{
usize i = 0;
for (i16 y = t->y; y < t->y + t->hgt; y++) {
for (i16 x = t->x; x < t->x + t->wid; x++, i++) {
usize rot_i = rotate_index(i, t->wid, t->rot);
for (i16 y = piece->y; y < piece->y + piece->hgt; y++) {
for (i16 x = piece->x; x < piece->x + piece->wid; x++, i++) {
usize rot_i = rotate_index(i, piece->wid, piece->rot);
if(t->blks[rot_i] == 0)
if(piece->blks[rot_i] == 0)
continue;
if(x < 0 or x >= board->wid or y < 0 or y >= board->hgt)
@ -127,34 +127,57 @@ void TetraOverlay(struct Tetra *t, struct Tetra *board)
}
}
void TetraTerminalClear(struct Tetra *board, struct Terminal *term)
void TetraTerminalClear(struct Tetra *board, struct Terminal *term, u16 OFS_X, u16 OFS_Y)
{
for (usize i = 0; i < board->wid * board->hgt; i++) {
struct Char4 *block = term->buf + i * 2;
for (i16 y = board->y; y < board->y + board->hgt; y++) {
for (i16 x = board->x; x < board->x + board->wid; x++) {
struct Char4 *ch4 = TerminalGet(term, (x * 2) + OFS_X, y + OFS_Y);
block[0] = (struct Char4) { .ch = '.', .color.fg = 8 };
block[1] = (struct Char4) { .ch = ' ', .color.fg = 8 };
ch4[0] = (struct Char4) { .ch = '.', .color.fg = 8 };
ch4[1] = (struct Char4) { .ch = ' ', .color.fg = 8 };
}
}
}
void TetraTerminalDraw(struct Tetra *t, struct Terminal *term)
void TetraTerminalDraw(struct Tetra *piece, struct Terminal *term, u16 OFS_X, u16 OFS_Y)
{
static const u8f blk_colors[8] = { 8, 14, 11, 13, 10, 9, 12, 3 };
usize i = 0;
for (usize y = 0; y < t->hgt; y++) {
for (usize x = 0; x < t->wid; x++, i++) {
usize rot_i = rotate_index(i, t->wid, t->rot);
for (i16 y = piece->y; y < piece->y + piece->hgt; y++) {
for (i16 x = piece->x; x < piece->x + piece->wid; x++, i++) {
usize rot_i = rotate_index(i, piece->wid, piece->rot);
if (t->blks[rot_i] == 0)
if (piece->blks[rot_i] == 0)
continue;
usize term_i = (y + t->y) * term->wid + (x + t->x) * 2;
struct Char4 *block = term->buf + term_i;
struct Char4 *ch4 = TerminalGet(term, (x * 2) + OFS_X, y + OFS_Y);
u8 fg = blk_colors[t->blks[rot_i]];
block[0] = (struct Char4) { .ch = '[', .color.fg = fg };
block[1] = (struct Char4) { .ch = ']', .color.fg = fg };
u8 fg = blk_colors[piece->blks[rot_i]];
ch4[0] = (struct Char4) { .ch = '[', .color.fg = fg };
ch4[1] = (struct Char4) { .ch = ']', .color.fg = fg };
}
}
}
void TetraTerminalDrawGhost(struct Tetra *t, struct Tetra *board, struct Terminal *term, u16 OFS_X, u16 OFS_Y)
{
struct Tetra ghost = *t;
while(TetraMove(&ghost, board, 0, 1));
usize i = 0;
for (i16 y = ghost.y; y < ghost.y + ghost.hgt; y++) {
for (i16 x = ghost.x; x < ghost.x + ghost.wid; x++, i++) {
usize rot_i = rotate_index(i, ghost.wid, ghost.rot);
if (ghost.blks[rot_i] == 0)
continue;
struct Char4 *ch4 = TerminalGet(term, (x * 2) + OFS_X, y + OFS_Y);
ch4[0] = (struct Char4) { .ch = '[', .color.fg = 8 };
ch4[1] = (struct Char4) { .ch = ']', .color.fg = 8 };
}
}
}

View file

@ -36,6 +36,8 @@ bool TetraRotate(struct Tetra *t, struct Tetra *board, i8 dr);
void TetraOverlay(struct Tetra *t, struct Tetra *board);
void TetraTerminalClear(struct Tetra *board, struct Terminal *term);
void TetraTerminalClear(struct Tetra *board, struct Terminal *term, u16 OFS_X, u16 OFS_Y);
void TetraTerminalDraw(struct Tetra *t, struct Terminal *term);
void TetraTerminalDraw(struct Tetra *piece, struct Terminal *term, u16 OFS_X, u16 OFS_Y);
void TetraTerminalDrawGhost(struct Tetra *t, struct Tetra *board, struct Terminal *term, u16 OFS_X, u16 OFS_Y);