Skip to content

Commit 1d7fa59

Browse files
committed
Start a random replay when idle. And fix some other minor things.
1 parent 262a2de commit 1d7fa59

File tree

5 files changed

+101
-22
lines changed

5 files changed

+101
-22
lines changed

resources/gui/hud.gui

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@
2929
margin: -30, -30
3030
visible: false
3131
}
32+
33+
[REPLAY_LABEL] {
34+
type: label
35+
alignment: bottom
36+
size: 0, 30
37+
text.size: 5
38+
caption: REPLAY
39+
}
3240
}
3341

3442
[@RECORD_BAR] {

src/levelScene.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ LevelScene::LevelScene()
2424
: sp::Scene("LEVEL")
2525
{
2626
gui = sp::gui::Loader::load("gui/hud.gui", "HUD");
27-
gui->hide();
2827
gui->getWidgetWithID("CAMERA_PREVIEW")->setRotation(-90);
2928
disable();
3029

@@ -53,7 +52,6 @@ void LevelScene::loadLevel(sp::string name, bool replay, std::string replay_file
5352
for(auto obj : getRoot()->getChildren())
5453
delete obj;
5554

56-
gui->show();
5755
gui->getWidgetWithID("BIG_ASS_TROPHY")->hide();
5856
gui->getWidgetWithID("CAMERA_PREVIEW")->hide();
5957

@@ -254,6 +252,8 @@ void LevelScene::onUpdate(float delta)
254252
if (level_already_finished)
255253
return;
256254

255+
gui->getWidgetWithID("REPLAY_LABEL")->setVisible(replay);
256+
257257
switch (level_info.trophy_mode)
258258
{
259259
case LevelInfo::TrophyMode::Normal: {
@@ -281,6 +281,16 @@ void LevelScene::onUpdate(float delta)
281281
}
282282
}
283283

284+
void LevelScene::onEnable()
285+
{
286+
gui->show();
287+
}
288+
289+
void LevelScene::onDisable()
290+
{
291+
gui->hide();
292+
}
293+
284294
bool LevelScene::inTargetArea(sp::Vector2d position)
285295
{
286296
for(auto& target_area : level_info.target_areas)
@@ -433,7 +443,6 @@ void LevelScene::earnTrophyB(int flags)
433443
void LevelScene::exitLevel()
434444
{
435445
disable();
436-
gui->hide();
437446
camera_capture_texture->close();
438447
sp::Scene::get("LEVEL_SELECT")->enable();
439448
}

src/levelScene.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ class LevelScene : public sp::Scene
2121

2222
virtual void onFixedUpdate() override;
2323
virtual void onUpdate(float delta) override;
24+
virtual void onEnable() override;
25+
virtual void onDisable() override;
2426
void doCameraShake() { shake = 15; }
2527

2628
bool inTargetArea(sp::Vector2d position);

src/levelSelect.cpp

Lines changed: 69 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
#include <cstdio>
2-
31
#include "levelSelect.h"
42
#include "main.h"
53
#include "lineNodeBuilder.h"
64
#include "levelScene.h"
75

6+
#include <sp2/random.h>
87
#include <sp2/scene/camera.h>
98
#include <sp2/engine.h>
109
#include <sp2/tween.h>
@@ -92,6 +91,7 @@ LevelSelect::LevelSelect()
9291
for(int n=0; sp::io::ResourceProvider::get("levels/level" + sp::string(n+1) + ".json") != nullptr; n++)
9392
{
9493
sp::P<LevelNode> next = new LevelNode(getRoot(), "level" + sp::string(n+1), sp::string(n + 1));
94+
all_levels.add(next);
9595
next->setPosition(sp::Vector2d(n * 30, (n % 2) * -10));
9696
if (prev)
9797
{
@@ -110,6 +110,7 @@ LevelSelect::LevelSelect()
110110
for(char c='b'; sp::io::ResourceProvider::get("levels/level" + sp::string(n+1) + sp::string(c) + ".json") != nullptr; c++)
111111
{
112112
sp::P<LevelNode> sub = new LevelNode(getRoot(), "level" + sp::string(n+1) + sp::string(c), sp::string(n + 1) + sp::string(c));
113+
all_levels.add(sub);
113114
sub->setPosition(prev->getPosition2D() + sp::Vector2d(10, -30));
114115
new LevelNodeLink(prev, sub);
115116
prev = sub;
@@ -142,6 +143,8 @@ void LevelSelect::onFixedUpdate()
142143
sp::P<sp::Node> old_selection = selection;
143144
for(int n=0; n<2; n++)
144145
{
146+
if (controls[n].left.get() || controls[n].right.get() || controls[n].up.get() || controls[n].down.get())
147+
auto_replay_countdown = auto_replay_delay;
145148
if (controls[n].right.getDown() && selection->right) selection = selection->right;
146149
if (controls[n].left.getDown() && selection->left) selection = selection->left;
147150
if (controls[n].up.getDown() && selection->up) selection = selection->up;
@@ -152,27 +155,17 @@ void LevelSelect::onFixedUpdate()
152155
sp::P<LevelScene> level_scene = sp::Scene::get("LEVEL");
153156
level_scene->loadLevel(selection->level_name);
154157
level_scene->enable();
155-
gui->hide();
156158
disable();
157159
}
158160

159161
if (controls[n].replay_fuel.getDown() || controls[n].replay_time.getDown())
160162
{
161-
sp::P<LevelScene> level_scene = sp::Scene::get("LEVEL");
162-
std::string replay_file = controls[n].replay_fuel.getDown() ? (selection->level_name + "-fuel.replay") :
163-
(selection->level_name + "-time.replay");
164-
165-
FILE* f_existance_test = fopen(replay_file.c_str(), "r");
166-
if(f_existance_test)
167-
{
168-
fclose(f_existance_test);
169-
level_scene->loadLevel(selection->level_name, true, replay_file);
170-
level_scene->enable();
171-
gui->hide();
172-
disable();
173-
}
174-
175-
163+
sp::string replay_file;
164+
if (controls[n].replay_fuel.getDown())
165+
replay_file = selection->level_name + "-fuel.replay";
166+
else
167+
replay_file = selection->level_name + "-time.replay";
168+
startReplay(replay_file);
176169
}
177170
}
178171
if (old_selection != selection)
@@ -183,12 +176,69 @@ void LevelSelect::onFixedUpdate()
183176
if (escape_key.getDown())
184177
sp::Engine::getInstance()->shutdown();
185178

179+
if (auto_replay_countdown > 0)
180+
{
181+
auto_replay_countdown--;
182+
}
183+
else
184+
{
185+
startRandomReplay();
186+
}
187+
186188
camera->setPosition(camera->getPosition2D() * 0.8 + selection->getPosition2D() * 0.2);
187189
}
188190

189-
void LevelSelect::updateTrophys()
191+
void LevelSelect::onEnable()
190192
{
193+
updateTrophys();
191194
gui->show();
195+
auto_replay_countdown = auto_replay_delay;
196+
}
197+
198+
void LevelSelect::onDisable()
199+
{
200+
gui->hide();
201+
}
202+
203+
void LevelSelect::startRandomReplay()
204+
{
205+
int index = sp::irandom(0, all_levels.size() - 1);
206+
for (LevelNode* level : all_levels)
207+
{
208+
if (index > 0)
209+
{
210+
index--;
211+
}
212+
else
213+
{
214+
sp::string replay_file;
215+
if (sp::random(0, 100) < 50)
216+
replay_file = level->level_name + "-fuel.replay";
217+
else
218+
replay_file = level->level_name + "-time.replay";
219+
startReplay(replay_file);
220+
return;
221+
}
222+
}
223+
}
224+
225+
bool LevelSelect::startReplay(sp::string filename)
226+
{
227+
LOG(Debug, filename);
228+
FILE* f_existance_test = fopen(filename.c_str(), "r");
229+
if (!f_existance_test)
230+
return false;
231+
fclose(f_existance_test);
232+
233+
sp::P<LevelScene> level_scene = sp::Scene::get("LEVEL");
234+
level_scene->loadLevel(selection->level_name, true, filename);
235+
level_scene->enable();
236+
disable();
237+
return true;
238+
}
239+
240+
void LevelSelect::updateTrophys()
241+
{
192242
gui->getWidgetWithID("FUEL")->setVisible(sp::io::ResourceProvider::get(selection->level_name + ".trophy.fuel.png") != nullptr);
193243
gui->getWidgetWithID("FUEL")->getWidgetWithID("PHOTO")->setAttribute("texture", selection->level_name + ".trophy.fuel.png");
194244
gui->getWidgetWithID("TIME")->setVisible(sp::io::ResourceProvider::get(selection->level_name + ".trophy.time.png") != nullptr);

src/levelSelect.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#ifndef LEVEL_SELECT_H
22
#define LEVEL_SELECT_H
33

4+
#include <sp2/engine.h>
45
#include <sp2/scene/scene.h>
56
#include <sp2/graphics/gui/widget/widget.h>
67

@@ -12,12 +13,21 @@ class LevelSelect : public sp::Scene
1213
LevelSelect();
1314

1415
virtual void onFixedUpdate() override;
16+
virtual void onEnable() override;
17+
virtual void onDisable() override;
1518

1619
void updateTrophys();
1720
private:
21+
void startRandomReplay();
22+
bool startReplay(sp::string filename);
23+
24+
static constexpr int auto_replay_delay = 30 * sp::Engine::fixed_update_frequency;
25+
1826
sp::P<sp::gui::Widget> gui;
1927
sp::P<sp::Camera> camera;
2028
sp::P<LevelNode> selection;
29+
sp::PList<LevelNode> all_levels;
30+
int auto_replay_countdown;
2131
};
2232

2333
#endif//LEVEL_SELECT_H

0 commit comments

Comments
 (0)