overhauled firering system
This commit is contained in:
parent
1fcbdf6d0a
commit
3363f82097
5 changed files with 97 additions and 87 deletions
3
Makefile
3
Makefile
|
@ -384,7 +384,8 @@ PROJECT_SOURCE_FILES ?= \
|
||||||
$(PROJECT_SOURCE_PATH)/Gameover.c \
|
$(PROJECT_SOURCE_PATH)/Gameover.c \
|
||||||
$(PROJECT_SOURCE_PATH)/Options.c \
|
$(PROJECT_SOURCE_PATH)/Options.c \
|
||||||
$(PROJECT_SOURCE_PATH)/Ending.c \
|
$(PROJECT_SOURCE_PATH)/Ending.c \
|
||||||
$(PROJECT_SOURCE_PATH)/LevelSel.c
|
$(PROJECT_SOURCE_PATH)/LevelSel.c \
|
||||||
|
$(PROJECT_SOURCE_PATH)/Gutils.c
|
||||||
|
|
||||||
# Define all object files from source files
|
# Define all object files from source files
|
||||||
OBJS = $(patsubst %.c, %.o, $(PROJECT_SOURCE_FILES))
|
OBJS = $(patsubst %.c, %.o, $(PROJECT_SOURCE_FILES))
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#define INPUT_RIGHT_PRESSED IsKeyPressed(KEY_RIGHT) || IsGamepadButtonPressed(0, GAMEPAD_BUTTON_LEFT_FACE_RIGHT)
|
#define INPUT_RIGHT_PRESSED IsKeyPressed(KEY_RIGHT) || IsGamepadButtonPressed(0, GAMEPAD_BUTTON_LEFT_FACE_RIGHT)
|
||||||
|
|
||||||
#define INPUT_OPTION_PRESSED IsKeyPressed(KEY_ENTER) || IsGamepadButtonPressed(0, GAMEPAD_BUTTON_MIDDLE_RIGHT)
|
#define INPUT_OPTION_PRESSED IsKeyPressed(KEY_ENTER) || IsGamepadButtonPressed(0, GAMEPAD_BUTTON_MIDDLE_RIGHT)
|
||||||
#define INPUT_FIRE_PRESSED IsKeyPressed(KEY_Z) || IsGamepadButtonPressed(0, GAMEPAD_BUTTON_RIGHT_FACE_DOWN)
|
#define INPUT_FIRE_DOWN IsKeyDown(KEY_Z) || IsGamepadButtonDown(0, GAMEPAD_BUTTON_RIGHT_FACE_DOWN)
|
||||||
|
|
||||||
#define INPUT_LEFT_DOWN IsKeyDown(KEY_LEFT) || IsGamepadButtonDown(0, GAMEPAD_BUTTON_LEFT_FACE_LEFT)
|
#define INPUT_LEFT_DOWN IsKeyDown(KEY_LEFT) || IsGamepadButtonDown(0, GAMEPAD_BUTTON_LEFT_FACE_LEFT)
|
||||||
#define INPUT_RIGHT_DOWN IsKeyDown(KEY_RIGHT) || IsGamepadButtonDown(0, GAMEPAD_BUTTON_LEFT_FACE_RIGHT)
|
#define INPUT_RIGHT_DOWN IsKeyDown(KEY_RIGHT) || IsGamepadButtonDown(0, GAMEPAD_BUTTON_LEFT_FACE_RIGHT)
|
||||||
|
|
110
src/Gameplay.c
110
src/Gameplay.c
|
@ -12,27 +12,32 @@
|
||||||
#include "Screens.h"
|
#include "Screens.h"
|
||||||
#include "Controls.h"
|
#include "Controls.h"
|
||||||
#include "Options.h"
|
#include "Options.h"
|
||||||
#include "Gameplay.h"
|
#include "Gstructs.h"
|
||||||
#include "Stats.h"
|
#include "Stats.h"
|
||||||
#include "Timers.h"
|
#include "Timers.h"
|
||||||
#include "Music.h"
|
#include "Music.h"
|
||||||
#include "Gfx.h"
|
#include "Gfx.h"
|
||||||
|
|
||||||
|
#define MAX_FIREWORKS 10
|
||||||
|
#define MAX_SHOOTS 5
|
||||||
|
|
||||||
|
struct Actor player = { 0 };
|
||||||
|
struct Actor enemy = { 0 };
|
||||||
|
struct Attack fireworks[MAX_FIREWORKS] = { 0 };
|
||||||
|
struct Attack shoot[MAX_SHOOTS] = { 0 };
|
||||||
|
struct Item feather = { 0 };
|
||||||
|
Sound fxfeather = { 0 };
|
||||||
|
bool pause;
|
||||||
|
bool DebugMode;
|
||||||
|
int ammo = 0;
|
||||||
|
int fireworkAmount = 0;
|
||||||
|
int GI_callcount = 0;
|
||||||
|
int trigMov;
|
||||||
|
|
||||||
int score = 0, bestscore = 0, finishfromGameplayScreen = 0, redfeathers = 0, greenfeathers = 0;
|
int score = 0, bestscore = 0, finishfromGameplayScreen = 0, redfeathers = 0, greenfeathers = 0;
|
||||||
|
|
||||||
Music Gameplaysong = { 0 };
|
Music Gameplaysong = { 0 };
|
||||||
|
|
||||||
bool CheckAttackActivity(struct Attack attack[], int val, int max)
|
|
||||||
{
|
|
||||||
int matches = 0;
|
|
||||||
for (int i = 0; i < max; i++) {
|
|
||||||
if (attack[i].active == val) matches++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (matches == max) return true;
|
|
||||||
else return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LoadGamplayScreen(void)
|
void LoadGamplayScreen(void)
|
||||||
{
|
{
|
||||||
player.fxhit = LoadSound("assets/sfx/hit.wav");
|
player.fxhit = LoadSound("assets/sfx/hit.wav");
|
||||||
|
@ -57,7 +62,7 @@ void InitGameplayScreen(void)
|
||||||
globalTimer = 0;
|
globalTimer = 0;
|
||||||
|
|
||||||
if (player.hp < 1) player.hp = 1;
|
if (player.hp < 1) player.hp = 1;
|
||||||
if (ammo < 5) ammo = 5;
|
//if (ammo < 60) ammo = 60;
|
||||||
|
|
||||||
player.currentframe = 0;
|
player.currentframe = 0;
|
||||||
player.speed = 300.0f;
|
player.speed = 300.0f;
|
||||||
|
@ -80,7 +85,7 @@ void InitGameplayScreen(void)
|
||||||
player.color = RAYWHITE;
|
player.color = RAYWHITE;
|
||||||
|
|
||||||
enemy.currentframe = 0;
|
enemy.currentframe = 0;
|
||||||
enemy.hp = 5;
|
enemy.hp = 20;
|
||||||
enemy.speed = 200.0f;
|
enemy.speed = 200.0f;
|
||||||
if (GI_callcount < 1) {
|
if (GI_callcount < 1) {
|
||||||
enemy.frameRec = (Rectangle) {
|
enemy.frameRec = (Rectangle) {
|
||||||
|
@ -111,6 +116,7 @@ void InitGameplayScreen(void)
|
||||||
|
|
||||||
for (int i = 0; i < MAX_FIREWORKS; i++) {
|
for (int i = 0; i < MAX_FIREWORKS; i++) {
|
||||||
fireworks[i].active = 1;
|
fireworks[i].active = 1;
|
||||||
|
fireworks[i].hp = 5;
|
||||||
fireworks[i].hitbox = (Rectangle) {
|
fireworks[i].hitbox = (Rectangle) {
|
||||||
GetScreenWidth() + firework_sprite.width,
|
GetScreenWidth() + firework_sprite.width,
|
||||||
0,
|
0,
|
||||||
|
@ -118,12 +124,11 @@ void InitGameplayScreen(void)
|
||||||
(float) firework_sprite.height
|
(float) firework_sprite.height
|
||||||
};
|
};
|
||||||
fireworks[i].hitbox.y = GetRandomValue(0, GetScreenHeight() - firework_sprite.height);
|
fireworks[i].hitbox.y = GetRandomValue(0, GetScreenHeight() - firework_sprite.height);
|
||||||
/* switch (level) {
|
switch (level) {
|
||||||
case LEVEL1: fireworks[i].speed.x = GetRandomValue(100, 300); break;
|
case LEVEL1: fireworks[i].speed.x = GetRandomValue(100, 300); break;
|
||||||
case LEVEL2: fireworks[i].speed.x = GetRandomValue(400, 600); break;
|
case LEVEL2: fireworks[i].speed.x = GetRandomValue(600, 800); break;
|
||||||
case LEVEL3: fireworks[i].speed.x = GetRandomValue(800, 1000); break;
|
case LEVEL3: fireworks[i].speed.x = GetRandomValue(1200, 2400); break;
|
||||||
} */
|
}
|
||||||
fireworks[i].speed.x = GetRandomValue(100, 300);
|
|
||||||
fireworks[i].color = RAYWHITE;
|
fireworks[i].color = RAYWHITE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,15 +139,15 @@ void InitGameplayScreen(void)
|
||||||
(float) attack_sprite.width,
|
(float) attack_sprite.width,
|
||||||
(float) attack_sprite.height
|
(float) attack_sprite.height
|
||||||
};
|
};
|
||||||
shoot[i].speed.x = 500.f;
|
shoot[i].speed.x = 5000.f;
|
||||||
shoot[i].speed.y = 0;
|
shoot[i].speed.y = 0;
|
||||||
shoot[i].active = false;
|
shoot[i].active = false;
|
||||||
shoot[i].color = RED;
|
shoot[i].color = RED;
|
||||||
}
|
}
|
||||||
switch (level) {
|
switch (level) {
|
||||||
case LEVEL1: fireworkAmount = 50; break;
|
case LEVEL1: fireworkAmount = 100; break;
|
||||||
case LEVEL2: fireworkAmount = 200; break;
|
case LEVEL2: fireworkAmount = 150; break;
|
||||||
case LEVEL3: fireworkAmount = 500; break;
|
case LEVEL3: fireworkAmount = 200; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pause = 0;
|
pause = 0;
|
||||||
|
@ -153,41 +158,10 @@ void InitGameplayScreen(void)
|
||||||
GI_callcount++;
|
GI_callcount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DamageActor(struct Actor *actor)
|
|
||||||
{
|
|
||||||
if (!actor->in) {
|
|
||||||
actor->hp--;
|
|
||||||
if (!mute) PlaySoundMulti(actor->fxhit);
|
|
||||||
actor->in = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
actor->currentframe = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void UpdateiFrameTimer(struct Actor *actor)
|
|
||||||
{
|
|
||||||
// here we use pointers to avoid duplicating code
|
|
||||||
if (actor->in) {
|
|
||||||
actor->iframetimer += GetFrameTime();
|
|
||||||
actor->currentframe = 1;
|
|
||||||
if ((int)globalTimer % 2 == 0) actor->color = GRAY;
|
|
||||||
else actor->color = RAYWHITE;
|
|
||||||
if (actor->iframetimer > 2) {
|
|
||||||
actor->in = false;
|
|
||||||
actor->iframetimer = 0;
|
|
||||||
}
|
|
||||||
} else { actor->color = RAYWHITE; actor->currentframe = 0; }
|
|
||||||
}
|
|
||||||
|
|
||||||
void ResetFeather(void)
|
void ResetFeather(void)
|
||||||
{
|
{
|
||||||
if (player.hp < 2) {
|
|
||||||
feather.power = 0;
|
feather.power = 0;
|
||||||
} else if (ammo < 2) {
|
|
||||||
feather.power = 1;
|
|
||||||
} else {
|
|
||||||
feather.power = GetRandomValue(0, 1);
|
|
||||||
}
|
|
||||||
feather.hitbox.x = GetScreenWidth() + feather_sprite.width;
|
feather.hitbox.x = GetScreenWidth() + feather_sprite.width;
|
||||||
feather.hitbox.y = GetRandomValue(0, GetScreenHeight() - feather_sprite.height);
|
feather.hitbox.y = GetRandomValue(0, GetScreenHeight() - feather_sprite.height);
|
||||||
feather.active = false;
|
feather.active = false;
|
||||||
|
@ -213,18 +187,18 @@ void UpdateGameplayScreen(void)
|
||||||
player.speed = 600.0f;
|
player.speed = 600.0f;
|
||||||
if (player.currentframe != 1) player.currentframe = 2;
|
if (player.currentframe != 1) player.currentframe = 2;
|
||||||
} else player.speed = 300.0f;
|
} else player.speed = 300.0f;
|
||||||
if (INPUT_FIRE_PRESSED) {
|
if (INPUT_FIRE_DOWN) {
|
||||||
if (ammo > 0) {
|
// if (ammo > 0) {
|
||||||
for (int i = 0; i < MAX_SHOOTS; i++) {
|
for (int i = 0; i < MAX_SHOOTS; i++) {
|
||||||
if (!shoot[i].active) {
|
if (!shoot[i].active) {
|
||||||
ammo--;
|
ammo++;
|
||||||
shoot[i].hitbox.x = player.hitbox.x;
|
shoot[i].hitbox.x = player.hitbox.x;
|
||||||
shoot[i].hitbox.y = player.hitbox.y + player.hitbox.height/4;
|
shoot[i].hitbox.y = player.hitbox.y + player.hitbox.height/4;
|
||||||
shoot[i].active = true;
|
shoot[i].active = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
// Update sprite positions
|
// Update sprite positions
|
||||||
player.sprite_pos = (Vector2){ player.hitbox.x, player.hitbox.y };
|
player.sprite_pos = (Vector2){ player.hitbox.x, player.hitbox.y };
|
||||||
|
@ -281,7 +255,7 @@ void UpdateGameplayScreen(void)
|
||||||
|
|
||||||
// Feather spawn logic
|
// Feather spawn logic
|
||||||
if (level == LEVEL3) { if ((int) globalTimer % 10 == 0) feather.active = true; }
|
if (level == LEVEL3) { if ((int) globalTimer % 10 == 0) feather.active = true; }
|
||||||
else { if ((int) globalTimer % 50 == 0) feather.active = true; }
|
else { if ((int) globalTimer % 30 == 0) feather.active = true; }
|
||||||
switch (feather.power) {
|
switch (feather.power) {
|
||||||
case 0: feather.color = GREEN; break;
|
case 0: feather.color = GREEN; break;
|
||||||
case 1: feather.color = RED; break;
|
case 1: feather.color = RED; break;
|
||||||
|
@ -292,7 +266,7 @@ void UpdateGameplayScreen(void)
|
||||||
if (CheckCollisionRecs(player.hitbox, feather.hitbox)) {
|
if (CheckCollisionRecs(player.hitbox, feather.hitbox)) {
|
||||||
switch (feather.power) {
|
switch (feather.power) {
|
||||||
case 0: player.hp++; break;
|
case 0: player.hp++; break;
|
||||||
case 1: ammo += 5; break;
|
case 1: ammo += 60; break;
|
||||||
}
|
}
|
||||||
if (!mute) PlaySoundMulti(fxfeather);
|
if (!mute) PlaySoundMulti(fxfeather);
|
||||||
ResetFeather();
|
ResetFeather();
|
||||||
|
@ -329,16 +303,19 @@ void UpdateGameplayScreen(void)
|
||||||
for (int j = 0; j < MAX_SHOOTS; j++) {
|
for (int j = 0; j < MAX_SHOOTS; j++) {
|
||||||
if (CheckCollisionRecs(shoot[j].hitbox, fireworks[i].hitbox) && shoot[j].active) {
|
if (CheckCollisionRecs(shoot[j].hitbox, fireworks[i].hitbox) && shoot[j].active) {
|
||||||
if (!mute) PlaySoundMulti(enemy.fxhit);
|
if (!mute) PlaySoundMulti(enemy.fxhit);
|
||||||
fireworks[i].active = 0;
|
fireworks[i].color = BLACK;
|
||||||
|
shoot[j].active = 0;
|
||||||
|
fireworks[i].hp--;
|
||||||
scoreTimer += 300;
|
scoreTimer += 300;
|
||||||
fireworkAmount--;
|
} else fireworks[i].color = RAYWHITE;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
switch (fireworks[i].active) {
|
switch (fireworks[i].active) {
|
||||||
case 0:
|
case 0:
|
||||||
fireworks[i].hitbox.x = GetScreenWidth() + firework_sprite.width;
|
fireworks[i].hitbox.x = GetScreenWidth() + firework_sprite.width;
|
||||||
|
|
||||||
if (fireworkAmount > 0) { fireworkAmount--; fireworks[i].active = 1; }
|
fireworks[i].hp = 5;
|
||||||
|
|
||||||
|
if (fireworkAmount > 0) { /*fireworkAmount--;*/ fireworks[i].active = 1; }
|
||||||
fireworks[i].hitbox.y = GetRandomValue(0, GetScreenHeight() - firework_sprite.height);
|
fireworks[i].hitbox.y = GetRandomValue(0, GetScreenHeight() - firework_sprite.height);
|
||||||
/* switch (level) {
|
/* switch (level) {
|
||||||
case LEVEL1: fireworks[i].speed.x = GetFrameTime() break;
|
case LEVEL1: fireworks[i].speed.x = GetFrameTime() break;
|
||||||
|
@ -347,7 +324,8 @@ void UpdateGameplayScreen(void)
|
||||||
} */
|
} */
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
trigMov = sin(2*PI/100*fireworks[i].hitbox.x) * 200;
|
if (fireworks[i].hp < 1) { fireworkAmount--; fireworks[i].active = 0; }
|
||||||
|
trigMov = sin(2*PI/20*fireworks[i].hitbox.x) * 200;
|
||||||
fireworks[i].hitbox.x -= fireworks[i].speed.x * GetFrameTime();
|
fireworks[i].hitbox.x -= fireworks[i].speed.x * GetFrameTime();
|
||||||
fireworks[i].hitbox.y += trigMov*GetFrameTime();
|
fireworks[i].hitbox.y += trigMov*GetFrameTime();
|
||||||
// Firework wall collision
|
// Firework wall collision
|
||||||
|
|
|
@ -1,16 +1,13 @@
|
||||||
/*
|
/*
|
||||||
- Avoid ~ a game by Canneddonuts
|
- Avoid ~ a game by Canneddonuts
|
||||||
- Filename ~ Gameplay.h
|
- Filename ~ Gstructs.h
|
||||||
- Author ~ Return0ne
|
- Author ~ Return0ne
|
||||||
- 2022
|
- 2022
|
||||||
- *no license*
|
- *no license*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef GAMEPLAY_HEADER
|
#ifndef GAMESTRUCTS_HEADER
|
||||||
#define GAMEPLAY_HEADER
|
#define GAMESTRUCTS_HEADER
|
||||||
|
|
||||||
#define MAX_FIREWORKS 10
|
|
||||||
#define MAX_SHOOTS 5
|
|
||||||
|
|
||||||
struct Actor {
|
struct Actor {
|
||||||
float speed;
|
float speed;
|
||||||
|
@ -38,20 +35,12 @@ struct Attack {
|
||||||
Rectangle hitbox;
|
Rectangle hitbox;
|
||||||
Vector2 speed;
|
Vector2 speed;
|
||||||
int active;
|
int active;
|
||||||
|
int hp;
|
||||||
Color color;
|
Color color;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Actor player = { 0 };
|
void DamageActor(struct Actor *actor);
|
||||||
struct Actor enemy = { 0 };
|
void UpdateiFrameTimer(struct Actor *actor);
|
||||||
struct Attack fireworks[MAX_FIREWORKS] = { 0 };
|
bool CheckAttackActivity(struct Attack attack[], int val, int max);
|
||||||
struct Attack shoot[MAX_SHOOTS] = { 0 };
|
|
||||||
struct Item feather = { 0 };
|
|
||||||
Sound fxfeather = { 0 };
|
|
||||||
bool pause;
|
|
||||||
bool DebugMode;
|
|
||||||
int ammo = 5;
|
|
||||||
int fireworkAmount = 0;
|
|
||||||
int GI_callcount = 0;
|
|
||||||
int trigMov;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
42
src/Gutils.c
Normal file
42
src/Gutils.c
Normal file
|
@ -0,0 +1,42 @@
|
||||||
|
#include "../include/raylib.h"
|
||||||
|
|
||||||
|
#include "Gstructs.h"
|
||||||
|
#include "Timers.h"
|
||||||
|
#include "Options.h"
|
||||||
|
|
||||||
|
void DamageActor(struct Actor *actor)
|
||||||
|
{
|
||||||
|
if (!actor->in) {
|
||||||
|
actor->hp--;
|
||||||
|
if (!mute) PlaySoundMulti(actor->fxhit);
|
||||||
|
actor->in = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
actor->currentframe = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void UpdateiFrameTimer(struct Actor *actor)
|
||||||
|
{
|
||||||
|
// here we use pointers to avoid duplicating code
|
||||||
|
if (actor->in) {
|
||||||
|
actor->iframetimer += GetFrameTime();
|
||||||
|
actor->currentframe = 1;
|
||||||
|
if ((int)globalTimer % 2 == 0) actor->color = GRAY;
|
||||||
|
else actor->color = RAYWHITE;
|
||||||
|
if (actor->iframetimer > 2) {
|
||||||
|
actor->in = false;
|
||||||
|
actor->iframetimer = 0;
|
||||||
|
}
|
||||||
|
} else { actor->color = RAYWHITE; actor->currentframe = 0; }
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CheckAttackActivity(struct Attack attack[], int val, int max)
|
||||||
|
{
|
||||||
|
int matches = 0;
|
||||||
|
for (int i = 0; i < max; i++) {
|
||||||
|
if (attack[i].active == val) matches++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (matches == max) return true;
|
||||||
|
else return false;
|
||||||
|
}
|
Loading…
Reference in a new issue