-
Notifications
You must be signed in to change notification settings - Fork 0
/
base.hpp
146 lines (121 loc) · 3.07 KB
/
base.hpp
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// Copyright 2024 Ruben Berenguel
#pragma once
#include <vector>
#include "/Users/ruben/code/32blit-sdk/32blit/32blit.hpp"
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
#define M_TWOPI 2 * M_PI
extern blit::Pen YELLOW;
extern blit::Pen BLUE;
extern blit::Pen MAGENTA;
extern blit::Pen CYAN;
extern blit::Pen SUBTLY_CYAN;
extern blit::Pen DARKCYAN;
extern blit::Pen BRIGHTGREEN;
extern blit::Pen MEDGREEN;
extern blit::Pen GREEN;
extern blit::Pen PINK;
extern blit::Pen RED;
extern blit::Pen MEDRED;
extern blit::Pen DARKRED;
extern blit::Pen DARKERRED;
extern blit::Pen FULLWHITE;
extern blit::Pen WHITE;
extern blit::Pen GREY;
extern blit::Pen LIGHTGREY;
extern blit::Pen DARKGREY;
extern blit::Pen BLACK;
extern const blit::Font monoid;
extern const blit::Font monoid_b;
extern const blit::Font monoid_s;
struct Point {
Point() : x(0), y(0) {}
Point(float _x, float _y) : x(_x), y(_y) {}
float x, y;
};
class HSV {
public:
HSV() : h(0.0f), s(0.0f), v(0.0f), a(255) {}
HSV(float _h, float _s, float _v) : h(_h), s(_s), v(_v) {}
HSV(float _h, float _s, float _v, int _a) : h(_h), s(_s), v(_v), a(_a) {}
float h;
float s;
float v;
int a = 255;
blit::Pen ToPen() {
auto color = blit::hsv_to_rgba(h, s, v);
color.a = a;
return color;
}
};
uint32_t fastrand(uint32_t);
float fastrand(float);
double fastrand(double ratio);
struct FastRandInt {
using result_type = uint32_t;
static constexpr result_type min() { return 0; }
static constexpr result_type max() { return 10000; }
result_type operator()() { return fastrand(uint32_t(10000)); }
};
struct Star {
float x;
float y;
HSV color;
};
void poly(Point center, std::vector<Point> points, int cnt);
struct Velocity {
float x, y;
};
enum class EntityKind {
kNone,
kFlame,
kPlasmaBullet,
kPhotonTorpedo,
kRoid,
kPiece,
};
enum class MeshKind { kPolygon, kPoints, kCircle };
struct Mesh {
// Point center = Point(0, 0);
std::vector<Point> points;
std::vector<Point> presentation;
float radius = 0; // Used only for circles
MeshKind kind;
blit::Pen color;
blit::Pen fill;
};
class Entity {
public:
Point center = Point{0, 0};
Velocity velocity = Velocity{0, 0};
std::vector<Mesh> meshes;
int energy = 0;
int mass =
1; // Stuff will have mass to account for some conservation of momentum
float r; // base rotation wrt origin
float spin = 0; // active spinning
EntityKind kind = EntityKind::kNone;
bool collided = false;
};
enum GameState { Welcome, Menu, Help, HighScore, Pause, Game };
void addTo(Point p, Point *q);
float sqdist(Point *p, Point *q);
float dot(Velocity *v1, Velocity *v2);
template <typename T>
void rotateTo(T *pt, T *dst, float angle);
template <typename T>
void addToList(T entity, std::vector<T> *entityList, bool *availableInList) {
if (availableInList) {
for (uint8_t i = 0; i < entityList->size(); i++) {
if ((*entityList)[i].energy == 0) {
(*entityList).at(i) = entity;
(*availableInList) = false;
return;
}
}
}
entityList->push_back(entity);
}
float n(Point *p);
float n(Velocity *p);