@ -12,8 +12,8 @@ using namespace olc;
//#define TEST_MAP1 //Toggle to just play around on map 1.
//#define TEST_MAP2 //Toggle on to just play around on map 2.
# define SKIP_INTRO fals e
# define SKIP_CHAPTER1 fals e
# define SKIP_INTRO tru e
# define SKIP_CHAPTER1 tru e
# define SKIP_CHAPTER2 false
# define SKIP_CHAPTER3 false
@ -49,6 +49,7 @@ enum GAMESTATE{
CUTSCENE_4 , //First rover repaired.
CUTSCENE_4_DONE ,
LATER_THAT_NIGHTFADEIN ,
LATER_THAT_NIGHTWAIT ,
LATER_THAT_NIGHTFADEOUT ,
} ;
@ -74,6 +75,7 @@ namespace cutscene{
GET_SOME_REST ,
IN_BED ,
SHAKE ,
INVESTIGATE_X_X ,
} ;
}
@ -87,6 +89,7 @@ namespace battle{
MOVE_RESOLUTION ,
PERFORM_TURN ,
WAIT_TURN_ANIMATION ,
WAIT_TURN_ANIMATION2 ,
DAMAGE_RESOLUTION ,
} ;
}
@ -108,6 +111,14 @@ enum MOVEMENT_PRIORITY{
BOTH
} ;
class Seed {
public :
vf2d pos ;
Seed ( vf2d pos ) {
this - > pos = pos ;
}
} ;
# define MAX_TERMINAL_NAME_LENGTH 6
# define WIDTH 256
# define HEIGHT 224
@ -123,7 +134,7 @@ class DisplayNumber{
int frame ; //Frame it was created.
float x , y ;
int alpha = 255 ;
DisplayNumber ( int numb , int x , in t y , int frameCount ) {
DisplayNumber ( int numb , float x , floa t y , int frameCount ) {
this - > number = numb ;
this - > x = x ;
this - > y = y ;
@ -272,6 +283,9 @@ class WEATHER_POWER{
Pixel textcol ;
int effectTime = 0 ;
ParticleEffect * effect ;
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.
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 ;
@ -293,8 +307,8 @@ class Entity{
int hp ;
int maxhp ;
Decal * spr ;
in t x ;
in t y ;
floa t x ;
floa t y ;
std : : string name ;
WEATHER_POWER * selectedMove ;
std : : vector < WEATHER_POWER * > moveSet ;
@ -304,7 +318,7 @@ class Entity{
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 ;
Entity ( Decal * spr , std : : string name , int x , in t y , int hp , int maxhp , std : : vector < WEATHER_POWER * > moveset , vf2d sprScale = { 1 , 1 } , bool fixedMoveset = false ) {
Entity ( Decal * spr , std : : string name , float x , floa t y , int hp , int maxhp , std : : vector < WEATHER_POWER * > moveset , vf2d sprScale = { 1 , 1 } , bool fixedMoveset = false ) {
this - > spr = spr ;
this - > name = name ;
this - > x = x ;
@ -321,6 +335,7 @@ class Entity{
class Encounter {
public :
int x , y ;
float playerX , playerY ;
std : : vector < Entity * > entities ;
std : : vector < int > turnOrder ;
} ;
@ -456,7 +471,7 @@ public:
WEATHER_POWER * SANDSTORM = new WEATHER_POWER ( " Sandstorm " , " " , POWER_HAILSTORM_ANIMATION , POWER_HAILSTORM_ANIMATION , 5 , 10 , 64 , Pixel ( 93 , 161 , 163 , 255 ) , Pixel ( 72 , 160 , 212 , 255 ) , 120 , SANDSTORM_EFF ) ;
WEATHER_POWER * SEED_STORM = new WEATHER_POWER ( " Seed Storm " , " " , POWER_HAILSTORM_ANIMATION , POWER_HAILSTORM_ANIMATION , - 10 , 15 , 30 , Pixel ( 93 , 161 , 163 , 255 ) , Pixel ( 72 , 160 , 212 , 255 ) , 120 , SEED_STORM_EFF ) ;
WEATHER_POWER * AVALANCHE = new WEATHER_POWER ( " Avalanche " , " " , POWER_HAILSTORM_ANIMATION , POWER_HAILSTORM_ANIMATION , 15 , 10 , 200 , Pixel ( 93 , 161 , 163 , 255 ) , Pixel ( 72 , 160 , 212 , 255 ) , 120 , AVALANCHE_EFF ) ;
WEATHER_POWER * LIGHT_STORM = new WEATHER_POWER ( " Light Storm " , " " , POWER_HAILSTORM_ANIMATION , POWER_HAILSTORM_ANIMATION , 15 , 10 , 64 , Pixel ( 171 , 151 , 53 , 255 ) , Pixel ( 237 , 237 , 237 , 255 ) , 120 , LIGHT_STORM_EFF ) ;
WEATHER_POWER * LIGHT_STORM = new WEATHER_POWER ( " Light Storm " , " " , POWER_HAILSTORM_ANIMATION , POWER_HAILSTORM_ANIMATION , 50 , 9 , 64 , Pixel ( 171 , 151 , 53 , 255 ) , Pixel ( 237 , 237 , 237 , 255 ) , 120 , LIGHT_STORM_EFF ) ;
WEATHER_POWER * SEED_BULLET = new WEATHER_POWER ( " Seed Bullet " , " " , POWER_HAILSTORM_ANIMATION , POWER_HAILSTORM_ANIMATION , 10 , 15 , 30 , Pixel ( 57 , 92 , 63 , 255 ) , Pixel ( 95 , 232 , 119 , 255 ) , 120 , SEED_BULLET_EFF ) ;
WEATHER_POWER * SEED_PELLET = new WEATHER_POWER ( " Seed Pellet " , " " , POWER_HAILSTORM_ANIMATION , POWER_HAILSTORM_ANIMATION , 5 , 10 , 30 , Pixel ( 57 , 92 , 63 , 255 ) , Pixel ( 95 , 232 , 119 , 255 ) , 120 , SEED_PELLET_EFF ) ;
WEATHER_POWER * SEED_OF_LIFE = new WEATHER_POWER ( " Seed of Life " , " " , POWER_HAILSTORM_ANIMATION , POWER_HAILSTORM_ANIMATION , - 10 , 15 , 96 , Pixel ( 93 , 161 , 163 , 255 ) , Pixel ( 72 , 160 , 212 , 255 ) , 120 , SEED_OF_LIFE_EFF ) ;
@ -516,7 +531,7 @@ public:
* SPIDEY_DECAL , * TARGETING_CIRCLE , * TARGETING_RANGE_CIRCLE , * HEALTHBAR_DECAL ,
* CONSUME_SNACK_DECAL , * CONSUME_MEAL_DECAL , * COMPUTER_DECAL , * BROKEN_ROVER_DECAL ,
* NADO_DECAL , * SILICON_ROCK_DECAL , * PETAL_STORM_DECAL , * ROVER_DECAL , * X_X_DECAL ,
* LATER_THAT_NIGHT_DECAL , * SLEEP_DECAL ;
* LATER_THAT_NIGHT_DECAL , * SLEEP_DECAL , * SEED_DECAL , * TREE_DECAL ;
std : : map < std : : string , ObjectLoadInfo * > BASE_OBJECTS ;
std : : vector < Encounter > ENCOUNTERS ;
Encounter ENCOUNTER_SPIDEY_1 ;
@ -525,10 +540,14 @@ public:
std : : vector < WEATHER_POWER * > MOVESET_SPIDEY ;
std : : vector < WEATHER_POWER * > MOVESET_X_X ;
std : : vector < WEATHER_POWER * > MOVESET_XMINION ;
std : : vector < Seed * > SEEDS ;
std : : vector < Seed * > TREES ;
bool SOUND_IS_MUTED = false ;
bool END_THE_GAME = false ;
bool audioFade = false ;
float audioLevel = 0.6 ;
int SEED_COUNT = 0 ;
vf2d BATTLE_PLAYER_COORDS ;
sound : : Wave SONG_MAIN ;
@ -553,6 +572,7 @@ public:
if ( SKIP_INTRO | | SKIP_CHAPTER1 | | SKIP_CHAPTER2 | | SKIP_CHAPTER3 ) {
GAME_FLAGS [ gameflag : : TUTORIAL_WALKED_OFF_FARM ] = true ;
GAME_FLAGS [ gameflag : : VISIT_BROKEN_ROVER ] = true ;
GAME_STATE = GAMEWORLD ;
}
if ( SKIP_CHAPTER1 | | SKIP_CHAPTER2 | | SKIP_CHAPTER3 ) {
GAME_FLAGS [ gameflag : : COLLECTED_SILICON_1 ] = true ;
@ -596,9 +616,11 @@ public:
SILICON_ROCK_DECAL = new Decal ( new Sprite ( " assets/siliconPiece.png " ) ) ;
PETAL_STORM_DECAL = new Decal ( new Sprite ( " assets/petalstorm_icon.png " ) ) ;
ROVER_DECAL = new Decal ( new Sprite ( " assets/ROVER.png " ) ) ;
X_X_DECAL = new Decal ( new Sprite ( " assets/X_ X.png " ) ) ;
X_X_DECAL = new Decal ( new Sprite ( " assets/X. X.png " ) ) ;
LATER_THAT_NIGHT_DECAL = new Decal ( new Sprite ( " assets/LaterThatNight.png " ) ) ;
SLEEP_DECAL = new Decal ( new Sprite ( " assets/sleep.png " ) ) ;
SEED_DECAL = new Decal ( new Sprite ( " assets/seed.png " ) ) ;
TREE_DECAL = new Decal ( new Sprite ( " assets/tree.png " ) ) ;
current_playerAnim - > spr = PLAYER_DECAL ;
playerAnim - > spr = PLAYER_DECAL ;
@ -700,6 +722,9 @@ public:
HURRICANE - > playerOwnCount = 1 ;
METEOR_RAIN - > playerOwnCount = 5 ;
PETAL_STORM - > seedProduction = 2 ; //Produce two seeds.
HURRICANE - > seedScatter = 2 ;
MOVESET_SPIDEY . push_back ( SANDSTORM ) ;
MOVESET_SPIDEY . push_back ( SEED_STORM ) ;
MOVESET_SPIDEY . push_back ( AVALANCHE ) ;
@ -720,18 +745,25 @@ public:
MOVESET_XMINION . push_back ( SEED_PELLET ) ;
MOVESET_XMINION . push_back ( SEED_STORM ) ;
COLLECTED_ITEMS . push_back ( { 20 , 5 } ) ;
COLLECTED_ITEMS . push_back ( { 20 , 6 } ) ;
ENCOUNTER_SPIDEY_1 . entities . push_back ( new Entity ( SPIDEY_DECAL , " Spidey " , 2 , 3 , 80 , 80 , MOVESET_SPIDEY ) ) ;
ENCOUNTER_SPIDEY_1 . entities . push_back ( new Entity ( SPIDEY_DECAL , " Spidey " , 4 , 4 , 80 , 80 , MOVESET_SPIDEY ) ) ;
ENCOUNTER_SPIDEY_1 . entities . push_back ( new Entity ( SPIDEY_DECAL , " Spidey " , 6 , 2 , 80 , 80 , MOVESET_SPIDEY ) ) ;
ENCOUNTER_SPIDEY_1 . x = 79 ;
ENCOUNTER_SPIDEY_1 . y = 47 ;
ENCOUNTER_X_X . playerX = 4 ;
ENCOUNTER_X_X . playerY = 3.75 ;
ENCOUNTERS . push_back ( ENCOUNTER_SPIDEY_1 ) ;
ENCOUNTER_X_X . entities . push_back ( new Entity ( X_X_DECAL , " X_X " , 3 , 3 , 590 , 590 , MOVESET_X_X , { 1 , 1 } , true ) ) ;
ENCOUNTER_X_X . entities . push_back ( new Entity ( X_X_DECAL , " X Minion " , 1 , 5 , 8 0, 80 , MOVESET_XMINION , { 0.4 , 0.4 } ) ) ;
ENCOUNTER_X_X . entities . push_back ( new Entity ( X_X_DECAL , " X Minion " , 0 , 2 , 8 0, 80 , MOVESET_XMINION , { 0.4 , 0.4 } ) ) ;
ENCOUNTER_X_X . entities . push_back ( new Entity ( X_X_DECAL , " X Minion " , 4 , 2 , 8 0, 80 , MOVESET_XMINION , { 0.4 , 0.4 } ) ) ;
ENCOUNTER_X_X . entities . push_back ( new Entity ( X_X_DECAL , " X_X " , 3 , 2.5 , 590 , 590 , MOVESET_X_X , { 2 , 2 } , true ) ) ;
ENCOUNTER_X_X . entities . push_back ( new Entity ( X_X_DECAL , " X Minion " , 1 , 5 , 0 , 80 , MOVESET_XMINION , { 0.7 , 0.7 } ) ) ;
ENCOUNTER_X_X . entities . push_back ( new Entity ( X_X_DECAL , " X Minion " , 0 , 2 , 0 , 80 , MOVESET_XMINION , { 0.7 , 0.7 } ) ) ;
ENCOUNTER_X_X . entities . push_back ( new Entity ( X_X_DECAL , " X Minion " , 4 , 2 , 0 , 80 , MOVESET_XMINION , { 0.7 , 0.7 } ) ) ;
ENCOUNTER_X_X . x = 38 ;
ENCOUNTER_X_X . y = 35 ;
ENCOUNTER_X_X . playerX = 3 ;
ENCOUNTER_X_X . playerY = 2 ;
//ENCOUNTERS.push_back(ENCOUNTER_X_X); //Activate at beginning of Chapter 2.
BASE_OBJECTS [ " DOME " ] = new ObjectLoadInfo ( DOME_DECAL ) ;
@ -1040,6 +1072,7 @@ public:
fadeIn ( ) ;
GAME_STATE = GAMEWORLD ;
PlayCutscene ( cutscene : : IN_BED ) ;
PLAYER_HP = PLAYER_MAXHP ;
} break ;
}
switch ( CURRENT_CUTSCENE ) {
@ -1055,6 +1088,16 @@ public:
}
} break ;
case cutscene : : TRANSITION_CUTSCENE_2 : {
if ( GAME_FLAGS [ gameflag : : REST_IN_DOME ] & & ! GAME_FLAGS [ gameflag : : SLEEP ] ) {
for ( int i = 0 ; i < COLLECTED_ITEMS . size ( ) ; i + + ) {
if ( COLLECTED_ITEMS [ i ] . x = = 20 & & COLLECTED_ITEMS [ i ] . y = = 5 ) {
COLLECTED_ITEMS . erase ( COLLECTED_ITEMS . begin ( ) + i - - ) ;
} else
if ( COLLECTED_ITEMS [ i ] . x = = 20 & & COLLECTED_ITEMS [ i ] . y = = 6 ) {
COLLECTED_ITEMS . erase ( COLLECTED_ITEMS . begin ( ) + i - - ) ;
}
}
}
LoadMap ( " assets/maps/map2 " ) ;
TeleportToMapFileCoords ( 8 , 17 ) ;
fadeIn ( ) ;
@ -1073,6 +1116,7 @@ public:
case cutscene : : REPAIR_ROVER_1 : {
ResetTerminal ( STORY_TEXT3 ) ;
GAME_STATE = CUTSCENE_4 ;
REPAIRED_ROVERS . push_back ( { 33 , 35 } ) ;
fadeIn ( ) ;
} break ;
case cutscene : : END_VOLCANIC_AREA_CUTSCENE : {
@ -1087,8 +1131,8 @@ public:
void fadeInCompleted ( ) {
switch ( GAME_STATE ) {
case LATER_THAT_NIGHTFADEIN : {
fadeOut ( ) ;
GAME_STATE = LATER_THAT_NIGHTFADEOU T ;
TIMER = 0 ;
GAME_STATE = LATER_THAT_NIGHTWAI T ;
} break ;
}
switch ( CURRENT_CUTSCENE ) {
@ -1142,6 +1186,12 @@ public:
case cutscene : : IN_BED : {
CUTSCENE_OBJS [ 0 ] = CreateObject ( { 20 , 2 } , SLEEP_DECAL , SLEEP_ANIMATION , true ) ;
} break ;
case cutscene : : INVESTIGATE_X_X : {
CUTSCENE_OBJS [ 0 ] - > anim = EMPTY_BED_ANIMATION ;
CUTSCENE_OBJS [ 1 ] = CreateObject ( { 19 , 3 } , PLAYER_DECAL , { 32 , 0 } , { 32 , 32 } , true ) ;
CUTSCENE_OBJS [ 1 ] - > flipped = true ;
DisplayMessageBox ( 20 ) ;
} break ;
}
for ( int i = 0 ; i < 8 ; i + + ) {
CUTSCENE_FLAGS [ i ] = false ;
@ -1364,6 +1414,7 @@ public:
availablePowers . push_back ( WEATHER_POWERS [ i ] ) ;
}
}
BATTLE_PLAYER_COORDS = { PLAYER_COORDS [ 0 ] , PLAYER_COORDS [ 1 ] } ;
BATTLE_CARD_SELECTION_IND = 0 ;
BATTLE_CARD_SELECTION = availablePowers [ BATTLE_CARD_SELECTION_IND ] ;
PLAYER_SELECTED_TARGET = - 1 ;
@ -1389,11 +1440,12 @@ public:
if ( BATTLE_ENTRY_TIMER > 45 ) {
int TARGET_COORDS_X = CURRENT_ENCOUNTER . x + WIDTH / 32 / 2 ;
int TARGET_COORDS_Y = CURRENT_ENCOUNTER . y + HEIGHT / 32 / 2 ;
if ( PLAYER_COORDS [ 0 ] = = TARGET_COORDS_X & & PLAYER_COORDS [ 1 ] = = TARGET_COORDS_Y ) {
if ( PLAYER_COORDS [ 0 ] = = TARGET_COORDS_X & & PLAYER_COORDS [ 1 ] = = TARGET_COORDS_Y
& & BATTLE_PLAYER_COORDS . x = = CURRENT_ENCOUNTER . playerX & & BATTLE_PLAYER_COORDS . y = = CURRENT_ENCOUNTER . playerY ) {
BATTLE_STATE = battle : : PLAYER_SELECTION ;
clearPixelEffect ( ) ;
EFFECT_TIMER = 0 ;
} else
}
if ( PLAYER_COORDS [ 0 ] ! = TARGET_COORDS_X ) {
if ( PLAYER_COORDS [ 0 ] < TARGET_COORDS_X ) {
PLAYER_COORDS [ 0 ] + = BATTLE_CAMERA_SCROLL_SPD ;
@ -1420,6 +1472,32 @@ public:
}
}
}
if ( BATTLE_PLAYER_COORDS . x ! = CURRENT_ENCOUNTER . x + CURRENT_ENCOUNTER . playerX ) {
if ( BATTLE_PLAYER_COORDS . x < CURRENT_ENCOUNTER . x + CURRENT_ENCOUNTER . playerX ) {
BATTLE_PLAYER_COORDS . x + = BATTLE_CAMERA_SCROLL_SPD ;
if ( BATTLE_PLAYER_COORDS . x > CURRENT_ENCOUNTER . x + CURRENT_ENCOUNTER . playerX ) {
BATTLE_PLAYER_COORDS . x = CURRENT_ENCOUNTER . x + CURRENT_ENCOUNTER . playerX ;
}
} else {
BATTLE_PLAYER_COORDS . x - = BATTLE_CAMERA_SCROLL_SPD ;
if ( BATTLE_PLAYER_COORDS . x < CURRENT_ENCOUNTER . x + CURRENT_ENCOUNTER . playerX ) {
BATTLE_PLAYER_COORDS . x = CURRENT_ENCOUNTER . x + CURRENT_ENCOUNTER . playerX ;
}
}
}
if ( BATTLE_PLAYER_COORDS . y ! = CURRENT_ENCOUNTER . y + CURRENT_ENCOUNTER . playerY ) {
if ( BATTLE_PLAYER_COORDS . y < CURRENT_ENCOUNTER . y + CURRENT_ENCOUNTER . playerY ) {
BATTLE_PLAYER_COORDS . y + = BATTLE_CAMERA_SCROLL_SPD ;
if ( BATTLE_PLAYER_COORDS . y > CURRENT_ENCOUNTER . y + CURRENT_ENCOUNTER . playerY ) {
BATTLE_PLAYER_COORDS . y = CURRENT_ENCOUNTER . y + CURRENT_ENCOUNTER . playerY ;
}
} else {
BATTLE_PLAYER_COORDS . y - = BATTLE_CAMERA_SCROLL_SPD ;
if ( BATTLE_PLAYER_COORDS . y < CURRENT_ENCOUNTER . y + CURRENT_ENCOUNTER . playerY ) {
BATTLE_PLAYER_COORDS . y = CURRENT_ENCOUNTER . y + CURRENT_ENCOUNTER . playerY ;
}
}
}
}
} break ;
case battle : : WAIT_TURN_ANIMATION : {
@ -1427,7 +1505,7 @@ public:
PIXEL_EFFECT_TRANSPARENCY = 0 ;
if ( BATTLE_CURRENT_TURN_ENTITY = = - 1 ) {
if ( PLAYER_SELECTED_TARGET = = - 2 ) {
applyPixelEffect ( BATTLE_CARD_SELECTION , { PLAYER_COORDS [ 0 ] , PLAYER_COORDS [ 1 ] } , 0 ) ;
applyPixelEffect ( BATTLE_CARD_SELECTION , { CURRENT_ENCOUNTER . x + CURRENT_ENCOUNTER . playerX , CURRENT_ENCOUNTER . x + CURRENT_ENCOUNTER . playerY } , 0 ) ;
} else {
applyPixelEffect ( BATTLE_CARD_SELECTION , { ( float ) ( CURRENT_ENCOUNTER . x + CURRENT_ENCOUNTER . entities [ PLAYER_SELECTED_TARGET ] - > x ) , ( float ) ( CURRENT_ENCOUNTER . y + CURRENT_ENCOUNTER . entities [ PLAYER_SELECTED_TARGET ] - > y ) } , 0 ) ;
}
@ -1435,7 +1513,7 @@ public:
if ( CURRENT_ENCOUNTER . entities [ BATTLE_CURRENT_TURN_ENTITY ] - > selectedMove - > damage < 0 ) {
applyPixelEffect ( CURRENT_ENCOUNTER . entities [ BATTLE_CURRENT_TURN_ENTITY ] - > selectedMove , { ( float ) CURRENT_ENCOUNTER . x + CURRENT_ENCOUNTER . entities [ BATTLE_CURRENT_TURN_ENTITY ] - > x , ( float ) CURRENT_ENCOUNTER . y + CURRENT_ENCOUNTER . entities [ BATTLE_CURRENT_TURN_ENTITY ] - > y } , 0 ) ;
} else {
applyPixelEffect ( CURRENT_ENCOUNTER . entities [ BATTLE_CURRENT_TURN_ENTITY ] - > selectedMove , { PLAYER_COORDS [ 0 ] , PLAYER_COORDS [ 1 ] } , 0 ) ;
applyPixelEffect ( CURRENT_ENCOUNTER . entities [ BATTLE_CURRENT_TURN_ENTITY ] - > selectedMove , { CURRENT_ENCOUNTER . x + CURRENT_ENCOUNTER . playerX , CURRENT_ENCOUNTER . x + CURRENT_ENCOUNTER . playerY } , 0 ) ;
}
}
}
@ -1468,16 +1546,23 @@ public:
if ( FOOD_REGEN_TURNS > 0 ) {
FOOD_REGEN_TURNS - - ;
PLAYER_HP = std : : clamp ( PLAYER_HP + ( int ) ( PLAYER_MAXHP * 0.33 ) , 0 , PLAYER_MAXHP ) ;
DisplayNumber * numb = new DisplayNumber ( ( int ) ( - PLAYER_MAXHP * 0.33 ) , PLAYER_COORDS [ 0 ] , PLAYER_COORDS [ 1 ] , frameCount ) ;
DisplayNumber * numb = Create DisplayNumber( ( int ) ( - PLAYER_MAXHP * 0.33 ) , CURRENT_ENCOUNTER . x + CURRENT_ENCOUNTER . playerX , CURRENT_ENCOUNTER . x + CURRENT_ENCOUNTER . playerY , frameCount ) ;
BATTLE_DISPLAY_NUMBERS . push_back ( numb ) ;
}
if ( PLAYER_SELECTED_TARGET = = - 2 ) {
effectRadius ( { ( int ) PLAYER_COORDS [ 0 ] , ( int ) PLAYER_COORDS [ 1 ] } , ref , true ) ;
effectRadius ( { CURRENT_ENCOUNTER . x + CURRENT_ENCOUNTER . playerX , CURRENT_ENCOUNTER . x + CURRENT_ENCOUNTER . playerY } , ref , true ) ;
} else {
effectRadius ( { CURRENT_ENCOUNTER . entities [ PLAYER_SELECTED_TARGET ] - > x + CURRENT_ENCOUNTER . x , CURRENT_ENCOUNTER . entities [ PLAYER_SELECTED_TARGET ] - > y + CURRENT_ENCOUNTER . y } , ref , true ) ;
}
} else {
effectRadius ( { ( int ) PLAYER_COORDS [ 0 ] , ( int ) PLAYER_COORDS [ 1 ] } , ref , false ) ;
effectRadius ( { CURRENT_ENCOUNTER . x + CURRENT_ENCOUNTER . playerX , CURRENT_ENCOUNTER . x + CURRENT_ENCOUNTER . playerY } , ref , false ) ;
}
} else
if ( EFFECT_TIMER = = ref - > effectTime / 2 ) {
addSeeds ( ref - > seedProduction ) ;
int newSeedCount = SEEDS . size ( ) * ref - > seedScatter ;
while ( SEEDS . size ( ) < newSeedCount ) {
addSeeds ( 1 ) ;
}
}
if ( EFFECT_TIMER > ref - > effectTime ) {
@ -1526,9 +1611,12 @@ public:
break ;
}
}
PLAYER_COORDS [ 0 ] = CURRENT_ENCOUNTER . x + BATTLE_PLAYER_COORDS . x ;
PLAYER_COORDS [ 1 ] = CURRENT_ENCOUNTER . y + BATTLE_PLAYER_COORDS . y ;
BATTLE_STATE = battle : : WAIT_TURN_ANIMATION ;
PIXEL_EFFECT_TRANSPARENCY = 0 ;
EFFECT_TIMER = 0 ;
clearSeeds ( ) ;
}
}
} break ;
@ -1742,17 +1830,34 @@ public:
}
} break ;
case cutscene : : SHAKE : {
if ( frameCount % 4 = = 0 ) {
PLAYER_COORDS [ 1 ] + = 0.25 ;
} else
if ( frameCount % 4 = = 1 ) {
PLAYER_COORDS [ 1 ] + = 0.25 ;
} else
if ( frameCount % 4 = = 2 ) {
PLAYER_COORDS [ 1 ] - = 0.25 ;
} else
if ( frameCount % 4 = = 3 ) {
PLAYER_COORDS [ 1 ] - = 0.25 ;
if ( CUTSCENE_TIMER < 60 * 4 ) {
if ( frameCount % 4 = = 0 ) {
PLAYER_COORDS [ 1 ] + = 0.25 ;
} else
if ( frameCount % 4 = = 1 ) {
PLAYER_COORDS [ 1 ] + = 0.25 ;
} else
if ( frameCount % 4 = = 2 ) {
PLAYER_COORDS [ 1 ] - = 0.25 ;
} else
if ( frameCount % 4 = = 3 ) {
PLAYER_COORDS [ 1 ] - = 0.25 ;
}
} else {
StartCutscene ( cutscene : : INVESTIGATE_X_X ) ;
}
} break ;
case cutscene : : INVESTIGATE_X_X : {
if ( ! messageBoxVisible ) {
if ( ! CUTSCENE_FLAGS [ 0 ] ) {
CUTSCENE_FLAGS [ 0 ] = true ;
DisplayMessageBox ( 21 ) ;
} else {
PLAYER_COORDS [ 0 ] = CUTSCENE_OBJS [ 1 ] - > x ;
PLAYER_COORDS [ 1 ] = CUTSCENE_OBJS [ 1 ] - > y ;
EndCutscene ( ) ;
ENCOUNTERS . push_back ( ENCOUNTER_X_X ) ;
}
}
} break ;
}
@ -1833,6 +1938,12 @@ public:
}
}
} break ;
case LATER_THAT_NIGHTWAIT : {
if ( TIMER > 180 ) {
fadeOut ( ) ;
GAME_STATE = LATER_THAT_NIGHTFADEOUT ;
}
} break ;
}
if ( PIXEL_EFFECT_TRANSPARENCY > 0 ) {
@ -1933,9 +2044,20 @@ public:
meterYOffset + = ( 2 + 48 * 0.4 ) ;
}
SetDrawTarget ( 2 ) ;
DrawPartialDecal ( { ( float ) ( WIDTH / 2 - 16 + ( current_playerAnim - > flipped ? 32 : 0 ) ) , ( float ) ( HEIGHT / 2 - 16 ) } , current_playerAnim - > spr , current_playerAnim - > getCurrentFrame ( ) , { 32 , 32 } , { ( float ) ( current_playerAnim - > flipped ? - 1 : 1 ) , 1 } ) ;
if ( IN_BATTLE_ENCOUNTER ) {
const vi2d CENTER = { ( float ) ( ( BATTLE_PLAYER_COORDS . x - PLAYER_COORDS [ 0 ] ) * 32 + WIDTH / 2 + ( current_playerAnim - > flipped ? 32 : 0 ) ) , ( float ) ( ( BATTLE_PLAYER_COORDS . y - PLAYER_COORDS [ 1 ] ) * 32 + HEIGHT / 2 ) } ;
for ( int i = 0 ; i < SEEDS . size ( ) ; i + + ) {
DrawDecal ( SEEDS [ i ] - > pos + CENTER , SEED_DECAL , { 0.5 , 0.5 } ) ;
}
for ( int i = 0 ; i < TREES . size ( ) ; i + + ) {
DrawDecal ( TREES [ i ] - > pos + CENTER , TREE_DECAL , { 1 , 1 } ) ;
}
DrawPartialDecal ( { ( float ) ( ( BATTLE_PLAYER_COORDS . x - PLAYER_COORDS [ 0 ] ) * 32 + WIDTH / 2 - 16 + ( current_playerAnim - > flipped ? 32 : 0 ) ) , ( float ) ( ( BATTLE_PLAYER_COORDS . y - PLAYER_COORDS [ 1 ] ) * 32 + HEIGHT / 2 - 16 ) } , current_playerAnim - > spr , current_playerAnim - > getCurrentFrame ( ) , { 32 , 32 } , { ( float ) ( current_playerAnim - > flipped ? - 1 : 1 ) , 1 } ) ;
} else {
DrawPartialDecal ( { ( float ) ( WIDTH / 2 - 16 + ( current_playerAnim - > flipped ? 32 : 0 ) ) , ( float ) ( HEIGHT / 2 - 16 ) } , current_playerAnim - > spr , current_playerAnim - > getCurrentFrame ( ) , { 32 , 32 } , { ( float ) ( current_playerAnim - > flipped ? - 1 : 1 ) , 1 } ) ;
}
if ( IN_BATTLE_ENCOUNTER & & BATTLE_ENTRY_TIMER < 45 ) {
DrawStringDecal ( { ( float ) ( WIDTH / 2 - 16 + ( current_playerAnim - > flipped ? 32 : 0 ) + 8 ) , ( float ) ( HEIGHT / 2 - 16 - sin ( frameCount * 12 / 60.0 ) * 4 - 12 ) } , " !! " , RED ) ;
DrawStringDecal ( { ( float ) ( WIDTH / 2 - 16 ) , ( float ) ( HEIGHT / 2 - 16 - sin ( frameCount * 12 / 60.0 ) * 4 - 12 ) } , " !! " , RED ) ;
}
}
} break ;
@ -1959,7 +2081,8 @@ public:
GradientFillRectDecal ( { WIDTH / 2 , HEIGHT / 2 } , { WIDTH / 2 , HEIGHT / 2 } , { 100 , 10 , 255 , ALPHA_SCREEN2 } , { 100 , 10 , 255 , ALPHA_SCREEN1 } , { 100 , 10 , 255 , ALPHA_SCREEN1 } , { 100 , 10 , 255 , ALPHA_SCREEN1 } ) ;
} break ;
case LATER_THAT_NIGHTFADEIN :
case LATER_THAT_NIGHTFADEOUT : {
case LATER_THAT_NIGHTFADEOUT :
case LATER_THAT_NIGHTWAIT : {
DrawDecal ( { ( float ) ( WIDTH / 2 - LATER_THAT_NIGHT_DECAL - > sprite - > width / 2 ) , ( float ) ( HEIGHT / 2 - LATER_THAT_NIGHT_DECAL - > sprite - > height / 2 ) } , LATER_THAT_NIGHT_DECAL ) ;
} break ;
}
@ -1995,11 +2118,11 @@ public:
for ( int x = - 1 ; x < = 1 ; x + + ) {
for ( int y = - 1 ; y < = 1 ; y + + ) {
if ( x ! = 0 & & y ! = 0 ) {
DrawStringDecal ( { ( ( numb - > x - PLAYER_COORDS [ 0 ] ) * 32 + WIDTH / 2 ) - GetTextSize ( display ) . x / 2 + x - 8 , ( ( numb - > y - PLAYER_COORDS [ 1 ] ) * 32 + HEIGHT / 2 ) - 12 - GetTextSize ( display ) . y / 2 + y } , display , ( numb - > number > 0 ) ? Pixel ( 255 , 0 , 0 , numb - > alpha ) : Pixel ( 0 , 255 , 0 , numb - > alpha ) , { 2 , 2 } ) ;
DrawStringDecal ( { ( ( numb - > x - PLAYER_COORDS [ 0 ] ) * 32 + WIDTH / 2 ) - GetTextSize ( display ) . x * 1.3 / 2 + x - 8 , ( ( numb - > y - PLAYER_COORDS [ 1 ] ) * 32 + HEIGHT / 2 ) - 12 - GetTextSize ( display ) . y * 1.3 / 2 + y } , display , ( numb - > number > 0 ) ? Pixel ( 255 , 0 , 0 , numb - > alpha ) : Pixel ( 0 , 255 , 0 , numb - > alpha ) , { 1.3 , 1.3 } ) ;
}
}
}
DrawStringDecal ( { ( ( numb - > x - PLAYER_COORDS [ 0 ] ) * 32 + WIDTH / 2 ) - GetTextSize ( display ) . x / 2 - 8 , ( ( numb - > y - PLAYER_COORDS [ 1 ] ) * 32 + HEIGHT / 2 ) - 12 - GetTextSize ( display ) . y / 2 } , display , Pixel ( 255 , 255 , 255 , numb - > alpha ) , { 2 , 2 } ) ;
DrawStringDecal ( { ( ( numb - > x - PLAYER_COORDS [ 0 ] ) * 32 + WIDTH / 2 ) - GetTextSize ( display ) . x * 1.3 / 2 - 8 , ( ( numb - > y - PLAYER_COORDS [ 1 ] ) * 32 + HEIGHT / 2 ) - 12 - GetTextSize ( display ) . y * 1.3 / 2 } , display , Pixel ( 255 , 255 , 255 , numb - > alpha ) , { 1.3 , 1.3 } ) ;
//std::cout<<numb->x<<"/"<<numb->y<<" "<<(((numb->x-PLAYER_COORDS[0])*32+WIDTH/2)-GetTextSize(display).x/2)<<","<<(((numb->y-PLAYER_COORDS[1])*32+HEIGHT/2)-8-GetTextSize(display).y/2)<<": ("<<numb->alpha<<")"<<display<<"\n";
}
}
@ -2089,7 +2212,7 @@ public:
int targetX = - 1 , targetY = - 1 ;
for ( auto & ent : enc . entities ) {
if ( BATTLE_STATE = = battle : : PLAYER_TARGET_SELECTION & & PLAYER_SELECTED_TARGET > = 0 & & CURRENT_ENCOUNTER . entities [ PLAYER_SELECTED_TARGET ] - > hp > 0 & & CURRENT_ENCOUNTER . entities [ PLAYER_SELECTED_TARGET ] - > x = = ent - > x & & CURRENT_ENCOUNTER . entities [ PLAYER_SELECTED_TARGET ] - > y = = ent - > y ) {
DrawDecal ( { ( enc . x + ent - > x - PLAYER_COORDS [ 0 ] ) * 32 + WIDTH / 2 , ( enc . y + ent - > y - PLAYER_COORDS [ 1 ] ) * 32 + HEIGHT / 2 } , TARGETING_CIRCLE , { ( float ) ( ent - > spr - > sprite - > width / 32 ) , ( float ) ( ent - > spr - > sprite - > height / 32 ) } , { 255 , 210 , 0 , 255 } ) ;
DrawDecal ( { ( enc . x + ent - > x - PLAYER_COORDS [ 0 ] ) * 32 + WIDTH / 2 , ( enc . y + ent - > y - PLAYER_COORDS [ 1 ] ) * 32 + HEIGHT / 2 } , TARGETING_CIRCLE , { ( float ) ( ent - > spr - > sprite - > width * ent - > sprScale . x / 32 ) , ( float ) ( ent - > spr - > sprite - > height * ent - > sprScale . y / 32 ) } , { 255 , 210 , 0 , 255 } ) ;
DrawDecal ( { ( enc . x + ent - > x - PLAYER_COORDS [ 0 ] ) * 32 + WIDTH / 2 , ( enc . y + ent - > y - PLAYER_COORDS [ 1 ] ) * 32 + HEIGHT / 2 } , ent - > spr , ent - > sprScale , { ( uint8_t ) ( ( 0.5 * ( float ) sin ( frameCount * 4 / 60.0 ) + 0.5 ) * 80 + 175 ) , ( uint8_t ) ( ( 0.5 * ( float ) sin ( frameCount * 4 / 60.0 ) + 0.5 ) * 80 + 175 ) , ( uint8_t ) ( ( 0.5 * ( float ) sin ( frameCount * 4 / 60.0 ) + 0.5 ) * 80 + 175 ) , 255 } ) ;
targetX = ent - > x ; targetY = ent - > y ;
} else {
@ -2102,7 +2225,7 @@ public:
}
}
if ( targetX ! = - 1 & & targetY ! = - 1 ) {
DrawDecal ( { ( enc . x + targetX - PLAYER_COORDS [ 0 ] ) * 32 + WIDTH / 2 - BATTLE_CARD_SELECTION - > range + 16 , ( enc . y + targetY - PLAYER_COORDS [ 1 ] ) * 32 + HEIGHT / 2 - BATTLE_CARD_SELECTION - > range + 16 } , TARGETING_RANGE_CIRCLE , { ( float ) ( BATTLE_CARD_SELECTION - > range * 2 / 32.0 ) , ( float ) ( BATTLE_CARD_SELECTION - > range * 2 / 32.0 ) } , { 255 , 60 , 0 , ( uint8_t ) ( ( 0.5 * ( float ) sin ( frameCount * 4 / 60.0 ) + 0.5 ) * 100 ) } ) ;
DrawDecal ( { ( enc . x + targetX - PLAYER_COORDS [ 0 ] ) * 32 + enc . entities [ PLAYER_SELECTED_TARGET ] - > spr - > sprite - > width / 2 * enc . entities [ PLAYER_SELECTED_TARGET ] - > sprScale . x + WIDTH / 2 - BATTLE_CARD_SELECTION - > range , ( enc . y + targetY - PLAYER_COORDS [ 1 ] ) * 32 + enc . entities [ PLAYER_SELECTED_TARGET ] - > spr - > sprite - > height / 2 * enc . entities [ PLAYER_SELECTED_TARGET ] - > sprScale . y + HEIGHT / 2 - BATTLE_CARD_SELECTION - > range } , TARGETING_RANGE_CIRCLE , { ( float ) ( BATTLE_CARD_SELECTION - > range * 2 / 32.0 ) , ( float ) ( BATTLE_CARD_SELECTION - > range * 2 / 32.0 ) } , { 255 , 60 , 0 , ( uint8_t ) ( ( 0.5 * ( float ) sin ( frameCount * 4 / 60.0 ) + 0.5 ) * 100 ) } ) ;
}
}
}
@ -2194,6 +2317,7 @@ public:
}
void DisplayMessageBox ( int dialogNumber ) {
performCropUpdate ( 10 ) ;
messageBoxVisible = true ;
messageBoxCursor = 0 ;
std : : string split1 = STORY_DIALOG [ dialogNumber ] . substr ( 0 , STORY_DIALOG [ dialogNumber ] . find ( ' \n ' ) ) ; //Unused for now.
@ -2426,15 +2550,15 @@ public:
foodCount - - ;
}
PLAYER_HP = std : : clamp ( PLAYER_HP - finalDamage , 0 , PLAYER_MAXHP ) ;
DisplayNumber * numb = new DisplayNumber ( finalDamage , PLAYER_COORDS [ 0 ] , PLAYER_COORDS [ 1 ] , frameCount ) ;
DisplayNumber * numb = Create DisplayNumber( finalDamage , PLAYER_COORDS [ 0 ] , PLAYER_COORDS [ 1 ] , frameCount ) ;
BATTLE_DISPLAY_NUMBERS . push_back ( numb ) ;
} else {
for ( int i = 0 ; i < CURRENT_ENCOUNTER . entities . size ( ) ; i + + ) {
finalDamage = power - > damage + rand ( ) % power - > damageRoll * sign ( power - > damage ) ;
Entity * ent = CURRENT_ENCOUNTER . entities [ i ] ;
if ( ent - > hp > 0 & & distancetoCoords ( { ( float ) ( ( ent - > x + CURRENT_ENCOUNTER . x ) * 32 ) , ( float ) ( ( ent - > y + CURRENT_ENCOUNTER . y ) * 32 ) } , coords * 32 ) < = power - > range ) {
if ( distancetoCoords ( { ( float ) ( ( ent - > x + CURRENT_ENCOUNTER . x ) * 32 ) , ( float ) ( ( ent - > y + CURRENT_ENCOUNTER . y ) * 32 ) } , coords * 32 ) < = power - > range ) {
ent - > hp = std : : clamp ( ent - > hp - finalDamage , 0 , ent - > maxhp ) ;
DisplayNumber * numb = new DisplayNumber ( finalDamage , ent - > x + CURRENT_ENCOUNTER . x , ent - > y + CURRENT_ENCOUNTER . y , frameCount ) ;
DisplayNumber * numb = Create DisplayNumber( finalDamage , ent - > x + CURRENT_ENCOUNTER . x + ent - > spr - > sprite - > width * ent - > sprScale . x / 2 , ent - > y + CURRENT_ENCOUNTER . y + ent - > spr - > sprite - > height * ent - > sprScale . y / 2 , frameCount ) ;
BATTLE_DISPLAY_NUMBERS . push_back ( numb ) ;
ent - > damageFrame = frameCount ;
}
@ -2449,14 +2573,14 @@ public:
std : : cout < < " Distance was " < < distancetoCoords ( { ( float ) ( ( ent - > x + CURRENT_ENCOUNTER . x ) * 32 ) , ( float ) ( ( ent - > y + CURRENT_ENCOUNTER . y ) * 32 ) } , coords * 32 ) < < " \n " ;
if ( ent - > hp > 0 & & distancetoCoords ( { ( float ) ( ( ent - > x + CURRENT_ENCOUNTER . x ) * 32 ) , ( float ) ( ( ent - > y + CURRENT_ENCOUNTER . y ) * 32 ) } , coords * 32 ) < = power - > range ) {
ent - > hp = std : : clamp ( ent - > hp - finalDamage , 0 , ent - > maxhp ) ;
DisplayNumber * numb = new DisplayNumber ( finalDamage , ent - > x + CURRENT_ENCOUNTER . x , ent - > y + CURRENT_ENCOUNTER . y , frameCount ) ;
DisplayNumber * numb = Create DisplayNumber( finalDamage , ent - > x + CURRENT_ENCOUNTER . x + ent - > spr - > sprite - > width * ent - > sprScale . x / 2 , ent - > y + CURRENT_ENCOUNTER . y + ent - > spr - > sprite - > height * ent - > sprScale . y / 2 , frameCount ) ;
BATTLE_DISPLAY_NUMBERS . push_back ( numb ) ;
ent - > damageFrame = frameCount ;
}
}
} else {
PLAYER_HP = std : : clamp ( PLAYER_HP - finalDamage , 0 , PLAYER_MAXHP ) ;
DisplayNumber * numb = new DisplayNumber ( finalDamage , PLAYER_COORDS [ 0 ] , PLAYER_COORDS [ 1 ] , frameCount ) ;
DisplayNumber * numb = Create DisplayNumber( finalDamage , PLAYER_COORDS [ 0 ] , PLAYER_COORDS [ 1 ] , frameCount ) ;
BATTLE_DISPLAY_NUMBERS . push_back ( numb ) ;
}
}
@ -2762,7 +2886,8 @@ public:
bool isPriorityMove ( WEATHER_POWER * power ) {
return
power - > name . compare ( " Seed Storm " ) = = 0 | |
power - > name . compare ( " Seed of Life " ) = = 0 ;
power - > name . compare ( " Seed of Life " ) = = 0 | |
power - > name . compare ( " Petal Storm " ) = = 0 ;
}
bool isFoodMove ( WEATHER_POWER * power ) {
@ -2770,6 +2895,36 @@ public:
power - > name . compare ( " Meal " ) = = 0 | |
power - > name . compare ( " Snack " ) = = 0 ;
}
void addSeeds ( int seedCount ) {
for ( int i = 0 ; i < seedCount ; i + + ) {
SEEDS . push_back ( new Seed ( { range ( - 32 , 32 ) , range ( - 32 , 32 ) } ) ) ;
}
}
void clearSeeds ( ) {
for ( int i = 0 ; i < SEEDS . size ( ) ; i + + ) {
delete SEEDS [ i ] ;
}
SEEDS . clear ( ) ;
}
void addTrees ( int treeCount ) {
for ( int i = 0 ; i < treeCount ; i + + ) {
TREES . push_back ( new Seed ( { range ( - 64 , 64 ) , range ( - 64 , 64 ) } ) ) ;
}
}
void clearTrees ( ) {
for ( int i = 0 ; i < TREES . size ( ) ; i + + ) {
delete TREES [ i ] ;
}
TREES . clear ( ) ;
}
DisplayNumber * CreateDisplayNumber ( int numb , float x , float y , int frameCount ) {
return new DisplayNumber ( numb , x + range ( - 0.5 , 0.5 ) , y + range ( - 0.5 , 0.5 ) , frameCount ) ;
}
} ;