@ -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 ) ;