diff --git a/SeasonsOfLoneliness.cpp b/SeasonsOfLoneliness.cpp index a2867cf..8c26c8a 100644 --- a/SeasonsOfLoneliness.cpp +++ b/SeasonsOfLoneliness.cpp @@ -153,7 +153,8 @@ namespace reasoncode{ enum Code{ SEED_GROWTH, TREE_BURN, - DROUGHT + DROUGHT, + PETRIFIED }; } @@ -339,6 +340,9 @@ class WEATHER_POWER{ bool appliesSlow=false; //If true, will apply slow to enemies hit. bool appliesSpeed=false; //If true, will apply speed on use. bool appliesHide=false; //If true, will apply hiding on use. + bool appliesPetrification=false; //Applies three turns of petrification on use. + float pctDmg=0; // + bool dealsPctDmg=false; //If set to true, uses pctDmg and deals a % health value instead. WEATHER_POWER(std::string name,std::string desc,Animation*icon,Animation*effect,int dmg,int dmgRoll,int range,Pixel bgcol,Pixel textcol,int effectTime,ParticleEffect*parteff) { this->description=desc; this->name=name; @@ -546,6 +550,9 @@ public: ParticleEffect*HIDE_EFF = new ParticleEffect({0,0},{64,64},{0,0},{64,64},{32,32},{32,32},{-1,-1},{1,1},Pixel(0, 0, 0,25),Pixel(0, 0, 0,75),5,Pixel(166, 51, 28,0)); ParticleEffect*HYPERZAP_EFF = new ParticleEffect({0,0},{64,64},{0,0},{64,64},{1,1},{6,6},{0,-2},{0,-10},Pixel(232, 2, 230,130),Pixel(250, 81, 247,210),30,Pixel(70, 158, 62,0)); ParticleEffect*POLLINATION_EFF = new ParticleEffect({0,0},{WIDTH,HEIGHT},{0,0},{WIDTH,HEIGHT},{4,4},{12,12},{-20,-6},{0,-20},Pixel(130, 245, 2,130),Pixel(250, 246, 2,210),50,Pixel(199, 199, 52,64)); + ParticleEffect*GLARE_EFF = new ParticleEffect({0,0},{WIDTH,HEIGHT},{0,0},{WIDTH,HEIGHT},{4,4},{12,12},{-20,-6},{0,-20},Pixel(130, 245, 2,130),Pixel(250, 246, 2,210),0,Pixel(255, 255, 255,64)); + ParticleEffect*PETRIFY_EFF = new ParticleEffect({0,0},{64,64},{0,0},{64,64},{2,2},{4,4},{-1,-3},{1,-8},Pixel(166, 147, 143,200),Pixel(199, 194, 193,210),30,Pixel(199, 199, 52,0)); + ParticleEffect*MEGA_FANG_EFF = new ParticleEffect({0,0},{64,64},{0,0},{64,64},{1,1},{3,3},{-5,-5},{5,5},Pixel(255,255,255,200),Pixel(255,255,255,210),40,Pixel(70, 158, 62,0)); WEATHER_POWER*HAILSTORM = new WEATHER_POWER("Hailstorm","Causes a flurry of hard cold rocks to be unleashed in target area. 60+1d30",POWER_HAILSTORM_ANIMATION,POWER_HAILSTORM_ANIMATION,60,30,160,Pixel(72, 160, 212,255),Pixel(93, 161, 163,255),120,HAILSTORM_EFF); WEATHER_POWER*HURRICANE = new WEATHER_POWER("Hurricane","Causes heavy winds, scattering seeds, heavy rain. 20+1d10",POWER_HURRICANE_ANIMATION,POWER_HURRICANE_ANIMATION,20,10,200,Pixel(99, 148, 132,255),Pixel(121, 132, 140,255),120,HURRICANE_EFF); WEATHER_POWER*METEOR_RAIN = new WEATHER_POWER("Meteor Rain","Causes fiery space rocks to fall on target area. 50+1d50",POWER_METEOR_SHOWER_ANIMATION,POWER_METEOR_SHOWER_ANIMATION,50,50,96,Pixel(96, 86, 153,255),Pixel(170, 103, 201,255),120,METEOR_STORM_EFF); @@ -574,6 +581,9 @@ public: WEATHER_POWER*HIDE = new WEATHER_POWER("Hide","",POWER_SOLARFLARE_ANIMATION,POWER_SOLARFLARE_ANIMATION,175,40,32,Pixel(176, 53, 37,255),Pixel(217, 98, 0,255),120,HIDE_EFF); WEATHER_POWER*HYPERZAP = new WEATHER_POWER("Hyper Zap","",POWER_SOLARFLARE_ANIMATION,POWER_SOLARFLARE_ANIMATION,175,40,32,Pixel(176, 53, 37,255),Pixel(217, 98, 0,255),120,HYPERZAP_EFF); WEATHER_POWER*POLLINATION = new WEATHER_POWER("Pollination","",POWER_SOLARFLARE_ANIMATION,POWER_SOLARFLARE_ANIMATION,-110,10,255,Pixel(176, 53, 37,255),Pixel(217, 98, 0,255),120,POLLINATION_EFF); + WEATHER_POWER*GLARE = new WEATHER_POWER("Glare","",POWER_SOLARFLARE_ANIMATION,POWER_SOLARFLARE_ANIMATION,-110,10,255,Pixel(176, 53, 37,255),Pixel(217, 98, 0,255),120,GLARE_EFF); + WEATHER_POWER*PETRIFY = new WEATHER_POWER("Petrify","",POWER_SOLARFLARE_ANIMATION,POWER_SOLARFLARE_ANIMATION,-110,10,255,Pixel(176, 53, 37,255),Pixel(217, 98, 0,255),120,PETRIFY_EFF); + WEATHER_POWER*MEGA_FANG = new WEATHER_POWER("Mega Fang","",POWER_SOLARFLARE_ANIMATION,POWER_SOLARFLARE_ANIMATION,-110,10,255,Pixel(176, 53, 37,255),Pixel(217, 98, 0,255),120,MEGAFANG_EFF); bool IN_BATTLE_ENCOUNTER = false; int BATTLE_ENTRY_TIMER = 0; @@ -642,7 +652,8 @@ public: *LATER_THAT_NIGHT_DECAL,*SLEEP_DECAL,*SEED_DECAL,*TREE_DECAL,*X_X_UNCHARGED_DECAL, *SANDWORM_DECAL,*SNAKE_DECAL,*MOTH_DECAL,*FLASH_FLOOD_DECAL,*SUNNY_DAY_DECAL,*FIRESTORM_DECAL,*SOLARFLARE_DECAL, *HP_REGEN_DECAL,*SLOWED_DECAL, *SPEED_DECAL,*HIDDEN_DECAL,*BOOK_DECAL,*BOOK2_DECAL, - *LAUNCHPAD_CLOSED_DECAL,*LAUNCHPAD_HALF1_DECAL,*LAUNCHPAD_HALF2_DECAL,*LAUNCHPAD_DECAL,*Y_Y_DECAL; + *LAUNCHPAD_CLOSED_DECAL,*LAUNCHPAD_HALF1_DECAL,*LAUNCHPAD_HALF2_DECAL,*LAUNCHPAD_DECAL,*Y_Y_DECAL, + *PETRIFY_DECAL; std::map BASE_OBJECTS; std::vector ENCOUNTERS; Encounter ENCOUNTER_SPIDEY_1; @@ -658,6 +669,7 @@ public: std::vectorMOVESET_X_X; std::vectorMOVESET_XMINION; std::vectorMOVESET_MEGAMOTH; + std::vectorMOVESET_SIDEWINDER; std::vectorSEEDS; std::vectorTREES; bool SOUND_IS_MUTED=false; @@ -668,6 +680,7 @@ public: vf2d BATTLE_PLAYER_COORDS; PlayerState*PREV_PLAYERSTATE=new PlayerState(); int WALK_STEPS=0; + int PETRIFY_TURNS=0; Map*CURRENT_MAP=MAP_1; @@ -968,6 +981,17 @@ public: MOVESET_XMINION.push_back(SEED_PELLET); MOVESET_XMINION.push_back(SEED_STORM); + MOVESET_SIDEWINDER.push_back(AVALANCHE); + MOVESET_SIDEWINDER.push_back(ACID_RAIN); + MOVESET_SIDEWINDER.push_back(ACID_RAIN); + MOVESET_SIDEWINDER.push_back(TORNADO); + MOVESET_SIDEWINDER.push_back(AVALANCHE); + MOVESET_SIDEWINDER.push_back(ACID_RAIN); + MOVESET_SIDEWINDER.push_back(GLARE); + MOVESET_SIDEWINDER.push_back(PETRIFY); + MOVESET_SIDEWINDER.push_back(MEGA_FANG); + MOVESET_SIDEWINDER.push_back(MEGA_FANG); + COLLECTED_ITEMS.push_back({20,5}); COLLECTED_ITEMS.push_back({20,6}); @@ -1008,10 +1032,10 @@ public: ENCOUNTER_MEGAMOTH.map=MAP_4; ENCOUNTERS.push_back(ENCOUNTER_MEGAMOTH); ENCOUNTER_SNAKEPACK.entities.push_back(new Entity(SNAKE_DECAL,"Snake",1,1,225,225,MOVESET_SNAKE)); - ENCOUNTER_SNAKEPACK.entities.push_back(new Entity(SNAKE_DECAL,"Snake",3,2,225,225,MOVESET_SNAKE)); - ENCOUNTER_SNAKEPACK.entities.push_back(new Entity(SNAKE_DECAL,"Snake",4,3,225,225,MOVESET_SNAKE)); + ENCOUNTER_SNAKEPACK.entities.push_back(new Entity(SNAKE_DECAL,"Snake",3,2,0,225,MOVESET_SNAKE)); + ENCOUNTER_SNAKEPACK.entities.push_back(new Entity(SNAKE_DECAL,"Sidewinder",4,3,0,225,MOVESET_SIDEWINDER,{2,2},true)); ENCOUNTER_SNAKEPACK.entities.push_back(new Entity(SNAKE_DECAL,"Snake",5,3,225,225,MOVESET_SNAKE)); - ENCOUNTER_SNAKEPACK.entities.push_back(new Entity(SNAKE_DECAL,"Snake",6,1,225,225,MOVESET_SNAKE)); + ENCOUNTER_SNAKEPACK.entities.push_back(new Entity(SNAKE_DECAL,"Snake",6,1,0,225,MOVESET_SNAKE)); ENCOUNTER_SNAKEPACK.x=11-4; ENCOUNTER_SNAKEPACK.y=5-3.5; ENCOUNTER_SNAKEPACK.playerX=4; @@ -1903,6 +1927,9 @@ public: } }break; case battle::PLAYER_SELECTION:{ + if (PETRIFY_TURNS>0) { + setupBattleTurns(); + } if (!GAME_FLAGS[gameflag::TUTORIAL1_X_X]&&GAME_FLAGS[gameflag::ANALYSIS_X_X]) { GAME_FLAGS[gameflag::TUTORIAL1_X_X]=true; bool hasPetalStorm=false; @@ -2036,6 +2063,13 @@ public: CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->hidden=true; } } + if (ref->appliesPetrification) { + if (BATTLE_CURRENT_TURN_ENTITY==-1) { + //Not implemented for the player. + } else { + PETRIFY_TURNS=3; + } + } if (EFFECT_TIMER>ref->effectTime) { EFFECT_TIMER=0; clearPixelEffect(); @@ -2109,6 +2143,7 @@ public: if (BATTLE_CURRENT_TURN_ENTITY==-1) { BATTLE_DROUGHT_ACTIVE=false; std::cout<<"Drought turned off.\n"; + PETRIFY_TURNS=std::clamp(PETRIFY_TURNS-1,0,3); } else { if (CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->lastSlowVal==CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->speed&& CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->speed!=0&&rand()%3==0) { @@ -3343,7 +3378,12 @@ public: } } } else { - PLAYER_HP=std::clamp(PLAYER_HP-finalDamage,0,PLAYER_MAXHP); + if (power->dealsPctDmg) { + finalDamage=PLAYER_HP*power->pctDmg; + PLAYER_HP=std::clamp(PLAYER_HP-finalDamage,0,PLAYER_MAXHP); + } else { + PLAYER_HP=std::clamp(PLAYER_HP-finalDamage,0,PLAYER_MAXHP); + } CreateDisplayNumber(finalDamage,CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.playerX,CURRENT_ENCOUNTER.y+CURRENT_ENCOUNTER.playerY,frameCount); } } @@ -3394,7 +3434,7 @@ public: PLAYER_TURN_COMPLETE=false; BATTLE_STATE=battle::MOVE_RESOLUTION; //Seed Storm has prio. - if (!PLAYER_TURN_COMPLETE&&isPriorityMove(BATTLE_CARD_SELECTION)) { + if (!PLAYER_TURN_COMPLETE&&isPriorityMove(BATTLE_CARD_SELECTION)&&PETRIFY_TURNS==0) { turnOrder.push(-1); PLAYER_TURN_COMPLETE=true; } @@ -3406,14 +3446,14 @@ public: } } //Healing has half prio for the player. - if (rand()%2==0&&!PLAYER_TURN_COMPLETE&&isFoodMove(BATTLE_CARD_SELECTION)) { + if (rand()%2==0&&!PLAYER_TURN_COMPLETE&&isFoodMove(BATTLE_CARD_SELECTION)&&PETRIFY_TURNS==0) { turnOrder.push(-1); PLAYER_TURN_COMPLETE=true; } //Otherwise, every enemy has a chance to go before the player unless they are slowed, then they always go after. for (int i=0;iturnComplete=true; } } - if (!PLAYER_TURN_COMPLETE) { + if (!PLAYER_TURN_COMPLETE&&PETRIFY_TURNS==0) { turnOrder.push(-1); PLAYER_TURN_COMPLETE=true; } @@ -3655,7 +3695,9 @@ public: bool isBuffMove(WEATHER_POWER*power) { //ONLY Buff moves with no damaging/healing effects go in here. return power->name.compare("Hide")==0|| - power->name.compare("Hyper Zap")==0; + power->name.compare("Hyper Zap")==0|| + power->name.compare("Glare")==0|| + power->name.compare("Petrify")==0; } bool isFoodMove(WEATHER_POWER*power) { @@ -3763,12 +3805,21 @@ public: buffPos.x+=16; } } else { + vi2d buffPos={0,0}; //Draw Player's Buffs. if (FOOD_REGEN_TURNS>0) { DrawDecal(pos,HP_REGEN_DECAL); std::string txt=std::to_string(FOOD_REGEN_TURNS); - DrawStringDecal({pos.x+16-GetTextSize(txt).x+1,pos.y+16-GetTextSize(txt).y+1},txt,VERY_DARK_GREEN); - DrawStringDecal({pos.x+16-GetTextSize(txt).x,pos.y+16-GetTextSize(txt).y},txt); + DrawStringDecal({pos.x+buffPos.x-GetTextSize(txt).x+1,pos.y+16-GetTextSize(txt).y+1},txt,VERY_DARK_GREEN); + DrawStringDecal({pos.x+buffPos.x-GetTextSize(txt).x,pos.y+16-GetTextSize(txt).y},txt); + buffPos.x+=16; + } + if (PETRIFY_TURNS>0) { + DrawDecal(pos,PETRIFY_DECAL); + std::string txt=std::to_string(PETRIFY_TURNS); + DrawStringDecal({pos.x+buffPos.x-GetTextSize(txt).x+1,pos.y+16-GetTextSize(txt).y+1},txt,VERY_DARK_GREEN); + DrawStringDecal({pos.x+buffPos.x-GetTextSize(txt).x,pos.y+16-GetTextSize(txt).y},txt); + buffPos.x+=16; } } } diff --git a/Seasons_of_Loneliness b/Seasons_of_Loneliness index 01e1f8b..350c452 100755 Binary files a/Seasons_of_Loneliness and b/Seasons_of_Loneliness differ diff --git a/assets/petrify.png b/assets/petrify.png new file mode 100644 index 0000000..c945111 Binary files /dev/null and b/assets/petrify.png differ