1
- #include < cstdio>
2
-
3
1
#include " levelSelect.h"
4
2
#include " main.h"
5
3
#include " lineNodeBuilder.h"
6
4
#include " levelScene.h"
7
5
6
+ #include < sp2/random.h>
8
7
#include < sp2/scene/camera.h>
9
8
#include < sp2/engine.h>
10
9
#include < sp2/tween.h>
@@ -92,6 +91,7 @@ LevelSelect::LevelSelect()
92
91
for (int n=0 ; sp::io::ResourceProvider::get (" levels/level" + sp::string (n+1 ) + " .json" ) != nullptr ; n++)
93
92
{
94
93
sp::P<LevelNode> next = new LevelNode (getRoot (), " level" + sp::string (n+1 ), sp::string (n + 1 ));
94
+ all_levels.add (next);
95
95
next->setPosition (sp::Vector2d (n * 30 , (n % 2 ) * -10 ));
96
96
if (prev)
97
97
{
@@ -110,6 +110,7 @@ LevelSelect::LevelSelect()
110
110
for (char c=' b' ; sp::io::ResourceProvider::get (" levels/level" + sp::string (n+1 ) + sp::string (c) + " .json" ) != nullptr ; c++)
111
111
{
112
112
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);
113
114
sub->setPosition (prev->getPosition2D () + sp::Vector2d (10 , -30 ));
114
115
new LevelNodeLink (prev, sub);
115
116
prev = sub;
@@ -142,6 +143,8 @@ void LevelSelect::onFixedUpdate()
142
143
sp::P<sp::Node> old_selection = selection;
143
144
for (int n=0 ; n<2 ; n++)
144
145
{
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;
145
148
if (controls[n].right .getDown () && selection->right ) selection = selection->right ;
146
149
if (controls[n].left .getDown () && selection->left ) selection = selection->left ;
147
150
if (controls[n].up .getDown () && selection->up ) selection = selection->up ;
@@ -152,27 +155,17 @@ void LevelSelect::onFixedUpdate()
152
155
sp::P<LevelScene> level_scene = sp::Scene::get (" LEVEL" );
153
156
level_scene->loadLevel (selection->level_name );
154
157
level_scene->enable ();
155
- gui->hide ();
156
158
disable ();
157
159
}
158
160
159
161
if (controls[n].replay_fuel .getDown () || controls[n].replay_time .getDown ())
160
162
{
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);
176
169
}
177
170
}
178
171
if (old_selection != selection)
@@ -183,12 +176,69 @@ void LevelSelect::onFixedUpdate()
183
176
if (escape_key.getDown ())
184
177
sp::Engine::getInstance ()->shutdown ();
185
178
179
+ if (auto_replay_countdown > 0 )
180
+ {
181
+ auto_replay_countdown--;
182
+ }
183
+ else
184
+ {
185
+ startRandomReplay ();
186
+ }
187
+
186
188
camera->setPosition (camera->getPosition2D () * 0.8 + selection->getPosition2D () * 0.2 );
187
189
}
188
190
189
- void LevelSelect::updateTrophys ()
191
+ void LevelSelect::onEnable ()
190
192
{
193
+ updateTrophys ();
191
194
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
+ {
192
242
gui->getWidgetWithID (" FUEL" )->setVisible (sp::io::ResourceProvider::get (selection->level_name + " .trophy.fuel.png" ) != nullptr );
193
243
gui->getWidgetWithID (" FUEL" )->getWidgetWithID (" PHOTO" )->setAttribute (" texture" , selection->level_name + " .trophy.fuel.png" );
194
244
gui->getWidgetWithID (" TIME" )->setVisible (sp::io::ResourceProvider::get (selection->level_name + " .trophy.time.png" ) != nullptr );
0 commit comments