diff options
| author | Ashif Khan <[email protected]> | 2026-09-12 21:02:32 +0530 |
|---|---|---|
| committer | Ashif Khan <[email protected]> | 2026-09-12 21:02:32 +0530 |
| commit | d99db5b7b663583d5eb26994336e8bb809f00529 (patch) | |
| tree | bb5ee6938d3744dde3269d8da0c65ec2bb2b1dbb | |
| parent | ffd968a26826108ca9fb23d46ed5789260852eb7 (diff) | |
tweaking
| -rw-r--r-- | assets/img/arrowhead.png | bin | 1060 -> 590 bytes | |||
| -rw-r--r-- | assets/img/forest.png | bin | 3816 -> 3812 bytes | |||
| -rw-r--r-- | assets/img/forest2.png | bin | 3777 -> 3781 bytes | |||
| -rw-r--r-- | assets/img/talk.png | bin | 1968 -> 1184 bytes | |||
| -rw-r--r-- | game/graphics.hpp | 52 | ||||
| -rw-r--r-- | game/story.hpp | 180 | ||||
| -rw-r--r-- | lib/gameState.hpp | 8 | ||||
| -rw-r--r-- | main.cpp | 5 | ||||
| -rw-r--r-- | screen/gameplay.cpp | 26 | ||||
| -rw-r--r-- | screen/main_menu.cpp | 5 |
10 files changed, 173 insertions, 103 deletions
diff --git a/assets/img/arrowhead.png b/assets/img/arrowhead.png Binary files differindex a703863..cc0960d 100644 --- a/assets/img/arrowhead.png +++ b/assets/img/arrowhead.png diff --git a/assets/img/forest.png b/assets/img/forest.png Binary files differindex b31366a..c1c21d5 100644 --- a/assets/img/forest.png +++ b/assets/img/forest.png diff --git a/assets/img/forest2.png b/assets/img/forest2.png Binary files differindex 83380f8..0a94069 100644 --- a/assets/img/forest2.png +++ b/assets/img/forest2.png diff --git a/assets/img/talk.png b/assets/img/talk.png Binary files differindex 6585ea4..b0344f0 100644 --- a/assets/img/talk.png +++ b/assets/img/talk.png diff --git a/game/graphics.hpp b/game/graphics.hpp index b4ff3b0..f6590cc 100644 --- a/game/graphics.hpp +++ b/game/graphics.hpp @@ -8,35 +8,32 @@ constexpr float TRANSITION_TIME = 1.5f; // in seconds -inline void drawCirno(GameState &gs) { +Texture2D getCirno(GameState &gs) +{ switch (gs.curExp) { case NEUTRAL: - DrawTextureV(gs.AssetManager.load("cirno-neutral"), CIRNO_SPRITE_POSITION, WHITE); - break; + return gs.AssetManager.load("cirno-neutral"); case PISSED: - DrawTextureV(gs.AssetManager.load("cirno-pissed"), CIRNO_SPRITE_POSITION, WHITE); - break; + return gs.AssetManager.load("cirno-pissed"); case HURT: - DrawTextureV(gs.AssetManager.load("cirno-hurt"), CIRNO_SPRITE_POSITION, WHITE); - break; + return gs.AssetManager.load("cirno-hurt"); case JOY: - DrawTextureV(gs.AssetManager.load("cirno-joy"), CIRNO_SPRITE_POSITION, WHITE); - break; + return gs.AssetManager.load("cirno-joy"); case WOW: - DrawTextureV(gs.AssetManager.load("cirno-wow"), CIRNO_SPRITE_POSITION, WHITE); - break; + return gs.AssetManager.load("cirno-wow"); case TIERED: - DrawTextureV(gs.AssetManager.load("cirno-tiered"), CIRNO_SPRITE_POSITION, WHITE); - break; + return gs.AssetManager.load("cirno-tiered"); case LAUGH: - DrawTextureV(gs.AssetManager.load("cirno-laugh"), CIRNO_SPRITE_POSITION, WHITE); - break; + return gs.AssetManager.load("cirno-laugh"); case RELAXED: - DrawTextureV(gs.AssetManager.load("cirno-relaxed"), CIRNO_SPRITE_POSITION, WHITE); - break; + return gs.AssetManager.load("cirno-relaxed"); } } +inline void drawCirno(GameState &gs) { + DrawTextureV(getCirno(gs), CIRNO_SPRITE_POSITION, WHITE); +} + inline Texture2D getCurrentScene(GameState &gs) { switch (gs.curPos) { case INSIDE: @@ -71,8 +68,9 @@ inline Texture2D getCurrentScene(GameState &gs, POSITION scene) { inline void DrawSceneChange(GameState &gs) { if (gs.timeSinceSceneChange < TRANSITION_TIME) { - float t = Clamp(gs.timeSinceSceneChange / TRANSITION_TIME, 0.0f, 1.0f); + float t = Clamp(gs.timeSinceSceneChange / (TRANSITION_TIME / 2), 0.0f, 1.0f); float a = 0.5f - 0.5f * cosf(t * PI); + DrawTextureV(getCurrentScene(gs, gs.prevPos), ZERO_VEC, ColorAlpha(WHITE, 1.0f - a)); @@ -80,8 +78,24 @@ inline void DrawSceneChange(GameState &gs) { DrawTextureV(getCurrentScene(gs, gs.curPos), ZERO_VEC, ColorAlpha(WHITE, a)); + + if (gs.timeSinceSceneChange > (TRANSITION_TIME/2)) { + float halfTime = gs.timeSinceSceneChange - (TRANSITION_TIME / 2); + float t2 = Clamp(halfTime / (TRANSITION_TIME / 2), 0.0f, 1.0f); + float a2 = 0.5f - 0.5f * cosf(t2 * PI); + + DrawTextureV(getCirno(gs), + CIRNO_SPRITE_POSITION, + ColorAlpha(WHITE, a2)); + + if (gs.curExp != HURT && gs.flowerOnHead) { + DrawTextureV(gs.AssetManager.load("flower"), ZERO_VEC, ColorAlpha(WHITE, a2)); + } + } + gs.timeSinceSceneChange = gs.timeSinceSceneChange + GetFrameTime(); - } else { + } + else { gs.timeSinceSceneChange = -1.0f; } } diff --git a/game/story.hpp b/game/story.hpp index ef06d13..d9053f6 100644 --- a/game/story.hpp +++ b/game/story.hpp @@ -8,18 +8,23 @@ #define CIRNO_DIALOG "Cirno", inline void ProcessClick(GameState &gs) { + if (gs.GameOver) return; + if (gs.DialogueOnlyInput) return; + if (CheckCollisionPointRec(gs.currentMousePos, Forehead)) { if (gs.flickCount == 0) { SayDialog(gs, std::vector<Dialogues>{ - {CIRNO_DIALOG HURT, "owww"}, - {CIRNO_DIALOG PISSED, "it hurts. You are mean!"}, + {CIRNO_DIALOG HURT, "Owww"}, + {CIRNO_DIALOG PISSED, "It hurts."}, {CIRNO_DIALOG PISSED, "Why did you do that?"} }); + gs.flickCount++; } else if (gs.flickCount == 1) { SayDialog(gs, std::vector<Dialogues> { {CIRNO_DIALOG HURT, "You did it again!"}, - {CIRNO_DIALOG PISSED, "Owww, it hurts.\nStop it!"}, + {CIRNO_DIALOG PISSED, "Stop it!"}, }); + gs.flickCount++; } else if (gs.flickCount == 2) { SayDialog(gs, std::vector<Dialogues> { {CIRNO_DIALOG PISSED, "No, I won't let you\ndo it again"}, @@ -27,62 +32,63 @@ inline void ProcessClick(GameState &gs) { }); gs.explored.insert(1); } - gs.flickCount++; } else if (CheckCollisionPointRec(gs.currentMousePos, UI_arrowBtn)) { if (gs.curPos == INSIDE) { changeSceneTo(gs, OUTSIDE); - SayDialog(gs, std::vector<Dialogues> { - {CIRNO_DIALOG WOW, "This is where I live"}, - }); gs.explored.insert(2); } else if (gs.curPos == OUTSIDE) { changeSceneTo(gs, FOREST); - SayDialog(gs, std::vector<Dialogues> { - {CIRNO_DIALOG LAUGH, "Let's freeze some\nfrogs!"}, - }); gs.explored.insert(3); } else if (gs.curPos == FOREST) { changeSceneTo(gs, INSIDE); - SayDialog(gs, std::vector<Dialogues> { - {CIRNO_DIALOG RELAXED, "Back in sweet cozy\nhome!"} - }); - gs.explored.insert(4); } } else if (CheckCollisionPointRec(gs.currentMousePos, UI_talkBtn)) { - if (!gs.usedTalkButton) { + if (gs.TalkButtonUseCount == 0) { SayDialog(gs, std::vector<Dialogues> { {CIRNO_DIALOG RELAXED, "Good Morning"}, }); - gs.usedTalkButton = true; - } else { + gs.TalkButtonUseCount++; + } else if (gs.TalkButtonUseCount == 1) { SayDialog(gs, std::vector<Dialogues> { {CIRNO_DIALOG JOY, "Having lots of fun is\nwhat matters."}, {CIRNO_DIALOG RELAXED, "Imagine having no fun\nand being grumpy\nall the time."}, - {CIRNO_DIALOG JOY, "Next time, when you come,\nwe can play together."}, - {CIRNO_DIALOG JOY, "With Daiyousei and\nthe other fairies."}, + }); + gs.TalkButtonUseCount++; + } else if (gs.TalkButtonUseCount == 2) { + SayDialog(gs, std::vector<Dialogues> { + {CIRNO_DIALOG JOY, "Next time, when you come,\nwe can play together with\nDaiyousei and the other"}, + {CIRNO_DIALOG JOY, "fairies."}, + }); + gs.TalkButtonUseCount++; + } else if (gs.TalkButtonUseCount == 3) { + SayDialog(gs, std::vector<Dialogues> { {CIRNO_DIALOG RELAXED, "It would be nice if\nwinter comes soon."}, {CIRNO_DIALOG JOY, "I want to skate on the\nmisty lake with Letty."}, - {CIRNO_DIALOG WOW, "I am the smartest\nin Gensokyo."}, - {CIRNO_DIALOG WOW, "I can add and multiply\nfractions!"}, + }); + gs.TalkButtonUseCount++; + } else if (gs.TalkButtonUseCount == 4) { + SayDialog(gs, std::vector<Dialogues> { + {CIRNO_DIALOG WOW, "I am the smartest in\nGensokyo. I can add\nand multiply fractions!"}, {CIRNO_DIALOG LAUGH, "Only a few could rival\nan intellect such\nas mine."} }); - gs.explored.insert(7); + gs.TalkButtonUseCount = 1; + gs.explored.insert(4); } } else if (gs.curPos == INSIDE) { if (CheckCollisionPointRec(gs.currentMousePos, Calendar)) { SayDialog(gs, std::vector<Dialogues> { - {CIRNO_DIALOG WOW, "its cirno day, todeh"}, - {CIRNO_DIALOG JOY, "billions must celebrate"} + {CIRNO_DIALOG WOW, "Its Cirno Day, todeh."}, + {CIRNO_DIALOG JOY, "Billions must celebrate\nthis occasion."} }); gs.explored.insert(5); } else if (CheckCollisionPointRec(gs.currentMousePos, Chest)) { if (gs.chestCount == 0) { SayDialog(gs, std::vector<Dialogues> { - {CIRNO_DIALOG WOW, "Hey!! Don't snoop around\nthe chest"}, - {CIRNO_DIALOG TIERED, "It's where I store all my\ntreasures"} + {CIRNO_DIALOG WOW, "Hey!! Don't snoop around\nthe chest."}, + {CIRNO_DIALOG TIERED, "It's where I store all my\ntreasures."} }); gs.chestCount++; } else if (gs.chestCount == 1) { @@ -93,84 +99,108 @@ inline void ProcessClick(GameState &gs) { } } else if (CheckCollisionPointRec(gs.currentMousePos, Futton)) { - if (gs.explored.size() == 13) { + if (gs.explored.size() == 12) { SayDialog(gs, std::vector<Dialogues> { - {CIRNO_DIALOG WOW, "I am feeling sleepy\nI had lots of fun with you"}, - {CIRNO_DIALOG TIERED, " I am gonna take a nap\nLet's see tommorow!!"} + {CIRNO_DIALOG WOW, "I am feeling sleepy\nI had lots of fun with you."}, + {CIRNO_DIALOG TIERED, " I am gonna take a nap\nnow. Let's see tommorow!!"} }); + gs.GameOver = true; } else { SayDialog(gs, std::vector<Dialogues> { - {CIRNO_DIALOG WOW, "I just woke up before\nyou came"}, - {CIRNO_DIALOG TIERED, "So, I am not sleepy now\nI want to play"} + {CIRNO_DIALOG WOW, "I just woke up before\nyou came."}, + {CIRNO_DIALOG TIERED, "So, I am not sleepy now."} }); } } } else if (gs.curPos == OUTSIDE){ if (CheckCollisionPointRec(gs.currentMousePos, YokaiMountain)) { - SayDialog(gs, std::vector<Dialogues> { - {CIRNO_DIALOG WOW, "That's the Youkai Mountain\nThat's where Aya lives"}, - {CIRNO_DIALOG JOY, "She is nosy and snitches\nme to people whenever\nI am up to no good"}, - {CIRNO_DIALOG PISSED, "Bah!! She is annoying!"}, - {CIRNO_DIALOG JOY, "The Moriya shrine is at\nthe very top of the\nYoukai Mountain"}, - {CIRNO_DIALOG WOW, "The deities there,\nare very strong."}, - {CIRNO_DIALOG LAUGH, "Not as strong as me,\nof course!"}, - {CIRNO_DIALOG WOW, "But I like the Hakurei\nshrine more"}, - {CIRNO_DIALOG RELAXED, "Reimu sometimes gives\nme some snacks\nwhen I go there"}, - }); - gs.explored.insert(8); + if (gs.MountainClickCount == 0) { + SayDialog(gs, std::vector<Dialogues> { + {CIRNO_DIALOG WOW, "That's Youkai Mountain\nThat's where Aya\nlives"}, + {CIRNO_DIALOG JOY, "She is nosy and snitches\nme to people whenever\nI am up to no good"}, + {CIRNO_DIALOG PISSED, "Bah!! She is annoying!"}, + }); + } else if (gs.MountainClickCount == 1) { + SayDialog(gs, std::vector<Dialogues> { + {CIRNO_DIALOG JOY, "The Moriya shrine is at\nthe very top of the\nYoukai Mountain"}, + {CIRNO_DIALOG WOW, "The deities there are\nvery strong."}, + {CIRNO_DIALOG LAUGH, "Not as strong as me,\nof course!"}, + }); + gs.explored.insert(7); + } + gs.MountainClickCount = (gs.MountainClickCount + 1) % 2; } else if (CheckCollisionPointRec(gs.currentMousePos, MistyLake)) { SayDialog(gs, std::vector<Dialogues> { - {CIRNO_DIALOG WOW, "Do you know? There is a\ngiant frog that lives"}, - {CIRNO_DIALOG TIERED, "at the bottom of the lake.\nIt's very very big."}, + {CIRNO_DIALOG WOW, "Do you know? There is a\ngiant frog that lives at\nthe bottom of the lake."}, + {CIRNO_DIALOG TIERED, "It's very very big."}, {CIRNO_DIALOG PISSED, "It ate me one time!!"} }); - gs.explored.insert(9); + gs.explored.insert(8); } else if (CheckCollisionPointRec(gs.currentMousePos, Igloo)) { SayDialog(gs, std::vector<Dialogues> { {CIRNO_DIALOG WOW, "My house looks very cool,\nright?"}, - {CIRNO_DIALOG JOY, "It was a lot of work,\nbullying the other fairies\ninto building my house"}, - {CIRNO_DIALOG TIERED, "Though, sometimes they\nbarge into my home to\nplay"} + {CIRNO_DIALOG JOY, "It was a lot of work,\nbullying the other fairies\ninto building my house."}, + {CIRNO_DIALOG TIERED, "Though, they now barge\ninto my home to play,\nwhenever they want,"}, + {CIRNO_DIALOG TIERED, "without my permission."} }); - gs.explored.insert(10); + gs.explored.insert(9); } else if (CheckCollisionPointRec(gs.currentMousePos, Flower) && !gs.flowerOnHead) { - SayDialog(gs, std::vector<Dialogues> { - {CIRNO_DIALOG JOY, "A flower!"}, - }); - gs.flowerOnHead = true; - SayDialog(gs, std::vector<Dialogues> { - {CIRNO_DIALOG WOW, "Do I look cute with\nthis flower on me?"}, - {CIRNO_DIALOG LAUGH, "I like it a lot"} - }); - gs.explored.insert(11); + if (gs.FlowerClickCount == 0) { + SayDialog(gs, std::vector<Dialogues> { + {CIRNO_DIALOG WOW, "A flower!"}, + }); + gs.FlowerClickCount++; + } else if (gs.FlowerClickCount == 1) { + gs.flowerOnHead = true; + SayDialog(gs, std::vector<Dialogues> { + {CIRNO_DIALOG JOY, "Do I look cute with\nthis flower on me?"}, + {CIRNO_DIALOG RELAXED, "I like it a lot"} + }); + gs.explored.insert(10); + } } } else if (gs.curPos == FOREST) { if (CheckCollisionPointRec(gs.currentMousePos, Frog)) { if (!gs.frogDialogDone) { SayDialog(gs, std::vector<Dialogues> { - {CIRNO_DIALOG WOW, "Suwako somehow always\ncatches me henever I bully\nfrogs here"}, - {CIRNO_DIALOG JOY, "Let's leave it alone for now\nShe will beat me up"}, - {CIRNO_DIALOG TIERED, "if I get caught red handed"} + {CIRNO_DIALOG WOW, "Suwako somehow always\ncatches me whenever I\nbully frogs here"}, + {CIRNO_DIALOG JOY, "Let's leave it alone for\nnow"}, + {CIRNO_DIALOG TIERED, "She will beat me\nup if I get caught red\nhanded."} }); gs.frogDialogDone = true; - gs.explored.insert(12); } else { SayDialog(gs, std::vector<Dialogues> { - {CIRNO_DIALOG LAUGH, "Ribbit ribbit\nThe frogs make\nfunny noises."}, + {CIRNO_DIALOG LAUGH, "The frogs make funny\nnoises. Ribbit Ribbit."}, + }); + gs.explored.insert(11); + } + } else if (CheckCollisionPointRec(gs.currentMousePos, RiceCake)) { + if (gs.ShrineClickCount == 0) { + SayDialog(gs, std::vector<Dialogues> { + {CIRNO_DIALOG RELAXED, "It's a small shrine for the\nMoriya gods."}, + {CIRNO_DIALOG WOW, "That Shrine Maiden Sanae\ncomes here from time to\ntime and takes care of it. "}, + }); + gs.ShrineClickCount++; + } else if (gs.ShrineClickCount == 1) { + SayDialog(gs, std::vector<Dialogues> { + {CIRNO_DIALOG JOY, "Look! There is a rice cake\nhere left as an offering."} + }); + gs.ShrineClickCount++; + } else if (gs.ShrineClickCount == 2) { + gs.riceCakeEaten = true; + SayDialog(gs, std::vector<Dialogues> { + {CIRNO_DIALOG JOY, "The rice cake magically \ndisappeared!"}, + {CIRNO_DIALOG RELAXED, ". . .", 0.4f}, + {CIRNO_DIALOG JOY, "*Burp*"}, + }); + gs.explored.insert(12); + gs.ShrineClickCount++; + } else if (gs.ShrineClickCount == 3) { + SayDialog(gs, std::vector<Dialogues> { + {CIRNO_DIALOG RELAXED, "It's a small shrine for the\nMoriya gods."}, + {CIRNO_DIALOG WOW, "That Shrine Maiden Sanae\ncomes here from time to\ntime and takes care of it. "}, }); } - } else if (CheckCollisionPointRec(gs.currentMousePos, RiceCake) && !gs.riceCakeEaten) { - SayDialog(gs, std::vector<Dialogues> { - {CIRNO_DIALOG RELAXED, "It's a small shrine for the\nMoriya gods built by the Kappas"}, - {CIRNO_DIALOG WOW, "The Miko called Sanae comes\nhere from time to time\nand takes care of it. "}, - {CIRNO_DIALOG JOY, "Look! There is a rice cake here\nleft as an offering."} - }); - gs.explored.insert(13); - gs.riceCakeEaten = true; - SayDialog(gs, std::vector<Dialogues> { - {CIRNO_DIALOG JOY, "The rice cake magically disappeared!"}, - {CIRNO_DIALOG RELAXED, ". . .", 0.4f}, - {CIRNO_DIALOG JOY, "*Burp*"}, - }); } } } diff --git a/lib/gameState.hpp b/lib/gameState.hpp index 5c718f4..edfedde 100644 --- a/lib/gameState.hpp +++ b/lib/gameState.hpp @@ -105,6 +105,12 @@ struct GameState { bool flowerOnHead = false; bool riceCakeEaten = false; bool frogDialogDone = false; - bool usedTalkButton = false; + int TalkButtonUseCount = 0; + int MountainClickCount = 0; + int FlowerClickCount = 0; + int ShrineClickCount = 0; + bool DialogueOnlyInput = false; + bool GameOver = false; + float GameOverTime = -1.0f; std::set<int> explored = {}; }; @@ -29,7 +29,10 @@ void drawFrame(GameState& currentGameState) { float renderScale = currentGameState.renderScale; if (IsDialogRunning(currentGameState)) { + currentGameState.DialogueOnlyInput = true; UpdateDialog(currentGameState); + } else { + currentGameState.DialogueOnlyInput = false; } BeginDrawing(); @@ -120,7 +123,7 @@ int main() { // }; // TODO : Implement Asset Manager // DisableCursor(); - g_bgMusic = LoadMusicStream("../assets/audio/bgm/bg.ogg"); + // g_bgMusic = LoadMusicStream("../assets/audio/bgm/bg.wav"); // PlayMusicStream(g_bgMusic); SetMusicVolume(g_bgMusic, 0.5f); currentGameState.AssetManager.init(); diff --git a/screen/gameplay.cpp b/screen/gameplay.cpp index 2f30c78..430c18d 100644 --- a/screen/gameplay.cpp +++ b/screen/gameplay.cpp @@ -13,20 +13,36 @@ void drawGameplay(GameState &gs){ + if (gs.GameOver && !IsDialogRunning(gs)) { + if (gs.GameOverTime == -1.0f){ + gs.GameOverTime = GetTime(); + } + + float t = (GetTime() - gs.GameOverTime)/2.0f; + if (t > 1.0f) return; + + float a = 0.5f - 0.5f * cosf(t * PI); + + DrawTextureV(getCurrentScene(gs, gs.curPos), + ZERO_VEC, + ColorAlpha(WHITE, 1.0f - a)); + return; + } + if (gs.timeSinceSceneChange == -1) { DrawTextureV(getCurrentScene(gs), ZERO_VEC, WHITE); + drawCirno(gs); + if (gs.curExp != HURT && gs.flowerOnHead) { + DrawTextureV(gs.AssetManager.load("flower"), ZERO_VEC, WHITE); + } } else { DrawSceneChange(gs); } if (gs.curExp != NEUTRAL && !IsDialogRunning(gs)) { gs.curExp = NEUTRAL; } - drawCirno(gs); - if (gs.curExp != HURT && gs.flowerOnHead) { - DrawTextureV(gs.AssetManager.load("flower"), ZERO_VEC, WHITE); - } if (DEBUG) { DrawText(TextFormat("%d, %d", (int)gs.currentMousePos.x, (int)gs.currentMousePos.y), 0, 40, 20, YELLOW);} - ui::DrawText(TextFormat("Explored : %d/13", gs.explored.size()), 20, 10, 26, RED); + ui::DrawText(TextFormat("Explored : %d/12", gs.explored.size()), 5, 5, 17, RED); if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT) and !IsDialogRunning(gs)) { ProcessClick(gs); } diff --git a/screen/main_menu.cpp b/screen/main_menu.cpp index 09a136d..bc7ad08 100644 --- a/screen/main_menu.cpp +++ b/screen/main_menu.cpp @@ -38,6 +38,7 @@ void drawMainMenu(GameState &gs){ gs.current_screen = GAMEPLAY; } } - ui::DrawTextV("Happy Cirno Day", {22, 25}, 22, ColorAlpha(YELLOW, Clamp(gs.timeSinceSceneChange/(SCENE_CHANGE/2.0f), 0, 1))); - ui::DrawTextV("A short story by\nsamosagaming69\n& silli_chilli", {22, 60}, 14, ColorAlpha(WHITE, Clamp(gs.timeSinceSceneChange/(SCENE_CHANGE/2.0f), 0, 1))); + ui::DrawTextV("Happy Cirno Day", {22, 20}, 22, ColorAlpha(YELLOW, Clamp(gs.timeSinceSceneChange/(SCENE_CHANGE/2.0f), 0, 1))); + ui::DrawTextV("A short story by\nsamosagaming69 (Odia\ntwinky boy) &\nsilli_chilli", {22, 48}, 14, ColorAlpha(GREEN, Clamp(gs.timeSinceSceneChange/(SCENE_CHANGE/2.0f), 0, 1))); + ui::DrawTextV("Music: Tomboyish Prelude\nAlbum: Fantasy Kaleidoscope OST\nCircle: Yuuhei Satellite\nArrangement: Iceon", {3, 323}, 12, ColorAlpha(ORANGE, Clamp(gs.timeSinceSceneChange/(SCENE_CHANGE/2.0f), 0, 1))); } |
