From 6ee7a812725ffeda795ceb823f45b9821edff5a2 Mon Sep 17 00:00:00 2001 From: Ray Date: Sun, 2 Feb 2020 14:16:28 +0100 Subject: [PATCH] Update game: RE-PAIR --- games/repair/Makefile | 2 +- games/repair/repair.c | 107 +++++++++++++- games/repair/resources/match.png | Bin 0 -> 20986 bytes games/repair/resources/qmark.png | Bin 0 -> 6500 bytes games/repair/resources/raylib_logo.png | Bin 3760 -> 1868 bytes games/repair/screens/screen_ending.c | 185 +++++++++++++++++++++++-- games/repair/screens/screen_gameplay.c | 185 ++++++------------------- games/repair/screens/screen_title.c | 57 ++++---- games/repair/screens/screens.h | 27 ++-- 9 files changed, 365 insertions(+), 198 deletions(-) create mode 100644 games/repair/resources/match.png create mode 100644 games/repair/resources/qmark.png diff --git a/games/repair/Makefile b/games/repair/Makefile index 5e4dd9d87..2b7065e3b 100644 --- a/games/repair/Makefile +++ b/games/repair/Makefile @@ -52,7 +52,7 @@ RAYLIB_H_INSTALL_PATH ?= $(DESTDIR)/include RAYLIB_LIBTYPE ?= STATIC # Build mode for project: DEBUG or RELEASE -BUILD_MODE ?= DEBUG +BUILD_MODE ?= RELEASE # Use external GLFW library instead of rglfw module # TODO: Review usage on Linux. Target version of choice. Switch on -lglfw or -lglfw3 diff --git a/games/repair/repair.c b/games/repair/repair.c index f66ce6687..df541e349 100644 --- a/games/repair/repair.c +++ b/games/repair/repair.c @@ -30,6 +30,12 @@ NPatchInfo npInfo = { 0 }; Texture2D texHead, texHair, texNose, texMouth, texEyes, texComp; Texture2D texMakeup = { 0 }; +Character playerBase = { 0 }; +Character datingBase = { 0 }; + +Character player = { 0 }; +Character dating = { 0 }; + //---------------------------------------------------------------------------------- // Global Variables Definition (local to this module) //---------------------------------------------------------------------------------- @@ -70,6 +76,8 @@ int main(void) InitAudioDevice(); font = LoadFont("resources/font.png"); + SetTextureFilter(font.texture, FILTER_BILINEAR); + music = LoadMusicStream("resources/elevator_romance.ogg"); fxCoin = LoadSound("resources/coin.wav"); @@ -95,8 +103,8 @@ int main(void) //PlayMusicStream(music); // Setup and Init first screen - currentScreen = TITLE; - InitTitleScreen(); + currentScreen = LOGO; + InitLogoScreen(); #if defined(PLATFORM_WEB) emscripten_set_main_loop(UpdateDrawFrame, 0, 1); @@ -130,6 +138,14 @@ int main(void) UnloadSound(fxCoin); UnloadTexture(background); UnloadTexture(texNPatch); + + UnloadTexture(texHead); + UnloadTexture(texHair); + UnloadTexture(texNose); + UnloadTexture(texMouth); + UnloadTexture(texEyes); + //UnloadTexture(texComp); + UnloadTexture(texMakeup); CloseAudioDevice(); // Close audio context @@ -139,6 +155,91 @@ int main(void) return 0; } +//---------------------------------------------------------------------------------- +// Public Functions Definition +//---------------------------------------------------------------------------------- + +Character GenerateCharacter(void) +{ + Character character = { 0 }; + + // Generate player character! + character.head = GetRandomValue(0, texHead.width/BASE_HEAD_WIDTH - 1); + character.colHead = headColors[GetRandomValue(0, 5)]; + character.hair = GetRandomValue(0, texHair.width/BASE_HAIR_WIDTH - 1); + character.colHair = hairColors[GetRandomValue(0, 9)]; + character.eyes = GetRandomValue(0, texEyes.width/BASE_EYES_WIDTH - 1); + character.nose = GetRandomValue(0, texNose.width/BASE_NOSE_WIDTH - 1); + character.mouth = GetRandomValue(0, texMouth.width/BASE_MOUTH_WIDTH - 1); + + // NOTE: No character customization at this point + + return character; +} + +void CustomizeCharacter(Character *character) +{ + if (GetRandomValue(0, 1)) character->hair = GetRandomValue(0, texHair.width/BASE_HAIR_WIDTH - 1); + if (GetRandomValue(0, 1)) character->colHair = hairColors[GetRandomValue(0, 9)]; + if (GetRandomValue(0, 1)) character->eyes = GetRandomValue(0, texEyes.width/BASE_EYES_WIDTH - 1); + if (GetRandomValue(0, 1)) character->nose = GetRandomValue(0, texNose.width/BASE_NOSE_WIDTH - 1); + if (GetRandomValue(0, 1)) character->mouth = GetRandomValue(0, texMouth.width/BASE_MOUTH_WIDTH - 1); +} + +void DrawCharacter(Character character, Vector2 position) +{ + DrawTextureRec(texHair, (Rectangle){ BASE_HAIR_WIDTH*character.hair, 240, BASE_HAIR_WIDTH, texHair.height - 240 }, (Vector2){ position.x + (250 - BASE_HAIR_WIDTH)/2, position.y + 240 }, GetColor(character.colHair)); + DrawTextureRec(texHead, (Rectangle){ BASE_HEAD_WIDTH*character.head, 0, BASE_HEAD_WIDTH, texHead.height }, (Vector2){ position.x + (250 - BASE_HEAD_WIDTH)/2, position.y + 60 }, GetColor(character.colHead)); + DrawTextureRec(texHair, (Rectangle){ BASE_HAIR_WIDTH*character.hair, 0, BASE_HAIR_WIDTH, 240 }, (Vector2){ position.x + (250 - BASE_HAIR_WIDTH)/2, position.y }, GetColor(character.colHair)); + DrawTextureRec(texEyes, (Rectangle){ BASE_EYES_WIDTH*character.eyes, 0, BASE_EYES_WIDTH, texEyes.height }, (Vector2){ position.x + (250 - BASE_EYES_WIDTH)/2, position.y + 190 }, WHITE); + DrawTextureRec(texNose, (Rectangle){ BASE_NOSE_WIDTH*character.nose, 0, BASE_NOSE_WIDTH, texNose.height }, (Vector2){ position.x + (250 - BASE_NOSE_WIDTH)/2, position.y + 275 }, GetColor(character.colHead)); + DrawTextureRec(texMouth, (Rectangle){ BASE_MOUTH_WIDTH*character.mouth, 0, BASE_MOUTH_WIDTH, texMouth.height }, (Vector2){ position.x + (250 - BASE_MOUTH_WIDTH)/2, position.y + 370 }, GetColor(character.colHead)); +} + +// Gui Button +bool GuiButton(Rectangle bounds, const char *text, int forcedState) +{ + static const int textColor[4] = { 0xeff6ffff, 0x78e782ff, 0xb04d5fff, 0xd6d6d6ff }; + + int state = (forcedState >= 0)? forcedState : 0; // NORMAL + bool pressed = false; + Vector2 textSize = MeasureTextEx(font, text, font.baseSize, 1); + + // Update control + //-------------------------------------------------------------------- + if ((state < 3) && (forcedState < 0)) + { + Vector2 mousePoint = GetMousePosition(); + + // Check button state + if (CheckCollisionPointRec(mousePoint, bounds)) + { + if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = 2; // PRESSED + else state = 1; // FOCUSED + + if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) + { + pressed = true; + PlaySound(fxCoin); + } + } + } + + npInfo.sourceRec.x = 80*state; + + //-------------------------------------------------------------------- + + // Draw control + //-------------------------------------------------------------------- + //DrawRectangleRec(bounds, GREEN); + //DrawRectangleLinesEx(bounds, 4, DARKGREEN); + DrawTextureNPatch(texNPatch, npInfo, bounds, (Vector2){ 0.0f, 0.0f }, 0.0f, WHITE); + DrawTextEx(font, text, (Vector2){ bounds.x + bounds.width/2 - textSize.x/2, bounds.y + bounds.height/2 - textSize.y/2 + 4 }, font.baseSize, 1, GetColor(textColor[state])); + //------------------------------------------------------------------ + + return pressed; +} + //---------------------------------------------------------------------------------- // Module specific Functions Definition //---------------------------------------------------------------------------------- @@ -184,7 +285,7 @@ static void UpdateTransition(void) { if (!transFadeOut) { - transAlpha += 0.02f; + transAlpha += 0.05f; // NOTE: Due to float internal representation, condition jumps on 1.0f instead of 1.05f // For that reason we compare against 1.01f, to avoid last frame loading stop diff --git a/games/repair/resources/match.png b/games/repair/resources/match.png new file mode 100644 index 0000000000000000000000000000000000000000..c1637fda9ae82e2fd3ad9df8f69a2d5dc58183c7 GIT binary patch literal 20986 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 BOcekC literal 0 HcmV?d00001 diff --git a/games/repair/resources/qmark.png b/games/repair/resources/qmark.png new file mode 100644 index 0000000000000000000000000000000000000000..c782062d9dee260197a780c6b5a61f9793227796 GIT binary patch literal 6500 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

Vim+2I(NR3t=s&IHo5$`G`_WT-^FAZ=eP}jhgvh zSb^u-7G|>r7UI8A70w*nv|65d52ewZZ^8zPwLH^;7;K;XYcUp7kS8`ELu86SA=PfQ zznlWHDxW#`C$e$Hl&rpCzqEpeJK{gNOZ(@QOS=kEKswOuul&Ww3IGK}g?HuGAdLRod}mQcKW7E7Hmn>uR^Q_qkAY_hGS!tJuK54Kr}cdZ#QO zh`ck%;CLX?x&A5_VuLJ6r_X2t@GUaTGl(ZVNeV z-xwQzciT)TmDRBQtq}}qQ^d+cC9*mGLN68Gf08HOrX#nDU^w=64ex(2YHnPd^+S0s zvv)kBoHC@8(i{!++yxUPWtj4+C_Hl{ zJO@LCaYYFB4JySB^3oBr*f-)LP}-MTe8Suz1~HTifCYosJjBtUg(5EOn{AZB%p~w& z+_Ev&d$||ID^Z3lAWhliNoT<@E32vb765FNXmDH0e~3$TM7zR^3|&Q#JxhUZ8|YjT z4&<*tn*c|NVJ%%Zf7B{%|KoQA=Z?3&3)4yj%u6x-9#zJ}4+7lJ_LYEk|3$=Fs&k53 zYT5nRv5a1+F3~paQwrBAu^&$r+p=BcV?#%o&8?6m(wQ zH~N0nr1Z`=w1Hu2;Y7yRq8;wHY9%vjv-94dpaa!wqks=$AV2fEE>c!S9`}hon4;{k z0}1K+xyu+_A>(SB-|fuo6-W63roU)f>!bU-RghY1trXHw6YAa%mm%A`qQk1Iy=sl~ z(fWNkrJB>kX(FIJQ=j?6iggp%AaPH>$7}Zgd~{uxwQdB7PMvx?<6*goaIB25zEMlQti(5SMjW+CNS=*DfNy7!`=;F`pk5h$z{uVsGr0QHk9?Y zP+N}4&0khkAdru3q zz?Fq?4wOv{DbPqLLd)rzr!ZaUYUUTlR^Q_wn~N~jblXtt2#z@d#Rg>Pu^YZjBKqC- z{?HF`Qd6KPj`+5%_c4aWXuL@G$J$<^KcbW|$cO literal 3760 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 200) + { + state = 1; + + // Check like percentatge for player base (playerBaseLikes) + if (playerBase.hair == dating.hair) playerBaseLikes.hair = GetRandomValue(70, 100); + else if (playerBase.hair == datingBase.hair) playerBaseLikes.hair = GetRandomValue(0, 30); + else playerBaseLikes.hair = GetRandomValue(0, 100); + + if (playerBase.colHair == dating.colHair) playerBaseLikes.colHair = GetRandomValue(70, 100); + else if (playerBase.colHair == datingBase.colHair) playerBaseLikes.colHair = GetRandomValue(0, 30); + else playerBaseLikes.colHair = GetRandomValue(0, 100); + + if (playerBase.eyes == dating.eyes) playerBaseLikes.eyes = GetRandomValue(70, 100); + else if (playerBase.eyes == datingBase.eyes) playerBaseLikes.eyes = GetRandomValue(0, 30); + else playerBaseLikes.eyes = GetRandomValue(0, 100); + + if (playerBase.nose == dating.nose) playerBaseLikes.nose = GetRandomValue(70, 100); + else if (playerBase.nose == datingBase.nose) playerBaseLikes.nose = GetRandomValue(0, 30); + else playerBaseLikes.nose = GetRandomValue(0, 100); + + if (playerBase.mouth == dating.mouth) playerBaseLikes.mouth = GetRandomValue(70, 100); + else if (playerBase.mouth == datingBase.mouth) playerBaseLikes.mouth = GetRandomValue(0, 30); + else playerBaseLikes.mouth = GetRandomValue(0, 100); + + + // Check like percentatge for player (playerLikes) + if (player.hair == dating.hair) playerLikes.hair = GetRandomValue(70, 100); + else if (player.hair == datingBase.hair) playerLikes.hair = GetRandomValue(0, 30); + else playerLikes.hair = GetRandomValue(0, 100); + + if (player.colHair == dating.colHair) playerLikes.colHair = GetRandomValue(70, 100); + else if (player.colHair == datingBase.colHair) playerLikes.colHair = GetRandomValue(0, 30); + else playerLikes.colHair = GetRandomValue(0, 100); + + if (player.eyes == dating.eyes) playerLikes.eyes = GetRandomValue(70, 100); + else if (player.eyes == datingBase.eyes) playerLikes.eyes = GetRandomValue(0, 30); + else playerLikes.eyes = GetRandomValue(0, 100); + + if (player.nose == dating.nose) playerLikes.nose = GetRandomValue(70, 100); + else if (player.nose == datingBase.nose) playerLikes.nose = GetRandomValue(0, 30); + else playerLikes.nose = GetRandomValue(0, 100); + + if (player.mouth == dating.mouth) playerLikes.mouth = GetRandomValue(70, 100); + else if (player.mouth == datingBase.mouth) playerLikes.mouth = GetRandomValue(0, 30); + else playerLikes.mouth = GetRandomValue(0, 100); + + // NOTE: Max possible points to get 5*100 = 500 + // If getting > 250 player likes! :D + matchValue = playerLikes.hair + playerLikes.colHair + playerLikes.eyes + playerLikes.nose + playerLikes.mouth; + } + } + else if (state == 1) + { + // Levels animation? + } + // Press enter or tap to return to TITLE screen if (IsKeyPressed(KEY_ENTER) || IsGestureDetected(GESTURE_TAP)) { @@ -62,16 +145,98 @@ void UpdateEndingScreen(void) // Ending Screen Draw logic void DrawEndingScreen(void) { - // TODO: Draw ENDING screen here! - DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), BLUE); - DrawTextEx(font, "ENDING SCREEN", (Vector2){ 20, 10 }, font.baseSize*3, 4, DARKBLUE); - DrawText("PRESS ENTER or TAP to RETURN to TITLE SCREEN", 120, 220, 20, DARKBLUE); + // Draw background + DrawTexture(background, 0, 0, GetColor(0xf6aa60ff)); + + DrawCharacter(player, (Vector2){ 180, 40 }); + + DrawCharacter(dating, (Vector2){ 820, 40 }); + + if (state == 0) + { + if ((framesCounter/15)%2 == 1) DrawTexture(texQmark, GetScreenWidth()/2 - texQmark.width/2, 180, WHITE); + } + else if (state == 1) + { + DrawTextEx(font, TextFormat("MATCH: %i%%", (int)(((float)matchValue/500.0f)*100.0f)), (Vector2){ 420, 40 }, font.baseSize*2, 1, SKYBLUE); + + DrawTextureRec(texMatch, (Rectangle){ 0, (matchValue > 250)? 0 : texMatch.height/2, texMatch.width, texMatch.height/2 }, (Vector2){ GetScreenWidth()/2 - texMatch.width/2, 240 }, WHITE); + + int barsPositionX = 80; + + //DrawRectangle(0, 530, GetScreenWidth(), GetScreenHeight() - 530, Fade(GRAY, 0.6f)); + //DrawRectangleLines(0, 530, GetScreenWidth(), GetScreenHeight() - 530, Fade(DARKGRAY, 0.8f)); + + // Draw like values: player base + DrawTextEx(font, "HAIR:", (Vector2){ barsPositionX, 550 }, font.baseSize/2, 1, WHITE); + DrawRectangle(barsPositionX + 80, 550 + 6, 400, font.baseSize/4, GRAY); + DrawRectangle(barsPositionX + 80, 550 + 6, playerBaseLikes.hair*4, font.baseSize/4, RED); + + DrawTextEx(font, "TINT:", (Vector2){ barsPositionX, 580 }, font.baseSize/2, 1, WHITE); + DrawRectangle(barsPositionX + 80, 580 + 6, 400, font.baseSize/4, GRAY); + DrawRectangle(barsPositionX + 80, 580 + 6, playerBaseLikes.colHair*4, font.baseSize/4, RED); + + DrawTextEx(font, "EYES:", (Vector2){ barsPositionX, 610 }, font.baseSize/2, 1, WHITE); + DrawRectangle(barsPositionX + 80, 610 + 6, 400, font.baseSize/4, GRAY); + DrawRectangle(barsPositionX + 80, 610 + 6, playerBaseLikes.eyes*4, font.baseSize/4, RED); + + DrawTextEx(font, "NOSE:", (Vector2){ barsPositionX, 640 }, font.baseSize/2, 1, WHITE); + DrawRectangle(barsPositionX + 80, 640 + 6, 400, font.baseSize/4, GRAY); + DrawRectangle(barsPositionX + 80, 640 + 6, playerBaseLikes.nose*4, font.baseSize/4, RED); + + DrawTextEx(font, "LIPS:", (Vector2){ barsPositionX, 670 }, font.baseSize/2, 1, WHITE); + DrawRectangle(barsPositionX + 80, 670 + 6, 400, font.baseSize/4, GRAY); + DrawRectangle(barsPositionX + 80, 670 + 6, playerBaseLikes.mouth*4, font.baseSize/4, RED); + + // Draw like values: player + if (player.hair != playerBase.hair) + { + DrawTextEx(font, "after re-touch:", (Vector2){ barsPositionX + 80 + 400 + 20, 550 }, font.baseSize/2, 1, WHITE); + DrawRectangle(barsPositionX + 80 + 400 + 100 + 90, 550 + 6, 400, font.baseSize/4, GRAY); + DrawRectangle(barsPositionX + 80 + 400 + 100 + 90, 550 + 6, playerLikes.hair*4, font.baseSize/4, RED); + } + + if (player.colHair != playerBase.colHair) + { + DrawTextEx(font, "after re-touch:", (Vector2){ barsPositionX + 80 + 400 + 20, 580 }, font.baseSize/2, 1, WHITE); + DrawRectangle(barsPositionX + 80 + 400 + 100 + 90, 580 + 6, 400, font.baseSize/4, GRAY); + DrawRectangle(barsPositionX + 80 + 400 + 100 + 90, 580 + 6, playerLikes.colHair*4, font.baseSize/4, RED); + } + + if (player.eyes != playerBase.eyes) + { + DrawTextEx(font, "after re-touch:", (Vector2){ barsPositionX + 80 + 400 + 20, 610 }, font.baseSize/2, 1, WHITE); + DrawRectangle(barsPositionX + 80 + 400 + 100 + 90, 610 + 6, 400, font.baseSize/4, GRAY); + DrawRectangle(barsPositionX + 80 + 400 + 100 + 90, 610 + 6, playerLikes.eyes*4, font.baseSize/4, RED); + } + + if (player.nose != playerBase.nose) + { + DrawTextEx(font, "after re-touch:", (Vector2){ barsPositionX + 80 + 400 + 20, 640 }, font.baseSize/2, 1, WHITE); + DrawRectangle(barsPositionX + 80 + 400 + 100 + 90, 640 + 6, 400, font.baseSize/4, GRAY); + DrawRectangle(barsPositionX + 80 + 400 + 100 + 90, 640 + 6, playerLikes.nose*4, font.baseSize/4, RED); + } + + if (player.mouth != playerBase.mouth) + { + DrawTextEx(font, "after re-touch:", (Vector2){ barsPositionX + 80 + 400 + 20, 670 }, font.baseSize/2, 1, WHITE); + DrawRectangle(barsPositionX + 80 + 400 + 100 + 90, 670 + 6, 400, font.baseSize/4, GRAY); + DrawRectangle(barsPositionX + 80 + 400 + 100 + 90, 670 + 6, playerLikes.mouth*4, font.baseSize/4, RED); + } + + // Draw left button: date! + if (GuiButton((Rectangle){ GetScreenWidth() - 280, 60, 260, 80 }, "AGAIN!", -1)) + { + finishScreen = 1; + } + } } // Ending Screen Unload logic void UnloadEndingScreen(void) { - // TODO: Unload ENDING screen variables here! + UnloadTexture(texQmark); + UnloadTexture(texMatch); } // Ending Screen should finish? diff --git a/games/repair/screens/screen_gameplay.c b/games/repair/screens/screen_gameplay.c index e531aad5f..9d1c44738 100644 --- a/games/repair/screens/screen_gameplay.c +++ b/games/repair/screens/screen_gameplay.c @@ -30,9 +30,8 @@ static bool doHairCut = false; static bool doHairTint = false; static bool doEyeLiner = false; static bool doLipStick = false; -static bool doMakeup = false; +static bool doNose = false; static bool doGlasses = false; -static bool doPiercing = false; //---------------------------------------------------------------------------------- // Global Variables Definition (local to this module) @@ -45,9 +44,6 @@ const unsigned int hairColors[10] = { 0xf5bf60ff, 0xaa754aff, 0x974e14ff, 0xf363 static int framesCounter = 0; static int finishScreen = 0; -static Character player = { 0 }; -static Character dating = { 0 }; - static RenderTexture target = { 0 }; //---------------------------------------------------------------------------------- @@ -65,10 +61,12 @@ void InitGameplayScreen(void) SetTextureFilter(target.texture, FILTER_BILINEAR); // Generate player character! - player = GenerateCharacter(); + //player = GenerateCharacter(); + playerBase = player; // Generate dating character! dating = GenerateCharacter(); + datingBase = dating; // TODO: Generate dating character likes // For the different types of properties we assign random like values: 0% (total-dislike) -> 100% (total-like) @@ -77,86 +75,76 @@ void InitGameplayScreen(void) // Some of the elements add points or remove points // At the end we can show the like percentadge of every element + + doHairCut = false; + doHairTint = false; + doEyeLiner = false; + doLipStick = false; + doNose = false; + doGlasses = false; } // Gameplay Screen Update logic void UpdateGameplayScreen(void) { - // Update GAMEPLAY screen - - // TODO: Check buttons and checkboxes to update player properties - - if (IsKeyPressed(KEY_SPACE)) player = GenerateCharacter(); - - // Press enter or tap to change to ENDING screen - if (IsKeyPressed(KEY_ENTER) || IsGestureDetected(GESTURE_TAP)) + if (IsKeyPressed(KEY_SPACE)) { - finishScreen = 1; - PlaySound(fxCoin); + player = GenerateCharacter(); + playerBase = player; } + + if (IsKeyPressed(KEY_ENTER)) finishScreen = 1; } // Gameplay Screen Draw logic void DrawGameplayScreen(void) { - // Draw background (texture, color, vignette?) + // Draw background DrawTexture(background, 0, 0, GetColor(0xf6aa60ff)); - // TODO: Draw left menu buttons - if (GuiButton((Rectangle){ 20, 40, 300, 80 }, "HAIR CUT", doHairCut? 3 : -1)) - { - doHairCut = true; - - if (GetRandomValue(0, 100) > 20) player.hair = GetRandomValue(0, texHair.width/BASE_HAIR_WIDTH); - else - { - player.hair = -1; - - // TODO: Play problem sound! - } - } + // Draw left menu buttons + GuiButton((Rectangle){ 20, 40, 300, 60 }, "RE-TOUCH:", 2); + if (GuiButton((Rectangle){ 20, 40 + 90, 300, 80 }, "HAIR TINT", doHairTint? 3 : -1)) { doHairTint = true; player.colHair = hairColors[GetRandomValue(0, 9)]; } - if (GuiButton((Rectangle){ 20, 40 + 180, 300, 80 }, "EYELINER", doEyeLiner? 3 : -1)) + if (GuiButton((Rectangle){ 20, 40 + 180, 300, 80 }, "HAIR", doHairCut? 3 : -1)) + { + doHairCut = true; + player.hair = GetRandomValue(0, texHair.width/BASE_HAIR_WIDTH); + + } + if (GuiButton((Rectangle){ 20, 40 + 270, 300, 80 }, "EYES", doEyeLiner? 3 : -1)) { doEyeLiner = true; + player.eyes = GetRandomValue(0, texEyes.width/BASE_EYES_WIDTH - 1); } - if (GuiButton((Rectangle){ 20, 40 + 270, 300, 80 }, "LIPSTICK", doLipStick? 3 : -1)) + if (GuiButton((Rectangle){ 20, 40 + 360, 300, 80 }, "NOSE", doNose? 3 : -1)) + { + doNose = true; + player.nose = GetRandomValue(0, texNose.width/BASE_NOSE_WIDTH - 1); + } + if (GuiButton((Rectangle){ 20, 40 + 450, 300, 80 }, "LIPS", doLipStick? 3 : -1)) { doLipStick = true; + player.mouth = GetRandomValue(0, texMouth.width/BASE_MOUTH_WIDTH - 1); } - if (GuiButton((Rectangle){ 20, 40 + 360, 300, 80 }, "MAKEUP", doMakeup? 3 : -1)) - { - doMakeup = true; - player.makeup = GetRandomValue(1, 2); - } - if (GuiButton((Rectangle){ 20, 40 + 540, 300, 80 }, "GLASSES", doGlasses? 3 : -1)) + if (GuiButton((Rectangle){ 20, 40 + 540, 300, 80 }, "GLASSES", 3)) { doGlasses = true; } - if (GuiButton((Rectangle){ 20, 40 + 540, 300, 80 }, "PIERCING", doPiercing? 3 : -1)) - { - doPiercing = true; - } // Draw player - DrawCharacter(player); + DrawCharacter(player, (Vector2){ GetScreenWidth()/2 - 125, 80 }); // Draw dating view - GuiButton((Rectangle){ 970, 40, 260, 60 }, "DATING...", 2); + GuiButton((Rectangle){ 970, 40, 260, 60 }, "DATING:", 2); GuiButton((Rectangle){ 970, 40 + 70, 260, 260 }, " ", 0); + BeginTextureMode(target); - DrawTextureRec(texHair, (Rectangle){ BASE_HAIR_WIDTH*dating.hair, 240, BASE_HAIR_WIDTH, texHair.height - 240 }, (Vector2){ target.texture.width/2 - BASE_HAIR_WIDTH/2, 80 + 240 }, GetColor(dating.colHair)); - DrawTextureRec(texHead, (Rectangle){ BASE_HEAD_WIDTH*dating.head, 0, BASE_HEAD_WIDTH, texHead.height }, (Vector2){ target.texture.width/2 - BASE_HEAD_WIDTH/2, 140 }, GetColor(dating.colHead)); - DrawTextureRec(texHair, (Rectangle){ BASE_HAIR_WIDTH*dating.hair, 0, BASE_HAIR_WIDTH, 240 }, (Vector2){ target.texture.width/2 - BASE_HAIR_WIDTH/2, 80 }, GetColor(dating.colHair)); - DrawTextureRec(texEyes, (Rectangle){ BASE_EYES_WIDTH*dating.eyes, 0, BASE_EYES_WIDTH, texEyes.height }, (Vector2){ target.texture.width/2 - BASE_EYES_WIDTH/2, 270 }, WHITE); - DrawTextureRec(texNose, (Rectangle){ BASE_NOSE_WIDTH*dating.nose, 0, BASE_NOSE_WIDTH, texNose.height }, (Vector2){ target.texture.width/2 - BASE_NOSE_WIDTH/2, 355 }, GetColor(dating.colHead)); - DrawTextureRec(texMouth, (Rectangle){ BASE_MOUTH_WIDTH*dating.mouth, 0, BASE_MOUTH_WIDTH, texMouth.height }, (Vector2){ target.texture.width/2 - BASE_MOUTH_WIDTH/2, 450 }, GetColor(dating.colHead)); - - if (dating.makeup) DrawTextureRec(texMakeup, (Rectangle){ 0, 0, texMakeup.width, texMakeup.height }, (Vector2){ target.texture.width/2 - texMakeup.width/2, 350 }, Fade(RED, 0.3f)); + DrawCharacter(dating, (Vector2){ (720 - 250)/2, (720 - 500)/2 }); EndTextureMode(); DrawTexturePro(target.texture, (Rectangle){ 0.0f, 0.0f, (float)target.texture.width, (float)-target.texture.height }, (Rectangle){ 970, 40 + 70, 260, 260 }, (Vector2){ 0, 0 }, 0.0f, WHITE); @@ -164,26 +152,14 @@ void DrawGameplayScreen(void) // Draw left button: date! if (GuiButton((Rectangle){ 970, 580, 260, 90 }, "GO DATE!", -1)) { - CustomizeCharacter(&dating); - finishScreen = 1; - PlaySound(fxCoin); } } // Gameplay Screen Unload logic void UnloadGameplayScreen(void) { - // Unload GAMEPLAY screen variables - // Unload required textures - UnloadTexture(texHead); - UnloadTexture(texHair); - UnloadTexture(texNose); - UnloadTexture(texMouth); - UnloadTexture(texEyes); - //UnloadTexture(texComp); - UnloadTexture(texMakeup); } // Gameplay Screen should finish? @@ -191,84 +167,3 @@ int FinishGameplayScreen(void) { return finishScreen; } - -Character GenerateCharacter(void) -{ - Character character = { 0 }; - - // Generate player character! - character.head = GetRandomValue(0, texHead.width/BASE_HEAD_WIDTH); - character.colHead = headColors[GetRandomValue(0, 5)]; - character.hair = GetRandomValue(0, texHair.width/BASE_HAIR_WIDTH); // Config (decrease value only) - character.colHair = hairColors[GetRandomValue(0, 9)]; // Config - character.eyes = GetRandomValue(0, texEyes.width/BASE_EYES_WIDTH); - character.nose = GetRandomValue(0, texNose.width/BASE_NOSE_WIDTH); - character.mouth = GetRandomValue(0, texMouth.width/BASE_MOUTH_WIDTH); - - // NOTE: No character customization at this point - - return character; -} - -void CustomizeCharacter(Character *character) -{ - character->eyeLine = GetRandomValue(0, 2); // Config - character->paintLips = GetRandomValue(0, 2); // Config - character->makeup = GetRandomValue(0, 2); // Config - //character->bear = GetRandomValue(0, 1); // Config: remove - //character->moustache = GetRandomValue(0, 1); // Config: remove - character->glasses = GetRandomValue(0, 3); // Config: put/remove - character->piercing = GetRandomValue(0, 3); // Config: put/remove -} - -void DrawCharacter(Character character) -{ - if (player.hair >= 0) DrawTextureRec(texHair, (Rectangle){ BASE_HAIR_WIDTH*character.hair, 240, BASE_HAIR_WIDTH, texHair.height - 240 }, (Vector2){ GetScreenWidth()/2 - BASE_HAIR_WIDTH/2, 80 + 240 }, GetColor(character.colHair)); - DrawTextureRec(texHead, (Rectangle){ BASE_HEAD_WIDTH*character.head, 0, BASE_HEAD_WIDTH, texHead.height }, (Vector2){ GetScreenWidth()/2 - BASE_HEAD_WIDTH/2, 140 }, GetColor(character.colHead)); - DrawTextureRec(texHair, (Rectangle){ BASE_HAIR_WIDTH*character.hair, 0, BASE_HAIR_WIDTH, 240 }, (Vector2){ GetScreenWidth()/2 - BASE_HAIR_WIDTH/2, 80 }, GetColor(character.colHair)); - DrawTextureRec(texEyes, (Rectangle){ BASE_EYES_WIDTH*character.eyes, 0, BASE_EYES_WIDTH, texEyes.height }, (Vector2){ GetScreenWidth()/2 - BASE_EYES_WIDTH/2, 270 }, WHITE); - DrawTextureRec(texNose, (Rectangle){ BASE_NOSE_WIDTH*character.nose, 0, BASE_NOSE_WIDTH, texNose.height }, (Vector2){ GetScreenWidth()/2 - BASE_NOSE_WIDTH/2, 355 }, GetColor(character.colHead)); - DrawTextureRec(texMouth, (Rectangle){ BASE_MOUTH_WIDTH*character.mouth, 0, BASE_MOUTH_WIDTH, texMouth.height }, (Vector2){ GetScreenWidth()/2 - BASE_MOUTH_WIDTH/2, 450 }, GetColor(character.colHead)); - - if (character.makeup) DrawTextureRec(texMakeup, (Rectangle){ 0, 0, texMakeup.width, texMakeup.height }, (Vector2){ GetScreenWidth()/2 - texMakeup.width/2, 350 }, Fade(RED, 0.3f)); -} - -// Gui Button -bool GuiButton(Rectangle bounds, const char *text, int forcedState) -{ - static const int textColor[4] = { 0xeff6ffff, 0x78e782ff, 0xb04d5fff, 0xd6d6d6ff }; - - int state = (forcedState >= 0)? forcedState : 0; // NORMAL - bool pressed = false; - Vector2 textSize = MeasureTextEx(font, text, font.baseSize, 1); - - // Update control - //-------------------------------------------------------------------- - if ((state < 3) && (forcedState < 0)) - { - Vector2 mousePoint = GetMousePosition(); - - // Check button state - if (CheckCollisionPointRec(mousePoint, bounds)) - { - if (IsMouseButtonDown(MOUSE_LEFT_BUTTON)) state = 2; // PRESSED - else state = 1; // FOCUSED - - if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON)) pressed = true; - } - } - - npInfo.sourceRec.x = 80*state; - - //-------------------------------------------------------------------- - - // Draw control - //-------------------------------------------------------------------- - //DrawRectangleRec(bounds, GREEN); - //DrawRectangleLinesEx(bounds, 4, DARKGREEN); - DrawTextureNPatch(texNPatch, npInfo, bounds, (Vector2){ 0.0f, 0.0f }, 0.0f, WHITE); - DrawTextEx(font, text, (Vector2){ bounds.x + bounds.width/2 - textSize.x/2, bounds.y + bounds.height/2 - textSize.y/2 + 4 }, font.baseSize, 1, GetColor(textColor[state])); - //------------------------------------------------------------------ - - return pressed; -} \ No newline at end of file diff --git a/games/repair/screens/screen_title.c b/games/repair/screens/screen_title.c index e4ed88b0d..460d30634 100644 --- a/games/repair/screens/screen_title.c +++ b/games/repair/screens/screen_title.c @@ -35,11 +35,10 @@ static int framesCounter = 0; static int finishScreen = 0; static Texture2D texTitle = { 0 }; - -static Character demoChar = { 0 }; +static Texture2D texLogo = { 0 }; static int titlePositionY = 0; -static int buttonPositionY = 0; +static int titleCounter = 0; //---------------------------------------------------------------------------------- // Title Screen Functions Definition @@ -52,44 +51,45 @@ void InitTitleScreen(void) finishScreen = 0; texTitle = LoadTexture("resources/title.png"); + texLogo = LoadTexture("resources/raylib_logo.png"); - demoChar = GenerateCharacter(); + player = GenerateCharacter(); - titlePositionY = -600; - buttonPositionY = 1600; + titlePositionY = -200; } // Title Screen Update logic void UpdateTitleScreen(void) { framesCounter++; - - if (framesCounter > 60) + + if (framesCounter > 5) { int partToChange = GetRandomValue(0, 4); if (partToChange == 0) { - demoChar.head = GetRandomValue(0, texHead.width/BASE_HEAD_WIDTH); - demoChar.colHead = headColors[GetRandomValue(0, 5)]; + player.head = GetRandomValue(0, texHead.width/BASE_HEAD_WIDTH - 1); + player.colHead = headColors[GetRandomValue(0, 5)]; } - else if (partToChange == 1) demoChar.eyes = GetRandomValue(0, texEyes.width/BASE_EYES_WIDTH); - else if (partToChange == 2) demoChar.nose = GetRandomValue(0, texNose.width/BASE_NOSE_WIDTH); - else if (partToChange == 3) demoChar.mouth = GetRandomValue(0, texMouth.width/BASE_MOUTH_WIDTH); + else if (partToChange == 1) player.eyes = GetRandomValue(0, texEyes.width/BASE_EYES_WIDTH - 1); + else if (partToChange == 2) player.nose = GetRandomValue(0, texNose.width/BASE_NOSE_WIDTH - 1); + else if (partToChange == 3) player.mouth = GetRandomValue(0, texMouth.width/BASE_MOUTH_WIDTH - 1); else if (partToChange == 4) { - demoChar.hair = GetRandomValue(0, texHair.width/BASE_HAIR_WIDTH); - demoChar.colHair = hairColors[GetRandomValue(0, 9)]; + player.hair = GetRandomValue(0, texHair.width/BASE_HAIR_WIDTH - 1); + player.colHair = hairColors[GetRandomValue(0, 9)]; } framesCounter = 0; } - titlePositionY++; + titlePositionY += 3; if (titlePositionY > 40) titlePositionY = 40; - buttonPositionY--; - if (buttonPositionY < 580) buttonPositionY = 580; + titleCounter++; + + if (IsKeyPressed(KEY_ENTER)) finishScreen = 1; } // Title Screen Draw logic @@ -98,26 +98,33 @@ void DrawTitleScreen(void) DrawTexture(background, 0, 0, GetColor(0xf6aa60ff)); // Draw face, parts keep changing ranomly - DrawCharacter(demoChar); + DrawCharacter(player, (Vector2){ GetScreenWidth()/2 - 125, 80 }); // Draw face rectangles - DrawRectangleRec((Rectangle){ GetScreenWidth()/2 - BASE_EYES_WIDTH/2, 270, BASE_EYES_WIDTH, texEyes.height }, Fade(GREEN, 0.3f)); - DrawRectangleRec((Rectangle){ GetScreenWidth()/2 - BASE_NOSE_WIDTH/2, 355, BASE_NOSE_WIDTH, texNose.height }, Fade(SKYBLUE, 0.3f)); - DrawRectangleRec((Rectangle){ GetScreenWidth()/2 - BASE_MOUTH_WIDTH/2, 450, BASE_MOUTH_WIDTH, texMouth.height }, Fade(RED, 0.3f)); + //DrawRectangleRec((Rectangle){ GetScreenWidth()/2 - BASE_EYES_WIDTH/2, 270, BASE_EYES_WIDTH, texEyes.height }, Fade(GREEN, 0.3f)); + //DrawRectangleRec((Rectangle){ GetScreenWidth()/2 - BASE_NOSE_WIDTH/2, 355, BASE_NOSE_WIDTH, texNose.height }, Fade(SKYBLUE, 0.3f)); + //DrawRectangleRec((Rectangle){ GetScreenWidth()/2 - BASE_MOUTH_WIDTH/2, 450, BASE_MOUTH_WIDTH, texMouth.height }, Fade(RED, 0.3f)); DrawTexture(texTitle, GetScreenWidth()/2 - texTitle.width/2, titlePositionY, WHITE); - if (GuiButton((Rectangle){ GetScreenWidth()/2 - 440/2, buttonPositionY, 440, 80 }, "START DATE!", -1)) + if (titleCounter > 180) { - finishScreen = 1; // GAMEPLAY - PlaySound(fxCoin); + if (GuiButton((Rectangle){ GetScreenWidth()/2 - 440/2, 580, 440, 80 }, "START DATE!", -1)) + { + finishScreen = 1; // GAMEPLAY + PlaySound(fxCoin); + } } + + DrawText("powered by", 20, GetScreenHeight() - texLogo.height - 35, 10, BLACK); + DrawTexture(texLogo, 20, GetScreenHeight() - texLogo.height - 20, WHITE); } // Title Screen Unload logic void UnloadTitleScreen(void) { UnloadTexture(texTitle); + UnloadTexture(texLogo); } // Title Screen should finish? diff --git a/games/repair/screens/screens.h b/games/repair/screens/screens.h index 872ff0cce..362a15c9a 100644 --- a/games/repair/screens/screens.h +++ b/games/repair/screens/screens.h @@ -40,20 +40,14 @@ typedef enum GameScreen { LOGO = 0, TITLE, OPTIONS, GAMEPLAY, ENDING } GameScree typedef struct { int head; int colHead; - int eyes; - int nose; - int mouth; - int hair; // Config (decrease value only) + int eyes; // Config + int nose; // Config + int mouth; // Config + int hair; // Config int colHair; // Config - int eyeLine; // Config -> 0, 1, 2 - int paintLips; // Config -> 0, 1, 2 - //Color colLips; // Config - bool makeup; // Config - bool bear; // Config: remove - bool moustache; // Config: remove - bool glasses; // Config: put/remove - bool piercing; // Config: put/remove - //bool freckles; + int glasses; // Config + //int piercing; + //int freckles; } Character; //---------------------------------------------------------------------------------- @@ -72,6 +66,11 @@ extern NPatchInfo npInfo; extern Texture2D texHead, texHair, texNose, texMouth, texEyes, texComp; extern Texture2D texMakeup; +extern Character player; +extern Character playerBase; +extern Character dating; +extern Character datingBase; + #ifdef __cplusplus extern "C" { // Prevents name mangling of functions #endif @@ -81,7 +80,7 @@ bool GuiButton(Rectangle rec, const char *text, int forcedState); Character GenerateCharacter(void); void CustomizeCharacter(Character *character); -void DrawCharacter(Character character); +void DrawCharacter(Character character, Vector2 position); //---------------------------------------------------------------------------------- // Logo Screen Functions Declaration