Implement new combo battle mechanics.

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
master
sigonasr2 3 years ago
parent 2d2761540d
commit 6e6a1eb32c
  1. 87
      SeasonsOfLoneliness.cpp

@ -119,6 +119,13 @@ class Seed{
}
};
namespace reasoncode{
enum Code{
SEED_GROWTH,
TREE_BURN
};
}
#define MAX_TERMINAL_NAME_LENGTH 6
#define WIDTH 256
#define HEIGHT 224
@ -286,6 +293,8 @@ class WEATHER_POWER{
int seedProduction=0; //Number of seeds to add to field.
float seedScatter=1; //Multiplier of current seeds on field.
bool growSeeds=false; //If set to true, will trigger a growth of all seeds.
bool burnTrees=false; //If set to true, will trigger a burning of trees.
float treeBurnChance=1; //% chance of trees getting burned by this attack.
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;
@ -463,6 +472,7 @@ public:
ParticleEffect*SEED_PELLET_EFF = new ParticleEffect({0,0},{64,64},{0,0},{WIDTH,HEIGHT},{1,1},{1,1},{-3,-3},{3,3},Pixel(138, 255, 153,200),Pixel(193, 245, 200,210),10,Pixel(70, 158, 62,0));
ParticleEffect*SUMMON_MINION_EFF = new ParticleEffect({0,0},{WIDTH,HEIGHT},{0,0},{WIDTH,HEIGHT},{4,4},{12,12},{0,-6},{0,-20},Pixel(223, 242, 0,130),Pixel(223, 255, 114,210),50,Pixel(70, 158, 62,0));
ParticleEffect*SEED_OF_LIFE_EFF = new ParticleEffect({0,0},{WIDTH,HEIGHT},{0,0},{WIDTH,HEIGHT},{2,2},{2,2},{-1,-2},{1,-0.2},Pixel(65, 98, 66,210),Pixel(65, 117, 60,255),140,Pixel(70, 158, 62,0));
ParticleEffect*FIRESTORM_EFF = new ParticleEffect({0,0},{WIDTH,HEIGHT},{0,0},{WIDTH,HEIGHT},{4,4},{12,12},{-12,-8},{12,-4},Pixel(209, 90, 69,130),Pixel(209, 141, 69,255),140,Pixel(255, 0, 0,32));
WEATHER_POWER*HAILSTORM = new WEATHER_POWER("Hailstorm","Causes a flurry of hard cold rocks to be unleashed in target area. 60+30d",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+10d",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 space rocks to fall on target area. 50+50d",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);
@ -524,6 +534,7 @@ public:
bool SOUND_IS_PLAYING=false;
int MAIN_MENU_SELECTION=0;
std::string MENU_OPTIONS[4]={"NEW GAME","CONTINUE","MUTE SOUND","EXIT"};
int BATTLE_REASON_CODE=-1;
Decal*DOME_DECAL,*FOOD_METER_DECAL,*OXYGEN_METER_DECAL,*PLANT_DECAL,
*PLAYER_DECAL,
@ -724,6 +735,10 @@ public:
PETAL_STORM->seedProduction=2; //Produce two seeds.
HURRICANE->seedScatter=2;
HURRICANE->growSeeds=true;
METEOR_STORM->burnTrees=true;
METEOR_RAIN->burnTrees=true;
METEOR_RAIN->treeBurnChance=0.5;
MOVESET_SPIDEY.push_back(SANDSTORM);
MOVESET_SPIDEY.push_back(SEED_STORM);
@ -1529,14 +1544,14 @@ public:
int healPower=30;
int healRoll=healPower+rand()%ref->damageRoll*sign(healPower);
if (BATTLE_CURRENT_TURN_ENTITY==-1) {
effectRadius({(int)PLAYER_COORDS[0],(int)PLAYER_COORDS[1]},ref,-healRoll,true);
effectRadius({(int)BATTLE_PLAYER_COORDS.x,(int)BATTLE_PLAYER_COORDS.y},ref,-healRoll,true);
} else {
effectRadius({CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->x+CURRENT_ENCOUNTER.x,CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->y+CURRENT_ENCOUNTER.y},ref,-healRoll,false);
}
}
if (EFFECT_TIMER==30&&ref->name.compare("Seed Storm")==0) {
if (BATTLE_CURRENT_TURN_ENTITY==-1) {
effectRadius({(int)PLAYER_COORDS[0],(int)PLAYER_COORDS[1]},ref,true);
effectRadius({(int)BATTLE_PLAYER_COORDS.x,(int)BATTLE_PLAYER_COORDS.y},ref,true);
} else {
effectRadius({CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->x+CURRENT_ENCOUNTER.x,CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->y+CURRENT_ENCOUNTER.y},ref,false);
}
@ -1566,9 +1581,58 @@ public:
}
}
if (EFFECT_TIMER>ref->effectTime) {
BATTLE_STATE=battle::DAMAGE_RESOLUTION;
EFFECT_TIMER=0;
clearPixelEffect();
if (ref->growSeeds&&SEEDS.size()>0) {
BATTLE_REASON_CODE=reasoncode::SEED_GROWTH;
BATTLE_STATE=battle::WAIT_TURN_ANIMATION2;
} else
if (ref->burnTrees&&TREES.size()>0&&ref->treeBurnChance>range(0,1)){
BATTLE_REASON_CODE=reasoncode::TREE_BURN;
BATTLE_STATE=battle::WAIT_TURN_ANIMATION2;
} else {
BATTLE_REASON_CODE=-1;
BATTLE_STATE=battle::DAMAGE_RESOLUTION;
}
}
}break;
case battle::WAIT_TURN_ANIMATION2:{
EFFECT_TIMER++;
if (EFFECT_TIMER==10) {
switch (BATTLE_REASON_CODE) {
case reasoncode::SEED_GROWTH:{
applyPixelEffect(SEED_STORM,BATTLE_PLAYER_COORDS,0);
}break;
case reasoncode::TREE_BURN:{
applyPixelEffect(FIRESTORM_EFF,BATTLE_PLAYER_COORDS,0);
}break;
}
}
if (EFFECT_TIMER==60) {
switch (BATTLE_REASON_CODE) {
case reasoncode::SEED_GROWTH:{
int healAmt=-10*SEEDS.size();
CreateDisplayNumber(healAmt,BATTLE_PLAYER_COORDS.x,BATTLE_PLAYER_COORDS.y,frameCount);
PLAYER_HP=std::clamp(PLAYER_HP+healAmt*-1,0,PLAYER_MAXHP);
addTrees(SEEDS.size());
clearSeeds();
}break;
case reasoncode::TREE_BURN:{
int dmgAmt=10*TREES.size();
for (int i=0;i<CURRENT_ENCOUNTER.entities.size();i++) {
if (CURRENT_ENCOUNTER.entities[i]->hp>0) {
CreateDisplayNumber(dmgAmt,CURRENT_ENCOUNTER.x+CURRENT_ENCOUNTER.entities[i]->x,CURRENT_ENCOUNTER.y+CURRENT_ENCOUNTER.entities[i]->y,frameCount);
CURRENT_ENCOUNTER.entities[i]->hp=std::clamp(CURRENT_ENCOUNTER.entities[i]->hp-dmgAmt,0,CURRENT_ENCOUNTER.entities[i]->maxhp);
}
}
clearTrees();
}break;
}
}
if (EFFECT_TIMER==120) {
BATTLE_REASON_CODE=-1;
BATTLE_STATE=battle::DAMAGE_RESOLUTION;
}
}break;
case battle::DAMAGE_RESOLUTION:{
@ -1617,6 +1681,7 @@ public:
PIXEL_EFFECT_TRANSPARENCY=0;
EFFECT_TIMER=0;
clearSeeds();
clearTrees();
}
}
}break;
@ -2095,8 +2160,8 @@ public:
}break;
case battle::PLAYER_TARGET_SELECTION:{
if (PLAYER_SELECTED_TARGET>=0) {
DrawWrappedText({5,5},"Target "+CURRENT_ENCOUNTER.entities[PLAYER_SELECTED_TARGET]->name+" "+(char)('A'+PLAYER_SELECTED_TARGET)+" with "+BATTLE_CARD_SELECTION->name,WIDTH-8,BLACK,{2,2});
DrawWrappedText({4,4},"Target "+CURRENT_ENCOUNTER.entities[PLAYER_SELECTED_TARGET]->name+" "+(char)('A'+PLAYER_SELECTED_TARGET)+" with "+BATTLE_CARD_SELECTION->name,WIDTH-8,WHITE,{2,2});
DrawWrappedText({5,5},"Target "+CURRENT_ENCOUNTER.entities[PLAYER_SELECTED_TARGET]->name+" "+(char)('A'+PLAYER_SELECTED_TARGET)+" uses "+BATTLE_CARD_SELECTION->name,WIDTH-8,BLACK,{2,2});
DrawWrappedText({4,4},"Target "+CURRENT_ENCOUNTER.entities[PLAYER_SELECTED_TARGET]->name+" "+(char)('A'+PLAYER_SELECTED_TARGET)+" uses "+BATTLE_CARD_SELECTION->name,WIDTH-8,WHITE,{2,2});
DrawStringDecal({(float)(WIDTH-GetTextSize("<UP> Back").x-1),(float)(HEIGHT-GetTextSize("<UP> Back").y-1)},"<UP> Back",BLACK,{1,1});
DrawStringDecal({(float)(WIDTH-GetTextSize("<UP> Back").x-2),(float)(HEIGHT-GetTextSize("<UP> Back").y-2)},"<UP> Back",GREEN,{1,1});
}
@ -2108,6 +2173,18 @@ public:
DrawWrappedText({4,4},CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->name+" "+(char)('A'+BATTLE_CURRENT_TURN_ENTITY)+" with "+CURRENT_ENCOUNTER.entities[BATTLE_CURRENT_TURN_ENTITY]->selectedMove->name,WIDTH-8,WHITE,{2,2});
}
}break;
case battle::WAIT_TURN_ANIMATION2:{
switch (BATTLE_REASON_CODE) {
case reasoncode::SEED_GROWTH:{
DrawWrappedText({5,5},"The seeds grow into lush trees!",WIDTH-8,DARK_GREEN,{2,2});
DrawWrappedText({4,4},"The seeds grow into lush trees!",WIDTH-8,WHITE,{2,2});
}break;
case reasoncode::TREE_BURN:{
DrawWrappedText({5,5},"The trees cause rampaging fires!",WIDTH-8,DARK_RED,{2,2});
DrawWrappedText({4,4},"The trees cause rampaging fires!",WIDTH-8,WHITE,{2,2});
}break;
}
}break;
}
if (IN_BATTLE_ENCOUNTER||(GAME_STATE==GAMEWORLD&&!CUTSCENE_ACTIVE&&PLAYER_HP!=PLAYER_MAXHP)) {
DrawStringDecal({4+1,(float)(HEIGHT-10-GetTextSize("HP:").y+1)},"HP: "+std::to_string(PLAYER_HP),BLACK);

Loading…
Cancel
Save