diff --git a/SeasonsOfLoneliness.cpp b/SeasonsOfLoneliness.cpp index db46cee..e1d71b6 100644 --- a/SeasonsOfLoneliness.cpp +++ b/SeasonsOfLoneliness.cpp @@ -321,6 +321,8 @@ class WEATHER_POWER{ float treeSeedChance=0; //% chance of trees producing seeds from this attack. bool lowPriority=false; //Will always go last if set to true. 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. 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; @@ -349,11 +351,15 @@ class Entity{ WEATHER_POWER*selectedMove; std::vector moveSet; bool turnComplete=false; - bool slowed=false; //Slowed entities have a low priority. + char speed=0; //Slowed entities have a low priority. -1=Slowed, 1=Fast (high Prio), 0=Normal Priority int damageFrame=0; int fixedTurnOrderInd=0; bool fixedTurnOrder=false; //If this is turned on, the selected move will increment in order of the move set (and loop accordingly.) vf2d sprScale; + int lastSlowVal=0; //Keeps track of last slow val. Don't take away a buff if it's different, as it was just applied. + bool lastHiddenVal=false; //Keeps track of last hidden val. Don't take away a buff if it's different, as it was just applied. + bool hidden=false; //If hidden, this enemy will take 0 damage. + int shield=0; //If shield is greater than 0, the shield must be depleted first before health can be dealt. Entity(Decal*spr,std::string name,float x,float y,int hp,int maxhp,std::vectormoveset,vf2d sprScale={1,1},bool fixedMoveset=false) { this->spr=spr; this->name=name; @@ -521,6 +527,9 @@ public: ParticleEffect*FLASH_FLOOD_EFF = new ParticleEffect({0,0},{WIDTH,HEIGHT},{0,0},{WIDTH,HEIGHT},{1,1},{2,2},{-4,1},{-1,4},Pixel(8, 54, 204,64),Pixel(255,255,255,128),500,Pixel(220, 226, 227,0)); ParticleEffect*SUNNYDAY_EFF = new ParticleEffect({0,0},{WIDTH,HEIGHT},{0,0},{WIDTH,HEIGHT},{1,1},{4,4},{0,-2},{0,-6},Pixel(209, 207, 113,130),Pixel(255, 255, 255,210),50,Pixel(70, 158, 62,0)); ParticleEffect*SOLARFLARE_EFF = new ParticleEffect({0,0},{128,128},{0,0},{128,128},{2,HEIGHT/2},{4,HEIGHT},{0,4},{0,25},Pixel(217, 36, 0,130),Pixel(217, 94, 0,255),40,Pixel(166, 51, 28,64)); + 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)); 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); @@ -546,6 +555,10 @@ public: WEATHER_POWER*SUNNY_DAY = new WEATHER_POWER("Sunny Day","Fertilize soil, multiplying seed growth and causing trees to drop seeds. 10+1d10",POWER_SUNNYDAY_ANIMATION,POWER_SUNNYDAY_ANIMATION,10,10,200,Pixel(179, 164, 71,255),Pixel(222, 198, 44,255),120,SUNNYDAY_EFF); WEATHER_POWER*FIRESTORM = new WEATHER_POWER("Fire Storm","Cause devastating fires, destroying everything in sight. 65+1d40",POWER_FIRESTORM_ANIMATION,POWER_FIRESTORM_ANIMATION,65,40,145,Pixel(176, 95, 44,255),Pixel(237, 100, 14,255),120,FIRESTORM_EFF); WEATHER_POWER*SOLAR_FLARE = new WEATHER_POWER("Solar Flare","A concentrated sunbeam of death. Burns down all trees. 175+1d40",POWER_SOLARFLARE_ANIMATION,POWER_SOLARFLARE_ANIMATION,175,40,32,Pixel(176, 53, 37,255),Pixel(217, 98, 0,255),120,SOLARFLARE_EFF); + 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); + bool IN_BATTLE_ENCOUNTER = false; int BATTLE_ENTRY_TIMER = 0; int EFFECT_TIMER = 0; @@ -611,12 +624,13 @@ public: *NADO_DECAL,*SILICON_ROCK_DECAL,*PETAL_STORM_DECAL,*ROVER_DECAL,*X_X_DECAL, *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; + *HP_REGEN_DECAL,*SLOWED_DECAL, *SPEED_DECAL,*HIDDEN_DECAL; std::map BASE_OBJECTS; std::vector ENCOUNTERS; Encounter ENCOUNTER_SPIDEY_1; Encounter ENCOUNTER_X_X; Encounter ENCOUNTER_SANDWORM_1; + Encounter ENCOUNTER_MEGAMOTH; Encounter CURRENT_ENCOUNTER; std::vectorMOVESET_SPIDEY; std::vectorMOVESET_SANDWORM; @@ -624,6 +638,7 @@ public: std::vectorMOVESET_MOTH; std::vectorMOVESET_X_X; std::vectorMOVESET_XMINION; + std::vectorMOVESET_MEGAMOTH; std::vectorSEEDS; std::vectorTREES; bool SOUND_IS_MUTED=false; @@ -727,6 +742,8 @@ public: SOLARFLARE_DECAL=new Decal(new Sprite("assets/solarflare.png")); HP_REGEN_DECAL=new Decal(new Sprite("assets/hpregen.png")); SLOWED_DECAL=new Decal(new Sprite("assets/slowed.png")); + SPEED_DECAL=new Decal(new Sprite("assets/speedup.png")); + HIDDEN_DECAL=new Decal(new Sprite("assets/hidden.png")); current_playerAnim->spr=PLAYER_DECAL; playerAnim->spr=PLAYER_DECAL; @@ -875,6 +892,14 @@ public: MOVESET_MOTH.push_back(GUST); MOVESET_MOTH.push_back(TORNADO); + MOVESET_MEGAMOTH.push_back(TORNADO); + MOVESET_MEGAMOTH.push_back(TORNADO); + MOVESET_MEGAMOTH.push_back(TORNADO); + MOVESET_MEGAMOTH.push_back(TORNADO); + MOVESET_MEGAMOTH.push_back(HIDE); + MOVESET_MEGAMOTH.push_back(HYPERZAP); + MOVESET_MEGAMOTH.push_back(POLLINATION); + MOVESET_SANDWORM.push_back(SANDSTORM); MOVESET_SANDWORM.push_back(HEAT_WAVE); MOVESET_SANDWORM.push_back(DROUGHT); @@ -927,6 +952,15 @@ public: ENCOUNTER_SANDWORM_1.playerY=3.5; ENCOUNTER_SANDWORM_1.map=MAP_3; //ENCOUNTERS.push_back(ENCOUNTER_X_X); //Activate at beginning of Chapter 2. + ENCOUNTER_MEGAMOTH.entities.push_back(new Entity(MOTH_DECAL,"Megamoth",3.5,3.25,745,745,MOVESET_MEGAMOTH,{2,2})); + ENCOUNTER_MEGAMOTH.entities.push_back(new Entity(MOTH_DECAL,"Moth",2,3,120,120,MOVESET_MOTH)); + ENCOUNTER_MEGAMOTH.entities.push_back(new Entity(MOTH_DECAL,"Moth",6,3,120,120,MOVESET_MOTH)); + ENCOUNTER_MEGAMOTH.entities.push_back(new Entity(MOTH_DECAL,"Moth",4,6.5,120,120,MOVESET_MOTH)); + ENCOUNTER_MEGAMOTH.x=195-4; + ENCOUNTER_MEGAMOTH.y=56-3.5; + ENCOUNTER_MEGAMOTH.playerX=4; + ENCOUNTER_MEGAMOTH.playerY=3.5; + ENCOUNTER_MEGAMOTH.map=MAP_4; BASE_OBJECTS["DOME"]=new ObjectLoadInfo(DOME_DECAL); BASE_OBJECTS["PLANT"]=new ObjectLoadInfo(PLANT_DECAL); @@ -1868,12 +1902,26 @@ public: if (ref->appliesSlow) { if (BATTLE_CURRENT_TURN_ENTITY==-1) { for (int i=0;islowed=true; + CURRENT_ENCOUNTER.entities[i]->speed=std::clamp(CURRENT_ENCOUNTER.entities[i]->speed-1,-1,1); } } else { //Not implemented for enemies. } } + if (ref->appliesSpeed) { + if (BATTLE_CURRENT_TURN_ENTITY==-1) { + //Not implemented for the player. + } else { + CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->speed=std::clamp(CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->speed+1,-1,1); + } + } + if (ref->appliesHide) { + if (BATTLE_CURRENT_TURN_ENTITY==-1) { + //Not implemented for the player. + } else { + CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->hidden=true; + } + } if (EFFECT_TIMER>ref->effectTime) { EFFECT_TIMER=0; clearPixelEffect(); @@ -1982,9 +2030,16 @@ public: BATTLE_DROUGHT_ACTIVE=false; std::cout<<"Drought turned off.\n"; } else { - if (CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->slowed&&rand()%3==0) { - CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->slowed=false; + 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) { + CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->speed=0; + } + if (CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->lastHiddenVal==CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->hidden&& + CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->hidden&&rand()%3==0) { + CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->hidden=0; } + CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->lastSlowVal=CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->speed; + CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->lastHiddenVal=CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->hidden; } BATTLE_CURRENT_TURN_ENTITY=turnOrder.front(); turnOrder.pop(); @@ -3116,10 +3171,9 @@ public: } for (int i=0;ihp>0&&!CURRENT_ENCOUNTER.entities[i]->turnComplete&& - isPriorityMove(CURRENT_ENCOUNTER.entities[i]->selectedMove)&&!CURRENT_ENCOUNTER.entities[i]->slowed) { + ((isPriorityMove(CURRENT_ENCOUNTER.entities[i]->selectedMove)&&CURRENT_ENCOUNTER.entities[i]->speed>=0)||CURRENT_ENCOUNTER.entities[i]->speed==1)) { turnOrder.push(i); CURRENT_ENCOUNTER.entities[i]->turnComplete=true; - std::cout<<" Entity "<hp>0&&!ent->turnComplete&& - !ent->slowed&&rand()%2==0&&!ent->selectedMove->lowPriority) { + ent->speed>=0&&rand()%2==0&&!ent->selectedMove->lowPriority) { turnOrder.push(i); ent->turnComplete=true; } @@ -3460,13 +3514,19 @@ public: void DrawBuffs(vf2d pos,Entity*ent) { if (ent!=NULL) { - if (ent->slowed) { + if (ent->speed==-1) { DrawDecal(pos,SLOWED_DECAL); + } else + if (ent->speed==1) { + DrawDecal(pos,SPEED_DECAL); } } else { //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); } } } diff --git a/A.A.png b/assets/A.A.png similarity index 100% rename from A.A.png rename to assets/A.A.png diff --git a/Y.Y.png b/assets/Y.Y.png similarity index 100% rename from Y.Y.png rename to assets/Y.Y.png diff --git a/assets/hidden.png b/assets/hidden.png new file mode 100644 index 0000000..150f042 Binary files /dev/null and b/assets/hidden.png differ diff --git a/assets/maps/map4 b/assets/maps/map4 index dcfd96b..ef35b44 100644 --- a/assets/maps/map4 +++ b/assets/maps/map4 @@ -50,7 +50,7 @@ 000000000000000000000000000000000000000000000000000000000000000000000222222222222222222222222220000000000000000000000000000000000000000000000066000000000000660000000000000000000000000000000000000660000000 000000000000000000050000000000000000000000000005000000000000000000000002222222222222222222222222200000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000660000000 000000000000000000000000000000000000000000000000000000000000000000000000002222222222222222222222222200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006660000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000006666000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000001006666000020 000000500000000000000005550000000000000000000000000000000000000000000000000000000222200000000000000000000000000000000000000000000000000000000000000000000006600000000000000000000000000000000000006666000000 000000000000000000000055500000000000000000000050000000000000000000000000000000002222220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066666000000 000000000000000000000000000055000000000000000000000000000050000000000000000000002222220000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000666666600000 @@ -102,6 +102,12 @@ 20;71;METEORSTORM_NODE 45;66;SOLARFLARE_NODE 181;42;SNOWSTORM_NODE +195;54;HAILSTORM_NODE +191;50;PETALSTORM_NODE +202;50;FLASHFLOOD_NODE +169;56;SUNNYDAY_NODE +193;37;HURRICANE_NODE +172;32;METEORSTORM_NODE 116;8;NADO 120;9;NADO 123;7;NADO diff --git a/assets/speedup.png b/assets/speedup.png new file mode 100644 index 0000000..54856bf Binary files /dev/null and b/assets/speedup.png differ