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 stages(nrOfStageLevels); -std::vector stageCleared(nrOfStageLevels); //vector that tells if a stage is cleared -std::vector stageTimes(nrOfStageLevels); //For statistical puposes -std::vector stageScores(nrOfStageLevels); //--||-- +//std::vector stageCleared(nrOfStageLevels); //vector that tells if a stage is cleared +//std::vector stageTimes(nrOfStageLevels); //For statistical puposes +//std::vector stageScores(nrOfStageLevels); //--||-- +std::vector 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