1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
#include <stdint.h>
#include <string.h>
#include "vga.h"
#include "data.h"
#include "map.h"
/* current map; set via map_init */
static const uint8_t *cmap;
static uint8_t gold[MAP_W * MAP_H];
static uint8_t total_gold;
void map_init(const uint8_t map[])
{
cmap = map;
/* make a copy of the gold data in RAM */
memcpy(gold, cmap + MAP_W * MAP_H, MAP_W * MAP_H);
/* count how many pieces of gold on this map */
total_gold = 0;
for (uint16_t i = 0; i < MAP_W * MAP_H; i++)
/* gold is not 0xff */
if (gold[i] != 0xff)
total_gold++;
}
void map_render()
{
Rect src = { 0, 0, 160, 48 };
Rect dst = { 0, 0, 8, 8 };
for (uint8_t y = 0; y < MAP_H; y++)
for (uint8_t x = 0; x < MAP_W; x++)
{
dst.x = x * MAP_TILE_W;
dst.y = y * MAP_TILE_H + MAP_OFFS_Y;
uint8_t t = cmap[x + y * MAP_W];
src.x = (t % MAP_TILESET_COLS) * MAP_TILE_W;
src.y = (t / MAP_TILESET_COLS) * MAP_TILE_H;
blitrc(binary_tiles_start, &src, &dst);
}
for (uint8_t y = 0; y < MAP_H; y++)
for (uint8_t x = 0; x < MAP_W; x++)
{
dst.x = x * MAP_TILE_W;
dst.y = y * MAP_TILE_H + MAP_OFFS_Y;
uint8_t t = gold[x + y * MAP_W];
/* not gold, skip! */
if (t == 0xff)
continue;
src.x = (t % MAP_TILESET_COLS) * MAP_TILE_W;
src.y = (t / MAP_TILESET_COLS) * MAP_TILE_H;
blitrc(binary_tiles_start, &src, &dst);
}
}
uint8_t map_is_blocked(uint16_t x, uint16_t y)
{
return cmap[(x / MAP_TILE_W) + (y / MAP_TILE_H) * MAP_W] >= MAP_FIRST_BLOCKED;
}
uint8_t map_is_deadly(uint16_t x, uint16_t y)
{
return cmap[(x / MAP_TILE_W) + (y / MAP_TILE_H) * MAP_W] >= MAP_FIRST_DEADLY;
}
uint8_t map_update_gold(uint16_t x, uint16_t y)
{
Rect src = { 0, 0, 160, 48 };
Rect dst = { 0, 0, 8, 8 };
uint16_t mx = x / MAP_TILE_W;
uint16_t my = y / MAP_TILE_H;
if (gold[mx + my * MAP_W] != 0xff)
{
/* this gold is collected */
gold[mx + my * MAP_W] = 0xff;
/* erase the background */
dst.x = mx * MAP_TILE_W;
dst.y = my * MAP_TILE_H + MAP_OFFS_Y;
uint8_t t = cmap[mx + my * MAP_W];
src.x = (t % MAP_TILESET_COLS) * MAP_TILE_W;
src.y = (t / MAP_TILESET_COLS) * MAP_TILE_H;
blitrc(binary_tiles_start, &src, &dst);
total_gold--;
return 1;
}
return 0;
}
uint8_t map_is_complete()
{
return total_gold == 0;
}
|