aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax-001 <80035972+Max-001@users.noreply.github.com>2025-01-10 14:13:46 +0100
committerGitHub <noreply@github.com>2025-01-10 14:13:46 +0100
commitbb2db93bfb8dd7e080d2708548eae660e6b33913 (patch)
tree32a54bc4469cb894aa009736e070bdc382e48e76
parentd20b25828b53af170a6534263e8de114e7fac121 (diff)
parent8d46ad5a20d1aa5b784291ae323e38d1e0d59351 (diff)
Merge pull request #122 from lonkaars/jaro/game
Jaro/game
-rw-r--r--game/CMakeLists.txt6
-rw-r--r--game/Config.h2
-rw-r--r--game/PreviewScene.cpp77
-rw-r--r--game/hud/HudScript.cpp2
-rw-r--r--game/menus/ButtonNextMainMenuSubScript.cpp4
-rw-r--r--game/menus/ButtonReplaySubScript.cpp13
-rw-r--r--game/menus/ButtonReplaySubScript.h3
-rw-r--r--game/menus/ButtonSubScene.cpp53
-rw-r--r--game/menus/ButtonSubScene.h14
-rw-r--r--game/menus/endgame/EndGameSubScene.cpp42
-rw-r--r--game/menus/endgame/EndGameSubScript.cpp40
-rw-r--r--game/menus/endgame/EndGameSubScript.h3
-rw-r--r--game/menus/mainmenu/MainMenuScene.cpp5
-rw-r--r--game/menus/shop/ButtonBuySelectBubbleScript.cpp36
-rw-r--r--game/menus/shop/ButtonBuySelectBubbleScript.h14
-rw-r--r--game/menus/shop/ButtonBuySelectBulletScript.cpp36
-rw-r--r--game/menus/shop/ButtonBuySelectBulletScript.h14
-rw-r--r--game/menus/shop/ShopLoadScript.cpp131
-rw-r--r--game/menus/shop/ShopLoadScript.h10
-rw-r--r--game/menus/shop/ShopMenuScene.cpp103
-rw-r--r--game/menus/shop/Shopconfig.h16
-rw-r--r--game/preview/PreviewReplaySubScript.cpp56
-rw-r--r--game/preview/PreviewReplaySubScript.h23
-rw-r--r--game/preview/PreviewStartRecSubScript.cpp21
-rw-r--r--game/preview/PreviewStartRecSubScript.h11
-rw-r--r--game/preview/PreviewStopRecSubScript.cpp21
-rw-r--r--game/preview/PreviewStopRecSubScript.h11
27 files changed, 754 insertions, 13 deletions
diff --git a/game/CMakeLists.txt b/game/CMakeLists.txt
index e1168eb..1a03b20 100644
--- a/game/CMakeLists.txt
+++ b/game/CMakeLists.txt
@@ -33,6 +33,9 @@ target_sources(main PUBLIC
# mainscenes
GameScene.cpp
menus/shop/ShopMenuScene.cpp
+ menus/shop/ShopLoadScript.cpp
+ menus/shop/ButtonBuySelectBubbleScript.cpp
+ menus/shop/ButtonBuySelectBulletScript.cpp
menus/mainmenu/MainMenuScene.cpp
PreviewScene.cpp
main.cpp
@@ -52,6 +55,9 @@ target_sources(main PUBLIC
preview/NpcScript.cpp
preview/PrevPlayerSubScene.cpp
preview/PrevPlayerScript.cpp
+ preview/PreviewStopRecSubScript.cpp
+ preview/PreviewStartRecSubScript.cpp
+ preview/PreviewReplaySubScript.cpp
# scripts
GameScene.cpp
diff --git a/game/Config.h b/game/Config.h
index c6bbfda..fc1a561 100644
--- a/game/Config.h
+++ b/game/Config.h
@@ -56,3 +56,5 @@ static constexpr float PLAYER_HELP_KICK_MAX = 0.3; // factor
static constexpr const char * CAMERA_NAME = "camera";
// Jetpack particles
static constexpr const char * JETPACK_PARTICLES = "jetpack_particles";
+
+static constexpr bool DISABLE_REPLAY = false;
diff --git a/game/PreviewScene.cpp b/game/PreviewScene.cpp
index 6cd9e78..6871961 100644
--- a/game/PreviewScene.cpp
+++ b/game/PreviewScene.cpp
@@ -2,6 +2,10 @@
#include "Config.h"
#include "background/BackgroundSubScene.h"
+#include "hud/HudScript.h"
+#include "hud/HudSubScene.h"
+#include "hud/SpeedScript.h"
+#include "menus/ButtonSubScene.h"
#include "missile/MissilePool.h"
#include "missile/SpawnEvent.h"
#include "preview/NpcSubScene.h"
@@ -47,6 +51,8 @@ void PreviewScene::load_scene() {
);
camera.add_component<Rigidbody>(Rigidbody::Data {});
camera.add_component<BehaviorScript>().set_script<MissileSpawnEventHandler>();
+ camera.add_component<BehaviorScript>().set_script<HudScript>();
+ camera.add_component<BehaviorScript>().set_script<SpeedScript>();
GameObject floor = new_object("floor", "game_world", vec2(0, 325));
floor.add_component<Rigidbody>(Rigidbody::Data {
@@ -83,6 +89,77 @@ void PreviewScene::load_scene() {
SmokeSubScene smoke(*this);
MissilePool mpool(*this);
+ HudSubScene hud;
+ hud.create(*this);
+
+
+ const float Y_POS_BUTTONS = -220;
+ const float X_POS_BUTTONS = -150;
+ const float X_POS_BUTTONS_SPACING = 145;
+ ButtonSubScene button;
+ button.create(
+ *this,
+ ButtonSubScene::Data {
+ .text = "BACK",
+ .text_width = 60,
+ .position = {X_POS_BUTTONS,Y_POS_BUTTONS},
+ .script_type = ButtonSubScene::ScriptSelect::NEXT,
+ .button_type = ButtonSubScene::ButtonSelect::BACK,
+ .scale = 0.6,
+ .worldspace = false,
+ .tag = "Next button",
+ .sorting_layer_offset = 20,
+ }
+ );
+
+ button.create(
+ *this,
+ ButtonSubScene::Data {
+ .text = "START REC",
+ .text_width = 130,
+ .position = {X_POS_BUTTONS+X_POS_BUTTONS_SPACING,Y_POS_BUTTONS},
+ .script_type = ButtonSubScene::ScriptSelect::PREVIEW_START,
+ .button_type = ButtonSubScene::ButtonSelect::LARGE,
+ .scale = 0.6,
+ .worldspace = false,
+ .tag = "Next button",
+ .sorting_layer_offset = 20,
+ .btn_side_color = ButtonSubScene::ButtonSideColor::YELLOW,
+ }
+ );
+
+ button.create(
+ *this,
+ ButtonSubScene::Data {
+ .text = "STOP REC",
+ .text_width = 120,
+ .position = {X_POS_BUTTONS+X_POS_BUTTONS_SPACING*2,Y_POS_BUTTONS},
+ .script_type = ButtonSubScene::ScriptSelect::PREVIEW_STOP,
+ .button_type = ButtonSubScene::ButtonSelect::LARGE,
+ .scale = 0.6,
+ .worldspace = false,
+ .tag = "Next button",
+ .sorting_layer_offset = 20,
+ .btn_side_color = ButtonSubScene::ButtonSideColor::BLUE,
+ }
+ );
+
+ button.create(
+ *this,
+ ButtonSubScene::Data {
+ .text = "REPLAY",
+ .text_width = 90,
+ .position = {X_POS_BUTTONS+X_POS_BUTTONS_SPACING*3,Y_POS_BUTTONS},
+ .script_type = ButtonSubScene::ScriptSelect::PREVIEW_REPLAY,
+ .button_type = ButtonSubScene::ButtonSelect::LARGE,
+ .scale = 0.6,
+ .worldspace = false,
+ .tag = "Next button",
+ .sorting_layer_offset = 20,
+ .btn_side_color = ButtonSubScene::ButtonSideColor::ORANGE,
+ }
+ );
+
/*
for (int i = 0; i < 200; ++i) {
diff --git a/game/hud/HudScript.cpp b/game/hud/HudScript.cpp
index 8f77706..3fb7a77 100644
--- a/game/hud/HudScript.cpp
+++ b/game/hud/HudScript.cpp
@@ -3,6 +3,7 @@
#include "../Config.h"
#include "../Events.h"
+#include "menus/endgame/EndGameSubScript.h"
#include <climits>
@@ -91,5 +92,6 @@ bool HudScript::save() {
SaveManager & savemgr = this->get_save_manager();
savemgr.set(TOTAL_COINS_RUN, this->coin_amount);
savemgr.set(DISTANCE_RUN, this->distance_st);
+ this->trigger_event<ShowScoreEvent>();
return false;
}
diff --git a/game/menus/ButtonNextMainMenuSubScript.cpp b/game/menus/ButtonNextMainMenuSubScript.cpp
index e03a34a..631b4d3 100644
--- a/game/menus/ButtonNextMainMenuSubScript.cpp
+++ b/game/menus/ButtonNextMainMenuSubScript.cpp
@@ -1,4 +1,5 @@
#include "ButtonNextMainMenuSubScript.h"
+#include "ButtonReplaySubScript.h"
#include "MenusConfig.h"
#include "ValueBroker.h"
@@ -26,7 +27,8 @@ bool ButtonNextMainMenuSubScript::on_button_press(const ButtonPressEvent & e) {
for (AudioSource & audio : audios) {
audio.stop();
}
-
+
+ this->trigger_event<DeleteRecordingEvent>();
SaveManager & savemgr = this->get_save_manager();
ValueBroker<int> coins = savemgr.get<int>(TOTAL_COINS_RUN, 0);
diff --git a/game/menus/ButtonReplaySubScript.cpp b/game/menus/ButtonReplaySubScript.cpp
index 9308350..55e718d 100644
--- a/game/menus/ButtonReplaySubScript.cpp
+++ b/game/menus/ButtonReplaySubScript.cpp
@@ -1,4 +1,5 @@
#include "ButtonReplaySubScript.h"
+#include "Config.h"
#include "MenusConfig.h"
#include "../Events.h"
@@ -16,15 +17,27 @@ void ButtonReplaySubScript::init() {
this->subscribe<EndGameEvent>([this](const EndGameEvent & e) {
return this->set_recording();
});
+ this->subscribe<DeleteRecordingEvent>([this](const DeleteRecordingEvent & e) {
+ return this->delete_recording();
+ });
+ if(DISABLE_REPLAY)return;
replay.record_start();
}
bool ButtonReplaySubScript::on_button_press(const ButtonPressEvent & e) {
+ if(DISABLE_REPLAY)return false;
replay.play(this->recording);
return false;
}
bool ButtonReplaySubScript::set_recording() {
+ if(DISABLE_REPLAY)return false;
this->recording = replay.record_end();
return false;
}
+
+bool ButtonReplaySubScript::delete_recording() {
+ if(DISABLE_REPLAY)return false;
+ replay.release(this->recording);
+ return false;
+}
diff --git a/game/menus/ButtonReplaySubScript.h b/game/menus/ButtonReplaySubScript.h
index bfc684d..3eb8aa9 100644
--- a/game/menus/ButtonReplaySubScript.h
+++ b/game/menus/ButtonReplaySubScript.h
@@ -4,6 +4,8 @@
#include <crepe/api/Script.h>
+struct DeleteRecordingEvent : public crepe::Event {};
+
class ButtonReplaySubScript : public IButtonScript {
public:
void init() override;
@@ -12,6 +14,7 @@ public:
private:
crepe::recording_t recording = 0;
bool set_recording();
+ bool delete_recording();
protected:
bool transition = false;
diff --git a/game/menus/ButtonSubScene.cpp b/game/menus/ButtonSubScene.cpp
index 30646f1..baf154c 100644
--- a/game/menus/ButtonSubScene.cpp
+++ b/game/menus/ButtonSubScene.cpp
@@ -7,10 +7,16 @@
#include "IButtonScript.h"
#include "MenusConfig.h"
+#include "../preview/PreviewReplaySubScript.h"
+#include "../preview/PreviewStartRecSubScript.h"
+#include "../preview/PreviewStopRecSubScript.h"
+#include "api/Asset.h"
#include "mainmenu/ButtonTransitionPreviewSubScript.h"
#include "../Config.h"
#include "mainmenu/CreditsSubScript.h"
+#include "menus/shop/ButtonBuySelectBubbleScript.h"
+#include "menus/shop/ButtonBuySelectBulletScript.h"
#include <crepe/api/BehaviorScript.h>
#include <crepe/api/Button.h>
@@ -72,6 +78,26 @@ void ButtonSubScene::set_script(crepe::GameObject & button_object, const Data &
button_object.add_component<BehaviorScript>()
.set_script<ButtonShowCreditsSubScript>();
break;
+ case ScriptSelect::PREVIEW_REPLAY:
+ button_object.add_component<BehaviorScript>()
+ .set_script<PreviewReplaySubScript>();
+ break;
+ case ScriptSelect::PREVIEW_START:
+ button_object.add_component<BehaviorScript>()
+ .set_script<PreviewStartRecSubScript>();
+ break;
+ case ScriptSelect::PREVIEW_STOP:
+ button_object.add_component<BehaviorScript>()
+ .set_script<PreviewStopRecSubScript>();
+ break;
+ case ScriptSelect::SHOP_BULLET:
+ button_object.add_component<BehaviorScript>()
+ .set_script<ButtonBuySelectBulletScript>();
+ break;
+ case ScriptSelect::SHOP_BUBBLE:
+ button_object.add_component<BehaviorScript>()
+ .set_script<ButtonBuySelectBubbleScript>();
+ break;
case ScriptSelect::NONE:
button_object.add_component<BehaviorScript>().set_script<IButtonScript>();
break;
@@ -196,8 +222,31 @@ void ButtonSubScene::next_btn_overlay(crepe::GameObject & button_object, const D
void ButtonSubScene::btn_color_side(
crepe::GameObject & button_object, const vec2 & offset, const Data & data
) {
+ Asset * selected;
+ Asset blue = Asset("asset/ui/buttonSmallBlue.png");
+ Asset orange = Asset("asset/ui/buttonSmallOrange.png");
+ Asset purple = Asset("asset/ui/buttonSmallPurple.png");
+ Asset yellow = Asset("asset/ui/buttonSmallYellow.png");
+ switch (data.btn_side_color) {
+ case ButtonSideColor::BLUE:
+ selected = &blue;
+ break;
+ case ButtonSideColor::ORANGE:
+ selected = &orange;
+ break;
+ case ButtonSideColor::PURPLE:
+ selected = &purple;
+ break;
+ case ButtonSideColor::YELLOW:
+ selected = &yellow;
+ break;
+ case ButtonSideColor::NONE:
+ selected = &blue;
+ break;
+ }
+
button_object.add_component<Sprite>(
- Asset("asset/ui/buttonSmallBlue.png"),
+ *selected,
Sprite::Data {
.sorting_in_layer = STARTING_SORTING_IN_LAYER + 2 + data.sorting_layer_offset,
.size = SIDE_PANEL_SIZE,
@@ -206,7 +255,7 @@ void ButtonSubScene::btn_color_side(
}
);
button_object.add_component<Sprite>(
- Asset("asset/ui/buttonSmallBlue.png"),
+ *selected,
Sprite::Data {
.flip = {true, false},
.sorting_in_layer = STARTING_SORTING_IN_LAYER + 2 + data.sorting_layer_offset,
diff --git a/game/menus/ButtonSubScene.h b/game/menus/ButtonSubScene.h
index 74f9464..d4c7223 100644
--- a/game/menus/ButtonSubScene.h
+++ b/game/menus/ButtonSubScene.h
@@ -19,6 +19,11 @@ public:
REPLAY,
CREDITS_SHOW,
CREDITS_BACK,
+ PREVIEW_START,
+ PREVIEW_STOP,
+ PREVIEW_REPLAY,
+ SHOP_BULLET,
+ SHOP_BUBBLE,
NONE,
};
//icon enum
@@ -33,6 +38,14 @@ public:
NEXT,
LARGE,
};
+
+ enum class ButtonSideColor {
+ BLUE,
+ ORANGE,
+ PURPLE,
+ YELLOW,
+ NONE,
+ };
//data struct
struct Data {
const std::string & text = "NODATA";
@@ -48,6 +61,7 @@ public:
const bool color_side = true;
const std::string & tag = "";
const int sorting_layer_offset = 0;
+ const ButtonSideColor btn_side_color = ButtonSideColor::NONE;
};
public:
diff --git a/game/menus/endgame/EndGameSubScene.cpp b/game/menus/endgame/EndGameSubScene.cpp
index a6f8b25..0b72bdc 100644
--- a/game/menus/endgame/EndGameSubScene.cpp
+++ b/game/menus/endgame/EndGameSubScene.cpp
@@ -47,6 +47,48 @@ void EndGameSubScene::create(Scene & scn) {
vec2 {0, -207} + FONTOFFSET, TITEL_STRING
);
+ const float Y_SPACING = 50;
+ const float Y_OFFSET = -100;
+
+ // Gold gathered
+ const string GOLD_STRING = "gold:0";
+ GameObject gold = scn.new_object("gold_endgame", TAG);
+ crepe::vec2 size_gold = {200, (200.0f / GOLD_STRING.size()) * 2};
+ gold.add_component<Text>(
+ size_gold, FONT,
+ Text::Data {
+ .world_space = false,
+ .text_color = Color::GOLD,
+ },
+ vec2 {0, Y_OFFSET} + FONTOFFSET, GOLD_STRING
+ );
+
+ // Distance
+ const string DISTANCE_STRING = "0M";
+ GameObject distance = scn.new_object("distance_endgame", TAG);
+ crepe::vec2 size_distance = {200, (200.0f / DISTANCE_STRING.size()) * 2};
+ distance.add_component<Text>(
+ size_distance, FONT,
+ Text::Data {
+ .world_space = false,
+ .text_color = Color::WHITE,
+ },
+ vec2 {0, Y_SPACING+Y_OFFSET} + FONTOFFSET, DISTANCE_STRING
+ );
+
+ // Highscore
+ const string HIGHSCORE_STRING = "NEW HIGHSCORE";
+ GameObject highscore = scn.new_object("highscore_endgame", "highscore_tag_end");
+ crepe::vec2 size_highscore = {200, (200.0f / HIGHSCORE_STRING.size()) * 2};
+ highscore.add_component<Text>(
+ size_highscore, FONT,
+ Text::Data {
+ .world_space = false,
+ .text_color = Color::WHITE,
+ },
+ vec2 {0, Y_SPACING*2+Y_OFFSET} + FONTOFFSET, HIGHSCORE_STRING
+ ).active = false;
+
// Buttons
vec2 button_position = {190, 190};
ButtonSubScene button;
diff --git a/game/menus/endgame/EndGameSubScript.cpp b/game/menus/endgame/EndGameSubScript.cpp
index 6edfe7b..e081350 100644
--- a/game/menus/endgame/EndGameSubScript.cpp
+++ b/game/menus/endgame/EndGameSubScript.cpp
@@ -3,6 +3,9 @@
#include "../../Events.h"
#include "../ButtonReplaySubScript.h"
#include "../IFloatingWindowScript.h"
+#include "../../Config.h"
+#include "ValueBroker.h"
+#include "manager/SaveManager.h"
#include <string>
@@ -21,6 +24,9 @@ void EndGameSubScript::init() {
this->subscribe<EndGameEvent>([this](const EndGameEvent e) {
return this->reset_timescale();
});
+ this->subscribe<ShowScoreEvent>([this](const ShowScoreEvent e) {
+ return this->showscore();
+ });
}
bool EndGameSubScript::disable_all() {
@@ -53,3 +59,37 @@ bool EndGameSubScript::reset_timescale() {
this->get_loop_timer().set_time_scale(1);
return false;
}
+
+bool EndGameSubScript::showscore(){
+ // Gather text
+ Text & coins_text = this->get_components_by_name<Text>("gold_endgame").front().get();
+ Text & distance_text = this->get_components_by_name<Text>("distance_endgame").front().get();
+ Text & highscore_text = this->get_components_by_name<Text>("highscore_endgame").front().get();
+ highscore_text.active = false;
+
+ // Gather saved data
+ SaveManager & savemgr = this->get_save_manager();
+ ValueBroker<std::string> coins = savemgr.get<std::string>(TOTAL_COINS_RUN, "0");
+ ValueBroker<std::string> distance = savemgr.get<std::string>(DISTANCE_RUN, "0");
+ int distance_run = savemgr.get<int>(DISTANCE_RUN, 0).get();
+ int distance_game = savemgr.get<int>(DISTANCE_GAME, 0).get();
+
+ // Show highscore
+ if(distance_run > distance_game) highscore_text.active = true;
+
+ const float CHAR_SIZE_DIS = 20;
+ // Show distance
+ std::string distance_string = "DISTANCE:" + distance.get();
+ distance_text.text = distance_string;
+ crepe::vec2 size_distance = {CHAR_SIZE_DIS*distance_string.size(), (CHAR_SIZE_DIS*distance_string.size() / distance_string.size()) * 2};
+ distance_text.dimensions = size_distance;
+
+ const float CHAR_SIZE_COIN = 16;
+ // Show coins
+ std::string coins_string = "Coins:" + coins.get();
+ coins_text.text = coins_string;
+ crepe::vec2 size_coins = {CHAR_SIZE_COIN*coins_string.size(), (CHAR_SIZE_COIN*coins_string.size() / coins_string.size()) * 2};
+ coins_text.dimensions = size_coins;
+
+ return false;
+}
diff --git a/game/menus/endgame/EndGameSubScript.h b/game/menus/endgame/EndGameSubScript.h
index 62a2f0c..c25f6ca 100644
--- a/game/menus/endgame/EndGameSubScript.h
+++ b/game/menus/endgame/EndGameSubScript.h
@@ -5,6 +5,8 @@
#include <crepe/api/Event.h>
#include <crepe/api/Script.h>
+struct ShowScoreEvent : public crepe::Event {};
+
class EndGameSubScript : public IFloatingWindowScript {
public:
EndGameSubScript(const std::string & tag);
@@ -12,4 +14,5 @@ public:
bool disable_all();
bool enable_all();
bool reset_timescale();
+ bool showscore();
};
diff --git a/game/menus/mainmenu/MainMenuScene.cpp b/game/menus/mainmenu/MainMenuScene.cpp
index fba90ac..baeca39 100644
--- a/game/menus/mainmenu/MainMenuScene.cpp
+++ b/game/menus/mainmenu/MainMenuScene.cpp
@@ -29,7 +29,7 @@ void MainMenuScene::load_scene() {
camera_object.add_component<Camera>(
ivec2(990, 720), vec2(1100, 800),
Camera::Data {
- .bg_color = Color::RED,
+ .bg_color = Color::BLACK,
}
);
camera_object.add_component<BehaviorScript>().set_script<TransitionStartSubScript>();
@@ -55,6 +55,7 @@ void MainMenuScene::load_scene() {
.text_width = 200,
.position = pos_btn,
.script_type = ButtonSubScene::ScriptSelect::PREVIEW,
+ .btn_side_color = ButtonSubScene::ButtonSideColor::PURPLE,
}
);
@@ -70,6 +71,7 @@ void MainMenuScene::load_scene() {
.icon_type = ButtonSubScene::IconSelect::SHOP,
.position = pos_btn,
.script_type = ButtonSubScene::ScriptSelect::SHOP,
+ .btn_side_color = ButtonSubScene::ButtonSideColor::ORANGE,
}
);
@@ -83,6 +85,7 @@ void MainMenuScene::load_scene() {
.text_width = 200,
.position = pos_btn,
.script_type = ButtonSubScene::ScriptSelect::CREDITS_SHOW,
+ .btn_side_color = ButtonSubScene::ButtonSideColor::BLUE,
}
);
diff --git a/game/menus/shop/ButtonBuySelectBubbleScript.cpp b/game/menus/shop/ButtonBuySelectBubbleScript.cpp
new file mode 100644
index 0000000..21dbe1a
--- /dev/null
+++ b/game/menus/shop/ButtonBuySelectBubbleScript.cpp
@@ -0,0 +1,36 @@
+#include "ButtonBuySelectBubbleScript.h"
+#include "../MenusConfig.h"
+#include "Config.h"
+#include "ValueBroker.h"
+#include "manager/SaveManager.h"
+#include "menus/shop/Shopconfig.h"
+
+using namespace crepe;
+using namespace std;
+
+void ButtonBuySelectBubbleScript::init() {
+ IButtonScript::init();
+ this->subscribe<ButtonPressEvent>([this](const ButtonPressEvent & e) {
+ return this->on_button_press(e);
+ });
+}
+
+bool ButtonBuySelectBubbleScript::on_button_press(const ButtonPressEvent & e) {
+ SaveManager & save = this->get_save_manager();
+ ValueBroker<int> buy_bullet = save.get<int>(BUY_BUBBLE_SAVE,0);
+ if(!buy_bullet.get()){
+ ValueBroker<int> coins = save.get<int>(TOTAL_COINS_GAME,0);
+ if(coins.get() >= 1000)
+ {
+ int coin = coins.get();
+ coin -= 1000;
+ save.set(TOTAL_COINS_GAME,coin);
+ save.set(BUY_BUBBLE_SAVE,1);
+ }
+ }
+ else {
+ save.set(JETPACK_PARTICLES,1);
+ }
+ this->trigger_event<ShopUpdate>();
+ return false;
+}
diff --git a/game/menus/shop/ButtonBuySelectBubbleScript.h b/game/menus/shop/ButtonBuySelectBubbleScript.h
new file mode 100644
index 0000000..ce276ef
--- /dev/null
+++ b/game/menus/shop/ButtonBuySelectBubbleScript.h
@@ -0,0 +1,14 @@
+#pragma once
+
+#include "../IButtonScript.h"
+
+#include <crepe/api/Script.h>
+
+class ButtonBuySelectBubbleScript : public IButtonScript {
+public:
+ void init() override;
+ bool on_button_press(const crepe::ButtonPressEvent & e);
+
+protected:
+ bool transition = false;
+};
diff --git a/game/menus/shop/ButtonBuySelectBulletScript.cpp b/game/menus/shop/ButtonBuySelectBulletScript.cpp
new file mode 100644
index 0000000..71d8b76
--- /dev/null
+++ b/game/menus/shop/ButtonBuySelectBulletScript.cpp
@@ -0,0 +1,36 @@
+#include "ButtonBuySelectBulletScript.h"
+#include "../MenusConfig.h"
+#include "Config.h"
+#include "ValueBroker.h"
+#include "manager/SaveManager.h"
+#include "menus/shop/Shopconfig.h"
+
+using namespace crepe;
+using namespace std;
+
+void ButtonBuySelectBulletScript::init() {
+ IButtonScript::init();
+ this->subscribe<ButtonPressEvent>([this](const ButtonPressEvent & e) {
+ return this->on_button_press(e);
+ });
+}
+
+bool ButtonBuySelectBulletScript::on_button_press(const ButtonPressEvent & e) {
+ SaveManager & save = this->get_save_manager();
+ ValueBroker<int> buy_bullet = save.get<int>(BUY_BULLET_SAVE,0);
+ if(!buy_bullet.get()){
+ ValueBroker<int> coins = save.get<int>(TOTAL_COINS_GAME,0);
+ if(coins.get() >= 0)
+ {
+ int coin = coins.get();
+ coin -= 0;
+ save.set(TOTAL_COINS_GAME,coin);
+ save.set(BUY_BULLET_SAVE,1);
+ }
+ }
+ else {
+ save.set(JETPACK_PARTICLES,0);
+ }
+ this->trigger_event<ShopUpdate>();
+ return false;
+}
diff --git a/game/menus/shop/ButtonBuySelectBulletScript.h b/game/menus/shop/ButtonBuySelectBulletScript.h
new file mode 100644
index 0000000..86de0ac
--- /dev/null
+++ b/game/menus/shop/ButtonBuySelectBulletScript.h
@@ -0,0 +1,14 @@
+#pragma once
+
+#include "../IButtonScript.h"
+
+#include <crepe/api/Script.h>
+
+class ButtonBuySelectBulletScript : public IButtonScript {
+public:
+ void init() override;
+ bool on_button_press(const crepe::ButtonPressEvent & e);
+
+protected:
+ bool transition = false;
+};
diff --git a/game/menus/shop/ShopLoadScript.cpp b/game/menus/shop/ShopLoadScript.cpp
new file mode 100644
index 0000000..a9f9bfe
--- /dev/null
+++ b/game/menus/shop/ShopLoadScript.cpp
@@ -0,0 +1,131 @@
+#include "ShopLoadScript.h"
+#include <crepe/ValueBroker.h>
+#include "api/Button.h"
+#include "api/Sprite.h"
+#include "Shopconfig.h"
+#include "api/Text.h"
+#include "manager/SaveManager.h"
+
+using namespace crepe;
+using namespace std;
+
+void ShopLoadScript::init() {
+ this->update();
+ this->subscribe<ShopUpdate>([this](const ShopUpdate e) {
+ return this->update();
+ });
+}
+
+bool ShopLoadScript::update(){
+ SaveManager & save = this->get_save_manager();
+ ValueBroker<int> buy_bullet = save.get<int>(BUY_BULLET_SAVE,0);
+ ValueBroker<int> buy_bubble = save.get<int>(BUY_BUBBLE_SAVE,0);
+
+
+ if(buy_bullet.get()){
+ auto sprites = this->get_components_by_tag<Sprite>(BUY_BULLET);
+ for(auto sprite : sprites){
+ sprite.get().active = false;
+ }
+ auto buttons = this->get_components_by_tag<Button>(BUY_BULLET);
+ for(auto btn : buttons){
+ btn.get().active = false;
+ }
+ auto texts = this->get_components_by_tag<Text>(BUY_BULLET);
+ for(auto txt : texts){
+ txt.get().active = false;
+ }
+ auto sprites1 = this->get_components_by_tag<Sprite>(SELECT_BULLET);
+ for(auto sprite : sprites1){
+ sprite.get().active = true;
+ }
+ auto buttons1 = this->get_components_by_tag<Button>(SELECT_BULLET);
+ for(auto btn : buttons1){
+ btn.get().active = true;
+ }
+ auto texts1 = this->get_components_by_tag<Text>(SELECT_BULLET);
+ for(auto txt : texts1){
+ txt.get().active = true;
+ }
+ }
+ else {
+ auto sprites = this->get_components_by_tag<Sprite>(SELECT_BULLET);
+ for(auto sprite : sprites){
+ sprite.get().active = false;
+ }
+ auto buttons = this->get_components_by_tag<Button>(SELECT_BULLET);
+ for(auto btn : buttons){
+ btn.get().active = false;
+ }
+ auto texts = this->get_components_by_tag<Text>(SELECT_BULLET);
+ for(auto txt : texts){
+ txt.get().active = false;
+ }
+ auto sprites1 = this->get_components_by_tag<Sprite>(BUY_BULLET);
+ for(auto sprite : sprites1){
+ sprite.get().active = true;
+ }
+ auto buttons1 = this->get_components_by_tag<Button>(BUY_BULLET);
+ for(auto btn : buttons1){
+ btn.get().active = true;
+ }
+ auto texts1 = this->get_components_by_tag<Text>(BUY_BULLET);
+ for(auto txt : texts1){
+ txt.get().active = true;
+ }
+ }
+
+ if(buy_bubble.get()){
+ auto sprites = this->get_components_by_tag<Sprite>(BUY_BUBBLE);
+ for(auto sprite : sprites){
+ sprite.get().active = false;
+ }
+ auto buttons = this->get_components_by_tag<Button>(BUY_BUBBLE);
+ for(auto btn : buttons){
+ btn.get().active = false;
+ }
+ auto texts = this->get_components_by_tag<Text>(BUY_BUBBLE);
+ for(auto txt : texts){
+ txt.get().active = false;
+ }
+ auto sprites1 = this->get_components_by_tag<Sprite>(SELECT_BUBBLE);
+ for(auto sprite : sprites1){
+ sprite.get().active = true;
+ }
+ auto buttons1 = this->get_components_by_tag<Button>(SELECT_BUBBLE);
+ for(auto btn : buttons1){
+ btn.get().active = true;
+ }
+ auto texts1 = this->get_components_by_tag<Text>(SELECT_BUBBLE);
+ for(auto txt : texts1){
+ txt.get().active = true;
+ }
+ }
+ else {
+ auto sprites = this->get_components_by_tag<Sprite>(SELECT_BUBBLE);
+ for(auto sprite : sprites){
+ sprite.get().active = false;
+ }
+ auto buttons = this->get_components_by_tag<Button>(SELECT_BUBBLE);
+ for(auto btn : buttons){
+ btn.get().active = false;
+ }
+ auto texts = this->get_components_by_tag<Text>(SELECT_BUBBLE);
+ for(auto txt : texts){
+ txt.get().active = false;
+ }
+ auto sprites1 = this->get_components_by_tag<Sprite>(BUY_BUBBLE);
+ for(auto sprite : sprites1){
+ sprite.get().active = true;
+ }
+ auto buttons1 = this->get_components_by_tag<Button>(BUY_BUBBLE);
+ for(auto btn : buttons1){
+ btn.get().active = true;
+ }
+ auto texts1 = this->get_components_by_tag<Text>(BUY_BUBBLE);
+ for(auto txt : texts1){
+ txt.get().active = true;
+ }
+ }
+ return false;
+}
diff --git a/game/menus/shop/ShopLoadScript.h b/game/menus/shop/ShopLoadScript.h
new file mode 100644
index 0000000..b17bf1c
--- /dev/null
+++ b/game/menus/shop/ShopLoadScript.h
@@ -0,0 +1,10 @@
+#pragma once
+
+#include <crepe/api/Script.h>
+#include <crepe/manager/SaveManager.h>
+
+class ShopLoadScript : public crepe::Script {
+public:
+ void init() override;
+ bool update();
+};
diff --git a/game/menus/shop/ShopMenuScene.cpp b/game/menus/shop/ShopMenuScene.cpp
index d1ea81d..fc7323b 100644
--- a/game/menus/shop/ShopMenuScene.cpp
+++ b/game/menus/shop/ShopMenuScene.cpp
@@ -2,14 +2,17 @@
#include "ShopMenuScene.h"
#include "../../Config.h"
-#include "../BannerSubScene.h"
#include "../ButtonSubScene.h"
#include "../MenusConfig.h"
+#include "api/BehaviorScript.h"
+#include "menus/BannerSubScene.h"
+#include "menus/shop/ShopLoadScript.h"
#include "types.h"
#include <crepe/api/Camera.h>
#include <crepe/api/Sprite.h>
#include <crepe/api/Text.h>
+#include "Shopconfig.h"
using namespace crepe;
using namespace std;
@@ -40,6 +43,7 @@ void ShopMenuScene::load_scene() {
.position_offset {0},
}
);
+ menu_background.add_component<BehaviorScript>().set_script<ShopLoadScript>();
ButtonSubScene button;
button.create(
@@ -54,6 +58,12 @@ void ShopMenuScene::load_scene() {
}
);
+
+
+ const float CHAR_SIZE = 16;
+ const float CHAR_SIZE_COIN = 16;
+ crepe::vec2 size;
+
GameObject shop_item_bullet = this->new_object("bullet", "shop_item", vec2(-100, 0));
shop_item_bullet.add_component<Sprite>(
Asset("asset/other_effects/effect_rocketmgshell_TVOS.png"),
@@ -63,13 +73,17 @@ void ShopMenuScene::load_scene() {
.position_offset = {0, 0},
}
);
+
+ const string BULLETS_STRING = "BULLETS";
+ size = {CHAR_SIZE*BULLETS_STRING.size(), (CHAR_SIZE*BULLETS_STRING.size() / BULLETS_STRING.size()) * 2};
+
shop_item_bullet.add_component<Text>(
- vec2 {100, 50}, FONT,
+ size, FONT,
Text::Data {
.world_space = true,
.text_color = Color::WHITE,
},
- vec2 {0, -75}, "BULLETS"
+ vec2 {0, -75}, BULLETS_STRING
);
shop_item_bullet.add_component<Sprite>(
Asset("asset/ui/buttonCoinsSmall.png"),
@@ -79,13 +93,16 @@ void ShopMenuScene::load_scene() {
.position_offset = {25, 75},
}
);
+
+ const string BULLETS_GOLD_STRING = "0";
+ size = {CHAR_SIZE_COIN*BULLETS_GOLD_STRING.size(), (CHAR_SIZE_COIN*BULLETS_GOLD_STRING.size() / BULLETS_GOLD_STRING.size()) * 2};
shop_item_bullet.add_component<Text>(
- vec2 {37.5, 37.5}, FONT,
+ size, FONT,
Text::Data {
.world_space = true,
.text_color = Color::GOLD,
},
- vec2 {-25, 75}, "0"
+ vec2 {-5, 75}, BULLETS_GOLD_STRING
);
GameObject shop_item_bubble = this->new_object("bubble", "shop_item", vec2(100, 0));
@@ -97,13 +114,16 @@ void ShopMenuScene::load_scene() {
.position_offset = {0, 0},
}
);
+
+ const string BUBBLE_STRING = "BUBBLE";
+ size = {CHAR_SIZE*BUBBLE_STRING.size(), (CHAR_SIZE*BUBBLE_STRING.size() / BUBBLE_STRING.size()) * 2};
shop_item_bubble.add_component<Text>(
- vec2 {100, 50}, FONT,
+ size, FONT,
Text::Data {
.world_space = true,
.text_color = Color::WHITE,
},
- vec2 {0, -75}, "BUBBLE"
+ vec2 {0, -75}, BUBBLE_STRING
);
shop_item_bubble.add_component<Sprite>(
Asset("asset/ui/buttonCoinsSmall.png"),
@@ -113,14 +133,79 @@ void ShopMenuScene::load_scene() {
.position_offset = {45, 75},
}
);
+
+ const string BUBBLE_GOLD_STRING = "1000";
+ size = {CHAR_SIZE_COIN*BUBBLE_GOLD_STRING.size(), (CHAR_SIZE_COIN*BUBBLE_GOLD_STRING.size() / BUBBLE_GOLD_STRING.size()) * 2};
shop_item_bubble.add_component<Text>(
- vec2 {100, 25}, FONT,
+ size, FONT,
Text::Data {
.world_space = true,
.text_color = Color::GOLD,
},
- vec2 {-25, 75}, "1000"
+ vec2 {-10, 75}, BUBBLE_GOLD_STRING
+ );
+
+ button.create(
+ *this,
+ ButtonSubScene::Data {
+ .text = "BUY",
+ .text_width = 100,
+ .position = vec2(-100, 120),
+ .script_type = ButtonSubScene::ScriptSelect::SHOP_BULLET,
+ .button_type = ButtonSubScene::ButtonSelect::LARGE,
+ .scale = 0.4,
+ .tag = BUY_BULLET,
+ .sorting_layer_offset = 20,
+ .btn_side_color = ButtonSubScene::ButtonSideColor::PURPLE
+
+ }
+ );
+
+ button.create(
+ *this,
+ ButtonSubScene::Data {
+ .text = "BUY",
+ .text_width = 100,
+ .position = vec2(100, 120),
+ .script_type = ButtonSubScene::ScriptSelect::SHOP_BUBBLE,
+ .button_type = ButtonSubScene::ButtonSelect::LARGE,
+ .scale = 0.4,
+ .tag = BUY_BUBBLE,
+ .sorting_layer_offset = 20,
+ .btn_side_color = ButtonSubScene::ButtonSideColor::PURPLE
+ }
);
+
+ button.create(
+ *this,
+ ButtonSubScene::Data {
+ .text = "SELECT",
+ .text_width = 100,
+ .position = vec2(-100, 120),
+ .script_type = ButtonSubScene::ScriptSelect::SHOP_BULLET,
+ .button_type = ButtonSubScene::ButtonSelect::LARGE,
+ .scale = 0.4,
+ .tag = SELECT_BULLET,
+ .sorting_layer_offset = 20,
+ .btn_side_color = ButtonSubScene::ButtonSideColor::PURPLE
+ }
+ );
+
+ button.create(
+ *this,
+ ButtonSubScene::Data {
+ .text = "SELECT",
+ .text_width = 100,
+ .position = vec2(100, 120),
+ .script_type = ButtonSubScene::ScriptSelect::SHOP_BUBBLE,
+ .button_type = ButtonSubScene::ButtonSelect::LARGE,
+ .scale = 0.4,
+ .tag = SELECT_BUBBLE,
+ .sorting_layer_offset = 20,
+ .btn_side_color = ButtonSubScene::ButtonSideColor::PURPLE
+ }
+ );
+
}
string ShopMenuScene::get_name() const { return SHOP_SCENE; }
diff --git a/game/menus/shop/Shopconfig.h b/game/menus/shop/Shopconfig.h
new file mode 100644
index 0000000..04c8c5c
--- /dev/null
+++ b/game/menus/shop/Shopconfig.h
@@ -0,0 +1,16 @@
+#pragma once
+#include "api/Event.h"
+
+//tags
+static constexpr const char * BUY_BULLET = "BUY_BULLET";
+static constexpr const char * SELECT_BULLET = "SELECT_BULLET";
+static constexpr const char * BUY_BUBBLE = "BUY_BUBBLE";
+static constexpr const char * SELECT_BUBBLE = "SELECT_BUBBLE";
+
+
+//save_data
+static constexpr const char * BUY_BULLET_SAVE = "BUY_BULLET_SAVE";
+static constexpr const char * BUY_BUBBLE_SAVE = "BUY_BUBBLE_SAVE";
+
+
+struct ShopUpdate : public crepe::Event {};
diff --git a/game/preview/PreviewReplaySubScript.cpp b/game/preview/PreviewReplaySubScript.cpp
new file mode 100644
index 0000000..51c27aa
--- /dev/null
+++ b/game/preview/PreviewReplaySubScript.cpp
@@ -0,0 +1,56 @@
+#include "PreviewReplaySubScript.h"
+#include "Config.h"
+#include "menus/ButtonReplaySubScript.h"
+#include <crepe/api/AudioSource.h>
+#include <crepe/types.h>
+
+using namespace crepe;
+using namespace std;
+
+void PreviewReplaySubScript::init() {
+ IButtonScript::init();
+ this->subscribe<ButtonPressEvent>([this](const ButtonPressEvent & e) {
+ return this->on_button_press(e);
+ });
+ this->subscribe<StopPreviewRecording>([this](const StopPreviewRecording & e) {
+ return this->stop_recording();
+ });
+ this->subscribe<DeleteRecordingEvent>([this](const DeleteRecordingEvent & e) {
+ return this->delete_recording();
+ });
+ this->subscribe<StartPreviewRecording>([this](const StartPreviewRecording & e) {
+ return this->start_recording();
+ });
+
+}
+
+bool PreviewReplaySubScript::on_button_press(const ButtonPressEvent & e) {
+ if(DISABLE_REPLAY)return false;
+ replay.play(this->recording);
+ return false;
+}
+bool PreviewReplaySubScript::start_recording(){
+ if(DISABLE_REPLAY)return false;
+ if(record_saved){
+ this->stop_recording();
+ this->delete_recording();
+ }
+ replay.record_start();
+ this->record_started = true;
+ return false;
+}
+
+bool PreviewReplaySubScript::stop_recording() {
+ if(DISABLE_REPLAY)return false;
+ if(this->record_started)this->recording = replay.record_end();
+ this->record_saved = true;
+ return false;
+}
+
+bool PreviewReplaySubScript::delete_recording() {
+ if(DISABLE_REPLAY)return false;
+ if(this->record_started) this->stop_recording();
+ if(this->record_saved)replay.release(this->recording);
+ this->record_saved = false;
+ return false;
+}
diff --git a/game/preview/PreviewReplaySubScript.h b/game/preview/PreviewReplaySubScript.h
new file mode 100644
index 0000000..ca5bd08
--- /dev/null
+++ b/game/preview/PreviewReplaySubScript.h
@@ -0,0 +1,23 @@
+#pragma once
+
+#include "menus/IButtonScript.h"
+
+#include <crepe/api/Script.h>
+
+struct StartPreviewRecording : public crepe::Event {};
+struct StopPreviewRecording : public crepe::Event {};
+
+class PreviewReplaySubScript : public IButtonScript {
+public:
+ void init() override;
+ bool on_button_press(const crepe::ButtonPressEvent & e);
+
+private:
+ crepe::recording_t recording = 0;
+ bool start_recording();
+ bool stop_recording();
+ bool delete_recording();
+private:
+ bool record_saved = false;
+ bool record_started = false;
+};
diff --git a/game/preview/PreviewStartRecSubScript.cpp b/game/preview/PreviewStartRecSubScript.cpp
new file mode 100644
index 0000000..194f849
--- /dev/null
+++ b/game/preview/PreviewStartRecSubScript.cpp
@@ -0,0 +1,21 @@
+#include "PreviewStartRecSubScript.h"
+#include "PreviewReplaySubScript.h"
+
+#include <crepe/api/AudioSource.h>
+#include <crepe/types.h>
+
+using namespace crepe;
+using namespace std;
+
+void PreviewStartRecSubScript::init() {
+ IButtonScript::init();
+ this->subscribe<ButtonPressEvent>([this](const ButtonPressEvent & e) {
+ return this->on_button_press(e);
+ });
+
+}
+
+bool PreviewStartRecSubScript::on_button_press(const ButtonPressEvent & e) {
+ this->trigger_event<StartPreviewRecording>();
+ return false;
+}
diff --git a/game/preview/PreviewStartRecSubScript.h b/game/preview/PreviewStartRecSubScript.h
new file mode 100644
index 0000000..a54a085
--- /dev/null
+++ b/game/preview/PreviewStartRecSubScript.h
@@ -0,0 +1,11 @@
+#pragma once
+
+#include "menus/IButtonScript.h"
+
+#include <crepe/api/Script.h>
+
+class PreviewStartRecSubScript : public IButtonScript {
+public:
+ void init() override;
+ bool on_button_press(const crepe::ButtonPressEvent & e);
+};
diff --git a/game/preview/PreviewStopRecSubScript.cpp b/game/preview/PreviewStopRecSubScript.cpp
new file mode 100644
index 0000000..c674a8b
--- /dev/null
+++ b/game/preview/PreviewStopRecSubScript.cpp
@@ -0,0 +1,21 @@
+#include "PreviewStopRecSubScript.h"
+#include "PreviewReplaySubScript.h"
+
+#include <crepe/api/AudioSource.h>
+#include <crepe/types.h>
+
+using namespace crepe;
+using namespace std;
+
+void PreviewStopRecSubScript::init() {
+ IButtonScript::init();
+ this->subscribe<ButtonPressEvent>([this](const ButtonPressEvent & e) {
+ return this->on_button_press(e);
+ });
+
+}
+
+bool PreviewStopRecSubScript::on_button_press(const ButtonPressEvent & e) {
+ this->trigger_event<StopPreviewRecording>();
+ return false;
+}
diff --git a/game/preview/PreviewStopRecSubScript.h b/game/preview/PreviewStopRecSubScript.h
new file mode 100644
index 0000000..b2dd73b
--- /dev/null
+++ b/game/preview/PreviewStopRecSubScript.h
@@ -0,0 +1,11 @@
+#pragma once
+
+#include "menus/IButtonScript.h"
+
+#include <crepe/api/Script.h>
+
+class PreviewStopRecSubScript : public IButtonScript {
+public:
+ void init() override;
+ bool on_button_press(const crepe::ButtonPressEvent & e);
+};