/********************************************************************************************** * * raylib - Koala Seasons game * * Gameplay Screen Functions Definitions (Init, Update, Draw, Unload) * * Copyright (c) 2014-2016 Ramon Santamaria (@raysan5) * * This software is provided "as-is", without any express or implied warranty. In no event * will the authors be held liable for any damages arising from the use of this software. * * Permission is granted to anyone to use this software for any purpose, including commercial * applications, and to alter it and redistribute it freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not claim that you * wrote the original software. If you use this software in a product, an acknowledgment * in the product documentation would be appreciated but is not required. * * 2. Altered source versions must be plainly marked as such, and must not be misrepresented * as being the original software. * * 3. This notice may not be removed or altered from any source distribution. * **********************************************************************************************/ //---------------------------------------------------------------------------------- // Defines and Macros //---------------------------------------------------------------------------------- #include "raylib.h" #include "screens.h" #include #include #include #include "atlas01.h" #include "atlas02.h" //#define DEBUG // DONE: Review MAX_* limits, don't waste memory!!! #define MAX_ENEMIES 16 #define MAX_BAMBOO 16 #define MAX_LEAVES 14 #define MAX_FIRE 10 #define MAX_FIRE_FLAMES 20 #define MAX_ICE 10 #define MAX_RESIN 10 #define MAX_WIND 10 #define MAX_PARTICLES 128 #define MAX_PARTICLES_RAY 8 #define MAX_PARTICLES_SPEED 64 #define MAX_PARTICLES_STORM 512 #define SPEED 3*TIME_FACTOR // Speed of koala, trees, enemies, ... #define JUMP 15*TIME_FACTOR // Jump speed #define FLYINGMOV 10*TIME_FACTOR // Up and Down speed when final form #define GRAVITY 1*TIME_FACTOR // Gravity when grabbed to tree #define ICEGRAVITY 4*TIME_FACTOR // Gravity when grabbed to an icy tree #define KICKSPEED 3*TIME_FACTOR // Gravity when kicking #define SEASONCHANGE 1200 // Frames duration per season #define SEASONTRANSITION SEASONCHANGE/6 // Season transition time //SPAWNCHANCE - Chance of spawning things everytime a tree spawns #define ICESPAWNCHANCE 30 // Chance of spawning ice everytime a tree spawns #define RESINSPAWNCHANCE 30 // Chance of spawning resin everytime a tree spawns #define FIRESPAWNCHANCE 30 // Chance of spawning fire everytime a tree spawns #define WINDSPAWNCHANCE 30 // Chance of spawning wind everytime a tree spawns //ENEMYSPAWNCHANCE - Chance of spawning enemies everytime a tree spawns #define DINGOSPAWNCHANCE 30 // Chance of spawning dingos everytime a tree spawns #define OWLSPAWNCHANCE 30 // Chance of spawning owls everytime a tree spawns #define SNAKESPAWNCHANCE 30 // Chance of spawning snakes everytime a tree spawns #define BEE_SPAWNCHANCE 10 // Chance of spawning bees everytime a tree spawns #define EAGLE_SPAWNCHANCE 5 // Chance of spawning eagles everytime a tree spawns #define EAGLE_TIME_DELAY 600 //SCORE - Score increase everytime an enemy is killed #define DINGOSCORE 100 // Score increase everytime a dingo is killed #define OWLSCORE 100 // Score increase everytime an owl is killed #define SNAKESCORE 100 // Score increase everytime a snake is killed #define BEESCORE 300 // Score increase everytime a bee is killed #define EAGLESCORE 300 // Score increase everytime an eagle is killed #define LEAVESTOTRANSFORM 100 // Number of leaves recquired for the transformation #define MAXTIMESPAWN 85 // Maximum time for tree spawn #define MINTIMESPAWN 35 // Minimum time for tree spawn #define STARTINGMONTH 0 // Starting month (0 = January (summer)) #define PROGRESION_START 3600 // Time to start the progresion #define PROGRESION_DURATION 12000 // Maximum time #define PROGRESOIN_MAX_SPAWNCHANCE 30 // Maximum spawn chance increase #define PROGRESION_MAX_SPEED 0.5 // Maximum speed modification by progresion //---------------------------------------------------------------------------------- // Types and Structures Definition //---------------------------------------------------------------------------------- typedef enum { WINTER, SPRING, SUMMER, FALL, TRANSITION} SeasonState; typedef enum { JUMPING, KICK, FINALFORM, GRABED, ONWIND } KoalaState; typedef struct { Vector2 position; Vector2 speed; float rotation; float size; Color color; float alpha; float rotPhy; bool active; } Particle; typedef struct { Vector2 position; Vector2 speed; float rotation; Vector2 size; Color color; float alpha; bool active; } ParticleSpeed; typedef struct { Vector2 position; Color color; float alpha; float size; float rotation; bool active; // NOTE: Use it to activate/deactive particles bool fading; float delayCounter; } ParticleRay; typedef struct { Vector2 position; bool active; int spawnTime; int maxTime; Particle particles[MAX_PARTICLES]; } ParticleSystem; // DONE: Rename for coherence: ParticleSystemStorm typedef struct { Vector2 position; bool active; int spawnTime; int maxTime; Particle particles[MAX_PARTICLES_STORM]; } ParticleSystemStorm; typedef struct { Vector2 position; bool active; float alpha; float scale; int score; } PopUpScore; typedef struct { Vector2 position; bool active; int spawnTime; int maxTime; ParticleSpeed particle[MAX_PARTICLES_SPEED]; } ParticleSystemSpeed; typedef struct { Vector2 position; bool active; int spawnTime; int maxTime; ParticleRay particles[MAX_PARTICLES_RAY]; } ParticleSystemRay; //---------------------------------------------------------------------------------- // Global Variables Definition (local to this module) //---------------------------------------------------------------------------------- static float gravity; static SeasonState season; static KoalaState state; // Gameplay screen global variables static int framesCounter; static int finishScreen; static int grabCounter; static int velocity; static int speed; static int bambooTimer; static int bambooSpawnTime; static int colorTimer; static int jumpSpeed; static int power; static int maxPower; static int transCount; static int posArray[2]; static int posArrayDingo[2]; static int enemyVel[MAX_ENEMIES]; static int beeVelocity; static int fireSpeed; static int windCounter; static int seasonTimer; static int seasonChange; static int resinCountjump; static int resinCountdrag; static int resinCount; static int currentMonth; static int monthTimer; static int monthChange; static int initMonth; static int fireCounter[MAX_FIRE]; static int fireOffset; static int beeMov; static int killCounter; static int leafType[MAX_LEAVES]; static int posArrayLeaf[3]; static int transAniCounter; static int globalFrameCounter; static int startCounter; static int animCounter; static int startNum = 3; static int finalFormEnd; static int randomMessage; static int parallaxBackOffset; static int parallaxFrontOffset; // Animation Variables static int thisFrame = 1; static int currentFrame = 0; static int thisFrameWind = 1; static int currentFrameWind = 0; static int thisFrameBee = 1; static int thisFrameSnake = 1; static int thisFrameDingo = 1; static int thisFrameOwl = 1; static int thisFrameEagle = 1; static int curFrameEagle; static int curFrameBee = 0; static int curFrameSnake = 0; static int curFrameDingo = 0; static int curFrameOwl = 0; static int curFrame; static int curFrame1; static int curFrame2; static int curFrame3; static int transitionFramesCounter; static int thisFrameKoala; static int curFrameKoala; static int fogSpeed; static int fogPosition; static int progresionDelay; static int progresionFramesCounter; static int initLeaves; static int eagleDelay; // Stage data variables static int jumpCounter; static int resinCounter; static int tornadoCounter; static int dashCounter; static int superKoalaCounter; // Global data variables static int snakeKillCounter; static int dingoKillCounter; static int owlKillCounter; static int beeKillCounter; static int eagleKillCounter; static int globalKillCounter; static int deathsCounter; static float scrollFront; static float scrollMiddle; static float scrollBack; static float scrollSpeed; static float rightAlpha = 0.5; static float leftAlpha = 0.5; static float speedMod; static float groundPos; static float transRotation; static float clockRotation; static float clockSpeedRotation; static float numberAlpha; static float numberScale; static float fogAlpha; static float speedIncrease; static float speedProgresion; static float progresionSpawnChance; static float UIfade; static float filterAlpha; static float leafGUIglowFade; static float leafGUIpulseFade; static float leafGUIpulseScale; static float clockInitRotation; static float clockFinalRotation; // Game text strings const char textFinalForm[32] = "THIS ISN'T EVEN MY FINAL FORM!"; const char textSpring1[32] = "FLOWER POWER!"; const char textSummer1[32] = "PREPARE FOR THE SUMMER!"; const char textFall1[32] = "HERE COMES THE FALL!"; const char textWinter1[32] = "WINTER IS COMING!"; const char textSpring2[32] = "POLLEN IS IN THE AIR"; const char textSummer2[32] = "HAPPY NEW YEAR!"; const char textFall2[32] = "IT'S RAINING RAIN"; const char textWinter2[32] = "LET IT SNOW!"; static bool snakeActive[MAX_ENEMIES]; static bool dingoActive[MAX_ENEMIES]; static bool owlActive[MAX_ENEMIES]; static bool branchActive[MAX_ENEMIES]; static bool bambooActive[MAX_BAMBOO]; static bool leafActive[MAX_LEAVES]; static bool fireActive[MAX_FIRE]; static bool iceActive[MAX_ICE]; static bool windActive[MAX_WIND]; static bool resinActive[MAX_RESIN]; static bool isHitSnake[MAX_ENEMIES]; static bool isHitDingo[MAX_ENEMIES]; static bool isHitOwl[MAX_ENEMIES]; static bool isHitBee; static bool isHitEagle; static bool onFire[MAX_FIRE]; static bool onIce; static bool onResin; static bool playerActive; static bool play; static bool transforming; static bool onWind; static bool glowing; static bool beeActive; static bool eagleActive; static bool eagleAlert; static bool alertActive; static bool alertBeeActive; static bool coolDown; static bool leafSide[MAX_LEAVES]; static bool transBackAnim; static bool fog; static bool leafGUIglow; static Rectangle player = {0, 0, 0, 0}; static Rectangle leftButton = {0, 0, 0, 0}; static Rectangle rightButton = {0, 0, 0, 0}; static Rectangle powerButton = {0, 0, 0, 0}; static Rectangle fire[MAX_FIRE]; //static Rectangle flames[MAX_FLAMES]; static Rectangle ice[MAX_ICE]; static Rectangle resin[MAX_RESIN]; static Rectangle wind[MAX_WIND]; static Rectangle bamboo[MAX_BAMBOO]; static Rectangle snake[MAX_ENEMIES]; static Rectangle dingo[MAX_ENEMIES]; static Rectangle owl[MAX_ENEMIES]; static Rectangle leaf[MAX_LEAVES]; // DONE: Review name! static Rectangle powerBar; static Rectangle backBar; static Rectangle fireAnimation; static Rectangle windAnimation; static Rectangle beeAnimation; static Rectangle snakeAnimation; static Rectangle dingoAnimation; static Rectangle owlAnimation; static Rectangle bee; static Rectangle eagle; static Rectangle eagleAnimation; static Rectangle koalaAnimationIddle; static Rectangle koalaAnimationJump; static Rectangle koalaAnimationFly; static Rectangle koalaAnimationTransform; static Rectangle alertRectangle; static Rectangle beeAlertRectangle; static time_t rawtime; static struct tm *ptm; static Color finalColor; static Color finalColor2; static Color flyColor; static Color counterColor; static Color color00, color01, color02, color03; static Color initcolor00, initcolor01, initcolor02, initcolor03; static Color finalcolor00, finalcolor01, finalcolor02, finalcolor03; static Vector2 zero; static Vector2 firePos; static Vector2 branchPos[MAX_ENEMIES]; static Vector2 textSize; static Vector2 clockPosition; static Particle enemyHit[MAX_ENEMIES]; static ParticleSystem leafParticles[MAX_LEAVES]; // DONE: Review!!! Creating 40 ParticleSystem!!! -> 40*128 = 5120 Particles! Maybe better create a struct Leaf? static ParticleSystem snowParticle; static ParticleSystem backSnowParticle; static ParticleSystem dandelionParticle; static ParticleSystem dandelionBackParticle; static ParticleSystem planetreeParticle; static ParticleSystem backPlanetreeParticle; static ParticleSystem flowerParticle; static ParticleSystem backFlowerParticle; static ParticleSystem rainParticle; static ParticleSystem backRainParticle; static ParticleSystemStorm rainStormParticle; static ParticleSystemStorm snowStormParticle; static ParticleSystemRay rayParticles; static ParticleSystemRay backRayParticles; static ParticleSystemSpeed speedFX; static PopUpScore popupScore[MAX_ENEMIES]; static PopUpScore popupLeaves[MAX_LEAVES]; static PopUpScore popupBee; static PopUpScore popupEagle; //---------------------------------------------------------------------------------- // Module specific Functions Declaration //---------------------------------------------------------------------------------- static void BambooSpawn(void); static void SnakeSpawn(int chance); static void DingoSpawn(int chance); static void OwlSpawn(int chance); static void BeeSpawn(int chance); static void EagleSpawn(int chance); static void FireSpawn(int chance); static void IceSpawn(int chance); static void ResinSpawn(int chance); static void WindSpawn(int chance); static void LeafSpawn(void); static void DrawParallaxFront(void); static void DrawParallaxMiddle(void); static void DrawParallaxBack(void); static float LinearEaseIn(float t, float b, float c, float d); static Color ColorTransition(Color initialColor, Color finalColor, int framesCounter); static bool CheckArrayValue(int *array, int arrayLength, int value); static void Reset(void); //---------------------------------------------------------------------------------- // Gameplay Screen Functions Definition //---------------------------------------------------------------------------------- // Gameplay Screen Initialization logic void InitGameplayScreen(void) { // Get current time at the moment of running game time(&rawtime); ptm = gmtime(&rawtime); currentMonth = ptm->tm_mon; initMonth = ptm->tm_mon; years = 1900 + ptm->tm_year; Reset(); } // Gameplay Screen Update logic void UpdateGameplayScreen(void) { //if ((IsKeyPressed(KEY_SPACE) || IsMouseButtonPressed(0)) && playerActive) play = true; if (play == false && playerActive) { startCounter+= 1*TIME_FACTOR; if (startCounter > 20 && startCounter < 110) { animCounter+=1*TIME_FACTOR; numberAlpha -= 0.033f*TIME_FACTOR; numberScale -= 0.0825f*TIME_FACTOR; if (animCounter <= 30) startNum = 3; else if (animCounter > 30 && animCounter <= 60) startNum = 2; else startNum = 1; } else if (startCounter >= 110) play = true; if (numberAlpha <= 0) numberAlpha = 1; if (numberScale <= 0) numberScale = 2.5f; textSize = MeasureTextEx(font, FormatText("%01i", startNum), font.baseSize*numberScale, 2); } if (playerActive) finishScreen = 0; if (play && playerActive) { seasonTimer += speedMod*TIME_FACTOR; monthTimer += speedMod*TIME_FACTOR; eagleDelay += speedMod*TIME_FACTOR; globalFrameCounter++; if (monthTimer >= monthChange) { if ((currentMonth == 10)) { clockInitRotation = 225; clockFinalRotation = clockInitRotation + 90; rainChance = GetRandomValue(0, 100); clockSpeedRotation = 0; seasons++; } else if (currentMonth == 1) { clockInitRotation = 315; clockFinalRotation = clockInitRotation + 90; rainChance = GetRandomValue(0, 100); clockSpeedRotation = 0; seasons++; } else if (currentMonth == 4) { clockInitRotation = 45; clockFinalRotation = clockInitRotation + 90; rainChance = GetRandomValue(0, 100); clockSpeedRotation = 0; seasons++; } else if (currentMonth == 7) { clockInitRotation = 135; clockFinalRotation = clockInitRotation + 90; rainChance = GetRandomValue(0, 100); clockSpeedRotation = 0; seasons++; } currentMonth++; monthTimer = 0; //EagleSpawn(); } if (currentMonth > 11) { currentMonth = 0; years++; } if ((currentMonth == 11) || (currentMonth == 0) || ((currentMonth == 1) && (monthTimer <= SEASONTRANSITION))) { dandelionParticle.active = true; dandelionBackParticle.active = true; rayParticles.active = true; backRayParticles.active = true; transitionFramesCounter = 0; randomMessage = GetRandomValue(0, 10); fog = false; initcolor00 = color00; // Summer Color initcolor01 = color01; initcolor02 = color02; initcolor03 = color03; finalcolor00 = (Color){242, 113, 62, 255}; // Fall Autum finalcolor01 = (Color){190, 135, 114, 255}; finalcolor02 = (Color){144, 130, 101, 255}; finalcolor03 = (Color){214, 133, 58, 255}; season = SUMMER; currentSeason = 0; } else if ((currentMonth == 2) || (currentMonth == 3) || ((currentMonth == 4) && (monthTimer <= SEASONTRANSITION))) { if ((rainChance <= 40) && (rainChance > 24)) { //rainParticle.active = true; rainStormParticle.active = true; backRainParticle.active = false; fog = true; } else if (rainChance <= 24) { //rainParticle.active = true; rainStormParticle.active = true; backRainParticle.active = false; fog = true; } else { planetreeParticle.active = true; backPlanetreeParticle.active = true; fog = false; } transitionFramesCounter = 0; randomMessage = GetRandomValue(0, 10); initcolor00 = color00; // Fall Color initcolor01 = color01; initcolor02 = color02; initcolor03 = color03; finalcolor00 = (Color){130, 130, 181, 255}; // Winter Autum finalcolor01 = (Color){145, 145, 166, 255}; finalcolor02 = (Color){104, 142, 144, 255}; finalcolor03 = (Color){57, 140, 173, 255}; season = FALL; currentSeason = 1; } else if ((currentMonth == 5) || (currentMonth == 6) || ((currentMonth == 7) && (monthTimer <= SEASONTRANSITION))) { if (rainChance <= 40) { //rainParticle.active = true; snowStormParticle.active = true; backSnowParticle.active = true; fog = true; } else { snowParticle.active = true; backSnowParticle.active = true; fog = false; } transitionFramesCounter = 0; randomMessage = GetRandomValue(0, 10); initcolor00 = color00; // Winter Color initcolor01 = color01; initcolor02 = color02; initcolor03 = color03; finalcolor00 = (Color){196, 176, 49, 255}; // Spring Autum finalcolor01 = (Color){178, 163, 67, 255}; finalcolor02 = (Color){133, 143, 90, 255}; finalcolor03 = (Color){133, 156, 42, 255}; season = WINTER; currentSeason = 2; } else if ((currentMonth == 8) || (currentMonth == 9) || ((currentMonth == 10) && (monthTimer <= SEASONTRANSITION))) { flowerParticle.active = true; backFlowerParticle.active = true; transitionFramesCounter = 0; randomMessage = GetRandomValue(0, 9); fog = false; initcolor00 = color00; // Spring Color initcolor01 = color01; initcolor02 = color02; initcolor03 = color03; finalcolor00 = (Color){129, 172, 86, 255}; // Summer Autum finalcolor01 = (Color){145, 165, 125, 255}; finalcolor02 = (Color){161, 130, 73, 255}; finalcolor03 = (Color){198, 103, 51, 255}; season = SPRING; currentSeason = 3; } else { flowerParticle.active = false; backFlowerParticle.active = false; snowParticle.active = false; backSnowParticle.active = false; planetreeParticle.active = false; backPlanetreeParticle.active = false; dandelionParticle.active = false; dandelionBackParticle.active = false; rainParticle.active = false; rainStormParticle.active = false; backRainParticle.active = false; rayParticles.active = false; backRayParticles.active = false; snowStormParticle.active = false; fog = false; transitionFramesCounter += speedMod*TIME_FACTOR; if(transitionFramesCounter <= SEASONTRANSITION) { color00 = ColorTransition(initcolor00, finalcolor00, transitionFramesCounter); color01 = ColorTransition(initcolor01, finalcolor01, transitionFramesCounter); color02 = ColorTransition(initcolor02, finalcolor02, transitionFramesCounter); color03 = ColorTransition(initcolor03, finalcolor03, transitionFramesCounter); } season = TRANSITION; } // Update scrolling values if (!transforming) { scrollFront -= scrollSpeed; scrollMiddle -= (scrollSpeed*0.75f); scrollBack -= scrollSpeed/2; fogPosition -= fogSpeed; groundPos -= speed; clockRotation += clockSpeedRotation; } player.y += gravity; bambooTimer += (speedMod*TIME_FACTOR); speed = SPEED*speedMod; if (player.x >= GetScreenWidth()*0.6 && state != FINALFORM) { speedIncrease = (player.x - GetScreenWidth()*0.6f)/GetScreenWidth(); } else if (player.x < GetScreenWidth()*0.6 && state != FINALFORM) { speedIncrease = 0; } if (state != FINALFORM) speedMod = 1.2 + speedIncrease + speedProgresion; progresionDelay++; if (progresionDelay >= PROGRESION_START) { progresionFramesCounter++; if (progresionFramesCounter < PROGRESION_DURATION) { speedProgresion = LinearEaseIn((float)progresionFramesCounter, 0.0f, (float)PROGRESION_MAX_SPEED, (float)PROGRESION_DURATION); progresionSpawnChance = LinearEaseIn((float)progresionFramesCounter, 0.0f, (float)PROGRESOIN_MAX_SPAWNCHANCE, (float)PROGRESION_DURATION); } } if (scrollFront <= -GetScreenWidth()) scrollFront = 0; if (scrollMiddle <= -GetScreenWidth()) scrollMiddle = 0; if (scrollBack <= -GetScreenWidth()) scrollBack = 0; if (groundPos <= -GetScreenWidth()) groundPos = 0; if (fogPosition <= -GetScreenWidth()) fogPosition = 0; if (fogAlpha > 0 && !fog) fogAlpha -= 0.03f*speedMod; else if (fog && fogAlpha < 1) fogAlpha += 0.03f*speedMod; if (filterAlpha > 0 && !fog) filterAlpha -= 0.02f*speedMod; else if (fog && filterAlpha < 0.15f) filterAlpha += 0.02f*speedMod; //if (state != FINALFORM) clockSpeedRotation = (float)((90/(float)seasonChange)*speedMod)*1.75; clockSpeedRotation += speedMod*TIME_FACTOR; if (clockSpeedRotation <= (SEASONCHANGE)) clockRotation = (float)LinearEaseIn((float)clockSpeedRotation, clockInitRotation, 90.0f, (float)(SEASONCHANGE)); else clockRotation = clockFinalRotation; if (CheckCollisionCircleRec(clockPosition, gameplay_gui_seasonsclock_disc.width, player)) { if (UIfade > 0.4f) UIfade -= 0.01f*TIME_FACTOR; } else { if (UIfade < 1) UIfade += 0.01f*TIME_FACTOR; } //---------------------------------------------------------------------------------- // Animations //---------------------------------------------------------------------------------- // Wind Animation thisFrameWind += 1*TIME_FACTOR; if (thisFrameWind >= 12) { currentFrameWind++; thisFrameWind = 0; } if (currentFrameWind > 3) currentFrameWind = 0; windAnimation.x = gameplay_props_whirlwind_spritesheet.x + windAnimation.width*currentFrameWind; // Fire Animation thisFrame += 1*TIME_FACTOR; if (thisFrame >= 8) { curFrame++; curFrame1++; curFrame2++; curFrame3++; thisFrame = 0; } if (curFrame > 3) curFrame = 0; if (curFrame1 > 3) curFrame1 = 0; if (curFrame2 > 3) curFrame2 = 0; if (curFrame3 > 3) curFrame3 = 0; if (!transforming) { // Eagle Animation curFrameEagle += 1*TIME_FACTOR; if (curFrameEagle >= 6*TIME_FACTOR) { thisFrameEagle ++; curFrameEagle = 0; } if (thisFrameEagle > 1) thisFrameEagle = 0; eagleAnimation.x = gameplay_enemy_eagle.x + eagleAnimation.width*thisFrameEagle; // Bee Animation curFrameBee += 1*TIME_FACTOR; if (curFrameBee >= 3*TIME_FACTOR) { thisFrameBee ++; curFrameBee = 0; } if (thisFrameBee > 3) thisFrameBee = 0; beeAnimation.x = gameplay_enemy_bee.x + beeAnimation.width*thisFrameBee; // Snake Animation thisFrameSnake += 1*TIME_FACTOR; if (thisFrameSnake >= 24*TIME_FACTOR) { curFrameSnake ++; thisFrameSnake = 0; } if (curFrameSnake > 1) curFrameSnake = 0; snakeAnimation.x = gameplay_enemy_snake.x + snakeAnimation.width*curFrameSnake; // Dingo Animation curFrameDingo += 1*TIME_FACTOR; if (curFrameDingo >= 24*TIME_FACTOR) { thisFrameDingo ++; curFrameDingo = 0; } if (thisFrameDingo > 1) thisFrameDingo = 0; dingoAnimation.x = gameplay_enemy_dingo.x + dingoAnimation.width*thisFrameDingo; // Owl Animation curFrameOwl += 1*TIME_FACTOR; if (curFrameOwl >= 24*TIME_FACTOR) { thisFrameOwl ++; curFrameOwl = 0; } if (thisFrameOwl > 1) thisFrameOwl = 0; owlAnimation.x = gameplay_enemy_owl.x + owlAnimation.width*thisFrameOwl; // Alert Animation if (alertActive) { if (eagleAlert) { alertRectangle.x -= 100*TIME_FACTOR; alertRectangle.width += 100*TIME_FACTOR; alertRectangle.height += 5*TIME_FACTOR; alertRectangle.y -= 5*TIME_FACTOR; if (alertRectangle.height >= 100) eagleAlert = false; } else { alertRectangle.height -= 1*TIME_FACTOR; alertRectangle.y += 1*TIME_FACTOR; if (alertRectangle.height <= 0) { eagleAlert = true; eagleActive = true; alertActive = false; } } } // Eagle Logic if (eagleActive == true && !isHitEagle) { eagle.x -= 10*speed*TIME_FACTOR; if (CheckCollisionRecs(eagle, player) && (state != FINALFORM) && (state != KICK)) { velocity = 8; jumpSpeed = 2; play = false; playerActive = false; killer = 6; } else if (CheckCollisionRecs(eagle, player) && (state == FINALFORM) && (state != KICK)) { isHitEagle = true; beeVelocity = 8; killHistory[killCounter] = 5; killCounter++; score += EAGLESCORE; eagleKillCounter++; globalKillCounter++; popupEagle.position = (Vector2){ eagle.x, eagle.y }; popupEagle.scale = 1.0f; popupEagle.alpha = 1.0f; popupEagle.score = EAGLESCORE; popupEagle.active = true; } } else if (isHitEagle) { if ((eagle.y + eagle.height) > GetScreenHeight()) { eagleActive = false; isHitEagle = false; } eagle.x += 2*TIME_FACTOR; beeVelocity -= 1*TIME_FACTOR*TIME_FACTOR; eagle.y -= beeVelocity*TIME_FACTOR; } if (eagle.x + eagle.width <= 0) eagleActive = false; // Bee Alert Animation if (alertBeeActive) { beeAlertRectangle.x -= 100*TIME_FACTOR; beeAlertRectangle.width += 100*TIME_FACTOR; beeAlertRectangle.height += 2.5*TIME_FACTOR; beeAlertRectangle.y += 1.25*TIME_FACTOR; if (beeAlertRectangle.height >= 100) { beeActive = true; alertBeeActive = false; } } // Bee Logic if (beeActive == true && !isHitBee) { bee.x -= 3*speed; beeMov = sin(2*PI/400*bee.x) * 5; bee.y += beeMov*TIME_FACTOR; if (CheckCollisionRecs(bee, player) && (state != FINALFORM) && (state != KICK)) { velocity = 8; jumpSpeed = 2; play = false; playerActive = false; killer = 5; } else if (CheckCollisionRecs(bee, player) && (state == FINALFORM) && (state != KICK)) { isHitBee = true; beeVelocity = 8; killHistory[killCounter] = 4; killCounter++; score += BEESCORE; beeKillCounter++; globalKillCounter++; popupBee.position = (Vector2){ bee.x, bee.y }; popupBee.scale = 1.0f; popupBee.alpha = 1.0f; popupBee.score = BEESCORE; popupBee.active = true; } } else if (isHitBee) { if ((bee.y + bee.height) > GetScreenHeight()) { beeActive = false; isHitBee = false; } bee.x += 2*TIME_FACTOR; beeVelocity -= 1*TIME_FACTOR*TIME_FACTOR; bee.y -= beeVelocity*TIME_FACTOR; } if (bee.x + bee.width <= 0) beeActive = false; } // Power bar logic powerBar.width = power; if (power >= maxPower) power = maxPower; if (currentLeaves >= LEAVESTOTRANSFORM && !coolDown) { flyColor = ORANGE; if (leafGUIglow) { leafGUIglowFade += 0.01f*TIME_FACTOR; if (leafGUIglowFade >= 1) leafGUIglow = false; } else { leafGUIglowFade -= 0.01f*TIME_FACTOR; if (leafGUIglowFade <= 0) leafGUIglow = true; } leafGUIpulseFade -= 0.01f*TIME_FACTOR; leafGUIpulseScale += 0.005F*TIME_FACTOR; if (leafGUIpulseFade <= 0) { leafGUIpulseFade = 1; leafGUIpulseScale = 1; } #if (defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB)) if ((IsGestureDetected(GESTURE_TAP) && CheckCollisionPointRec(GetTouchPosition(0), powerButton)) && (state != FINALFORM)) { state = FINALFORM; transforming = true; //currentLeaves -= LEAVESTOTRANSFORM; initLeaves = currentLeaves; curFrameKoala = 0; thisFrameKoala = 0; superKoalaCounter++; } #elif (defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)) if ((IsKeyPressed(KEY_ENTER) || (CheckCollisionPointRec(GetMousePosition(), powerButton) && IsMouseButtonPressed(0))) && (state != FINALFORM)) { state = FINALFORM; transforming = true; //currentLeaves -= LEAVESTOTRANSFORM; initLeaves = currentLeaves; curFrameKoala = 0; thisFrameKoala = 0; superKoalaCounter++; } #endif } #if defined(DEBUG) if (currentLeaves < LEAVESTOTRANSFORM && (IsKeyPressed(KEY_ENTER))) { currentLeaves += LEAVESTOTRANSFORM; } #endif if (coolDown) { power += 20; if (power >= maxPower) coolDown = false; } colorTimer += 1*TIME_FACTOR; if (colorTimer > 10) { finalColor.r = GetRandomValue(0, 255); finalColor.g = GetRandomValue(0, 255); finalColor.b = GetRandomValue(0, 255); colorTimer = 0; } // Ice logic for (int i = 0; i < MAX_ICE; i++) { if (!iceActive[i]) ice[i].x = -100; if (ice[i].x <= - ice[i].width) iceActive[i] = false; if (CheckCollisionRecs(ice[i], player) && (state == GRABED)) onIce = true; } // Resin logic for (int i = 0; i < MAX_RESIN; i++) { if (!resinActive[i]) resin[i].x = -100; if (resin[i].x <= -resin[i].width) resinActive[i] = false; if (CheckCollisionRecs(resin[i], player) && resinCount >= 30*TIME_FACTOR && state != FINALFORM) { if (!onResin) { PlaySound(fxHitResin); resinCounter++; } onResin = true; grabCounter = 10; //gravity = 0; state = GRABED; } } // Wind logic for (int i = 0; i < MAX_WIND; i++) { if (!windActive[i]) wind[i].x = -500; else wind[i].x -= 9*speedMod*TIME_FACTOR; if (wind[i].x <= - wind[i].width) windActive[i] = false; if (CheckCollisionRecs(wind[i], player) && state != ONWIND && (windCounter >= 35) && state != FINALFORM) { state = ONWIND; windCounter = 0; velocity = JUMP; grabCounter = 0; jumpSpeed = 10; rightAlpha = 1; onIce = false; onResin = false; resinCountjump = 0; resinCountdrag = 0; tornadoCounter++; } } // Fire logic for (int i = 0; i < MAX_FIRE; i++) { //fire[i].x -= speed; if (fireActive[i] == false) fire[i].x = -200; if (fire[i].x <= (player.x + player.width) && !onFire[i]) { onFire[i] = true; } if (onFire[i] && fire[i].y > -50 && !transforming) { fireCounter[i]++; fire[i].y -= fireSpeed*TIME_FACTOR; fireCounter[i] = 0; //fire[i].height += fireSpeed; } if (fire[i].x <= -fire[i].width) { fireActive[i] = false; onFire[i] = false; } if (CheckCollisionRecs(player, fire[i])) { if (state != FINALFORM) { velocity = 8; jumpSpeed = 2; play = false; playerActive = false; killer = 0; } } for (int k = 0; k < MAX_ENEMIES; k++) { if (CheckCollisionRecs(fire[i], snake[k]) && !isHitSnake[k]) { isHitSnake[k] = true; enemyVel[k] = 8; } } } // Bamboo logic for (int i = 0; i < MAX_BAMBOO; i++) { if (bambooActive[i]) { bamboo[i].x -= speed; if ((CheckCollisionRecs(player, bamboo[i])) && (state != FINALFORM)) { if (grabCounter >= 10) { player.x = bamboo[i].x - 25; state = GRABED; } } if ((CheckCollisionRecs(player, bamboo[i])) && (state == FINALFORM)) { if (power <= 1) { state = JUMPING; velocity = JUMP; jumpSpeed = 6; scrollSpeed = 1.6f; speedMod = 1.2f; coolDown = true; flyColor = GRAY; speedFX.active = false; } } for (int k = 0; k < MAX_ENEMIES; k++) { if ((CheckCollisionRecs(snake[k], bamboo[i])) && snakeActive[k] && !isHitSnake[k]) snake[k].x = bamboo[i].x - 15; if ((CheckCollisionRecs(dingo[k], bamboo[i])) && dingoActive[k] && !isHitDingo[k]) dingo[k].x = bamboo[i].x - 15; if ((CheckCollisionRecs(owl[k], bamboo[i])) && owlActive[k] && !isHitOwl[k]) owl[k].x = bamboo[i].x - 22; if ((CheckCollisionRecs((Rectangle){branchPos[k].x, branchPos[k].y, gameplay_props_owl_branch.width, gameplay_props_owl_branch.height}, bamboo[i])) && branchActive[k]) branchPos[k].x = bamboo[i].x -24; } for (int j = 0; j < MAX_LEAVES; j++) { if ((CheckCollisionRecs(leaf[j], bamboo[i])) && leafActive[j]) { if (leafSide[j])leaf[j].x = bamboo[i].x + 18; else leaf[j].x = bamboo[i].x - 18; } //else leaf[j].x -= speed; } for (int z = 0; z < MAX_FIRE; z++) { if ((CheckCollisionRecs(fire[z], bamboo[i])) && fireActive[z]) fire[z].x = bamboo[i].x - 5; //else fire[z].x -= speed; } for (int n = 0; n < MAX_ICE; n++) { if ((CheckCollisionRecs(ice[n], bamboo[i])) && iceActive[n]) ice[n].x = bamboo[i].x; } for (int m = 0; m < MAX_RESIN; m++) { if ((CheckCollisionRecs(resin[m], bamboo[i])) && resinActive[m]) resin[m].x = bamboo[i].x; } if (bamboo[i].x <= -(bamboo[i].width + 30)) { bambooActive[i] = false; } } } // Enemy logic for (int k = 0; k < MAX_ENEMIES; k++) { //if (snakeActive[k] && !isHitSnake[k])snake[k].x -= speed; if (snake[k].x <= -snake[k].width) snakeActive[k] = false; if (dingo[k].x <= -dingo[k].width) dingoActive[k] = false; if (owl[k].x <= -owl[k].width) owlActive[k] = false; if (branchPos[k].x <= -owl[k].width) branchActive[k] = false; if (!snakeActive[k]) snake[k].x = -500; if (!dingoActive[k]) dingo[k].x = -500; if (!owlActive[k]) owl[k].x = -500; if (CheckCollisionRecs(player, snake[k]) && (state != KICK) && !isHitSnake[k]) { if (state != FINALFORM) { velocity = 8; jumpSpeed = 2; enemyVel[k] = 8; play = false; playerActive = false; killer = 1; } else if (state == FINALFORM) { isHitSnake[k] = true; enemyVel[k] = 8; killHistory[killCounter] = 1; killCounter++; snakeKillCounter++; globalKillCounter++; score += SNAKESCORE; PlaySound(fxDieSnake); enemyHit[k].position = (Vector2){ snake[k].x, snake[k].y }; enemyHit[k].speed = (Vector2){ 0, 0 }; enemyHit[k].size = (float)GetRandomValue(0, 10)/30; enemyHit[k].rotation = 0.0f; //enemyHit[i].color = (Color){ GetRandomValue(0, 255), GetRandomValue(0, 255), GetRandomValue(0, 255), 255 }; enemyHit[k].alpha = 1.0f; enemyHit[k].active = true; popupScore[k].position = (Vector2){ snake[k].x,snake[k].y }; popupScore[k].scale = 1.0f; popupScore[k].alpha = 1.0f; popupScore[k].score = SNAKESCORE; popupScore[k].active = true; } } if (CheckCollisionRecs(player, dingo[k]) && (state != KICK) && !isHitDingo[k]) { if (state != FINALFORM) { velocity = 8; jumpSpeed = 2; play = false; enemyVel[k] = 8; playerActive = false; killer = 2; } else if (state == FINALFORM) { isHitDingo[k] = true; enemyVel[k] = 8; killHistory[killCounter] = 2; killCounter++; score += DINGOSCORE; dingoKillCounter++; globalKillCounter++; enemyHit[k].position = (Vector2){ dingo[k].x,dingo[k].y }; enemyHit[k].speed = (Vector2){ 0, 0 }; enemyHit[k].size = (float)GetRandomValue(5, 10)/30; enemyHit[k].rotation = 0.0f; //enemyHit[i].color = (Color){ GetRandomValue(0, 255), GetRandomValue(0, 255), GetRandomValue(0, 255), 255 }; enemyHit[k].alpha = 1.0f; enemyHit[k].active = true; popupScore[k].position = (Vector2){ dingo[k].x,dingo[k].y }; popupScore[k].scale = 1.0f; popupScore[k].alpha = 1.0f; popupScore[k].score = DINGOSCORE; popupScore[k].active = true; } } if (CheckCollisionRecs(player, owl[k]) && (state != KICK) && !isHitOwl[k]) { if (state != FINALFORM) { velocity = 8; enemyVel[k] = 8; jumpSpeed = 2; play = false; playerActive = false; killer = 3; } else if (state == FINALFORM) { isHitOwl[k] = true; enemyVel[k] = 8; killHistory[killCounter] = 3; killCounter++; score += OWLSCORE; owlKillCounter++; globalKillCounter++; enemyHit[k].position = (Vector2){ owl[k].x, owl[k].y }; enemyHit[k].speed = (Vector2){ owl[k].x, owl[k].y }; enemyHit[k].size = (float)GetRandomValue(5, 10)/30; enemyHit[k].rotation = 0.0f; //enemyHit[i].color = (Color){ GetRandomValue(0, 255), GetRandomValue(0, 255), GetRandomValue(0, 255), 255 }; enemyHit[k].alpha = 1.0f; enemyHit[k].active = true; popupScore[k].position = (Vector2){ owl[k].x,owl[k].y }; popupScore[k].scale = 1.0f; popupScore[k].alpha = 1.0f; popupScore[k].score = OWLSCORE; popupScore[k].active = true; } } if (isHitSnake[k]) { if ((snake[k].y + snake[k].height) > GetScreenHeight()) { snakeActive[k] = false; isHitSnake[k] = false; } snake[k].x += 2*TIME_FACTOR; enemyVel[k] -= 1*TIME_FACTOR*TIME_FACTOR; snake[k].y -= enemyVel[k]*TIME_FACTOR; } if (isHitDingo[k]) { if ((dingo[k].y) > GetScreenHeight()) { dingoActive[k] = false; isHitDingo[k] = false; } dingo[k].x += 2*TIME_FACTOR; enemyVel[k] -= 1*TIME_FACTOR*TIME_FACTOR; dingo[k].y -= enemyVel[k]*TIME_FACTOR; } if (isHitOwl[k]) { if ((owl[k].y) > GetScreenHeight()) { owlActive[k] = false; isHitOwl[k] = false; } owl[k].x += 2*TIME_FACTOR; enemyVel[k] -= 1*TIME_FACTOR*TIME_FACTOR; owl[k].y -= enemyVel[k]; } } // Leaves logic for (int j = 0; j < MAX_LEAVES; j++) { //leaf[j].x -= speed; leafParticles[j].position = (Vector2){ leaf[j].x, leaf[j].y}; if (leaf[j].x <= -leaf[j].width) leafActive[j] = false; if (CheckCollisionRecs(player, leaf[j]) && leafActive[j]) { //power += 20; //printf("coin %c", coinType[j]); // DONE: Review popupLeaves[j].position = (Vector2){ leaf[j].x, leaf[j].y }; popupLeaves[j].scale = 1.0f; popupLeaves[j].alpha = 1.0f; popupLeaves[j].active = true; PlaySound(fxEatLeaves); if(leafType[j] == 0) { currentLeaves++; popupLeaves[j].score = 1; } else if(leafType[j] == 1) { currentLeaves += 2; popupLeaves[j].score = 2; } else if(leafType[j] == 2) { currentLeaves += 3; popupLeaves[j].score = 3; } else if(leafType[j] == 3) { currentLeaves += 4; popupLeaves[j].score = 4; } leafActive[j] = false; leafParticles[j].active = true; for (int h = 0; h < 32; h++) { leafParticles[j].particles[h].active = true; leafParticles[j].particles[h].position = (Vector2){ leafParticles[j].position.x, leafParticles[j].position.y}; leafParticles[j].particles[h].speed = (Vector2){ (float)GetRandomValue(-400, 400)/100, (float)GetRandomValue(-400, 400)/100 }; leafParticles[j].particles[h].size = (float)GetRandomValue(4, 8)/10; leafParticles[j].particles[h].rotation = GetRandomValue(-180, 180); //enemyHit[i].color = (Color){ GetRandomValue(0, 255), GetRandomValue(0, 255), GetRandomValue(0, 255), 255 }; leafParticles[j].particles[h].alpha = 1.0f; } } } //---------------------------------------------------------------------------------- // Particles Logic //---------------------------------------------------------------------------------- // Leaf particles logic for (int i = 0; i < MAX_LEAVES; i++) { if (leafParticles[i].active == true) { for (int j = 0; j < 32; j++) { //enemyHit[i].speed.y -= 1; leafParticles[i].particles[j].position.x += leafParticles[i].particles[j].speed.x*TIME_FACTOR; leafParticles[i].particles[j].position.y += leafParticles[i].particles[j].speed.y; //if (((enemyHitPosition.x + enemyHit[i].position.x + enemyHit[i].size) >= screenWidth) || ((enemyHitPosition.x + enemyHit[i].position.x - enemyHit[i].size) <= 0)) enemyHit[i].speed.x *= -1; //if (((enemyHitPosition.y + enemyHit[i].position.y + enemyHit[i].size) >= screenHeight) || ((enemyHitPosition.y + enemyHit[i].position.y - enemyHit[i].size) <= 0)) enemyHit[i].speed.y *= -1; leafParticles[i].particles[j].rotation += 6*TIME_FACTOR; leafParticles[i].particles[j].alpha -= 0.03f*TIME_FACTOR; leafParticles[i].particles[j].size -= 0.004*TIME_FACTOR; if (leafParticles[i].particles[j].size <= 0) leafParticles[i].particles[j].size = 0.0f; if (leafParticles[i].particles[j].alpha <= 0) { leafParticles[i].particles[j].alpha = 0.0f; leafParticles[i].particles[j].active = false; leafParticles[i].active = false; } } } if (popupLeaves[i].active) { //mouseTail[i].position.y += gravity; popupLeaves[i].alpha -= 0.02f; popupLeaves[i].scale += 0.1f; popupLeaves[i].position.y -= 3.0f; popupLeaves[i].position.x -= speed; if (popupLeaves[i].alpha <= 0.0f) popupLeaves[i].active = false; } } // Enemy Particles for (int i = 0; i < MAX_ENEMIES; i++) { if (enemyHit[i].active) { //mouseTail[i].position.y += gravity; enemyHit[i].alpha -= 0.1f*TIME_FACTOR; enemyHit[i].size += 0.1f*TIME_FACTOR; if (enemyHit[i].alpha <= 0.0f) enemyHit[i].active = false; } if (popupScore[i].active) { //mouseTail[i].position.y += gravity; popupScore[i].alpha -= 0.02f; popupScore[i].scale += 0.2f; popupScore[i].position.y -= 4.0f; popupScore[i].position.x -= speed; if (popupScore[i].alpha <= 0.0f) popupScore[i].active = false; } } if (popupBee.active) { //mouseTail[i].position.y += gravity; popupBee.alpha -= 0.02f; popupBee.scale += 0.2f; popupBee.position.y -= 4.0f; popupBee.position.x -= speed; if (popupBee.alpha <= 0.0f) popupBee.active = false; } if (popupEagle.active) { //mouseTail[i].position.y += gravity; popupEagle.alpha -= 0.02f; popupEagle.scale += 0.2f; popupEagle.position.y -= 4.0f; popupEagle.position.x -= speed; if (popupEagle.alpha <= 0.0f) popupEagle.active = false; } if (state != FINALFORM) { // Snow Particle if (snowParticle.active) { snowParticle.spawnTime += 1*TIME_FACTOR; for (int i = 0; i < MAX_PARTICLES; i++) { if (!snowParticle.particles[i].active && (snowParticle.spawnTime >= snowParticle.maxTime)) { snowParticle.particles[i].active = true; snowParticle.particles[i].position = (Vector2){ GetRandomValue(0, GetScreenWidth() + 200), -10 }; snowParticle.spawnTime = 0; snowParticle.maxTime = GetRandomValue(5, 20); } } } if (backSnowParticle.active) { snowParticle.spawnTime += 1*TIME_FACTOR; for (int i = 0; i < MAX_PARTICLES; i++) { if (!backSnowParticle.particles[i].active && (backSnowParticle.spawnTime >= backSnowParticle.maxTime)) { backSnowParticle.particles[i].active = true; backSnowParticle.particles[i].position = (Vector2){ GetRandomValue(0, GetScreenWidth() + 200), -10 }; backSnowParticle.spawnTime = 0; backSnowParticle.maxTime = GetRandomValue(3, 10); } } } // Autumn leaves particles if (planetreeParticle.active) { planetreeParticle.spawnTime += 1*TIME_FACTOR; backPlanetreeParticle.spawnTime += 1*TIME_FACTOR; for (int i = 0; i < MAX_PARTICLES; i++) { if (!planetreeParticle.particles[i].active && (planetreeParticle.spawnTime >= planetreeParticle.maxTime)) { planetreeParticle.particles[i].active = true; planetreeParticle.particles[i].position = (Vector2){ GetRandomValue(0, GetScreenWidth() + 200), -10 }; planetreeParticle.spawnTime = 0; planetreeParticle.maxTime = GetRandomValue(5, 20); } if (!backPlanetreeParticle.particles[i].active && (backPlanetreeParticle.spawnTime >= backPlanetreeParticle.maxTime)) { backPlanetreeParticle.particles[i].active = true; backPlanetreeParticle.particles[i].position = (Vector2){ GetRandomValue(0, GetScreenWidth() + 200), -10 }; backPlanetreeParticle.spawnTime = 0; backPlanetreeParticle.maxTime = GetRandomValue(3, 10); } } } // Dandelion particle if (dandelionParticle.active) { dandelionParticle.spawnTime += 1*TIME_FACTOR; dandelionBackParticle.spawnTime += 1*TIME_FACTOR; for (int i = 0; i < MAX_PARTICLES; i++) { if (!dandelionParticle.particles[i].active && (dandelionParticle.spawnTime >= dandelionParticle.maxTime)) { dandelionParticle.particles[i].active = true; dandelionParticle.particles[i].position = (Vector2){ GetRandomValue(0, GetScreenWidth() + 200), -10 }; dandelionParticle.spawnTime = 0; dandelionParticle.maxTime = GetRandomValue(5, 20); } if (!dandelionBackParticle.particles[i].active && (dandelionBackParticle.spawnTime >= dandelionBackParticle.maxTime)) { dandelionBackParticle.particles[i].active = true; dandelionBackParticle.particles[i].position = (Vector2){ GetRandomValue(0, GetScreenWidth() + 200), -10 }; dandelionBackParticle.spawnTime = 0; dandelionBackParticle.maxTime = GetRandomValue(3, 10); } } } // Flower Particle if (flowerParticle.active) { flowerParticle.spawnTime += 1*TIME_FACTOR; backFlowerParticle.spawnTime += 1*TIME_FACTOR; for (int i = 0; i < MAX_PARTICLES; i++) { if (!flowerParticle.particles[i].active && (flowerParticle.spawnTime >= flowerParticle.maxTime)) { flowerParticle.particles[i].active = true; flowerParticle.particles[i].position = (Vector2){ GetRandomValue(0, GetScreenWidth() + 200), -10 }; flowerParticle.spawnTime = 0; flowerParticle.maxTime = GetRandomValue(5, 20); } if (!backFlowerParticle.particles[i].active && (backFlowerParticle.spawnTime >= backFlowerParticle.maxTime)) { backFlowerParticle.particles[i].active = true; backFlowerParticle.particles[i].position = (Vector2){ GetRandomValue(0, GetScreenWidth() + 200), -10 }; backFlowerParticle.spawnTime = 0; backFlowerParticle.maxTime = GetRandomValue(3, 10); } } } // Rain Particle if (rainParticle.active) { rainParticle.spawnTime += 1*TIME_FACTOR; for (int i = 0; i < MAX_PARTICLES; i++) { if (!rainParticle.particles[i].active && (rainParticle.spawnTime >= rainParticle.maxTime)) { rainParticle.particles[i].active = true; rainParticle.particles[i].position = (Vector2){ GetRandomValue(0, GetScreenWidth() + 200), -10 }; rainParticle.spawnTime = 0; rainParticle.maxTime = GetRandomValue(1, 8); } } } // BackRain Particles if (backRainParticle.active) { backRainParticle.spawnTime += 1*TIME_FACTOR; for (int i = 0; i < MAX_PARTICLES; i++) { if (!backRainParticle.particles[i].active && (backRainParticle.spawnTime >= backRainParticle.maxTime)) { backRainParticle.particles[i].active = true; backRainParticle.particles[i].position = (Vector2){ GetRandomValue(0, GetScreenWidth() + 200), -10 }; backRainParticle.spawnTime = 0; backRainParticle.maxTime = GetRandomValue(1, 8); } } } // Storm Particles if (rainStormParticle.active) { rainStormParticle.spawnTime += 1*TIME_FACTOR; for (int i = 0; i < MAX_PARTICLES_STORM; i++) { if (!rainStormParticle.particles[i].active && (rainStormParticle.spawnTime >= rainStormParticle.maxTime)) { for (int j = 0; j < 16; j++) { rainStormParticle.particles[i+j].active = true; rainStormParticle.particles[i+j].position = (Vector2){ GetRandomValue(100, GetScreenWidth() + 1000), GetRandomValue(-10,-20) }; } rainStormParticle.spawnTime = 0; rainStormParticle.maxTime = 4; } } } // Snow Storm Particles if (snowStormParticle.active) { snowStormParticle.spawnTime += 1*TIME_FACTOR; for (int i = 0; i < MAX_PARTICLES_STORM; i++) { if (!snowStormParticle.particles[i].active && (snowStormParticle.spawnTime >= snowStormParticle.maxTime)) { snowStormParticle.particles[i].active = true; snowStormParticle.particles[i].position = (Vector2){ GetRandomValue(100, GetScreenWidth() + 800), -10 }; snowStormParticle.spawnTime = 0; snowStormParticle.maxTime = GetRandomValue(1, 2); } } } } // Speed Particles if (speedFX.active) { speedFX.spawnTime++; for (int i = 0; i < MAX_PARTICLES_SPEED; i++) { if (!speedFX.particle[i].active && (speedFX.spawnTime >= speedFX.maxTime)) { speedFX.particle[i].active = true; speedFX.particle[i].alpha = 0.7f; speedFX.particle[i].size = (Vector2){ GetScreenWidth(), GetRandomValue(5, 30) }; speedFX.particle[i].position = (Vector2){ GetScreenWidth(), GetRandomValue(0, GetScreenHeight() - 10) }; speedFX.spawnTime = 0; speedFX.maxTime = GetRandomValue(1, 10); //i = MAX_PARTICLES; } } } for (int i = 0; i < MAX_PARTICLES_SPEED; i++) { if (speedFX.particle[i].active) { speedFX.particle[i].position.x -= 40; speedFX.particle[i].alpha -= 0.015f; speedFX.particle[i].size.y -= 0.1f; if (speedFX.particle[i].size.y <= 0) speedFX.particle[i].active = false; } } // Ray Particles if (rayParticles.active) { rayParticles.spawnTime += 1*TIME_FACTOR; backRayParticles.spawnTime += 1*TIME_FACTOR; for (int i = 0; i < MAX_PARTICLES_RAY; i++) { if (!rayParticles.particles[i].active && (rayParticles.spawnTime >= rayParticles.maxTime)) { //printf("PARTICLEEES"); rayParticles.particles[i].active = true; rayParticles.particles[i].alpha = 0.0f; rayParticles.particles[i].size = (float)(GetRandomValue(10, 20)/10); rayParticles.particles[i].position = (Vector2){ GetRandomValue(300, GetScreenWidth() + 200), 0 }; rayParticles.particles[i].rotation = -35; rayParticles.spawnTime = 0; rayParticles.particles[i].delayCounter = 0; rayParticles.maxTime = GetRandomValue(20, 50); } if (!backRayParticles.particles[i].active && (backRayParticles.spawnTime >= backRayParticles.maxTime)) { backRayParticles.particles[i].active = true; backRayParticles.particles[i].alpha = 0.0f; backRayParticles.particles[i].size = (float)(GetRandomValue(5, 15)/10); backRayParticles.particles[i].position = (Vector2){ GetRandomValue(300, GetScreenWidth() + 200), 0 }; backRayParticles.particles[i].rotation = -35; backRayParticles.spawnTime = 0; backRayParticles.particles[i].delayCounter = 0; backRayParticles.maxTime = GetRandomValue(20, 50); } } } // Particles Logic for (int i = 0; i < MAX_PARTICLES; i++) { if (snowParticle.particles[i].active) { snowParticle.particles[i].position.y += 2*speedMod*TIME_FACTOR; snowParticle.particles[i].position.x -= 4*speedMod*TIME_FACTOR; snowParticle.particles[i].rotation += 0.5*TIME_FACTOR; if (snowParticle.particles[i].position.y >= GetScreenHeight()) snowParticle.particles[i].active = false; } if (backSnowParticle.particles[i].active) { backSnowParticle.particles[i].position.y += (int)1.5f*speedMod*TIME_FACTOR; backSnowParticle.particles[i].position.x -= 5*speedMod*TIME_FACTOR; backSnowParticle.particles[i].rotation += 0.5*TIME_FACTOR; if (backSnowParticle.particles[i].position.y >= GetScreenHeight()) backSnowParticle.particles[i].active = false; } if (planetreeParticle.particles[i].active) { planetreeParticle.particles[i].position.y += 4*speedMod*TIME_FACTOR; planetreeParticle.particles[i].position.x -= 5*speedMod*TIME_FACTOR; planetreeParticle.particles[i].rotation += 0.5*TIME_FACTOR; if (planetreeParticle.particles[i].position.y >= GetScreenHeight()) planetreeParticle.particles[i].active = false; } if (backPlanetreeParticle.particles[i].active) { backPlanetreeParticle.particles[i].position.y += 3*speedMod*TIME_FACTOR; backPlanetreeParticle.particles[i].position.x -= 5*speedMod*TIME_FACTOR; backPlanetreeParticle.particles[i].rotation += 0.5*TIME_FACTOR; if (backPlanetreeParticle.particles[i].position.y >= GetScreenHeight()) backPlanetreeParticle.particles[i].active = false; } if (dandelionParticle.particles[i].active) { dandelionParticle.particles[i].position.y += 3*speedMod*TIME_FACTOR; dandelionParticle.particles[i].position.x -= 5*speedMod*TIME_FACTOR; dandelionParticle.particles[i].rotation = -(30*sin(2*PI/120*globalFrameCounter + dandelionParticle.particles[i].rotPhy) + 30); if (dandelionParticle.particles[i].position.y >= GetScreenHeight()) dandelionParticle.particles[i].active = false; } if (dandelionBackParticle.particles[i].active) { dandelionBackParticle.particles[i].position.y += (int)1.5f*speedMod*TIME_FACTOR; dandelionBackParticle.particles[i].position.x -= 5*speedMod*TIME_FACTOR; dandelionBackParticle.particles[i].rotation = 30*sin(2*PI/120*globalFrameCounter + dandelionParticle.particles[i].rotPhy) + 30; if (dandelionBackParticle.particles[i].position.y >= GetScreenHeight()) dandelionBackParticle.particles[i].active = false; } if (flowerParticle.particles[i].active) { flowerParticle.particles[i].position.y += 2.5f*speedMod*TIME_FACTOR; flowerParticle.particles[i].position.x -= 4*speedMod*TIME_FACTOR; flowerParticle.particles[i].rotation += 0.5*TIME_FACTOR; if (flowerParticle.particles[i].position.y >= GetScreenHeight()) flowerParticle.particles[i].active = false; } if (backFlowerParticle.particles[i].active) { backFlowerParticle.particles[i].position.y += 2.5f*speedMod*TIME_FACTOR; backFlowerParticle.particles[i].position.x -= 5*speedMod*TIME_FACTOR; backFlowerParticle.particles[i].rotation += 0.5*TIME_FACTOR; if (backFlowerParticle.particles[i].position.y >= GetScreenHeight()) backFlowerParticle.particles[i].active = false; } if (rainParticle.particles[i].active) { rainParticle.particles[i].position.y += 8*speedMod*TIME_FACTOR; rainParticle.particles[i].position.x -= 10*speedMod*TIME_FACTOR; //rainParticle.particles[i].rotation += 0.5; if (rainParticle.particles[i].position.y >= GetScreenHeight()) rainParticle.particles[i].active = false; } if (backRainParticle.particles[i].active) { backRainParticle.particles[i].position.y += 6*speedMod*TIME_FACTOR; backRainParticle.particles[i].position.x -= 6*speedMod*TIME_FACTOR; //rainParticle.particles[i].rotation += 0.5; if (backRainParticle.particles[i].position.y >= GetScreenHeight()) backRainParticle.particles[i].active = false; } } for (int i = 0; i < MAX_PARTICLES_STORM; i++) { if (rainStormParticle.particles[i].active) { rainStormParticle.particles[i].position.y += 12*speedMod*TIME_FACTOR; rainStormParticle.particles[i].position.x -= 15*speedMod*TIME_FACTOR; //rainParticle.particles[i].rotation += 0.5; if (rainStormParticle.particles[i].position.y >= GetScreenHeight()) rainStormParticle.particles[i].active = false; if (rainStormParticle.active == false)rainStormParticle.particles[i].alpha -= 0.01; } } for (int i = 0; i < MAX_PARTICLES_STORM; i++) { if (snowStormParticle.particles[i].active) { snowStormParticle.particles[i].position.y += 12*speedMod*TIME_FACTOR; snowStormParticle.particles[i].position.x -= 15*speedMod*TIME_FACTOR; snowStormParticle.particles[i].rotation += 0.5*TIME_FACTOR; if (snowStormParticle.particles[i].position.y >= GetScreenHeight()) snowStormParticle.particles[i].active = false; } } for (int i = 0; i < MAX_PARTICLES_RAY; i++) { if (rayParticles.particles[i].active) { rayParticles.particles[i].position.x -= 0.5*speedMod*TIME_FACTOR; //printf("RAY X: %i", rayParticles.particles[i].position.x); if (rayParticles.particles[i].fading) { rayParticles.particles[i].alpha -= 0.01f; if (rayParticles.particles[i].alpha <= 0) { rayParticles.particles[i].alpha = 0; rayParticles.particles[i].delayCounter += 1; if (rayParticles.particles[i].delayCounter >= 30) { rayParticles.particles[i].active = false; rayParticles.particles[i].delayCounter = 0; rayParticles.particles[i].fading = false; } } } else { rayParticles.particles[i].alpha += 0.01f; if (rayParticles.particles[i].alpha >= 0.5f) { rayParticles.particles[i].alpha = 0.5f; rayParticles.particles[i].delayCounter += 1*TIME_FACTOR; if (rayParticles.particles[i].delayCounter >= 30) { rayParticles.particles[i].delayCounter = 0; rayParticles.particles[i].fading = true; } } } } if (backRayParticles.particles[i].active) { backRayParticles.particles[i].position.x -= 0.5*speedMod*TIME_FACTOR; if (backRayParticles.particles[i].fading) { backRayParticles.particles[i].alpha -= 0.01f; if (backRayParticles.particles[i].alpha <= 0) { backRayParticles.particles[i].alpha = 0; backRayParticles.particles[i].delayCounter += 1; if (backRayParticles.particles[i].delayCounter >= 30) { backRayParticles.particles[i].active = false; backRayParticles.particles[i].delayCounter = 0; backRayParticles.particles[i].fading = false; } } } else { backRayParticles.particles[i].alpha += 0.01f; if (backRayParticles.particles[i].alpha >= 0.5f) { backRayParticles.particles[i].alpha = 0.5f; backRayParticles.particles[i].delayCounter +=1; if (backRayParticles.particles[i].delayCounter >= 30) { backRayParticles.particles[i].delayCounter = 0; backRayParticles.particles[i].fading = true; } } } } } // Player States switch (state) { case GRABED: { onWind = false; windCounter += 1*TIME_FACTOR; resinCount += 1*TIME_FACTOR; //speedMod = 1; thisFrameKoala += 1*TIME_FACTOR; if (thisFrameKoala >= 24) { curFrameKoala += 1; thisFrameKoala = 0; } if (curFrameKoala > 2) curFrameKoala = 0; koalaAnimationIddle.x = gameplay_koala_idle.x + koalaAnimationIddle.width*curFrameKoala; if (!onResin) { #if (defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB)) if (((IsGestureDetected(GESTURE_TAP) || (GetGestureDetected() == GESTURE_DOUBLETAP)) && CheckCollisionPointRec(GetTouchPosition(0), rightButton))) { state = JUMPING; velocity = JUMP; grabCounter = 0; jumpSpeed = 6; rightAlpha = 1; onIce = false; onResin = false; thisFrameKoala = 0; PlaySound(fxJump); jumpCounter++; } if (((IsGestureDetected(GESTURE_TAP) || (GetGestureDetected() == GESTURE_DOUBLETAP)) && CheckCollisionPointRec(GetTouchPosition(0), leftButton))) { if(!onIce)gravity = KICKSPEED; else gravity = ICEGRAVITY; PlaySound(fxDash); state = KICK; grabCounter = 0; leftAlpha = 1; onResin = false; dashCounter++; //thisFrameKoala = 0; } else { if(!onIce)gravity = GRAVITY; else gravity = ICEGRAVITY; //thisFrameKoala = 0; } #elif (defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)) if (IsKeyPressed(KEY_SPACE) || (CheckCollisionPointRec(GetMousePosition(), rightButton) && IsMouseButtonPressed(0))) { state = JUMPING; velocity = JUMP; grabCounter = 0; jumpSpeed = 6; rightAlpha = 1; onIce = false; onResin = false; thisFrameKoala = 0; PlaySound(fxJump); jumpCounter++; } if (IsKeyPressed(KEY_DOWN) || (CheckCollisionPointRec(GetMousePosition(), leftButton) && IsMouseButtonPressed(0))) { if(!onIce)gravity = KICKSPEED; else gravity = ICEGRAVITY; PlaySound(fxDash); state = KICK; grabCounter = 0; leftAlpha = 1; onResin = false; dashCounter++; //thisFrameKoala = 0; } else { if(!onIce)gravity = GRAVITY; else gravity = ICEGRAVITY; //thisFrameKoala = 0; } #endif } else { #if (defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB)) if (((IsGestureDetected(GESTURE_TAP) || (GetGestureDetected() == GESTURE_DOUBLETAP)) && CheckCollisionPointRec(GetTouchPosition(0), rightButton))) { resinCountjump++; if (resinCountjump >= 2) { //thisFrameKoala = 0; state = JUMPING; velocity = JUMP; grabCounter = 0; jumpSpeed = 6; rightAlpha = 1; onIce = false; onResin = false; resinCountjump = 0; resinCountdrag = 0; resinCount = 0; jumpCounter++; } } if (((IsGestureDetected(GESTURE_TAP) || (GetGestureDetected() == GESTURE_DOUBLETAP)) && CheckCollisionPointRec(GetTouchPosition(0), leftButton))) { resinCountdrag ++; if (resinCountdrag >= 2) { //thisFrameKoala = 0; gravity = KICKSPEED; state = KICK; grabCounter = 0; leftAlpha = 1; onResin = false; resinCountjump = 0; resinCountdrag = 0; resinCount = 0; dashCounter++; } } else { gravity = 0; } #elif (defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)) if (IsKeyPressed(KEY_SPACE) || (CheckCollisionPointRec(GetMousePosition(), rightButton) && IsMouseButtonPressed(0))) { resinCountjump++; if (resinCountjump >= 2) { //thisFrameKoala = 0; state = JUMPING; velocity = JUMP; grabCounter = 0; jumpSpeed = 6; rightAlpha = 1; onIce = false; onResin = false; resinCountjump = 0; resinCountdrag = 0; resinCount = 0; jumpCounter++; } } if (IsKeyPressed(KEY_DOWN) || (CheckCollisionPointRec(GetMousePosition(), leftButton) && IsMouseButtonPressed(0))) { resinCountdrag ++; if (resinCountdrag >= 2) { //thisFrameKoala = 0; gravity = KICKSPEED; state = KICK; grabCounter = 0; leftAlpha = 1; onResin = false; resinCountjump = 0; resinCountdrag = 0; resinCount = 0; dashCounter++; } } else { gravity = 0; } #endif } } break; case JUMPING: { player.x += jumpSpeed*TIME_FACTOR; velocity -= 1*TIME_FACTOR*TIME_FACTOR; player.y -= velocity; framesCounter += 1*TIME_FACTOR; grabCounter+= 1*TIME_FACTOR; } break; case KICK: { gravity += 1*TIME_FACTOR*TIME_FACTOR; player.y += gravity; player.x -= speed; grabCounter += 1*TIME_FACTOR; // DONE: Review, before checking collision with ALL enemies, check if they are active! for (int i = 0; i < MAX_ENEMIES; i++) { if (CheckCollisionRecs(player, snake[i]) && !isHitSnake[i] && snakeActive[i]) { state = JUMPING; velocity = JUMP; enemyVel[i] = 8; grabCounter = 3; gravity = KICKSPEED; isHitSnake[i] = true; jumpSpeed = -3; score += SNAKESCORE; killHistory[killCounter] = 1; killCounter++; PlaySound(fxDieSnake); snakeKillCounter++; globalKillCounter++; enemyHit[i].position = (Vector2){ snake[i].x, snake[i].y }; enemyHit[i].speed = (Vector2){ snake[i].x, snake[i].y }; enemyHit[i].size = (float)GetRandomValue(5, 10)/30; enemyHit[i].rotation = 0.0f; //enemyHit[i].color = (Color){ GetRandomValue(0, 255), GetRandomValue(0, 255), GetRandomValue(0, 255), 255 }; enemyHit[i].alpha = 1.0f; enemyHit[i].active = true; popupScore[i].position = (Vector2){ snake[i].x,snake[i].y }; popupScore[i].scale = 1.0f; popupScore[i].alpha = 1.0f; popupScore[i].score = SNAKESCORE; popupScore[i].active = true; } if (CheckCollisionRecs(player, dingo[i]) && !isHitDingo[i] && dingoActive[i]) { state = JUMPING; velocity = JUMP; enemyVel[i] = 8*TIME_FACTOR; grabCounter = 3*TIME_FACTOR; gravity = KICKSPEED; isHitDingo[i] = true; jumpSpeed = -3; score += DINGOSCORE; killHistory[killCounter] = 2; killCounter++; PlaySound(fxDieDingo); dingoKillCounter++; globalKillCounter++; enemyHit[i].position = (Vector2){ dingo[i].x, dingo[i].y }; enemyHit[i].speed = (Vector2){ dingo[i].x, dingo[i].y }; enemyHit[i].size = (float)GetRandomValue(5, 10)/30; enemyHit[i].rotation = 0.0f; //enemyHit[i].color = (Color){ GetRandomValue(0, 255), GetRandomValue(0, 255), GetRandomValue(0, 255), 255 }; enemyHit[i].alpha = 1.0f; enemyHit[i].active = true; popupScore[i].position = (Vector2){ dingo[i].x,dingo[i].y }; popupScore[i].scale = 1.0f; popupScore[i].alpha = 1.0f; popupScore[i].score = DINGOSCORE; popupScore[i].active = true; } if (CheckCollisionRecs(player, owl[i]) && !isHitOwl[i] && owlActive[i]) { state = JUMPING; velocity = JUMP; enemyVel[i] = 8; grabCounter = 3; gravity = KICKSPEED; isHitOwl[i] = true; jumpSpeed = -3; score += OWLSCORE; killHistory[killCounter] = 3; killCounter++; PlaySound(fxDieOwl); owlKillCounter++; globalKillCounter++; enemyHit[i].position = (Vector2){ owl[i].x, owl[i].y }; enemyHit[i].speed = (Vector2){ owl[i].x, owl[i].y }; enemyHit[i].size = (float)GetRandomValue(5, 10)/30; enemyHit[i].rotation = 0.0f; //enemyHit[i].color = (Color){ GetRandomValue(0, 255), GetRandomValue(0, 255), GetRandomValue(0, 255), 255 }; enemyHit[i].alpha = 1.0f; enemyHit[i].active = true; popupScore[i].position = (Vector2){ owl[i].x,owl[i].y }; popupScore[i].scale = 1.0f; popupScore[i].alpha = 1.0f; popupScore[i].score = OWLSCORE; popupScore[i].active = true; } } if (CheckCollisionRecs(player, bee) && !isHitBee && beeActive) { state = JUMPING; velocity = JUMP; beeVelocity = 8; grabCounter = 3; gravity = KICKSPEED; isHitBee = true; jumpSpeed = -3; score += BEESCORE; killHistory[killCounter] = 4; killCounter++; beeKillCounter++; globalKillCounter++; popupBee.position = (Vector2){ bee.x, bee.y }; popupBee.scale = 1.0f; popupBee.alpha = 1.0f; popupBee.score = BEESCORE; popupBee.active = true; } if (CheckCollisionRecs(player, eagle) && !isHitEagle && eagleActive) { state = JUMPING; velocity = JUMP; beeVelocity = 8; grabCounter = 3; gravity = KICKSPEED; isHitEagle = true; jumpSpeed = -3; score += EAGLESCORE; killHistory[killCounter] = 5; killCounter++; eagleKillCounter++; globalKillCounter++; popupEagle.position = (Vector2){ eagle.x, eagle.y }; popupEagle.scale = 1.0f; popupEagle.alpha = 1.0f; popupEagle.score = EAGLESCORE; popupEagle.active = true; } } break; case FINALFORM: { if (transforming) { speedMod = 0; transCount += 1*TIME_FACTOR; transRotation += 1*TIME_FACTOR; transAniCounter += 1*TIME_FACTOR; thisFrameKoala += 1*TIME_FACTOR; currentLeaves = LinearEaseIn((float)transCount, (float)initLeaves, (float)-LEAVESTOTRANSFORM, 120.0f); if (thisFrameKoala >= 24) { curFrameKoala += 1; thisFrameKoala = 0; } //if (curFrameKoala > 1) curFrameKoala = ; if(curFrameKoala <= 1 )koalaAnimationTransform.x = gameplay_koala_transform.x + koalaAnimationTransform.width*curFrameKoala; if (transAniCounter >= 5) { transBackAnim = !transBackAnim; transAniCounter = 0; } if (transBackAnim) { finalColor = RED; finalColor2 = WHITE; } if (!transBackAnim) { finalColor = WHITE; finalColor2 = RED; } if (transCount >= 120) { transforming = false; thisFrameKoala = 0; curFrameKoala = 0; speedFX.active = true; //speedMod = 2; transCount = 0; //printf ("THIS ISN'T EVEN MY FINAL FORM"); bambooTimer += 15*TIME_FACTOR; } } else if (!transforming) { speedMod = 5; scrollSpeed = 3.2f*TIME_FACTOR; power -= 1*TIME_FACTOR; thisFrameKoala += 1*TIME_FACTOR; if (thisFrameKoala >= 12) { curFrameKoala ++; thisFrameKoala = 0; } if (curFrameKoala > 1) curFrameKoala = 0; if (curFrameKoala <= 1) koalaAnimationFly.x = gameplay_koala_fly.x + koalaAnimationFly.width*curFrameKoala; if (player.x > GetScreenWidth()/3) player.x -= 2; if (player.x < GetScreenWidth()/3) player.x++; if (power <= maxPower/5) { finalFormEnd += 1*TIME_FACTOR; if (finalFormEnd >= 5) { transBackAnim = !transBackAnim; finalFormEnd = 0; } if (transBackAnim) { finalColor = RED; } if (!transBackAnim) { finalColor = WHITE; } } else finalColor = WHITE; #if (defined(PLATFORM_ANDROID) || defined(PLATFORM_WEB)) if ((IsGestureDetected(GESTURE_HOLD) || (GetGestureDetected() == GESTURE_DRAG)) && CheckCollisionPointRec(GetTouchPosition(0), leftButton)) player.y += FLYINGMOV; if ((IsGestureDetected(GESTURE_HOLD) || (GetGestureDetected() == GESTURE_DRAG)) && CheckCollisionPointRec(GetTouchPosition(0), rightButton)) player.y -= FLYINGMOV; #elif (defined(PLATFORM_DESKTOP) || defined(PLATFORM_WEB)) if (IsKeyDown(KEY_DOWN) || (CheckCollisionPointRec(GetMousePosition(), leftButton) && IsMouseButtonDown(0))) player.y += FLYINGMOV; if (IsKeyDown(KEY_UP) || (CheckCollisionPointRec(GetMousePosition(), rightButton) && IsMouseButtonDown(0))) player.y -= FLYINGMOV; #endif } gravity = 0; grabCounter ++; } break; case ONWIND: { player.x -= jumpSpeed*TIME_FACTOR; velocity -= 2*TIME_FACTOR; player.y -= velocity; framesCounter += 1*TIME_FACTOR; grabCounter += 1*TIME_FACTOR; } break; default: break; } if (player.x <= (-player.width)) { play = false; playerActive = false; killer = 4; } if ((player.y + player.height) >= GetScreenHeight()) { if (state == FINALFORM) player.y = GetScreenHeight() - player.height; else { play = false; playerActive = false; killer = 4; } } if ((player.y) <= 0 && state == FINALFORM) player.y = 0; if (player.x >= (GetScreenWidth() - player.width)) player.x = (GetScreenWidth() - player.width); if (player.y <= -32) player.y = -32; if (bambooTimer > bambooSpawnTime) { if (!transforming) { BambooSpawn(); if (state != FINALFORM && eagleDelay >= EAGLE_TIME_DELAY)EagleSpawn(EAGLE_SPAWNCHANCE); switch (season) { case WINTER: IceSpawn(ICESPAWNCHANCE); OwlSpawn(OWLSPAWNCHANCE + (int)progresionSpawnChance); break; case SPRING: ResinSpawn(RESINSPAWNCHANCE); if (state != FINALFORM)BeeSpawn(BEE_SPAWNCHANCE); DingoSpawn(DINGOSPAWNCHANCE + (int)progresionSpawnChance); break; case SUMMER: FireSpawn(FIRESPAWNCHANCE); SnakeSpawn(SNAKESPAWNCHANCE + (int)progresionSpawnChance); break; case FALL: WindSpawn(WINDSPAWNCHANCE); SnakeSpawn(SNAKESPAWNCHANCE + (int)progresionSpawnChance); break; default: break; } LeafSpawn(); } bambooTimer = 0; bambooSpawnTime = GetRandomValue(MINTIMESPAWN, MAXTIMESPAWN); } } else if (!play && !playerActive) { if (score > hiscore) hiscore = score; player.x -= jumpSpeed; velocity -= 1*TIME_FACTOR; player.y -= velocity; if(player.y >= GetScreenHeight()) { deathsCounter++; finishScreen = 1; } } } // Gameplay Screen Draw logic void DrawGameplayScreen(void) { BeginShaderMode(colorBlend); DrawTexturePro(atlas02, gameplay_background, (Rectangle){0, 0, gameplay_background.width*2, gameplay_background.height*2}, (Vector2){0, 0}, 0, color02); // Draw parallax DrawParallaxBack(); DrawParallaxMiddle(); // Draw particles (only if active) for (int i = 0; i < MAX_PARTICLES; i++) { if (backSnowParticle.particles[i].active) DrawTexturePro(atlas02, particle_icecrystal_bw, (Rectangle){ backSnowParticle.particles[i].position.x, backSnowParticle.particles[i].position.y, particle_icecrystal_bw.width*backSnowParticle.particles[i].size, particle_icecrystal_bw.height*backSnowParticle.particles[i].size }, (Vector2){ particle_icecrystal_bw.width*backSnowParticle.particles[i].size/2, particle_icecrystal_bw.height*backSnowParticle.particles[i].size/2 }, backSnowParticle.particles[i].rotation, Fade((Color){144, 214, 255, 255}, backSnowParticle.particles[i].alpha)); if (backPlanetreeParticle.particles[i].active) DrawTexturePro(atlas02, particle_planetreeleaf_bw, (Rectangle){ backPlanetreeParticle.particles[i].position.x, backPlanetreeParticle.particles[i].position.y, particle_planetreeleaf_bw.width*backPlanetreeParticle.particles[i].size, particle_planetreeleaf_bw.height*backPlanetreeParticle.particles[i].size }, (Vector2){ particle_planetreeleaf_bw.width*backPlanetreeParticle.particles[i].size/2, particle_planetreeleaf_bw.height*backPlanetreeParticle.particles[i].size/2 }, backPlanetreeParticle.particles[i].rotation, Fade((Color){179, 86, 6, 255}, backPlanetreeParticle.particles[i].alpha)); if (dandelionBackParticle.particles[i].active) DrawTexturePro(atlas02, particle_dandelion_bw, (Rectangle){ dandelionBackParticle.particles[i].position.x, dandelionBackParticle.particles[i].position.y, particle_dandelion_bw.width*dandelionBackParticle.particles[i].size, particle_dandelion_bw.height*dandelionBackParticle.particles[i].size }, (Vector2){ particle_dandelion_bw.width*dandelionBackParticle.particles[i].size/2, particle_dandelion_bw.height*dandelionBackParticle.particles[i].size/2 }, dandelionBackParticle.particles[i].rotation, Fade((Color){202, 167, 126, 255}, dandelionBackParticle.particles[i].alpha)); if (backFlowerParticle.particles[i].active) DrawTexturePro(atlas02, particle_ecualyptusflower_bw, (Rectangle){ backFlowerParticle.particles[i].position.x, backFlowerParticle.particles[i].position.y, particle_ecualyptusflower_bw.width*backFlowerParticle.particles[i].size, particle_ecualyptusflower_bw.height*backFlowerParticle.particles[i].size }, (Vector2){ particle_ecualyptusflower_bw.width*backFlowerParticle.particles[i].size/2, particle_ecualyptusflower_bw.height*backFlowerParticle.particles[i].size/2 }, backFlowerParticle.particles[i].rotation, Fade((Color){218, 84, 108, 255}, backFlowerParticle.particles[i].alpha)); if (backRainParticle.particles[i].active) DrawTexturePro(atlas02, particle_waterdrop_bw, (Rectangle){ backRainParticle.particles[i].position.x, backRainParticle.particles[i].position.y, particle_waterdrop_bw.width*backRainParticle.particles[i].size, particle_waterdrop_bw.height*backRainParticle.particles[i].size }, (Vector2){ particle_waterdrop_bw.width*backRainParticle.particles[i].size/2, particle_waterdrop_bw.height*backRainParticle.particles[i].size/2 }, backRainParticle.particles[i].rotation, Fade((Color){144, 183, 187, 255}, backRainParticle.particles[i].alpha)); } for (int i = 0; i < MAX_PARTICLES_RAY; i++) { if (backRayParticles.particles[i].active) DrawTexturePro(atlas02, gameplay_back_fx_lightraymid, (Rectangle){ backRayParticles.particles[i].position.x, backRayParticles.particles[i].position.y, gameplay_back_fx_lightraymid.width*backRayParticles.particles[i].size, gameplay_back_fx_lightraymid.height*backRayParticles.particles[i].size }, (Vector2){ gameplay_back_fx_lightraymid.width*backRayParticles.particles[i].size/2, gameplay_back_fx_lightraymid.height*backRayParticles.particles[i].size/2 }, backRayParticles.particles[i].rotation, Fade(backRayParticles.particles[i].color, backRayParticles.particles[i].alpha)); } DrawParallaxFront(); for (int i = 0; i < MAX_BAMBOO; i++) { if (bambooActive[i]) { DrawTexturePro(atlas02, gameplay_props_tree, (Rectangle){bamboo[i].x, bamboo[i].y, 43, 720}, (Vector2){0, 0}, 0, color03); } } for (int i = 0; i < MAX_ENEMIES; i++) { if (branchActive[i]) { DrawTexturePro(atlas02, gameplay_props_owl_branch, (Rectangle){branchPos[i].x, branchPos[i].y, 36, 20}, (Vector2){0, 0}, 0, color03); } } EndShaderMode(); for (int i = 0; i < MAX_FIRE; i++) { DrawTexturePro(atlas01, (Rectangle){gameplay_props_burnttree.x, gameplay_props_burnttree.y + fire[i].y + gameplay_props_burnttree.height/14, gameplay_props_burnttree.width, gameplay_props_burnttree.height}, (Rectangle){fire[i].x + 5, fire[i].y + gameplay_props_burnttree.height/14, gameplay_props_burnttree.width, gameplay_props_burnttree.height}, (Vector2){0, 0}, 0, WHITE); DrawTextureRec(atlas01, fireAnimation, (Vector2){fire[i].x, GetScreenHeight() - gameplay_props_burnttree.height/7}, WHITE); for(int j = MAX_FIRE_FLAMES; j > -2; j--) { if ((fire[i].y - 25 <= (j*43)) && fireActive[i]) { if (j%2 > 0) { DrawTextureRec(atlas01, fireAnimation, (Vector2){fire[i].x + fireOffset - 10, 40*j}, WHITE); fireAnimation.x = gameplay_props_fire_spritesheet.x + fireAnimation.width*curFrame1; } else if (j%2 + 1 == 1) { DrawTextureRec(atlas01, fireAnimation, (Vector2){fire[i].x - fireOffset , 40*j}, WHITE); fireAnimation.x = gameplay_props_fire_spritesheet.x + fireAnimation.width*curFrame2; } else { DrawTextureRec(atlas01, fireAnimation, (Vector2){fire[i].x - fireOffset , 40*j}, WHITE); fireAnimation.x = gameplay_props_fire_spritesheet.x + fireAnimation.width*curFrame3; } } } } for (int i = 0; i < MAX_ICE; i++) { if (iceActive[i]) for (int k = 0; k < GetScreenHeight(); k += (GetScreenHeight()/6)) DrawTexturePro(atlas01, gameplay_props_ice_sprite, (Rectangle){ice[i].x - 5, ice[i].y+k, gameplay_props_ice_sprite.width, gameplay_props_ice_sprite.height}, (Vector2){0,0}, 0, WHITE); } BeginShaderMode(colorBlend); DrawTexturePro(atlas02, gameplay_back_ground00, (Rectangle){(int)groundPos + GetScreenWidth(), 637, gameplay_back_ground00.width*2, gameplay_back_ground00.height*2}, (Vector2){0,0}, 0, color00); DrawTexturePro(atlas02, gameplay_back_ground00, (Rectangle){(int)groundPos, 637, gameplay_back_ground00.width*2, gameplay_back_ground00.height*2}, (Vector2){0,0}, 0, color00); EndShaderMode(); for (int i = 0; i < MAX_RESIN; i++) { if (resinActive[i]) DrawTextureRec(atlas01, gameplay_props_resin_sprite,(Vector2){ resin[i].x - resin[i].width/3, resin[i].y - resin[i].height/5}, WHITE); } for (int i = 0; i < MAX_ENEMIES; i++) { if (snakeActive[i]) { if (!isHitSnake[i])DrawTextureRec(atlas01, snakeAnimation, (Vector2){snake[i].x - snake[i].width, snake[i].y - snake[i].height/2}, WHITE); else DrawTextureRec(atlas01, (Rectangle){gameplay_enemy_snake.x + snakeAnimation.width*2, gameplay_enemy_snake.y, snakeAnimation.width, snakeAnimation.height}, (Vector2){snake[i].x - snake[i].width/2, snake[i].y - snake[i].height/2}, WHITE); } if (dingoActive[i]) { if (!isHitDingo[i]) DrawTextureRec(atlas01, dingoAnimation, (Vector2){dingo[i].x - dingo[i].width/2, dingo[i].y - dingo[i].height/4}, WHITE); else DrawTextureRec(atlas01, (Rectangle){gameplay_enemy_dingo.x + dingoAnimation.width*2, gameplay_enemy_dingo.y, dingoAnimation.width, dingoAnimation.height}, (Vector2){dingo[i].x - dingo[i].width/2, dingo[i].y - dingo[i].height/4}, WHITE); } if (owlActive[i]) { if (!isHitOwl[i])DrawTextureRec(atlas01, owlAnimation, (Vector2){owl[i].x - owl[i].width*0.7, owl[i].y - owl[i].height*0.1}, WHITE); else DrawTextureRec(atlas01, (Rectangle){gameplay_enemy_owl.x + owlAnimation.width*2, gameplay_enemy_owl.y, owlAnimation.width, owlAnimation.height}, (Vector2){owl[i].x - owl[i].width/2, owl[i].y - owl[i].height/6}, WHITE); } if (enemyHit[i].active) { DrawTexturePro(atlas01, particle_hit, (Rectangle){ enemyHit[i].position.x, enemyHit[i].position.y, particle_hit.width*enemyHit[i].size, particle_hit.height*enemyHit[i].size }, (Vector2){ particle_hit.width*enemyHit[i].size/2, particle_hit.height*enemyHit[i].size/2 }, enemyHit[i].rotation, Fade(enemyHit[i].color, enemyHit[i].alpha)); } } // Only one bee / eagle / alert at the same time for (int i = 0; i < MAX_LEAVES; i++) { if (leafActive[i]) { if (leafSide[i]) { if (leafType[i] == 0) DrawTextureRec(atlas01, (Rectangle){ gameplay_props_leaf_lil.x, gameplay_props_leaf_lil.y, -gameplay_props_leaf_lil.width, gameplay_props_leaf_lil.height }, (Vector2){ leaf[i].x, leaf[i].y - 15 }, WHITE); else if (leafType[i] == 1) DrawTextureRec(atlas01, (Rectangle){ gameplay_props_leaf_lil.x, gameplay_props_leaf_lil.y, -gameplay_props_leaf_lil.width, gameplay_props_leaf_lil.height }, (Vector2){leaf[i].x, leaf[i].y + 10 }, WHITE); else if (leafType[i] == 2) DrawTextureRec(atlas01, (Rectangle){ gameplay_props_leaf_mid.x, gameplay_props_leaf_mid.y, -gameplay_props_leaf_mid.width, gameplay_props_leaf_mid.height }, (Vector2){leaf[i].x, leaf[i].y - 15 }, WHITE); else if (leafType[i] == 3) DrawTextureRec(atlas01, (Rectangle){ gameplay_props_leaf_big.x, gameplay_props_leaf_big.y, -gameplay_props_leaf_big.width, gameplay_props_leaf_big.height }, (Vector2){leaf[i].x, leaf[i].y - 15 }, WHITE); } else { if (leafType[i] == 0) DrawTextureRec(atlas01, gameplay_props_leaf_lil, (Vector2){ leaf[i].x - 25, leaf[i].y - 15 }, WHITE); else if (leafType[i] == 1) DrawTextureRec(atlas01, gameplay_props_leaf_lil, (Vector2){leaf[i].x - 25, leaf[i].y + 10 }, WHITE); else if (leafType[i] == 2) DrawTextureRec(atlas01, gameplay_props_leaf_mid, (Vector2){leaf[i].x - 25, leaf[i].y - 15 }, WHITE); else if (leafType[i] == 3) DrawTextureRec(atlas01, gameplay_props_leaf_big, (Vector2){leaf[i].x - 25, leaf[i].y - 15 }, WHITE); } #if defined(DEBUG) DrawRectangle(leaf[i].x, leaf[i].y, 64, 64, Fade(GREEN, 0.5f)); #endif } if (leafParticles[i].active) { for (int j = 0; j < 32; j++) { DrawTexturePro(atlas01, particle_ecualyptusleaf, (Rectangle){ leafParticles[i].particles[j].position.x, leafParticles[i].particles[j].position.y, particle_ecualyptusleaf.width*leafParticles[i].particles[j].size, particle_ecualyptusleaf.height*leafParticles[i].particles[j].size }, (Vector2){ particle_ecualyptusleaf.width/2*leafParticles[i].particles[j].size, particle_ecualyptusleaf.height/2*leafParticles[i].particles[j].size }, leafParticles[i].particles[j].rotation, Fade(WHITE,leafParticles[i].particles[j].alpha)); } } } if (beeActive && !isHitBee) DrawTextureRec(atlas01, beeAnimation, (Vector2){bee.x, bee.y - gameplay_enemy_bee.height/2}, WHITE); else if (beeActive && isHitBee) DrawTexturePro(atlas01, (Rectangle){gameplay_enemy_bee.x + beeAnimation.width*4, gameplay_enemy_bee.y, beeAnimation.width, gameplay_enemy_bee.height}, (Rectangle){bee.x, bee.y, beeAnimation.width, gameplay_enemy_bee.height}, (Vector2){0, 0}, 0, WHITE); if (eagleActive && !isHitEagle) DrawTextureRec(atlas01, eagleAnimation, (Vector2){eagle.x, eagle.y}, WHITE); else if (eagleActive && isHitEagle) DrawTextureRec(atlas01, gameplay_enemy_eagle_death, (Vector2){eagle.x, eagle.y}, WHITE); if (alertActive) DrawTexturePro(atlas01, gameplay_fx_eaglealert, alertRectangle, (Vector2){0, 0}, 0, Fade(RED, 0.7f)); if (alertBeeActive) DrawTexturePro(atlas01, gameplay_fx_eaglealert, beeAlertRectangle, (Vector2){0, 0}, 0, Fade(ORANGE, 0.7f)); if (transforming) { for (int i = 0; i < 8; i++) { DrawTexturePro(atlas02, background_transformation, (Rectangle){player.x + player.width/2 , player.y + player.height/2, background_transformation.width*4, background_transformation.height*4}, (Vector2){0, background_transformation.height*2}, 45*i, Fade(finalColor, 0.7f)); } for (int i = 0; i < 8; i++) { DrawTexturePro(atlas02, background_transformation, (Rectangle){player.x + player.width/2 , player.y + player.height/2, background_transformation.width*4, background_transformation.height}, (Vector2){0, background_transformation.height/2}, 22.5 + 45*i, Fade(finalColor2, 0.7f)); } } if (playerActive && play) { switch(state) { case GRABED: DrawTextureRec(atlas01, koalaAnimationIddle, (Vector2){player.x - player.width, player.y - gameplay_koala_idle.height/4}, WHITE); break; case JUMPING: DrawTexturePro(atlas01, gameplay_koala_jump, (Rectangle){player.x - player.width, player.y - gameplay_koala_jump.height/4, gameplay_koala_jump.width, gameplay_koala_jump.height}, (Vector2){0, 0}, 0, WHITE); break; case KICK:DrawTexturePro(atlas01, gameplay_koala_dash, (Rectangle){player.x - player.width, player.y - gameplay_koala_jump.height/4, gameplay_koala_dash.width, gameplay_koala_dash.height}, (Vector2){0, 0}, 0, WHITE); break; case FINALFORM: { if(transforming)DrawTexturePro(atlas01, koalaAnimationTransform, (Rectangle){player.x - player.width, player.y - gameplay_koala_transform.height/4, gameplay_koala_transform.width/2, gameplay_koala_transform.height}, (Vector2){0, 0}, 0, finalColor); else DrawTexturePro(atlas01, koalaAnimationFly, (Rectangle){player.x - gameplay_koala_fly.width/3, player.y - gameplay_koala_fly.height/4, gameplay_koala_fly.width/2, gameplay_koala_fly.height}, (Vector2){0, 0}, 0, finalColor);//DrawTextureRec((koalaFly), (Rectangle){0, 0, 128, 128}, (Vector2){player.x - 50, player.y - 40}, WHITE); } break; case ONWIND: DrawTexturePro(atlas01, gameplay_koala_jump, (Rectangle){player.x - player.width, player.y - gameplay_koala_jump.height/4, gameplay_koala_jump.width, gameplay_koala_jump.height}, (Vector2) { 0, 0}, 0, WHITE); break; default: break; } } else if (play == false && playerActive) DrawTextureRec(atlas01, (Rectangle){gameplay_koala_idle.x, gameplay_koala_idle.y, gameplay_koala_idle.width/3, gameplay_koala_idle.height}, (Vector2){player.x - player.width, player.y - gameplay_koala_idle.height/4}, WHITE); else DrawTexturePro(atlas01, gameplay_koala_die, (Rectangle){player.x - player.width, player.y - gameplay_koala_die.height/4, gameplay_koala_die.width, gameplay_koala_die.height}, (Vector2) { 0, 0}, 0, WHITE); for (int i = 0; i < MAX_WIND; i++) { if (windActive[i]) DrawTextureRec(atlas01, windAnimation, (Vector2){wind[i].x - 14, wind[i].y - 14}, WHITE); } if (playerActive && !play) { if (initSeason == 0) DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade((Color){216, 200, 39, 255}, 0.4)); else if (initSeason == 1) DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade((Color){155, 70, 22, 255}, 0.4)); else if (initSeason == 2) DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade((Color){17, 129, 162, 255}, 0.4)); else DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade((Color){82, 174, 7, 255}, 0.4)); } for (int i = 0; i < MAX_PARTICLES; i++) { if (snowParticle.particles[i].active) DrawTexturePro(atlas01, particle_icecrystal, (Rectangle){ snowParticle.particles[i].position.x, snowParticle.particles[i].position.y, particle_icecrystal.width*snowParticle.particles[i].size, particle_icecrystal.height*snowParticle.particles[i].size }, (Vector2){ particle_icecrystal.width*snowParticle.particles[i].size/2, particle_icecrystal.height*snowParticle.particles[i].size/2 }, snowParticle.particles[i].rotation, Fade(snowParticle.particles[i].color, snowParticle.particles[i].alpha)); if (planetreeParticle.particles[i].active) DrawTexturePro(atlas01, particle_planetreeleaf, (Rectangle){ planetreeParticle.particles[i].position.x, planetreeParticle.particles[i].position.y, particle_planetreeleaf.width*planetreeParticle.particles[i].size, particle_planetreeleaf.height*planetreeParticle.particles[i].size }, (Vector2){ particle_planetreeleaf.width*planetreeParticle.particles[i].size/2, particle_planetreeleaf.height*planetreeParticle.particles[i].size/2 }, planetreeParticle.particles[i].rotation, Fade(planetreeParticle.particles[i].color, planetreeParticle.particles[i].alpha)); if (dandelionParticle.particles[i].active) DrawTexturePro(atlas01, particle_dandelion, (Rectangle){ dandelionParticle.particles[i].position.x, dandelionParticle.particles[i].position.y, particle_dandelion.width*dandelionParticle.particles[i].size, particle_dandelion.height*dandelionParticle.particles[i].size }, (Vector2){ particle_dandelion.width*dandelionParticle.particles[i].size/2, particle_dandelion.height*dandelionParticle.particles[i].size/2 }, dandelionParticle.particles[i].rotation, Fade(dandelionParticle.particles[i].color, dandelionParticle.particles[i].alpha)); if (flowerParticle.particles[i].active) DrawTexturePro(atlas01, particle_ecualyptusflower, (Rectangle){ flowerParticle.particles[i].position.x, flowerParticle.particles[i].position.y, particle_ecualyptusflower.width*flowerParticle.particles[i].size, particle_ecualyptusflower.height*flowerParticle.particles[i].size }, (Vector2){ particle_ecualyptusflower.width*flowerParticle.particles[i].size/2, particle_ecualyptusflower.height*flowerParticle.particles[i].size/2 }, flowerParticle.particles[i].rotation, Fade(flowerParticle.particles[i].color, flowerParticle.particles[i].alpha)); if (rainParticle.particles[i].active) DrawTexturePro(atlas01, particle_waterdrop, (Rectangle){ rainParticle.particles[i].position.x, rainParticle.particles[i].position.y, particle_waterdrop.width*rainParticle.particles[i].size, particle_waterdrop.height*rainParticle.particles[i].size }, (Vector2){ particle_waterdrop.width*rainParticle.particles[i].size/2, particle_waterdrop.height*rainParticle.particles[i].size/2 }, rainParticle.particles[i].rotation, Fade(rainParticle.particles[i].color, rainParticle.particles[i].alpha)); } // Draw Speed Particles for (int i = 0; i < MAX_PARTICLES_SPEED; i++) { if (speedFX.particle[i].active) DrawRectangle(speedFX.particle[i].position.x, speedFX.particle[i].position.y, speedFX.particle[i].size.x, speedFX.particle[i].size.y , Fade(WHITE, speedFX.particle[i].alpha)); } for (int i = 0; i < MAX_PARTICLES_STORM; i++) { if (rainStormParticle.particles[i].active) DrawTexturePro(atlas01, particle_waterdrop, (Rectangle){ rainStormParticle.particles[i].position.x, rainStormParticle.particles[i].position.y, particle_waterdrop.width*rainStormParticle.particles[i].size, particle_waterdrop.height*rainStormParticle.particles[i].size }, (Vector2){ particle_waterdrop.width*rainStormParticle.particles[i].size/2, particle_waterdrop.height*rainStormParticle.particles[i].size/2 }, rainStormParticle.particles[i].rotation, Fade(rainStormParticle.particles[i].color, rainStormParticle.particles[i].alpha)); } for (int i = 0; i < MAX_PARTICLES_STORM; i++) { if (snowStormParticle.particles[i].active) DrawTexturePro(atlas01, particle_icecrystal, (Rectangle){ snowStormParticle.particles[i].position.x, snowStormParticle.particles[i].position.y, particle_icecrystal.width*snowStormParticle.particles[i].size, particle_icecrystal.height*snowStormParticle.particles[i].size }, (Vector2){ particle_icecrystal.width*snowStormParticle.particles[i].size/2, particle_icecrystal.height*snowStormParticle.particles[i].size/2 }, snowStormParticle.particles[i].rotation, Fade(snowStormParticle.particles[i].color, snowStormParticle.particles[i].alpha)); } for (int i = 0; i < MAX_PARTICLES_RAY; i++) { if (rayParticles.particles[i].active) DrawTexturePro(atlas01, gameplay_fx_lightraymid, (Rectangle){ rayParticles.particles[i].position.x, rayParticles.particles[i].position.y, gameplay_fx_lightraymid.width*rayParticles.particles[i].size, gameplay_fx_lightraymid.height*rayParticles.particles[i].size }, (Vector2){ gameplay_fx_lightraymid.width*rayParticles.particles[i].size/2, gameplay_fx_lightraymid.height*rayParticles.particles[i].size/2 }, rayParticles.particles[i].rotation, Fade(rayParticles.particles[i].color, rayParticles.particles[i].alpha)); } if (fogAlpha != 0) { DrawTexturePro(atlas02, background_fog02, (Rectangle){ fogPosition, GetScreenHeight()*0.6, GetScreenWidth(), background_fog02.height}, (Vector2){ 0 , 0 }, 0, Fade(WHITE, fogAlpha)); DrawTexturePro(atlas02, background_fog02, (Rectangle){ fogPosition+GetScreenWidth(), GetScreenHeight()*0.6, GetScreenWidth(), background_fog02.height}, (Vector2){ 0 , 0 }, 0, Fade(WHITE, fogAlpha)); } if (filterAlpha != 0 && state != FINALFORM) DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(SKYBLUE, filterAlpha)); DrawTexturePro(atlas01, gameplay_gui_leafcounter_base, (Rectangle){ 0, 0, gameplay_gui_leafcounter_base.width, gameplay_gui_leafcounter_base.height}, (Vector2){ 0 , 0 }, 0, WHITE); DrawTexturePro(atlas01, gameplay_gui_seasonsclock_disc, (Rectangle) {GetScreenWidth(), 0, gameplay_gui_seasonsclock_disc.width, gameplay_gui_seasonsclock_disc.height}, (Vector2) {gameplay_gui_seasonsclock_disc.width/2, gameplay_gui_seasonsclock_disc.height/2}, // Draw a part of a texture defined by a rectangle with 'pro' parameters clockRotation, Fade(WHITE, UIfade)); DrawTexturePro(atlas01, gameplay_gui_seasonsclock_base, (Rectangle){ (GetScreenWidth() - gameplay_gui_seasonsclock_base.width ), 0, gameplay_gui_seasonsclock_base.width, gameplay_gui_seasonsclock_base.height}, (Vector2){ 0 , 0 }, 0, Fade(WHITE, UIfade)); for (int i = 0; i < 20; i++) { if (((currentLeaves/5) > i) && (state != FINALFORM)) DrawTexturePro(atlas01, gameplay_gui_leafcounter_cell, (Rectangle) {87, 83, gameplay_gui_leafcounter_cell.width, gameplay_gui_leafcounter_cell.height}, (Vector2) {gameplay_gui_leafcounter_cell.width/4, 69}, i*(-18), WHITE); else if ((power/18 >= i) && (state == FINALFORM)) DrawTexturePro(atlas01, gameplay_gui_leafcounter_cell, (Rectangle) {87, 83, gameplay_gui_leafcounter_cell.width, gameplay_gui_leafcounter_cell.height}, (Vector2) {gameplay_gui_leafcounter_cell.width/4, 69}, i*(-18), WHITE); } if ((currentLeaves >= LEAVESTOTRANSFORM) && (state != FINALFORM)) { DrawTexturePro(atlas01, gameplay_gui_leafcounter_pulsel, (Rectangle){ 85, 84, gameplay_gui_leafcounter_pulsel.width*leafGUIpulseScale, gameplay_gui_leafcounter_pulsel.height*leafGUIpulseScale}, (Vector2){ gameplay_gui_leafcounter_pulsel.width*leafGUIpulseScale/2 , gameplay_gui_leafcounter_pulsel.height*leafGUIpulseScale/2 }, 0, Fade((Color){126, 248, 25, 255}, leafGUIpulseFade)); DrawTexturePro(atlas01, gameplay_gui_leafcounter_glow, (Rectangle){ 84, 83, gameplay_gui_leafcounter_glow.width, gameplay_gui_leafcounter_glow.height}, (Vector2){ gameplay_gui_leafcounter_glow.width/2 , gameplay_gui_leafcounter_glow.height/2 }, 0, Fade(WHITE, leafGUIglowFade)); } if ((play == false) && playerActive) { if (startNum == 3) DrawTexturePro(atlas01, gameplay_countdown_3, (Rectangle){ GetScreenWidth()/2, GetScreenHeight()/2, gameplay_countdown_3.width*numberScale, gameplay_countdown_3.height*numberScale}, (Vector2){ gameplay_countdown_3.width*numberScale/2 , gameplay_countdown_3.height*numberScale/2 }, 0, Fade(RED, numberAlpha)); else if (startNum == 2) DrawTexturePro(atlas01, gameplay_countdown_2, (Rectangle){ GetScreenWidth()/2, GetScreenHeight()/2, gameplay_countdown_2.width*numberScale, gameplay_countdown_2.height*numberScale}, (Vector2){ gameplay_countdown_2.width*numberScale/2 , gameplay_countdown_2.height*numberScale/2 }, 0, Fade(RED, leafGUIpulseFade)); else if (startNum == 1) DrawTexturePro(atlas01, gameplay_countdown_1, (Rectangle){ GetScreenWidth()/2, GetScreenHeight()/2, gameplay_countdown_1.width*numberScale, gameplay_countdown_1.height*numberScale}, (Vector2){ gameplay_countdown_1.width*numberScale/2 , gameplay_countdown_1.height*numberScale/2 }, 0, Fade(RED, leafGUIpulseFade)); } // Draw text elements //-------------------------- for (int i = 0; i < MAX_ENEMIES; i++) { if (popupScore[i].active) { DrawTextEx(font, FormatText("%i", popupScore[i].score), popupScore[i].position, font.baseSize/4*popupScore[i].scale, -5, Fade((Color){255, 73, 73, 255}, popupScore[i].alpha)); } } if (popupBee.active) DrawTextEx(font, FormatText("%i", popupBee.score), popupBee.position, font.baseSize/4*popupBee.scale, -5, Fade((Color){255, 73, 73, 255}, popupBee.alpha)); if (popupEagle.active) DrawTextEx(font, FormatText("%i", popupEagle.score), popupEagle.position, font.baseSize/4*popupEagle.scale, -5, Fade((Color){255, 73, 73, 255}, popupEagle.alpha)); for (int i = 0; i < MAX_LEAVES; i++) { if (popupLeaves[i].active) DrawTextEx(font, FormatText("+ %i", popupLeaves[i].score), popupLeaves[i].position, font.baseSize/4*popupLeaves[i].scale, -5, Fade((Color){139, 179, 0, 255}, popupLeaves[i].alpha)); } DrawTextEx(font, FormatText("%03i", currentLeaves), (Vector2){ 47, 50 }, font.baseSize, -8, counterColor); if (transforming) DrawTextEx(font, textFinalForm, (Vector2){ GetScreenWidth()/2 - MeasureText(textFinalForm, 40)/2, GetScreenHeight()/4}, font.baseSize, -5, (Color){246, 133, 133, 255}); if ((currentMonth == 7) && (transitionFramesCounter >= SEASONTRANSITION/2)) { if (randomMessage <= 4) DrawTextEx(font, textSpring1, (Vector2){GetScreenWidth()/2 - MeasureText(textSpring1, 40)/2, GetScreenHeight()/3}, font.baseSize, -5, (Color){185, 222, 105, 255}); else DrawTextEx(font, textSpring2, (Vector2){GetScreenWidth()/2 - MeasureText(textSpring2, 40)/2, GetScreenHeight()/3}, font.baseSize, -5, (Color){185, 222, 105, 255}); } else if ((currentMonth == 10) && (transitionFramesCounter >= SEASONTRANSITION/2)) { if (randomMessage <= 4) DrawTextEx(font, textSummer1, (Vector2){GetScreenWidth()/2 - MeasureText(textSummer1, 40)/2, GetScreenHeight()/3}, font.baseSize, -5, (Color){253, 200, 108, 255}); else DrawTextEx(font, textSummer2, (Vector2){GetScreenWidth()/2 - MeasureText(textSummer2, 40)/2, GetScreenHeight()/3}, font.baseSize, -5, (Color){253, 200, 108, 255}); } else if ((currentMonth == 1) && (transitionFramesCounter >= SEASONTRANSITION/2)) { if (randomMessage <= 4) DrawTextEx(font, textFall1, (Vector2){GetScreenWidth()/2 - MeasureText(textFall1, 40)/2, GetScreenHeight()/3}, font.baseSize, -5, (Color){255, 149, 107, 255}); else DrawTextEx(font, textFall2, (Vector2){GetScreenWidth()/2 - MeasureText(textFall2, 40)/2, GetScreenHeight()/3}, font.baseSize, -5, (Color){255, 149, 107, 255}); } else if (currentMonth == 4 && transitionFramesCounter >= SEASONTRANSITION/2) { if (randomMessage <= 4) DrawTextEx(font, textWinter1, (Vector2){GetScreenWidth()/2 - MeasureText(textWinter1, 40)/2, GetScreenHeight()/3}, font.baseSize, -5, (Color){133, 249, 253, 255}); else DrawTextEx(font, textWinter2, (Vector2){GetScreenWidth()/2 - MeasureText(textWinter2, 40)/2, GetScreenHeight()/3}, font.baseSize, -5, (Color){133, 249, 253, 255}); } #if defined(DEBUG) DrawRectangle(player.x, player.y, player.width, player.height, Fade(WHITE, 0.5)); for (int i = 0; i < MAX_WIND; i++) { if (windActive[i]) DrawRectangleRec(wind[i], Fade (GRAY, 0.4)); } for (int i = 0; i < MAX_ENEMIES; i++) { if (owlActive[i]) DrawRectangleRec(owl[i], Fade(BLACK, 0.5f)); if (dingoActive[i]) DrawRectangleRec(dingo[i], Fade(BLACK, 0.5f)); if (snakeActive[i]) DrawRectangleRec(snake[i], BLACK); } if (beeActive) DrawRectangleRec(bee, Fade(BLACK, 0.5f)); if (eagleActive) DrawRectangleRec(eagle, Fade(BLACK, 0.5f)); switch (season) { case WINTER: { if (currentMonth == 5) DrawText("June", GetScreenWidth() - 140, GetScreenHeight() - 20, 20, RED); if (currentMonth == 6) DrawText("July", GetScreenWidth() - 140, GetScreenHeight() - 20, 20, RED); } break; case SPRING: { if (currentMonth == 8) DrawText("September", GetScreenWidth() - 140, GetScreenHeight() - 20, 20, RED); if (currentMonth == 9) DrawText("October", GetScreenWidth() - 140, GetScreenHeight() - 20, 20, RED); } break; case SUMMER: { if (currentMonth == 11) DrawText("December", GetScreenWidth() - 140, GetScreenHeight() - 20, 20, RED); if (currentMonth == 0) DrawText("January", GetScreenWidth() - 140, GetScreenHeight() - 20, 20, RED); } break; case FALL: { if (currentMonth == 2) DrawText("March", GetScreenWidth() - 140, GetScreenHeight() - 20, 20, RED); if (currentMonth == 3) DrawText("April", GetScreenWidth() - 140, GetScreenHeight() - 20, 20, RED); } break; case TRANSITION: { if (currentMonth == 4) DrawText("May", GetScreenWidth() - 140, GetScreenHeight() - 20, 20, RED); } break; default: break; } DrawText(FormatText("Score: %02i", score), 140, GetScreenHeight() - 20, 20, RED); DrawText(FormatText("HighScore: %02i", hiscore), 600, GetScreenHeight() - 20, 20, RED); DrawText(FormatText("SeasonChange: %03i", seasonTimer), 300, GetScreenHeight() - 20, 20, RED); #endif } // Gameplay Screen Unload logic void UnloadGameplayScreen(void) { // ... } // Gameplay Screen should finish? int FinishGameplayScreen(void) { return finishScreen; } // Tree Spawn static void BambooSpawn(void) { int counter = 0; for (int k = 0; k < MAX_ENEMIES; k++) { if ((!bambooActive[k]) && (counter < 1)) { bamboo[k].y = 0; bamboo[k].x = GetScreenWidth(); bambooActive[k] = true; counter++; } } } //Snake Spawn static void SnakeSpawn(int chance) { int position; int counter = 0; for (int z = 0; z < 2; z++) posArray[z] = -1; if (GetRandomValue(0, 100) <= chance) { for (int k = 0; k < MAX_ENEMIES; k++) { if ((!snakeActive[k]) && (counter < 1)) { position = GetRandomValue(0, 4); if (counter == 0) posArray[counter] = position; snake[k].x = GetScreenWidth() - 15; snake[k].y = 25 + GetScreenHeight()/5*position; snakeActive[k] = true; isHitSnake[k] = false; counter++; } } } } // Dingo Spawn static void DingoSpawn(int chance) { int position; int counter = 0; for (int z = 0; z < 2; z++) posArrayDingo[z] = -1; if (GetRandomValue(0, 100) <= chance) { for(int k = 0; k < MAX_ENEMIES; k++) { if ((!dingoActive[k]) && (counter < 1)) { position = GetRandomValue(1, 3); if (counter == 0) posArray[counter] = position; dingo[k].x = GetScreenWidth() - 15; dingo[k].y = 25 + GetScreenHeight()/5*position; dingoActive[k] = true; isHitDingo[k] = false; counter++; } } } } // Owl Spawn static void OwlSpawn(int chance) { int position; int counter = 0; for (int z = 0; z < 2; z++) posArray[z] = -1; if (GetRandomValue(0, 100) <= chance) { for (int k = 0; k < MAX_ENEMIES; k++) { if ((!owlActive[k]) && (!branchActive[k]) && (counter < 1)) { position = GetRandomValue(1, 3); if (counter == 0) posArray[counter] = position; owl[k].x = GetScreenWidth() - 15; owl[k].y = 25 + GetScreenHeight()/5*position; owlActive[k] = true; branchPos[k].x = owl[k].x; branchPos[k].y = owl[k].y + 64; branchActive[k] = true; counter++; } } } } // Leaf spawn function static void LeafSpawn(void) { int counter = 0; int maxLeavesCounter = GetRandomValue(0, 2); for (int z = 0; z < 2; z++) posArrayLeaf[z] = -1; for (int k = 0; k < MAX_LEAVES; k++) { if ((!leafActive[k]) && (counter <= maxLeavesCounter)) { int leafPosition = GetRandomValue(0, 4); int leafTypeSelection = GetRandomValue(0,99); int leafSideSelection = GetRandomValue(0,1); leafSide[k] = leafSideSelection; if (counter == 0) { while (CheckArrayValue(posArray, 2, leafPosition)) leafPosition = GetRandomValue(0, 4); posArrayLeaf[counter] = leafPosition; } else if (counter == 1) { while(leafPosition == posArrayLeaf[counter - 1] || CheckArrayValue(posArray, 2, leafPosition)) leafPosition = GetRandomValue(0, 4); posArrayLeaf[counter] = leafPosition; } else if (counter == 2) { while((leafPosition == posArrayLeaf[counter - 1] || (leafPosition == posArrayLeaf[counter - 2])) || CheckArrayValue(posArray, 2, leafPosition)) leafPosition = GetRandomValue(0, 4); posArrayLeaf[counter] = leafPosition; } leaf[k].y = 30 + GetScreenHeight()/5*leafPosition; leaf[k].x = GetScreenWidth() - 18; leafActive[k] = true; if (leafTypeSelection <= 24) leafType[k] = 0; else if ((leafTypeSelection > 24) && leafTypeSelection <= 50) leafType[k] = 1; else if ((leafTypeSelection > 50) && leafTypeSelection <= 75) leafType[k] = 2; else leafType[k] = 3; counter++; } } } static void FireSpawn(int chance) { int counter = 0; if (GetRandomValue(0, 100) <= chance) { for (int k = 0; k < MAX_FIRE; k++) { if ((!fireActive[k]) && (counter < 1)) { fire[k].y = GetScreenHeight() - 30; fire[k].x = GetScreenWidth() - 5; //fire[k].height = 30; fireActive[k] = true; onFire[k] = false; counter++; } } } } static void IceSpawn(int chance) { int counter = 0; if (GetRandomValue(0, 100) <= chance) { for (int k = 0; k < MAX_ICE; k++) { if ((!iceActive[k]) && (counter < 1)) { ice[k].y = 0; ice[k].x = GetScreenWidth() + 5; iceActive[k] = true; counter++; } } } } static void ResinSpawn(int chance) { int counter = 0; if (GetRandomValue(0, 100) <= chance) { for (int k = 0; k < MAX_RESIN; k++) { if ((!resinActive[k]) && (counter < 1)) { int resPosition = GetRandomValue(0, 4); while (CheckArrayValue(posArray, 2, resPosition)) resPosition = GetRandomValue(0, 4); resin[k].y = 25 + GetScreenHeight()/5*resPosition; resin[k].x = GetScreenWidth() + 5; resinActive[k] = true; counter++; } } } } static void WindSpawn(int chance) { int counter = 0; if (GetRandomValue(0, 100) <= chance) { for (int k = 0; k < MAX_WIND ; k++) { if ((!windActive[k]) && (counter < 1)) { int resPosition = GetRandomValue(0, 4); while (CheckArrayValue(posArray, 2, resPosition)) resPosition = GetRandomValue(0, 4); wind[k].y = 25 + GetScreenHeight()/5*resPosition; wind[k].x = GetScreenWidth() + 5; windActive[k] = true; counter++; } } } } // Spawn bee enemy static void BeeSpawn(int chance) { if ((GetRandomValue(0, 100) <= chance) && !beeActive && !alertBeeActive) { bee.x = GetScreenWidth(); bee.y = GetRandomValue(40, GetScreenHeight() - bee.height - 40); beeAlertRectangle = (Rectangle){GetScreenWidth(), bee.y + gameplay_enemy_bee.height/2, 0, 0}; beeActive = false; alertBeeActive = true; } } // Spawn eagle enemy static void EagleSpawn(int chance) { if ((GetRandomValue(0, 100) <= chance) && !eagleActive && !alertActive) { eagleDelay = 0; eagle.x = GetScreenWidth(); eagle.y = player.y; alertRectangle = (Rectangle){GetScreenWidth(), eagle.y + gameplay_enemy_eagle.height/2, 0, 0}; eagleActive = false; eagleAlert = true; alertActive = true; } } // Check if the array contains a value static bool CheckArrayValue(int *array, int arrayLength, int value) { for (int n = 0; n < arrayLength; n++) { if (array[n] == value) return 1; } return 0; } // Scroll functions // Front parallax drawing static void DrawParallaxFront(void) { Rectangle ground01 = gameplay_back_ground01; DrawTexturePro(atlas02, gameplay_back_tree01_layer01, (Rectangle){(int)scrollFront + parallaxFrontOffset, 60, gameplay_back_tree01_layer01.width*2, gameplay_back_tree01_layer01.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree02_layer01, (Rectangle){(int)scrollFront + parallaxFrontOffset + 140, 60, gameplay_back_tree02_layer01.width*2, gameplay_back_tree02_layer01.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree03_layer01, (Rectangle){(int)scrollFront + parallaxFrontOffset + 140*2, 55, gameplay_back_tree02_layer01.width*2, gameplay_back_tree02_layer01.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree04_layer01, (Rectangle){(int)scrollFront + parallaxFrontOffset + 140*3, 60, gameplay_back_tree04_layer01.width*2, gameplay_back_tree04_layer01.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree05_layer01, (Rectangle){(int)scrollFront + parallaxFrontOffset + 140*4, 60, gameplay_back_tree05_layer01.width*2, gameplay_back_tree05_layer01.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree06_layer01, (Rectangle){(int)scrollFront + parallaxFrontOffset + 140*5, 55, gameplay_back_tree06_layer01.width*2, gameplay_back_tree06_layer01.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree07_layer01, (Rectangle){(int)scrollFront + parallaxFrontOffset + 140*6, 60, gameplay_back_tree07_layer01.width*2, gameplay_back_tree07_layer01.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree08_layer01, (Rectangle){(int)scrollFront + parallaxFrontOffset + 140*7, 60, gameplay_back_tree08_layer01.width*2, gameplay_back_tree08_layer01.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_ground01, (Rectangle){(int)scrollFront, 559, ground01.width*2, ground01.height*2}, (Vector2){0,0}, 0, color01); DrawTexturePro(atlas02, (Rectangle){ground01.x, ground01.y + ground01.height, ground01.width, -ground01.height}, (Rectangle){(int)scrollFront, -33, ground01.width*2, ground01.height*2}, (Vector2){0,0}, 0, color01); DrawTexturePro(atlas02, gameplay_back_tree01_layer01, (Rectangle){(int)scrollFront + parallaxFrontOffset + GetScreenWidth(), 60, gameplay_back_tree01_layer01.width*2, gameplay_back_tree01_layer01.height*2},(Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree02_layer01, (Rectangle){(int)scrollFront + parallaxFrontOffset + GetScreenWidth() + 140, 60, gameplay_back_tree02_layer01.width*2, gameplay_back_tree02_layer01.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree03_layer01, (Rectangle){(int)scrollFront + parallaxFrontOffset + GetScreenWidth() + 140*2, 55, gameplay_back_tree03_layer01.width*2, gameplay_back_tree03_layer01.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree04_layer01, (Rectangle){(int)scrollFront + parallaxFrontOffset + GetScreenWidth() + 140*3, 60, gameplay_back_tree04_layer01.width*2, gameplay_back_tree04_layer01.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree05_layer01, (Rectangle){(int)scrollFront + parallaxFrontOffset + GetScreenWidth() + 140*4, 60, gameplay_back_tree05_layer01.width*2, gameplay_back_tree05_layer01.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree06_layer01, (Rectangle){(int)scrollFront + parallaxFrontOffset + GetScreenWidth() + 140*5, 55, gameplay_back_tree06_layer01.width*2, gameplay_back_tree06_layer01.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree07_layer01, (Rectangle){(int)scrollFront + parallaxFrontOffset + GetScreenWidth() + 140*6, 60, gameplay_back_tree07_layer01.width*2, gameplay_back_tree07_layer01.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree08_layer01, (Rectangle){(int)scrollFront + parallaxFrontOffset+ GetScreenWidth() + 140*7, 60, gameplay_back_tree08_layer01.width*2, gameplay_back_tree08_layer01.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_ground01, (Rectangle){(int)scrollFront + GetScreenWidth(), 559, ground01.width*2, ground01.height*2}, (Vector2){0,0}, 0, color01); DrawTexturePro(atlas02, (Rectangle){ground01.x, ground01.y + ground01.height, ground01.width, -ground01.height}, (Rectangle){(int)scrollFront+ GetScreenWidth(), -33, ground01.width*2, ground01.height*2}, (Vector2){0,0}, 0, color01); } // Middle parallax drawing static void DrawParallaxMiddle(void) { Rectangle ground02 = gameplay_back_ground02; DrawTexturePro(atlas02, gameplay_back_tree01_layer02, (Rectangle){(int)scrollMiddle, 67, gameplay_back_tree01_layer02.width*2, gameplay_back_tree01_layer02.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree02_layer02, (Rectangle){(int)scrollMiddle + 140, 67, gameplay_back_tree02_layer02.width*2, gameplay_back_tree02_layer02.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree03_layer02, (Rectangle){(int)scrollMiddle + 140*2, 67, gameplay_back_tree03_layer02.width*2, gameplay_back_tree03_layer02.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree04_layer02, (Rectangle){(int)scrollMiddle + 140*3, 67, gameplay_back_tree04_layer02.width*2, gameplay_back_tree04_layer02.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree05_layer02, (Rectangle){(int)scrollMiddle + 140*4, 67, gameplay_back_tree05_layer02.width*2, gameplay_back_tree05_layer02.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree06_layer02, (Rectangle){(int)scrollMiddle + 140*5, 67, gameplay_back_tree06_layer02.width*2, gameplay_back_tree06_layer02.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree07_layer02, (Rectangle){(int)scrollMiddle + 140*6, 67, gameplay_back_tree07_layer02.width*2, gameplay_back_tree07_layer02.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree08_layer02, (Rectangle){(int)scrollMiddle + 140*7, 67, gameplay_back_tree08_layer02.width*2, gameplay_back_tree08_layer02.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_ground02, (Rectangle){(int)scrollMiddle, 509, ground02.width*2, ground02.height*2}, (Vector2){0,0}, 0, color01); DrawTexturePro(atlas02, (Rectangle){ground02.x, ground02.y + ground02.height, ground02.width, -ground02.height}, (Rectangle){(int)scrollMiddle, 19, ground02.width*2, ground02.height*2}, (Vector2){0,0}, 0, color01); DrawTexturePro(atlas02, gameplay_back_tree02_layer02, (Rectangle){(int)scrollMiddle + GetScreenWidth() + 140, 67, gameplay_back_tree02_layer02.width*2, gameplay_back_tree02_layer02.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree03_layer02, (Rectangle){(int)scrollMiddle + GetScreenWidth() + 140*2, 67, gameplay_back_tree03_layer02.width*2, gameplay_back_tree03_layer02.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree04_layer02, (Rectangle){(int)scrollMiddle + GetScreenWidth() + 140*3, 67, gameplay_back_tree04_layer02.width*2, gameplay_back_tree04_layer02.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree05_layer02, (Rectangle){(int)scrollMiddle + GetScreenWidth() + 140*4, 67, gameplay_back_tree05_layer02.width*2, gameplay_back_tree05_layer02.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree06_layer02, (Rectangle){(int)scrollMiddle + GetScreenWidth() + 140*5, 67, gameplay_back_tree06_layer02.width*2, gameplay_back_tree06_layer02.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree07_layer02, (Rectangle){(int)scrollMiddle + GetScreenWidth() + 140*6, 67, gameplay_back_tree07_layer02.width*2, gameplay_back_tree07_layer02.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree08_layer02, (Rectangle){(int)scrollMiddle + GetScreenWidth() + 140*7, 67, gameplay_back_tree08_layer02.width*2, gameplay_back_tree08_layer02.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree01_layer02, (Rectangle){(int)scrollMiddle+ GetScreenWidth(), 67, gameplay_back_tree01_layer02.width*2, gameplay_back_tree01_layer02.height*2},(Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_ground02, (Rectangle){(int)scrollMiddle + GetScreenWidth(), 509, ground02.width*2, ground02.height*2},(Vector2){0,0}, 0, color01); DrawTexturePro(atlas02, (Rectangle){ground02.x, ground02.y + ground02.height, ground02.width, -ground02.height}, (Rectangle){(int)scrollMiddle+ GetScreenWidth(), 19, ground02.width*2, ground02.height*2}, (Vector2){0,0}, 0, color01); } // Back parallax drawing static void DrawParallaxBack(void) { Rectangle ground03 = gameplay_back_ground03; DrawTexturePro(atlas02, gameplay_back_tree01_layer03, (Rectangle){(int)scrollBack + parallaxBackOffset, 67, gameplay_back_tree01_layer03.width*2, gameplay_back_tree01_layer03.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree02_layer03, (Rectangle){(int)scrollBack + parallaxBackOffset + 140, 67, gameplay_back_tree02_layer03.width*2, gameplay_back_tree02_layer03.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree03_layer03, (Rectangle){(int)scrollBack + parallaxBackOffset + 140*2, 67, gameplay_back_tree03_layer03.width*2, gameplay_back_tree03_layer03.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree04_layer03, (Rectangle){(int)scrollBack + parallaxBackOffset + 140*3, 67, gameplay_back_tree04_layer03.width*2, gameplay_back_tree04_layer03.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree05_layer03, (Rectangle){(int)scrollBack + parallaxBackOffset + 140*4, 67, gameplay_back_tree05_layer03.width*2, gameplay_back_tree05_layer03.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree06_layer03, (Rectangle){(int)scrollBack + parallaxBackOffset + 140*5, 67, gameplay_back_tree06_layer03.width*2, gameplay_back_tree06_layer03.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree07_layer03, (Rectangle){(int)scrollBack + parallaxBackOffset + 140*6, 67, gameplay_back_tree07_layer03.width*2, gameplay_back_tree07_layer03.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree08_layer03, (Rectangle){(int)scrollBack + parallaxBackOffset + 140*7, 67, gameplay_back_tree08_layer03.width*2, gameplay_back_tree08_layer03.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_ground03, (Rectangle){(int)scrollBack, 469, ground03.width*2, ground03.height*2}, (Vector2){0,0}, 0, color01); DrawTexturePro(atlas02, (Rectangle){ground03.x, ground03.y + ground03.height, ground03.width, -ground03.height}, (Rectangle){(int)scrollBack, 67, ground03.width*2, ground03.height*2}, (Vector2){0,0}, 0, color01); DrawTexturePro(atlas02, gameplay_back_tree01_layer03, (Rectangle){(int)scrollBack + parallaxBackOffset+ GetScreenWidth(), 67, gameplay_back_tree01_layer03.width*2, gameplay_back_tree01_layer03.height*2},(Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree02_layer03, (Rectangle){(int)scrollBack + parallaxBackOffset + GetScreenWidth() + 140, 67, gameplay_back_tree02_layer03.width*2, gameplay_back_tree02_layer03.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree03_layer03, (Rectangle){(int)scrollBack + parallaxBackOffset + GetScreenWidth() + 140*2, 67, gameplay_back_tree03_layer03.width*2, gameplay_back_tree03_layer03.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree04_layer03, (Rectangle){(int)scrollBack + parallaxBackOffset + GetScreenWidth() + 140*3, 67, gameplay_back_tree04_layer03.width*2, gameplay_back_tree04_layer03.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree05_layer03, (Rectangle){(int)scrollBack + parallaxBackOffset + GetScreenWidth() + 140*4, 67, gameplay_back_tree05_layer03.width*2, gameplay_back_tree05_layer03.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree06_layer03, (Rectangle){(int)scrollBack + parallaxBackOffset + GetScreenWidth() + 140*5, 67, gameplay_back_tree06_layer03.width*2, gameplay_back_tree06_layer03.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree07_layer03, (Rectangle){(int)scrollBack + parallaxBackOffset + GetScreenWidth() + 140*6, 67, gameplay_back_tree07_layer03.width*2, gameplay_back_tree07_layer03.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_tree08_layer03, (Rectangle){(int)scrollBack + parallaxBackOffset + GetScreenWidth() + 140*7, 67, gameplay_back_tree08_layer03.width*2, gameplay_back_tree08_layer03.height*2}, (Vector2){0,0}, 0, color02); DrawTexturePro(atlas02, gameplay_back_ground03, (Rectangle){(int)scrollBack + GetScreenWidth(), 469, ground03.width*2, ground03.height*2}, (Vector2){0,0}, 0, color01); DrawTexturePro(atlas02, (Rectangle){ground03.x, ground03.y + ground03.height, ground03.width, -ground03.height}, (Rectangle){(int)scrollBack+ GetScreenWidth(), 67, ground03.width*2, ground03.height*2}, (Vector2){0,0}, 0, color01); } // Linear easing animation static float LinearEaseIn(float t, float b, float c, float d) { return c*t/d + b; } // Transition from one color to another static Color ColorTransition(Color initialColor, Color finalColor, int framesCounter) { Color currentColor; currentColor.r = (unsigned char)LinearEaseIn((float)framesCounter, (float)initialColor.r, (float)(finalColor.r - initialColor.r), (float)(SEASONTRANSITION)); currentColor.g = (unsigned char)LinearEaseIn((float)framesCounter, (float)initialColor.g, (float)(finalColor.g - initialColor.g), (float)(SEASONTRANSITION)); currentColor.b = (unsigned char)LinearEaseIn((float)framesCounter, (float)initialColor.b, (float)(finalColor.b - initialColor.b), (float)(SEASONTRANSITION)); currentColor.a = 255; return currentColor; } static void Reset(void) { framesCounter = 0; finishScreen = 0; grabCounter = 10; bambooTimer = 0; bambooSpawnTime = 0; gravity = 5; speed = 3; score = 0; hiscore = 0; power = 360; resinCount = 0; rightAlpha = 0.5; leftAlpha = 0.5; speedMod = 1.2f; transCount = 0; windCounter = 0; maxPower = 360; playerActive = true; scrollFront = 0; scrollMiddle = 0; scrollBack = 0; scrollSpeed = 1.6f*TIME_FACTOR; groundPos = 0; resinCountjump = 0; resinCountdrag = 0; colorTimer = 0; play = false; onIce = false; onResin = false; jumpSpeed = 6; transforming = false; eagleAlert = false; alertActive = false; fireSpeed = 4; seasonTimer = 0; seasonChange = SEASONCHANGE; monthChange = seasonChange/3; glowing = true; currentFrame = 0; curFrame = 0; curFrame1 = 1; curFrame2 = 2; curFrame3 = 3; curFrameBee = 0; fireOffset = 20; beeMov = 0; killCounter = 0; currentLeaves = 0; clockRotation = 0; flyColor = GRAY; globalFrameCounter = 0; startCounter = 0; numberAlpha = 1; numberScale = 2.5f; startNum = 3; animCounter = 0; finalFormEnd = 0; randomMessage = 0; years = 0; UIfade = 1; fogAlpha = 0; seasons = 0; fog = false; clockSpeedRotation = 0; eagleDelay = 0; parallaxBackOffset = GetRandomValue (10, 100); parallaxFrontOffset = GetRandomValue (100, 200); progresionDelay = 0; progresionFramesCounter = 0; speedProgresion = 0; jumpCounter = 0; resinCounter = 0; tornadoCounter = 0; dashCounter = 0; superKoalaCounter = 0; fogSpeed = 2; leafGUIglow = true; leafGUIglowFade = 0; leafGUIpulseFade = 1; leafGUIpulseScale = 1; //initMonth = ptm->tm_mon; initYears = 1900 + ptm->tm_year; //initMonth = STARTINGMONTH; if (initSeason == 0) { initMonth = 11; clockRotation = 225; clockInitRotation = 225; clockFinalRotation = clockInitRotation + 90; color00 = (Color){129, 172, 86, 255}; // Summer Color color01 = (Color){145, 165, 125, 255}; color02 = (Color){161, 130, 73, 255}; color03 = (Color){198, 103, 51, 255}; } else if (initSeason == 1) { initMonth = 2; clockRotation = 315; clockInitRotation = 315; clockFinalRotation = clockInitRotation + 90; color00 = (Color){242, 113, 62, 255}; // Fall Color color01 = (Color){190, 135, 114, 255}; color02 = (Color){144, 130, 101, 255}; color03 = (Color){214, 133, 58, 255}; } else if (initSeason == 2) { initMonth = 5; clockRotation = 45; clockInitRotation = 45; clockFinalRotation = clockInitRotation + 90; color00 = (Color){130, 130, 181, 255}; // Winter Color color01 = (Color){145, 145, 166, 255}; color02 = (Color){104, 142, 144, 255}; color03 = (Color){57, 140, 173, 255}; } else if (initSeason == 3) { initMonth = 8; clockRotation = 135; clockInitRotation = 135; clockFinalRotation = clockInitRotation + 90; color00 = (Color){196, 176, 49, 255}; // Spring Color color01 = (Color){178, 163, 67, 255}; color02 = (Color){133, 143, 90, 255}; color03 = (Color){133, 156, 42, 255}; } currentMonth = initMonth; leftButton.x = 0; leftButton.y = 200; leftButton.width = GetScreenWidth()/2; leftButton.height = GetScreenHeight(); rightButton.x = GetScreenWidth()/2; rightButton.y = 200; rightButton.width = GetScreenWidth()/2; rightButton.height = GetScreenHeight(); powerButton.x = 0; powerButton.y = 0; powerButton.width = GetScreenWidth()/2; powerButton.height = 200; finalColor.r = GetRandomValue(0, 255); finalColor.g = GetRandomValue(0, 255); finalColor.b = GetRandomValue(0, 255); finalColor.a = 255; backBar.x = 20; backBar.y = 22; backBar.width = maxPower + 4; backBar.height = 24; powerBar.x = 22; powerBar.y = 23; powerBar.width = power; powerBar.height = 22; fireAnimation.x = gameplay_props_fire_spritesheet.x; fireAnimation.y = gameplay_props_fire_spritesheet.y; fireAnimation.width = gameplay_props_fire_spritesheet.width/4; fireAnimation.height = gameplay_props_fire_spritesheet.height; windAnimation.x = gameplay_props_whirlwind_spritesheet.x; windAnimation.y = gameplay_props_whirlwind_spritesheet.y; windAnimation.width = gameplay_props_whirlwind_spritesheet.width/4; windAnimation.height = gameplay_props_whirlwind_spritesheet.height; beeAnimation.x = gameplay_enemy_bee.x; beeAnimation.y = gameplay_enemy_bee.y; beeAnimation.width = gameplay_enemy_bee.width/5; beeAnimation.height = gameplay_enemy_bee.height; eagleAnimation.x = gameplay_enemy_eagle.x; eagleAnimation.y = gameplay_enemy_eagle.y; eagleAnimation.width = gameplay_enemy_eagle.width/2; eagleAnimation.height = gameplay_enemy_eagle.height; snakeAnimation.x = gameplay_enemy_snake.x; snakeAnimation.y = gameplay_enemy_snake.y; snakeAnimation.width = gameplay_enemy_snake.width/3; snakeAnimation.height = gameplay_enemy_snake.height; dingoAnimation.x = gameplay_enemy_dingo.x; dingoAnimation.y = gameplay_enemy_dingo.y; dingoAnimation.width = gameplay_enemy_dingo.width/3; dingoAnimation.height = gameplay_enemy_dingo.height; owlAnimation.x = gameplay_enemy_owl.x; owlAnimation.y = gameplay_enemy_owl.y; owlAnimation.width = gameplay_enemy_owl.width/3; owlAnimation.height = gameplay_enemy_owl.height; koalaAnimationIddle = gameplay_koala_idle; koalaAnimationIddle.width = gameplay_koala_idle.width/3; koalaAnimationJump = gameplay_koala_jump; koalaAnimationFly = gameplay_koala_fly; koalaAnimationFly.width = gameplay_koala_fly.width/2; koalaAnimationTransform = gameplay_koala_transform; koalaAnimationTransform.width = gameplay_koala_transform.width/2; snowParticle.position = (Vector2){ 0, 0 }; snowParticle.active = false; snowStormParticle.position = (Vector2){ 0, 0 }; snowStormParticle.active = false; backSnowParticle.position = (Vector2){ 0, 0 }; backSnowParticle.active = false; planetreeParticle.position = (Vector2){ 0, 0 }; planetreeParticle.active = false; backPlanetreeParticle.position = (Vector2){ 0, 0 }; backPlanetreeParticle.active = false; dandelionParticle.active = false; dandelionBackParticle.position = (Vector2){ 0, 0}; flowerParticle.position = (Vector2){ 0, 0 }; flowerParticle.active = false; backFlowerParticle.position = (Vector2){ 0, 0 }; backFlowerParticle.active = false; rainParticle.position = (Vector2){ 0, 0 }; rainParticle.active = false; rainStormParticle.position = (Vector2){ 0, 0 }; rainStormParticle.active = false; backRainParticle.position = (Vector2){ 0, 0 }; backRainParticle.active = false; rayParticles.position = (Vector2){ 0, 0 }; rayParticles.active = false; backRayParticles.position = (Vector2){ 0, 0 }; backRayParticles.active = false; speedFX.active = false; clockPosition = (Vector2){GetScreenWidth(), 0}; for (int j = 0; j < MAX_PARTICLES; j++) { snowParticle.particles[j].active = false; snowParticle.particles[j].position = (Vector2){ 0, 0 }; snowParticle.particles[j].size = (float)GetRandomValue(3, 9)/10; snowParticle.particles[j].rotation = GetRandomValue(0, 360); snowParticle.particles[j].color = WHITE; snowParticle.particles[j].alpha = 1.0f; backSnowParticle.particles[j].active = false; backSnowParticle.particles[j].position = (Vector2){ 0, 0 }; backSnowParticle.particles[j].size = (float)GetRandomValue(2, 8)/10; backSnowParticle.particles[j].rotation = GetRandomValue(0, 360); backSnowParticle.particles[j].color = WHITE; backSnowParticle.particles[j].alpha = 0.7f; planetreeParticle.particles[j].active = false; planetreeParticle.particles[j].position = (Vector2){ 0, 0 }; planetreeParticle.particles[j].size = (float)GetRandomValue(3, 9)/10; planetreeParticle.particles[j].rotation = GetRandomValue(0, 360); planetreeParticle.particles[j].color = WHITE; planetreeParticle.particles[j].alpha = 1.0f; backPlanetreeParticle.particles[j].active = false; backPlanetreeParticle.particles[j].position = (Vector2){ 0, 0 }; backPlanetreeParticle.particles[j].size = (float)GetRandomValue(2, 8)/10; backPlanetreeParticle.particles[j].rotation = GetRandomValue(0, 360); backPlanetreeParticle.particles[j].color = WHITE; backPlanetreeParticle.particles[j].alpha = 0.7f; dandelionParticle.particles[j].active = false; dandelionParticle.particles[j].position = (Vector2){ 0, 0 }; dandelionParticle.particles[j].size = (float)GetRandomValue(3, 9)/10; dandelionParticle.particles[j].rotation = 0; dandelionParticle.particles[j].color = WHITE; dandelionParticle.particles[j].alpha = 1; dandelionParticle.particles[j].rotPhy = GetRandomValue(0 , 180); dandelionBackParticle.particles[j].active = false; dandelionBackParticle.particles[j].position = (Vector2){ 0, 0 }; dandelionBackParticle.particles[j].size = (float)GetRandomValue(2, 8)/10; dandelionBackParticle.particles[j].rotation = 0; dandelionBackParticle.particles[j].color = WHITE; dandelionBackParticle.particles[j].alpha = 0.7f; dandelionBackParticle.particles[j].rotPhy = GetRandomValue(0 , 180); flowerParticle.particles[j].active = false; flowerParticle.particles[j].position = (Vector2){ 0, 0 }; flowerParticle.particles[j].size = (float)GetRandomValue(3, 9)/10; flowerParticle.particles[j].rotation = GetRandomValue(0, 360); flowerParticle.particles[j].color = WHITE; flowerParticle.particles[j].alpha = 1.0f; backFlowerParticle.particles[j].active = false; backFlowerParticle.particles[j].position = (Vector2){ 0, 0 }; backFlowerParticle.particles[j].size = (float)GetRandomValue(2, 8)/10; backFlowerParticle.particles[j].rotation = GetRandomValue(0, 360); backFlowerParticle.particles[j].color = WHITE; backFlowerParticle.particles[j].alpha = 0.7f; rainParticle.particles[j].active = false; rainParticle.particles[j].position = (Vector2){ 0, 0 }; rainParticle.particles[j].size = (float)GetRandomValue(3, 9)/10; rainParticle.particles[j].rotation = -20; rainParticle.particles[j].color = WHITE; rainParticle.particles[j].alpha = 1.0f; backRainParticle.particles[j].active = false; backRainParticle.particles[j].position = (Vector2){ 0, 0 }; backRainParticle.particles[j].size = (float)GetRandomValue(2, 8)/10; backRainParticle.particles[j].rotation = -20; backRainParticle.particles[j].color = WHITE; backRainParticle.particles[j].alpha = 0.7f; } for (int j = 0; j < MAX_PARTICLES_SPEED; j++) { speedFX.particle[j].position = (Vector2){ 0, 0 }; speedFX.particle[j].color = WHITE; speedFX.particle[j].alpha = 1.0f; speedFX.particle[j].size = (Vector2){GetScreenWidth(), GetRandomValue(10, 50)/10}; speedFX.particle[j].rotation = 0.0f; speedFX.particle[j].active = false; } for (int j = 0; j < MAX_PARTICLES_STORM; j++) { rainStormParticle.particles[j].active = false; rainStormParticle.particles[j].position = (Vector2){ 0, 0 }; rainStormParticle.particles[j].size = (float)GetRandomValue(3, 9)/10; rainStormParticle.particles[j].rotation = -40; rainStormParticle.particles[j].color = WHITE; rainStormParticle.particles[j].alpha = 1.0f; } for (int j = 0; j < MAX_PARTICLES_STORM; j++) { snowStormParticle.particles[j].active = false; snowStormParticle.particles[j].position = (Vector2){ 0, 0 }; snowStormParticle.particles[j].size = (float)GetRandomValue(2, 8)/10; snowStormParticle.particles[j].rotation = 40; snowStormParticle.particles[j].color = WHITE; snowStormParticle.particles[j].alpha = 1.0f; } for (int i = 0; i < MAX_PARTICLES_RAY; i++) { rayParticles.particles[i].position = (Vector2){ 0, 0 }; rayParticles.particles[i].color.r = 255; rayParticles.particles[i].color.g = 255; rayParticles.particles[i].color.b = 182; rayParticles.particles[i].color.a = 255; rayParticles.particles[i].alpha = 0.0f; rayParticles.particles[i].size = (float)(GetRandomValue(30, 70)/10); rayParticles.particles[i].rotation = 0.0f; rayParticles.particles[i].active = false; rayParticles.particles[i].fading = false; rayParticles.particles[i].delayCounter = 0; backRayParticles.particles[i].position = (Vector2){ 0, 0 }; backRayParticles.particles[i].color.r = 255; backRayParticles.particles[i].color.g = 255; backRayParticles.particles[i].color.b = 182; backRayParticles.particles[i].color.a = 255; backRayParticles.particles[i].alpha = 0.0f; backRayParticles.particles[i].size = (float)(GetRandomValue(10, 20)/10); backRayParticles.particles[i].rotation = 0.0f; backRayParticles.particles[i].active = false; backRayParticles.particles[i].fading = false; backRayParticles.particles[i].delayCounter = 0; } for (int i = 0; i < MAX_KILLS; i++) killHistory[i] = 0; for (int i = 0; i < MAX_BAMBOO; i++) { bamboo[i].x = 150 + 200*i; bamboo[i].y = 0; bamboo[i].width = 50; bamboo[i].height = GetScreenHeight(); if(i > 5) bambooActive[i] = false; else bambooActive[i] = true; } for (int i = 0; i < MAX_FIRE; i++) { fire[i].x = -200; fire[i].y = GetScreenHeight() - 30; fire[i].width = 30; fire[i].height = 720; fireActive[i] = false; onFire[i] = false; fireCounter[i] = 0; } for (int i = 0; i < MAX_ICE; i++) { ice[i].x = -100; ice[i].y = 0; ice[i].width = 10; ice[i].height = GetScreenHeight(); iceActive[i] = false; } for (int i = 0; i < MAX_RESIN; i++) { resin[i].x = -100; resin[i].y = 0; resin[i].width = 32; resin[i].height = 50; resinActive[i] = false; } for (int i = 0; i < MAX_WIND; i++) { wind[i].x = -100; wind[i].y = 0; wind[i].width = 70; wind[i].height = 100; windActive[i] = false; } for (int i = 0; i < MAX_ENEMIES; i++) { snake[i].x = 0; snake[i].y = 0; snake[i].width = 50; snake[i].height = 60; snakeActive[i] = false; isHitSnake[i] = false; dingo[i].x = -100; dingo[i].y = 0; dingo[i].width = 64; dingo[i].height = 90; dingoActive[i] = false; isHitDingo[i] = false; owl[i].x = -100; owl[i].y = 0; owl[i].width = 40; owl[i].height = 60; owlActive[i] = false; branchActive[i] = false; isHitOwl[i] = false; branchPos[i].x = owl[i].x; branchPos[i].y = owl[i].y; enemyHit[i].position = (Vector2){ GetRandomValue(-20, 20), GetRandomValue(-20, 20) }; enemyHit[i].speed = (Vector2){ (float)GetRandomValue(-500, 500)/100, (float)GetRandomValue(-500, 500)/100 }; enemyHit[i].size = (float)GetRandomValue(1, 45)/30; enemyHit[i].rotation = GetRandomValue(0, 360); enemyHit[i].color = RED; enemyHit[i].alpha = 1.0f; enemyHit[i].active = false; popupScore[i].position = (Vector2){ GetRandomValue(-20, 20), GetRandomValue(-20, 20) }; popupScore[i].scale = (float)GetRandomValue(1, 45)/30; popupScore[i].alpha = 1.0f; popupScore[i].active = false; } for (int i = 0; i < MAX_LEAVES; i++) { leaf[i].x = 0; leaf[i].y = 0; leaf[i].width = 30; leaf[i].height = 30; leafActive[i] = false; leafType[i] = -1; leafParticles[i].position = (Vector2){ 0, 0 }; leafParticles[i].active = false; popupLeaves[i].position = (Vector2){ GetRandomValue(-20, 20), GetRandomValue(-20, 20) }; popupLeaves[i].scale = (float)GetRandomValue(1, 45)/30; popupLeaves[i].alpha = 1.0f; popupLeaves[i].score = 0; popupLeaves[i].active = false; for (int j = 0; j < 32; j++) { leafParticles[i].particles[j].active = false; leafParticles[i].particles[j].position = (Vector2){ GetRandomValue(-20, 20), GetRandomValue(-20, 20) }; leafParticles[i].particles[j].speed = (Vector2){ (float)GetRandomValue(-500, 500)/100, (float)GetRandomValue(-500, 500)/100 }; leafParticles[i].particles[j].size = (float)GetRandomValue(3, 10)/5; leafParticles[i].particles[j].rotation = GetRandomValue(0, 360); leafParticles[i].particles[j].color = WHITE; leafParticles[i].particles[j].alpha = 1.0f; } } player.x = GetScreenWidth()*0.26f; player.y = 100; player.width = 35; player.height = 60; bee.x = -200; bee.y = 0; bee.width = 50; bee.height = 32; beeActive = false; popupBee.position = (Vector2){ GetRandomValue(-20, 20), GetRandomValue(-20, 20) }; popupBee.scale = (float)GetRandomValue(1, 45)/30; popupBee.alpha = 1.0f; popupBee.active = false; eagle.x = -128; eagle.y = 0; eagle.width = 200; eagle.height = 80; eagleActive = false; popupEagle.position = (Vector2){ GetRandomValue(-20, 20), GetRandomValue(-20, 20) }; popupEagle.scale = (float)GetRandomValue(1, 45)/30; popupEagle.alpha = 1.0f; popupEagle.active = false; counterColor.r = 255; counterColor.g = 224; counterColor.b = 185; counterColor.a = 255; zero.x = 0; zero.y = 0; firePos.x = -200; firePos.y = 0; textSize = MeasureTextEx(font, "3", font.baseSize*5, 2); }