git repos / blockattack-game

commit c03502ad

Poul Sander · 2025-10-11 17:10
c03502ad426946a3310a0194d0cd38521817d4bd patch · browse files
parent f5353039ca354079e4103a52ba7e9cea95b3a4ef

Add par score to Stage Clear

Changed files

A Game/data/misc/stage_clear_par.json
M Game/data/sprites/blockattack1.sprite before
M source/code/global.hpp before
M source/code/levelselect.cpp before
M source/code/main.cpp before
M source/code/stageclearhandler.cpp before
M source/code/stageclearhandler.hpp before
diff --git a/Game/data/misc/stage_clear_par.json b/Game/data/misc/stage_clear_par.json new file mode 100644 index 0000000..d1f479c --- /dev/null +++ b/Game/data/misc/stage_clear_par.json
@@ -0,0 +1,254 @@
+{
+ "stages": [
+ {
+ "cleared": true,
+ "score": 5750,
+ "time": 123300
+ },
+ {
+ "cleared": true,
+ "score": 6867,
+ "time": 156050
+ },
+ {
+ "cleared": true,
+ "score": 7343,
+ "time": 187100
+ },
+ {
+ "cleared": true,
+ "score": 8657,
+ "time": 253140
+ },
+ {
+ "cleared": true,
+ "score": 12527,
+ "time": 246200
+ },
+ {
+ "cleared": true,
+ "score": 13137,
+ "time": 292550
+ },
+ {
+ "cleared": true,
+ "score": 4933,
+ "time": 115300
+ },
+ {
+ "cleared": true,
+ "score": 7121,
+ "time": 149820
+ },
+ {
+ "cleared": true,
+ "score": 7556,
+ "time": 179000
+ },
+ {
+ "cleared": true,
+ "score": 8355,
+ "time": 216950
+ },
+ {
+ "cleared": true,
+ "score": 10495,
+ "time": 262850
+ },
+ {
+ "cleared": true,
+ "score": 10497,
+ "time": 306400
+ },
+ {
+ "cleared": true,
+ "score": 4966,
+ "time": 100750
+ },
+ {
+ "cleared": true,
+ "score": 6380,
+ "time": 167100
+ },
+ {
+ "cleared": true,
+ "score": 6970,
+ "time": 182100
+ },
+ {
+ "cleared": true,
+ "score": 9856,
+ "time": 193640
+ },
+ {
+ "cleared": true,
+ "score": 9384,
+ "time": 225750
+ },
+ {
+ "cleared": true,
+ "score": 11658,
+ "time": 286550
+ },
+ {
+ "cleared": true,
+ "score": 4411,
+ "time": 114300
+ },
+ {
+ "cleared": true,
+ "score": 5843,
+ "time": 167500
+ },
+ {
+ "cleared": true,
+ "score": 7277,
+ "time": 186850
+ },
+ {
+ "cleared": true,
+ "score": 10909,
+ "time": 204900
+ },
+ {
+ "cleared": true,
+ "score": 9118,
+ "time": 239550
+ },
+ {
+ "cleared": true,
+ "score": 14225,
+ "time": 246350
+ },
+ {
+ "cleared": true,
+ "score": 4264,
+ "time": 109700
+ },
+ {
+ "cleared": true,
+ "score": 6456,
+ "time": 146600
+ },
+ {
+ "cleared": true,
+ "score": 8061,
+ "time": 199000
+ },
+ {
+ "cleared": true,
+ "score": 8412,
+ "time": 223950
+ },
+ {
+ "cleared": true,
+ "score": 10617,
+ "time": 239750
+ },
+ {
+ "cleared": true,
+ "score": 13763,
+ "time": 266020
+ },
+ {
+ "cleared": true,
+ "score": 5722,
+ "time": 101800
+ },
+ {
+ "cleared": true,
+ "score": 6008,
+ "time": 145480
+ },
+ {
+ "cleared": true,
+ "score": 6777,
+ "time": 167320
+ },
+ {
+ "cleared": true,
+ "score": 6752,
+ "time": 210160
+ },
+ {
+ "cleared": true,
+ "score": 10568,
+ "time": 253600
+ },
+ {
+ "cleared": true,
+ "score": 11497,
+ "time": 275400
+ },
+ {
+ "cleared": true,
+ "score": 5185,
+ "time": 100200
+ },
+ {
+ "cleared": true,
+ "score": 6118,
+ "time": 140650
+ },
+ {
+ "cleared": true,
+ "score": 7112,
+ "time": 165150
+ },
+ {
+ "cleared": true,
+ "score": 10008,
+ "time": 193360
+ },
+ {
+ "cleared": true,
+ "score": 7879,
+ "time": 245020
+ },
+ {
+ "cleared": true,
+ "score": 11114,
+ "time": 287020
+ },
+ {
+ "cleared": true,
+ "score": 4867,
+ "time": 111040
+ },
+ {
+ "cleared": true,
+ "score": 6268,
+ "time": 139740
+ },
+ {
+ "cleared": true,
+ "score": 6640,
+ "time": 173900
+ },
+ {
+ "cleared": true,
+ "score": 8303,
+ "time": 195040
+ },
+ {
+ "cleared": true,
+ "score": 8446,
+ "time": 242730
+ },
+ {
+ "cleared": true,
+ "score": 14302,
+ "time": 248240
+ },
+ {
+ "cleared": true,
+ "score": 4515,
+ "time": 110620
+ },
+ {
+ "cleared": true,
+ "score": 4569,
+ "time": 133160
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Game/data/sprites/blockattack1.sprite b/Game/data/sprites/blockattack1.sprite index 49643df..54bceb1 100644 --- a/Game/data/sprites/blockattack1.sprite +++ b/Game/data/sprites/blockattack1.sprite
@@ -117,6 +117,15 @@
"number_of_frames" : 1,
"frame_time" : 1
},
+"star_yellow" : {
+ "texture" : "ball_yellow",
+ "topx" : 0,
+ "topy" : 0,
+ "height" : 16,
+ "width" : 16,
+ "number_of_frames" : 1,
+ "frame_time" : 1
+},
"b_blank" : {
"texture" : "b_blank",
"topx" : 0,
diff --git a/source/code/global.hpp b/source/code/global.hpp index c795eb0..0c07caf 100644 --- a/source/code/global.hpp +++ b/source/code/global.hpp
@@ -164,6 +164,8 @@ struct GlobalData {
ButtonCords cordNextButton;
ButtonCords cordRetryButton;
+
+ sago::SagoSprite yellow_star;
};
#include "BallManager.hpp"
diff --git a/source/code/levelselect.cpp b/source/code/levelselect.cpp index 12b9c66..4cca2ca 100644 --- a/source/code/levelselect.cpp +++ b/source/code/levelselect.cpp
@@ -99,8 +99,13 @@ int PuzzleLevelSelect(int Type) {
if (Type == 0 && PuzzleIsCleared(i)) {
globalData.iLevelCheck.Draw(globalData.screen,ticks, xplace+10+(i%10)*50, yplace+60+(i/10)*50, &globalData.logicalResize);
}
- if (Type == 1 && IsStageCleared(i)) {
- globalData.iLevelCheck.Draw(globalData.screen, ticks, xplace+10+(i%10)*50, yplace+60+(i/10)*50, &globalData.logicalResize);
+ if (Type == 1) {
+ if (GetStageScores(i) >= GetStageParScore(i)) {
+ globalData.yellow_star.Draw(globalData.screen, ticks, xplace+10+(i%10)*50+2, yplace+60+(i/10)*50+2, &globalData.logicalResize);
+ }
+ if (IsStageCleared(i)) {
+ globalData.iLevelCheck.Draw(globalData.screen, ticks, xplace+10+(i%10)*50, yplace+60+(i/10)*50, &globalData.logicalResize);
+ }
}
}
@@ -197,12 +202,14 @@ int PuzzleLevelSelect(int Type) {
if (Type == 1) {
std::string scoreString = fmt::format(_("Best score: {}"), GetStageScores(selected)) ;
std::string timeString = fmt::format(_("Time used: {}"),"-- : --");
+ std::string parScoreString = fmt::format(_("Par score: {}"), GetStageParScore(selected));
if (GetStageTime(selected)>0) {
timeString = fmt::format(_("Time used: {} : {:02}"), GetStageTime(selected)/1000/60, (GetStageTime(selected)/1000)%60);
}
Write(globalData.screen, 200,200,scoreString.c_str());
+ Write(globalData.screen, 500, 200, parScoreString.c_str());
Write(globalData.screen, 200,250,timeString.c_str());
std::string totalString = fmt::format(_("Total score: {} in {}:{:02}"), totalScore, totalTime/1000/60, ((totalTime/1000)%60) );
Write(globalData.screen, 200,600,totalString.c_str());
diff --git a/source/code/main.cpp b/source/code/main.cpp index 18adb4c..af7e2ef 100644 --- a/source/code/main.cpp +++ b/source/code/main.cpp
@@ -144,6 +144,7 @@ static int InitImages(sago::SagoSpriteHolder& holder) {
globalData.balls[4] = holder.GetSprite("ball_yellow");
globalData.balls[5] = holder.GetSprite("ball_turkish");
globalData.balls[6] = holder.GetSprite("ball_gray");
+ globalData.yellow_star = holder.GetSprite("star_yellow");
globalData.cursor = holder.GetSprite("cursor");
globalData.ready = holder.GetSprite("block_ready");
globalData.explosion[0] = holder.GetSprite("explosion0");
diff --git a/source/code/stageclearhandler.cpp b/source/code/stageclearhandler.cpp index 3080328..5b6d4bd 100644 --- a/source/code/stageclearhandler.cpp +++ b/source/code/stageclearhandler.cpp
@@ -52,9 +52,10 @@ void from_json(const json& j, StageClearElement& p) {
std::vector<StageClearElement> stages(nrOfStageLevels);
-std::vector<bool> stageCleared(nrOfStageLevels); //vector that tells if a stage is cleared
-std::vector<Sint32> stageTimes(nrOfStageLevels); //For statistical puposes
-std::vector<Sint32> stageScores(nrOfStageLevels); //--||--
+//std::vector<bool> stageCleared(nrOfStageLevels); //vector that tells if a stage is cleared
+//std::vector<Sint32> stageTimes(nrOfStageLevels); //For statistical puposes
+//std::vector<Sint32> stageScores(nrOfStageLevels); //--||--
+std::vector<StageClearElement> parScores(nrOfStageLevels);
Sint32 totalScore = 0;
Sint32 totalTime = 0;
@@ -93,6 +94,13 @@ void LoadStageClearStages() {
else {
stages.clear();
}
+ readFileContent = sago::GetFileContent("misc/stage_clear_par.json");
+ json j = json::parse(readFileContent);
+ try {
+ j.at("stages").get_to(parScores);
+ } catch (json::exception& e) {
+ std::cerr << "Failed to read par times. Reason: " << e.what() << "\n";
+ }
stages.resize(nrOfStageLevels);
totalScore = 0;
totalTime = 0;
@@ -117,6 +125,9 @@ bool IsStageCleared(int level) {
return stages.at(level).cleared;
}
+int GetStageParScore(int level) {
+ return parScores.at(level).score;
+}
int GetStageScores(int level) {
return stages.at(level).score;
diff --git a/source/code/stageclearhandler.hpp b/source/code/stageclearhandler.hpp index effa3ca..4580991 100644 --- a/source/code/stageclearhandler.hpp +++ b/source/code/stageclearhandler.hpp
@@ -41,6 +41,7 @@ int GetTotalTime();
int GetNrOfLevels();
bool IsStageCleared(int level);
int GetStageScores(int level);
+int GetStageParScore(int level);
int GetStageTime(int level);
const int nrOfStageLevels = 50; //number of stages in stage Clear