-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgame.h
More file actions
192 lines (163 loc) · 5.37 KB
/
game.h
File metadata and controls
192 lines (163 loc) · 5.37 KB
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#pragma once
#include <furi.h>
#include <engine/game_engine.h>
#include <engine/game_manager_i.h>
#include <genann.h>
#include <storage/storage.h>
#include "game_menu.h"
#include "game_level.h"
#include "tutorial_level.h"
#include "npc_ai_variants.h"
/* Global game defines go here */
//#define DEBUGGING
//#define MINIMAL_DEBUGGING
#define WORLD_BORDER_LEFT_X 6
#define WORLD_BORDER_RIGHT_X 120
#define WORLD_BORDER_TOP_Y 6
#define WORLD_BORDER_BOTTOM_Y 53
#define WORLD_TRANSITION_LEFT_STARTING_POINT 0
#define WORLD_TRANSITION_LEFT_ENDING_POINT 4
#define BULLET_DISTANCE_THRESHOLD 8
#define STARTING_PLAYER_HEALTH 16
#define STARTING_ENEMY_HEALTH 5
#define BACKGROUND_ASSET_ROWS 1
#define BACKGROUND_ASSET_COUNT 1 //Must be divisible by BACKGROUND_ASSET_ROWS
#ifdef __cplusplus
extern "C" {
#endif
#define NPC_ANN_WEIGHT_UNIQUENESS
//#define DEBUGGING
//#define MINIMAL_DEBUGGING
//Configurable variables
//While debugging we increase all lives for longer testing/gameplay.
static const EntityDescription global_desc;
static const EntityDescription player_desc;
static const EntityDescription enemy_desc;
//Enemy structure
typedef struct {
Entity* instance;
bool direction;
bool jumping;
float targetY;
int lives;
uint32_t spawnTime;
uint32_t mercyTicks;
uint32_t lastShot;
genann* ai;
genann* lastAI;
} Enemy;
#define MAX_ENEMIES 30
extern Enemy enemies[MAX_ENEMIES];
extern int ENEMY_LIVES;
extern uint32_t shootingDelay;
extern uint32_t enemyShootingDelay;
extern float bulletMoveSpeed;
extern float speed;
extern float enemySpeed;
extern float jumpHeight;
extern float jumpSpeed;
extern float enemyJumpHeight;
//Tracking player data
extern bool canRespawn;
extern int health;
extern uint32_t kills;
extern bool jumping;
extern float targetY;
extern float targetX;
extern bool showBackground;
#define TRANSITION_FRAMES 15
extern int16_t transitionLeftTicks;
extern int16_t transitionRightTicks;
//Internals
extern int firstMobSpawnTicks;
extern uint32_t firstKillTick;
extern uint32_t secondKillTick;
extern uint32_t gameBeginningTick;
extern Level* gameLevel;
extern GameManager* globalGameManager;
extern Entity* globalPlayer;
//Functions
float lerp(float y1, float y2, float t);
void renderSceneBackground(Canvas* canvas);
void enemy_spawn(
Level* level,
GameManager* manager,
Vector spawnPosition,
uint32_t mercyTicks,
bool right);
void _enemy_spawn(
Level* level,
GameManager* manager,
Vector spawnPosition,
uint32_t mercyTicks,
bool right,
int startingLives);
bool damage_enemy(Enemy* enemy);
bool damage_player(Entity* self);
void global_update(Entity* self, GameManager* manager, void* context);
void global_render(Entity* self, GameManager* manager, Canvas* canvas, void* context);
void player_update(Entity* self, GameManager* manager, void* context);
void player_render(Entity* self, GameManager* manager, Canvas* canvas, void* context);
void enemy_render(Entity* self, GameManager* manager, Canvas* canvas, void* context);
void enemy_update(Entity* self, GameManager* manager, void* context);
void hideBackgroundAssets();
void computeBackgroundAssets();
int32_t relaunch_game();
void canvas_printf_blinking(
Canvas* canvas,
uint32_t x,
uint32_t y,
uint32_t shownTicks,
uint32_t hiddenTicks,
const char* format,
uint32_t* dataHolder);
typedef struct {
Sprite* sprite;
Sprite* sprite_left;
Sprite* sprite_left_shadowed;
Sprite* sprite_left_recoil;
Sprite* sprite_right;
Sprite* sprite_right_shadowed;
Sprite* sprite_right_recoil;
Sprite* sprite_jump;
Sprite* sprite_stand;
Sprite* sprite_forward;
} PlayerContext;
typedef struct {
uint32_t score;
Sprite* sceneBackground;
Sprite* backgroundAsset1;
Sprite* backgroundAsset2;
} GameContext;
static const EntityDescription global_desc = {
.start = NULL, // called when entity is added to the level
.stop = NULL, // called when entity is removed from the level
.update = global_update, // called every frame
.render = global_render, // called every frame, after update
.collision = NULL, // called when entity collides with another entity
.event = NULL, // called when entity receives an event
.context_size = 0, // size of entity context, will be automatically allocated and freed
};
static const EntityDescription player_desc = {
.start = NULL, // called when entity is added to the level
.stop = NULL, // called when entity is removed from the level
.update = player_update, // called every frame
.render = player_render, // called every frame, after update
.collision = NULL, // called when entity collides with another entity
.event = NULL, // called when entity receives an event
.context_size =
sizeof(PlayerContext), // size of entity context, will be automatically allocated and freed
};
static const EntityDescription enemy_desc = {
.start = NULL, // called when entity is added to the level
.stop = NULL, // called when entity is removed from the level
.update = enemy_update, // called every frame
.render = enemy_render, // called every frame, after update
.collision = NULL, // called when entity collides with another entity
.event = NULL, // called when entity receives an event
.context_size =
sizeof(PlayerContext), // size of entity context, will be automatically allocated and freed
};
#ifdef __cplusplus
}
#endif