Weekly challenge option added to play menu
This commit is contained in:
parent
ce2a3482d1
commit
1212b1a88a
2
.vimrc
2
.vimrc
|
@ -5,5 +5,5 @@ nnoremap <F4> :ter ++close env LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./ ./_build/debu
|
||||||
|
|
||||||
packadd termdebug
|
packadd termdebug
|
||||||
let g:termdebug_wide = 1
|
let g:termdebug_wide = 1
|
||||||
let g:syntastic_c_include_dirs = [ '_build/debug', '/usr/include/SDL2', 'steamworks_c_wrapper/src' ]
|
let g:syntastic_c_include_dirs = [ '_build/debug', '/usr/include/SDL2', 'steamworks_c_wrapper/src', 'physfs-3.0/src' ]
|
||||||
let g:syntastic_cpp_include_dirs = [ 'steamworks_c_wrapper/sdk/public/steam' ]
|
let g:syntastic_cpp_include_dirs = [ 'steamworks_c_wrapper/sdk/public/steam' ]
|
||||||
|
|
|
@ -184,6 +184,7 @@ add_executable(breakhack
|
||||||
src/stats
|
src/stats
|
||||||
src/actiontext
|
src/actiontext
|
||||||
src/random
|
src/random
|
||||||
|
src/time
|
||||||
src/linkedlist
|
src/linkedlist
|
||||||
src/hashtable
|
src/hashtable
|
||||||
src/gui
|
src/gui
|
||||||
|
|
|
@ -27,7 +27,7 @@ actiontext_create(Sprite *sprite)
|
||||||
ActionText *t = ec_malloc(sizeof(ActionText));
|
ActionText *t = ec_malloc(sizeof(ActionText));
|
||||||
t->pos = (Position) { 0, 0 };
|
t->pos = (Position) { 0, 0 };
|
||||||
t->sprite = sprite;
|
t->sprite = sprite;
|
||||||
t->timer = timer_create();
|
t->timer = _timer_create();
|
||||||
t->dead = false;
|
t->dead = false;
|
||||||
t->velocity = (Vector2d) { 0, -100 };
|
t->velocity = (Vector2d) { 0, -100 };
|
||||||
t->color = C_WHITE;
|
t->color = C_WHITE;
|
||||||
|
|
|
@ -27,7 +27,7 @@ animation_create(unsigned int clipCount)
|
||||||
{
|
{
|
||||||
Animation *animation = ec_malloc(sizeof(Animation)
|
Animation *animation = ec_malloc(sizeof(Animation)
|
||||||
+ clipCount * sizeof(AnimationClip));
|
+ clipCount * sizeof(AnimationClip));
|
||||||
animation->clipTimer = timer_create();
|
animation->clipTimer = _timer_create();
|
||||||
animation->clipCount = clipCount;
|
animation->clipCount = clipCount;
|
||||||
animation->currentClip = 0;
|
animation->currentClip = 0;
|
||||||
animation->loop = true;
|
animation->loop = true;
|
||||||
|
|
|
@ -30,7 +30,7 @@ Camera *camera_create(SDL_Renderer *renderer)
|
||||||
{
|
{
|
||||||
gCamera = ec_malloc(sizeof(Camera));
|
gCamera = ec_malloc(sizeof(Camera));
|
||||||
gCamera->renderer = renderer;
|
gCamera->renderer = renderer;
|
||||||
gCamera->shakeTimer = timer_create();
|
gCamera->shakeTimer = _timer_create();
|
||||||
gCamera->velocity = VECTOR2D_NODIR;
|
gCamera->velocity = VECTOR2D_NODIR;
|
||||||
gCamera->pos = (Position) { 0, 0 };
|
gCamera->pos = (Position) { 0, 0 };
|
||||||
gCamera->basePos = (Position) { 0, 0 };
|
gCamera->basePos = (Position) { 0, 0 };
|
||||||
|
|
|
@ -195,7 +195,7 @@ gui_create(Camera *cam)
|
||||||
|
|
||||||
gui->event_message = texture_create();
|
gui->event_message = texture_create();
|
||||||
texture_load_font(gui->event_message, "GUI/SDS_8x8.ttf", EVENT_MESSAGE_FONT_SIZE, 2);
|
texture_load_font(gui->event_message, "GUI/SDS_8x8.ttf", EVENT_MESSAGE_FONT_SIZE, 2);
|
||||||
gui->event_message_timer = timer_create();
|
gui->event_message_timer = _timer_create();
|
||||||
|
|
||||||
gui->labels[CURRENT_XP_LABEL] = create_label_sprite((Position) { 16, POS_Y_XPBAR + 18 });
|
gui->labels[CURRENT_XP_LABEL] = create_label_sprite((Position) { 16, POS_Y_XPBAR + 18 });
|
||||||
gui->labels[LEVEL_LABEL] = create_label_sprite((Position) { 16, POS_Y_XPBAR + 18 + 14 });
|
gui->labels[LEVEL_LABEL] = create_label_sprite((Position) { 16, POS_Y_XPBAR + 18 + 14 });
|
||||||
|
|
70
src/main.c
70
src/main.c
|
@ -54,6 +54,7 @@
|
||||||
#include "io_util.h"
|
#include "io_util.h"
|
||||||
#include "tooltip.h"
|
#include "tooltip.h"
|
||||||
#include "gamecontroller.h"
|
#include "gamecontroller.h"
|
||||||
|
#include "time.h"
|
||||||
|
|
||||||
#ifdef STEAM_BUILD
|
#ifdef STEAM_BUILD
|
||||||
#include "steam/steamworks_api_wrapper.h"
|
#include "steam/steamworks_api_wrapper.h"
|
||||||
|
@ -165,6 +166,7 @@ static Turn currentTurn = PLAYER;
|
||||||
static class_t playerClass = WARRIOR;
|
static class_t playerClass = WARRIOR;
|
||||||
static bool quickGame = false;
|
static bool quickGame = false;
|
||||||
static bool arcadeGame = false;
|
static bool arcadeGame = false;
|
||||||
|
static bool weeklyGame = false;
|
||||||
static GameState gGameState;
|
static GameState gGameState;
|
||||||
static SDL_Rect mainViewport;
|
static SDL_Rect mainViewport;
|
||||||
static SDL_Rect gameViewport;
|
static SDL_Rect gameViewport;
|
||||||
|
@ -316,7 +318,7 @@ initGame(void)
|
||||||
gPointer = pointer_create(gRenderer);
|
gPointer = pointer_create(gRenderer);
|
||||||
#endif // DEBUG
|
#endif // DEBUG
|
||||||
particle_engine_init();
|
particle_engine_init();
|
||||||
menuTimer = timer_create();
|
menuTimer = _timer_create();
|
||||||
actiontextbuilder_init(gRenderer);
|
actiontextbuilder_init(gRenderer);
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
@ -410,6 +412,7 @@ static void
|
||||||
startRegularGame(void *unused)
|
startRegularGame(void *unused)
|
||||||
{
|
{
|
||||||
quickGame = false;
|
quickGame = false;
|
||||||
|
weeklyGame = false;
|
||||||
goToCharacterMenu(unused);
|
goToCharacterMenu(unused);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -417,9 +420,21 @@ static void
|
||||||
startQuickGame(void *unused)
|
startQuickGame(void *unused)
|
||||||
{
|
{
|
||||||
quickGame = true;
|
quickGame = true;
|
||||||
|
weeklyGame = false;
|
||||||
goToCharacterMenu(unused);
|
goToCharacterMenu(unused);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef STEAM_BUILD
|
||||||
|
static void
|
||||||
|
startWeeklyGame(void *unused)
|
||||||
|
{
|
||||||
|
quickGame = true;
|
||||||
|
weeklyGame = true;
|
||||||
|
set_random_seed((unsigned int) time_get_weekly_seed());
|
||||||
|
goToCharacterMenu(unused);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void
|
static void
|
||||||
startArcadeGame(void *unused)
|
startArcadeGame(void *unused)
|
||||||
{
|
{
|
||||||
|
@ -452,6 +467,13 @@ goToGameSelectMenu(void *unused)
|
||||||
"Standard 20 level game, recommended for new players",
|
"Standard 20 level game, recommended for new players",
|
||||||
startRegularGame
|
startRegularGame
|
||||||
},
|
},
|
||||||
|
#ifdef STEAM_BUILD
|
||||||
|
{
|
||||||
|
"WEEKLY CHALLENGE",
|
||||||
|
"Quck game with weekly leaderboards at breakhack.net",
|
||||||
|
startWeeklyGame
|
||||||
|
},
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
"QUICK GAME",
|
"QUICK GAME",
|
||||||
"Shorter 12 level game, with more action earlier in the game",
|
"Shorter 12 level game, with more action earlier in the game",
|
||||||
|
@ -464,7 +486,12 @@ goToGameSelectMenu(void *unused)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
menu_create_text_menu(&gameSelectMenu, &menuItems[0], 3, gRenderer);
|
#ifdef STEAM_BUILD
|
||||||
|
int count = 4;
|
||||||
|
#else
|
||||||
|
int count = 3;
|
||||||
|
#endif
|
||||||
|
menu_create_text_menu(&gameSelectMenu, &menuItems[0], count, gRenderer);
|
||||||
gGameState = GAME_SELECT;
|
gGameState = GAME_SELECT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -540,6 +567,7 @@ initMainMenu(void)
|
||||||
creditsScreen = screen_create_credits(gRenderer);
|
creditsScreen = screen_create_credits(gRenderer);
|
||||||
scoreScreen = screen_create_hiscore(gRenderer);
|
scoreScreen = screen_create_hiscore(gRenderer);
|
||||||
quickGame = false;
|
quickGame = false;
|
||||||
|
weeklyGame = false;
|
||||||
arcadeGame = false;
|
arcadeGame = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -614,12 +642,14 @@ static bool
|
||||||
init(void)
|
init(void)
|
||||||
{
|
{
|
||||||
#ifdef STEAM_BUILD
|
#ifdef STEAM_BUILD
|
||||||
|
#ifndef DEBUG
|
||||||
if (!steam_restart_needed()) {
|
if (!steam_restart_needed()) {
|
||||||
steam_init();
|
steam_init();
|
||||||
} else {
|
} else {
|
||||||
error("%s needs to be started through Steam", GAME_TITLE);
|
error("%s needs to be started through Steam", GAME_TITLE);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#endif // STEAM_BUILD
|
#endif // STEAM_BUILD
|
||||||
|
|
||||||
if (!initSDL()) {
|
if (!initSDL()) {
|
||||||
|
@ -1003,21 +1033,33 @@ run_game_render(void)
|
||||||
static inline void
|
static inline void
|
||||||
register_scores(void)
|
register_scores(void)
|
||||||
{
|
{
|
||||||
uint8_t details[4] = { (uint8_t) gPlayer->stats.lvl, (uint8_t) cLevel, (uint8_t) (gPlayer->class + 1), 0 };
|
uint8_t details[4] = {
|
||||||
steam_register_score((int) gPlayer->gold, (int32_t*) &details, 1);
|
(uint8_t) gPlayer->stats.lvl,
|
||||||
steam_register_kills((int) gPlayer->stat_data.kills, (int32_t*) &details, 1);
|
(uint8_t) cLevel, (uint8_t) (gPlayer->class + 1), 0
|
||||||
|
};
|
||||||
|
steam_register_score((int) gPlayer->gold, (int32_t*)
|
||||||
|
&details, 1);
|
||||||
|
steam_register_kills((int) gPlayer->stat_data.kills,
|
||||||
|
(int32_t*) &details, 1);
|
||||||
if (quickGame) {
|
if (quickGame) {
|
||||||
steam_register_qp_score((int) gPlayer->gold, (int32_t*) &details, 1);
|
steam_register_qp_score((int) gPlayer->gold,
|
||||||
|
(int32_t*) &details, 1);
|
||||||
|
}
|
||||||
|
if (weeklyGame) {
|
||||||
|
//steam_register_weekly_score((int) gPlayer->gold, (int32_t*) &details, 1);
|
||||||
}
|
}
|
||||||
if (arcadeGame) {
|
if (arcadeGame) {
|
||||||
steam_register_arcade_score((int)gPlayer->gold, (int32_t*) &details, 1);
|
steam_register_arcade_score((int)gPlayer->gold,
|
||||||
|
(int32_t*) &details, 1);
|
||||||
}
|
}
|
||||||
if (gPlayer->class == ROGUE) {
|
if (gPlayer->class == ROGUE) {
|
||||||
steam_set_achievement(ROGUE_LIKE);
|
steam_set_achievement(ROGUE_LIKE);
|
||||||
steam_register_rogue_score((int) gPlayer->gold, (int32_t*) &details, 1);
|
steam_register_rogue_score((int) gPlayer->gold,
|
||||||
|
(int32_t*) &details, 1);
|
||||||
}
|
}
|
||||||
else if (gPlayer->class == WARRIOR) {
|
else if (gPlayer->class == WARRIOR) {
|
||||||
steam_register_warrior_score((int) gPlayer->gold, (int32_t*) &details, 1);
|
steam_register_warrior_score((int) gPlayer->gold,
|
||||||
|
(int32_t*) &details, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1046,6 +1088,8 @@ run_game(void)
|
||||||
gGameState = GAME_OVER;
|
gGameState = GAME_OVER;
|
||||||
createInGameGameOverMenu();
|
createInGameGameOverMenu();
|
||||||
hiscore_register(gPlayer, cLevel);
|
hiscore_register(gPlayer, cLevel);
|
||||||
|
if (weeklyGame)
|
||||||
|
set_random_seed(0);
|
||||||
#ifdef STEAM_BUILD
|
#ifdef STEAM_BUILD
|
||||||
register_scores();
|
register_scores();
|
||||||
#endif // STEAM_BUILD
|
#endif // STEAM_BUILD
|
||||||
|
@ -1061,6 +1105,8 @@ run_game(void)
|
||||||
gui_log("Your break is over!");
|
gui_log("Your break is over!");
|
||||||
gui_event_message("Well done!");
|
gui_event_message("Well done!");
|
||||||
end_game_details();
|
end_game_details();
|
||||||
|
if (weeklyGame)
|
||||||
|
set_random_seed(0);
|
||||||
#ifdef STEAM_BUILD
|
#ifdef STEAM_BUILD
|
||||||
if (cLevel >= 20 && !arcadeGame)
|
if (cLevel >= 20 && !arcadeGame)
|
||||||
steam_set_achievement(BACK_TO_WORK);
|
steam_set_achievement(BACK_TO_WORK);
|
||||||
|
@ -1140,13 +1186,13 @@ run(void)
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Uint32 frame = 0;
|
Uint32 frame = 0;
|
||||||
Timer *fpsTime = timer_create();
|
Timer *fpsTime = _timer_create();
|
||||||
Timer *updateTimer = timer_create();
|
Timer *updateTimer = _timer_create();
|
||||||
timer_start(fpsTime);
|
timer_start(fpsTime);
|
||||||
timer_start(updateTimer);
|
timer_start(updateTimer);
|
||||||
#endif // DEBUG
|
#endif // DEBUG
|
||||||
|
|
||||||
Timer *fpsTimer = timer_create();
|
Timer *fpsTimer = _timer_create();
|
||||||
|
|
||||||
while (!quit)
|
while (!quit)
|
||||||
{
|
{
|
||||||
|
|
|
@ -58,7 +58,7 @@ map_create(void)
|
||||||
map->artifacts = linkedlist_create();
|
map->artifacts = linkedlist_create();
|
||||||
map->objects = linkedlist_create();
|
map->objects = linkedlist_create();
|
||||||
map->currentRoom = (Position) { 0, 0 };
|
map->currentRoom = (Position) { 0, 0 };
|
||||||
map->monsterMoveTimer = timer_create();
|
map->monsterMoveTimer = _timer_create();
|
||||||
map->level = 1;
|
map->level = 1;
|
||||||
|
|
||||||
for (i=0; i < MAP_H_ROOM_COUNT; ++i) {
|
for (i=0; i < MAP_H_ROOM_COUNT; ++i) {
|
||||||
|
|
|
@ -513,7 +513,7 @@ player_create(class_t class, Camera *cam)
|
||||||
player->class = class;
|
player->class = class;
|
||||||
player->state = ALIVE;
|
player->state = ALIVE;
|
||||||
player->projectiles = linkedlist_create();
|
player->projectiles = linkedlist_create();
|
||||||
player->animationTimer = timer_create();
|
player->animationTimer = _timer_create();
|
||||||
player->swordAnimation = animation_create(5);
|
player->swordAnimation = animation_create(5);
|
||||||
player->equipment.hasArtifacts = false;
|
player->equipment.hasArtifacts = false;
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ projectile_create(void)
|
||||||
p->sprite = sprite_create();
|
p->sprite = sprite_create();
|
||||||
p->velocity = VECTOR2D_NODIR;
|
p->velocity = VECTOR2D_NODIR;
|
||||||
p->alive = true;
|
p->alive = true;
|
||||||
p->lifetime = timer_create();
|
p->lifetime = _timer_create();
|
||||||
p->onRender = NULL;
|
p->onRender = NULL;
|
||||||
timer_start(p->lifetime);
|
timer_start(p->lifetime);
|
||||||
return p;
|
return p;
|
||||||
|
|
|
@ -181,8 +181,8 @@ skillbar_create(Camera *cam)
|
||||||
{
|
{
|
||||||
SkillBar *bar = ec_malloc(sizeof(SkillBar));
|
SkillBar *bar = ec_malloc(sizeof(SkillBar));
|
||||||
bar->sprites = linkedlist_create();
|
bar->sprites = linkedlist_create();
|
||||||
bar->activationTimer = timer_create();
|
bar->activationTimer = _timer_create();
|
||||||
bar->skillSparkleTimer = timer_create();
|
bar->skillSparkleTimer = _timer_create();
|
||||||
bar->lastActivation = 0;
|
bar->lastActivation = 0;
|
||||||
bar->frame = create_frame_sprite(cam);
|
bar->frame = create_frame_sprite(cam);
|
||||||
bar->artifactDisplayOffset = 5 * 32 + 8;
|
bar->artifactDisplayOffset = 5 * 32 + 8;
|
||||||
|
|
|
@ -35,8 +35,8 @@ sprite_create_default(void)
|
||||||
s->angle = 0;
|
s->angle = 0;
|
||||||
s->rotationPoint = (SDL_Point) { 0, 0 };
|
s->rotationPoint = (SDL_Point) { 0, 0 };
|
||||||
s->flip = SDL_FLIP_NONE;
|
s->flip = SDL_FLIP_NONE;
|
||||||
s->renderTimer = timer_create();
|
s->renderTimer = _timer_create();
|
||||||
s->animationTimer = timer_create();
|
s->animationTimer = _timer_create();
|
||||||
s->texture_index = 0;
|
s->texture_index = 0;
|
||||||
s->fixed = false;
|
s->fixed = false;
|
||||||
s->animate = true;
|
s->animate = true;
|
||||||
|
|
|
@ -88,7 +88,7 @@ steam_init()
|
||||||
m_Initiated = m_AppID != 0;
|
m_Initiated = m_AppID != 0;
|
||||||
if (m_Initiated)
|
if (m_Initiated)
|
||||||
c_SteamAPI_SetCallbacks(stats_received, stats_stored, leaderboard_received);
|
c_SteamAPI_SetCallbacks(stats_received, stats_stored, leaderboard_received);
|
||||||
requestDataTimer = timer_create();
|
requestDataTimer = _timer_create();
|
||||||
}
|
}
|
||||||
|
|
||||||
void steam_shutdown(void)
|
void steam_shutdown(void)
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
#include "time.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
#define SECONDS_PER_DAY 86400
|
||||||
|
#define SECONDS_PER_HOUR 3600
|
||||||
|
#define SECONDS_PER_MINUTE 60
|
||||||
|
|
||||||
|
time_t
|
||||||
|
time_get_weekly_seed(void)
|
||||||
|
{
|
||||||
|
time_t now = time(NULL);
|
||||||
|
|
||||||
|
struct tm *tm;
|
||||||
|
tm = localtime(&now);
|
||||||
|
|
||||||
|
// Zero out the hour and minutes to 00:00:01
|
||||||
|
now -= tm->tm_hour * SECONDS_PER_HOUR;
|
||||||
|
now -= tm->tm_min * SECONDS_PER_MINUTE;
|
||||||
|
now -= tm->tm_sec;
|
||||||
|
now += 1;
|
||||||
|
|
||||||
|
// Reverse time back to last monday
|
||||||
|
unsigned int dayOfWeek = tm->tm_wday;
|
||||||
|
now -= (dayOfWeek == 0 ? 6 : dayOfWeek - 1) * SECONDS_PER_DAY;
|
||||||
|
|
||||||
|
info("Monday: %s", ctime(&now));
|
||||||
|
|
||||||
|
return now;
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
time_t
|
||||||
|
time_get_weekly_seed(void);
|
|
@ -21,7 +21,7 @@
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "timer.h"
|
#include "timer.h"
|
||||||
|
|
||||||
Timer* timer_create()
|
Timer* _timer_create()
|
||||||
{
|
{
|
||||||
Timer *t = ec_malloc(sizeof(Timer));
|
Timer *t = ec_malloc(sizeof(Timer));
|
||||||
t->startTime = 0;
|
t->startTime = 0;
|
||||||
|
|
|
@ -25,7 +25,7 @@ typedef struct Timer {
|
||||||
unsigned int startTime;
|
unsigned int startTime;
|
||||||
} Timer;
|
} Timer;
|
||||||
|
|
||||||
Timer* timer_create(void);
|
Timer* _timer_create(void);
|
||||||
void timer_start(Timer*);
|
void timer_start(Timer*);
|
||||||
void timer_stop(Timer*);
|
void timer_stop(Timer*);
|
||||||
bool timer_started(Timer*);
|
bool timer_started(Timer*);
|
||||||
|
|
Loading…
Reference in New Issue