35
36
Sample *sfx_extraball;
36
37
Sample *sfx_extralife;
37
38
Sample *sfx_timebonus;
40
Sample *sfx_failedlevel;
42
BallDesc BallDescriptions[] =
44
{"balls1.png", 255, 0, 0, 1},
45
{"balls1.png", 255, 255, 255, 0},
46
{"balls1.png", 0, 170, 0, 2},
47
{"balls1.png", 0, 0, 255, 3},
48
{"balls1.png", 255, 0, 255, 4},
49
{"balls1.png", 255, 255, 0, 5},
50
{"balls1.png", 30, 30, 30, 0},
51
{"balls1.png", 189, 108, 28, 6},
52
{"balls2.png", 255, 0, 0, 1},
53
{"balls2.png", 255, 255, 255, 0},
54
{"balls2.png", 0, 170, 0, 2},
55
{"balls2.png", 0, 0, 255, 3},
56
{"balls2.png", 255, 0, 255, 4},
57
{"balls2.png", 255, 255, 0, 5},
58
{"balls2.png", 30, 30, 30, 0},
59
{"balls2.png", 189, 108, 28, 6}
43
Game::Game(Scenes::Settings *settings, SDL_Surface *surf, Level &level, GLuint *textures, uint randomSeed, uint lives, int score, bool fromEditor)
44
: Scene(settings, surf), settings(settings), surface(surf),
66
Game::Game(SDL_Surface *surf, Level &level, GLuint *textures, uint randomSeed, uint lives, int score, bool fromEditor, bool alwaysAccuracy, bool survivalMode)
67
: Scene(surf), surface(surf),
45
68
dying(false), randomSeed(randomSeed), randomSeedSet(false), finishCountdown(false), level(level),
46
editor(fromEditor), ownTextures(false), gameOver(false), escaped(false), lives(lives), displayExtraLife(false), extraLifeLastScore(0), score(score),
47
stopTimer(false), timeBonus(false), timeBonusSecondsAdded(0)
69
editor(fromEditor), ownTextures(false), lives(lives), displayExtraLife(false), extraLifeLastScore(0),
70
stopTimer(false), timeBonus(false), timeBonusSecondsAdded(0), renderingForThumb(false), survival(survivalMode), dyingSound(false), score(score), gameOver(false), escaped(false)
49
72
if (textures == NULL)
52
ballText[0] = LoadTexture("balls1.png");
53
ballText[1] = LoadTexture("balls2.png");
54
ballText[2] = LoadTexture("balls3.png");
55
ballText[3] = LoadTexture("balls4.png");
56
ballText[4] = LoadTexture("balls5.png");
57
ballText[5] = LoadTexture("balls6.png");
58
ballText[6] = LoadTexture("balls7.png");
59
ballText[7] = LoadTexture("balls8.png");
61
ballText[8] = LoadTexture("bonus1.png");
62
ballText[9] = LoadTexture("bonus2.png");
63
ballText[10] = LoadTexture("bonus3.png");
64
ballText[11] = LoadTexture("bonus4.png");
65
ballText[12] = LoadTexture("bonus5.png");
66
ballText[13] = LoadTexture("explosion.png");
74
bool useColourHints = settings.getb("colourHints", false);
76
for (int b = 0; b < 16; b++)
78
BallDesc bd = BallDescriptions[b];
79
ballText[b] = LoadBallsTexture(bd.fileName, bd.r, bd.g, bd.b, useColourHints?bd.overlay:0);
82
ballText[16] = LoadTexture("bonus1.png");
83
ballText[17] = LoadTexture("bonus2.png");
84
ballText[18] = LoadTexture("bonus3.png");
85
ballText[19] = LoadTexture("bonus4.png");
86
ballText[20] = LoadTexture("bonus5.png");
87
ballText[21] = LoadTexture("explosion.png");
68
88
ownTextures = true;
72
for (int f = 0; f < 14; f++)
92
for (int f = 0; f < 22; f++)
73
93
ballText[f] = textures[f];
109
138
ballPaths = new BallPath*[nPaths + 1];
110
139
for (int b = 0; b < nPaths; ++b)
112
ballPaths[b] = new BallPath(level.paths[b + 1], ballText, &mix, false);
113
ballPaths[b]->state.ballsToDraw = level.ballsToDraw;
141
Bezier nb = level.paths[b + 1];
145
for (uint p = 0; p < nb.points.size(); p++)
147
nb.points[p].x = 50.0 + (50.0 - nb.points[p].x);
148
nb.points[p].cx = 50.0 + (50.0 - nb.points[p].cx);
154
for (uint p = 0; p < nb.points.size(); p++)
156
nb.points[p].y = 50.0 + (50.0 - nb.points[p].y);
157
nb.points[p].cy = 50.0 + (50.0 - nb.points[p].cy);
161
ballPaths[b] = new BallPath(nb, ballText, &mix, false, level.ballSizes[b]);
162
ballPaths[b]->state.ballsToDraw = level.ballsToDraw[b];
114
163
ballPaths[b]->state.colors = level.colors;
115
ballPaths[b]->state.feedRate = 1;
116
ballPaths[b]->state.ballsFromStart = level.ballsFromStart;
164
ballPaths[b]->state.lastColors = level.colors;
165
ballPaths[b]->state.feedRate = level.startFeedRates[b];
166
ballPaths[b]->state.startFeedRate = level.startFeedRates[b];
167
ballPaths[b]->state.ballsFromStart = level.ballsFromStart[b];
168
ballPaths[b]->state.kidsMode = level.kidsMode;
169
ballPaths[b]->state.bonusFrequency = level.bonusFrequency;
173
ballPaths[b]->state.colors = survivalColorsStart;
174
ballPaths[b]->state.lastColors = survivalColorsStart;
175
ballPaths[b]->state.survival = survival;
119
179
ballPaths[nPaths] = 0;
121
181
// create the player
122
pl = new Player(level.paths[0], ballPaths, level.loop, level.invert);
182
Bezier nb = level.paths[0];
186
for (uint p = 0; p < nb.points.size(); p++)
188
nb.points[p].x = 50.0 + (50.0 - nb.points[p].x);
189
nb.points[p].cx = 50.0 + (50.0 - nb.points[p].cx);
195
for (uint p = 0; p < nb.points.size(); p++)
197
nb.points[p].y = 50.0 + (50.0 - nb.points[p].y);
198
nb.points[p].cy = 50.0 + (50.0 - nb.points[p].cy);
202
bool inv = level.invert;
204
if (level.mirrorX && !level.mirrorY)
209
if (level.mirrorY && !level.mirrorX)
214
pl = new Player(nb, ballPaths, level.loop, inv, fromEditor, level.kidsMode || alwaysAccuracy);
125
sfxVol = atoi(settings->get("sfxVolume", "50").c_str());
126
musicVol = atoi(settings->get("musicVolume", "50").c_str());
217
sfxVol = atoi(settings.get("sfxVolume", "50").c_str());
218
musicVol = atoi(settings.get("musicVolume", "50").c_str());
128
220
displayLevelName = true;
129
221
levelNameDisplayTime = levelNameDisplayTimeout;
131
223
extraLifeLastScore = (score/pointsForNewLife) * pointsForNewLife;
227
// create an empty cursor
229
Uint8 cursdata[] = {0, 0, 0, 0, 0, 0, 0, 0};
134
232
const string Game::getRandomMusic()
285
414
for (int b = 0; b < nPaths; ++b)
287
416
ballPaths[b]->Logic();
290
419
// adjust the feedrate
291
for (int p = 0; p < nPaths; ++p)
293
if (ballPaths[p]->state.ballsToDraw != -1)
295
double fs = level.startFeedRate;
296
double fe = level.endFeedRate;
298
double bd = ballPaths[p]->state.ballsToDraw;
299
double b2d = level.ballsToDraw;
303
ballPaths[p]->state.feedRate = fs + (bd / b2d) * (fe - fs);
422
for (int p = 0; p < nPaths; ++p)
424
if (ballPaths[p]->state.ballsToDraw != -1)
426
double fs = level.startFeedRates[p];
427
double fe = level.endFeedRates[p];
429
double bd = ballPaths[p]->state.ballsToDraw - ballPaths[p]->state.ballsFromStart;
430
double b2d = level.ballsToDraw[p] - level.ballsFromStart[p];
437
ballPaths[p]->state.feedRate = fs + (bd / b2d) * (fe - fs);
443
for (int b = 0; b < nPaths; ++b)
445
ballPaths[b]->state.ballsToDraw = 1;
446
ballPaths[b]->state.colors = survivalColorsStart + (levelSeconds / survivalNewColorTimeout);
447
if (ballPaths[b]->state.colors >= NBALLCOLORS)
448
ballPaths[b]->state.colors = NBALLCOLORS;
450
ballPaths[b]->state.feedRate = ballPaths[b]->state.startFeedRate + (ballPaths[b]->state.colors - survivalColorsStart);
452
ballPaths[b]->state.feedRate = ballPaths[b]->state.feedRate + ((double(levelSeconds) - ((ballPaths[b]->state.colors - survivalColorsStart) * survivalNewColorTimeout * 1.4)) / double(survivalNewColorTimeout) * 1.8);
457
if (ballPaths[0]->state.lastColors != ballPaths[0]->state.colors)
459
mixer->EnqueueSample (sfx_newcolor, sfxVol, 0, false);
460
ballPaths[0]->state.lastColors = ballPaths[0]->state.colors;
307
463
// load the score
482
652
glMatrixMode( GL_MODELVIEW );
483
653
glLoadIdentity( );
655
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
485
657
// render level background
487
686
glTranslatef(0.0, 0.0, -5);
488
687
glEnable(GL_TEXTURE_2D);
489
688
glBindTexture(GL_TEXTURE_2D, level.backgroundTex);
490
689
glBegin(GL_QUADS);
690
glTexCoord2d(tl.x, tl.y);
492
691
glVertex3d(vleft, 100, 0);
692
glTexCoord2d(bl.x, bl.y);
494
693
glVertex3d(vleft, 0, 0);
694
glTexCoord2d(br.x, br.y);
496
695
glVertex3d(vleft + vwidth, 0, 0);
696
glTexCoord2d(tr.x, tr.y);
498
697
glVertex3d(vleft + vwidth, 100, 0);
501
700
glDisable(GL_TEXTURE_2D);
506
for (int b = 0; b < nPaths; ++b)
508
ballPaths[b]->Render();
703
for (int b = 0; b < nPaths; ++b)
705
ballPaths[b]->Render(true, false, true, false);
710
if (level.overlayTex)
713
glTranslatef(0.0, 0.0, 1.5);
714
glEnable(GL_TEXTURE_2D);
715
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
716
glBindTexture(GL_TEXTURE_2D, level.overlayTex);
717
glColor4f(1.0, 1.0, 1.0, 1.0);
720
glTexCoord2d(tl.x, tl.y);
721
glVertex3d(vleft, 100, 0);
722
glTexCoord2d(bl.x, bl.y);
723
glVertex3d(vleft, 0, 0);
724
glTexCoord2d(br.x, br.y);
725
glVertex3d(vleft + vwidth, 0, 0);
726
glTexCoord2d(tr.x, tr.y);
727
glVertex3d(vleft + vwidth, 100, 0);
729
glDisable(GL_TEXTURE_2D);
734
for (int b = 0; b < nPaths; ++b)
736
ballPaths[b]->Render(true, false, false, true);
740
for (int b = 0; b < nPaths; ++b)
742
ballPaths[b]->Render(false, true);
749
if (!editor && !renderingForThumb)
516
751
glColor3f(1.0, 1.0, 1.0);
601
852
font->Render(gettext(level.name.c_str()));
602
853
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
609
sprintf(tbuff, "%02d:%02d", levelSeconds/60, levelSeconds%60);
861
sprintf(tbuff, "%02d:%02d / %02d:%02d ", levelSeconds/60, levelSeconds%60, level.time/60, level.time%60);
865
sprintf(tbuff, "%02d:%02d", levelSeconds/60, levelSeconds%60);
610
868
glLoadIdentity( );
613
870
FTBBox b = font3->BBox(tbuff);
614
871
double tw = b.Upper().X() / 5;
615
872
glTranslated((100 - tw) / 2, 95, 50);
616
873
glScaled(0.2, 0.2, 0.2);
874
glColor4d(1.0, 1.0, 1.0, 1.0);
876
if (!editor && !renderingForThumb)
619
877
font3->Render(tbuff);
621
879
if (timeBonus) // we're adding time bonus !