@ -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 < std : : string , ObjectLoadInfo * > BASE_OBJECTS ;
std : : vector < Encounter > ENCOUNTERS ;
Encounter ENCOUNTER_SPIDEY_1 ;
@ -658,6 +669,7 @@ public:
std : : vector < WEATHER_POWER * > MOVESET_X_X ;
std : : vector < WEATHER_POWER * > MOVESET_XMINION ;
std : : vector < WEATHER_POWER * > MOVESET_MEGAMOTH ;
std : : vector < WEATHER_POWER * > MOVESET_SIDEWINDER ;
std : : vector < Seed * > SEEDS ;
std : : vector < Seed * > TREES ;
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 ; i < CURRENT_ENCOUNTER . entities . size ( ) ; i + + ) {
Entity * ent = CURRENT_ENCOUNTER . entities [ i ] ;
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 ;
}
@ -3423,7 +3463,7 @@ public:
ent - > turnComplete = 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 ;
}
}
}