@ -29,6 +29,7 @@ namespace battle{
NONE ,
WAITING_FOR_CAMERA ,
PLAYER_SELECTION ,
PLAYER_TARGET_SELECTION ,
ENEMY_SELECTION ,
MOVE_RESOLUTION ,
PERFORM_TURN ,
@ -225,12 +226,13 @@ public:
std : : vector < WEATHER_POWER * > availablePowers ;
WEATHER_POWER * BATTLE_CARD_SELECTION = HAILSTORM ;
int BATTLE_CARD_SELECTION_IND = 0 ;
int PLAYER_SELECTED_TARGET = - 1 ;
Decal * DOME_DECAL , * FOOD_METER_DECAL , * OXYGEN_METER_DECAL , * PLANT_DECAL ,
* PLAYER_DECAL ,
* WEATHERNODE_EFFECT_DECAL , * POWER_HAILSTORM_DECAL , * POWER_HURRICANE_DECAL , * POWER_METEOR_SHOWER_DECAL , * POWER_METEOR_STORM_DECAL , * POWER_SNOWSTORM_DECAL ,
* SPIDEY_DECAL ;
* SPIDEY_DECAL , * TARGETING_CIRCLE , * TARGETING_RANGE_CIRCLE ;
std : : map < std : : string , ObjectLoadInfo * > BASE_OBJECTS ;
std : : vector < Encounter > ENCOUNTERS ;
Encounter ENCOUNTER_SPIDEY_1 ;
@ -255,6 +257,8 @@ public:
POWER_METEOR_STORM_DECAL = new Decal ( new Sprite ( " assets/meteor_storm.png " ) ) ;
POWER_SNOWSTORM_DECAL = new Decal ( new Sprite ( " assets/snowstorm_icon.png " ) ) ;
SPIDEY_DECAL = new Decal ( new Sprite ( " assets/spidey.png " ) ) ;
TARGETING_CIRCLE = new Decal ( new Sprite ( " assets/targetCircle.png " ) ) ;
TARGETING_RANGE_CIRCLE = new Decal ( new Sprite ( " assets/targetRange.png " ) ) ;
current_playerAnim . spr = PLAYER_DECAL ;
playerAnim . spr = PLAYER_DECAL ;
@ -380,6 +384,20 @@ public:
}
} break ;
}
switch ( BATTLE_STATE ) {
case battle : : PLAYER_SELECTION : {
BATTLE_STATE = battle : : PLAYER_TARGET_SELECTION ;
if ( PLAYER_SELECTED_TARGET = = - 1 | | CURRENT_ENCOUNTER . entities [ PLAYER_SELECTED_TARGET ] . hp < = 0 ) {
for ( int i = 0 ; i < CURRENT_ENCOUNTER . entities . size ( ) ; i + + ) {
Entity ent = CURRENT_ENCOUNTER . entities [ i ] ;
if ( ! ent . ally & & ent . hp > 0 ) {
PLAYER_SELECTED_TARGET = i ;
break ;
}
}
}
} break ;
}
}
bool OnUserUpdate ( float fElapsedTime ) override
@ -437,6 +455,26 @@ public:
BATTLE_CARD_SELECTION = availablePowers [ BATTLE_CARD_SELECTION_IND ] ;
}
} break ;
case battle : : PLAYER_TARGET_SELECTION : {
if ( GetKey ( D ) . bPressed | | GetKey ( RIGHT ) . bPressed | | GetKey ( NP6 ) . bPressed | | GetKey ( W ) . bReleased | | GetKey ( UP ) . bReleased | | GetKey ( NP8 ) . bReleased ) {
while ( true ) {
PLAYER_SELECTED_TARGET = ( PLAYER_SELECTED_TARGET + 1 ) % CURRENT_ENCOUNTER . entities . size ( ) ;
if ( CURRENT_ENCOUNTER . entities [ PLAYER_SELECTED_TARGET ] . hp > 0 ) {
break ;
}
}
}
if ( GetKey ( A ) . bPressed | | GetKey ( LEFT ) . bPressed | | GetKey ( NP4 ) . bPressed | | GetKey ( S ) . bReleased | | GetKey ( DOWN ) . bReleased | | GetKey ( NP5 ) . bReleased | | GetKey ( NP2 ) . bReleased ) {
while ( true ) {
if ( - - PLAYER_SELECTED_TARGET < 0 ) {
PLAYER_SELECTED_TARGET = CURRENT_ENCOUNTER . entities . size ( ) - 1 ;
}
if ( CURRENT_ENCOUNTER . entities [ PLAYER_SELECTED_TARGET ] . hp > 0 ) {
break ;
}
}
}
} break ;
}
}
drawGame ( ) ;
@ -623,6 +661,7 @@ public:
}
BATTLE_CARD_SELECTION_IND = 0 ;
BATTLE_CARD_SELECTION = availablePowers [ BATTLE_CARD_SELECTION_IND ] ;
PLAYER_SELECTED_TARGET = - 1 ;
}
}
}
@ -841,6 +880,12 @@ public:
DrawCard ( availablePowers [ ( BATTLE_CARD_SELECTION_IND - 1 < 0 ) ? availablePowers . size ( ) - 1 : BATTLE_CARD_SELECTION_IND - 1 ] , { - 96 , 32 } , { 0.7 , 0.7 } , 0.4 ) ;
DrawCard ( BATTLE_CARD_SELECTION ) ;
} 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 } ) ;
}
} break ;
}
if ( messageBoxVisible ) {
DrawDialogBox ( { 4 , HEIGHT - 60 } , { WIDTH / 2 , 16 } , Pixel ( 18 , 0 , 33 , 180 ) ) ;
@ -895,8 +940,18 @@ public:
}
}
for ( auto & enc : ENCOUNTERS ) {
int targetX = - 1 , targetY = - 1 ;
for ( auto & ent : enc . entities ) {
DrawDecal ( { ( enc . x + ent . x - PLAYER_COORDS [ 0 ] ) * 32 + WIDTH / 2 , ( enc . y + ent . y - PLAYER_COORDS [ 1 ] ) * 32 + HEIGHT / 2 } , ent . spr ) ;
if ( 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 , { ent . spr - > sprite - > width / 32 , 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 } , ent . spr , { 1 , 1 } , { ( 0.5 * ( float ) sin ( frameCount * 4 / 60.0 ) + 0.5 ) * 80 + 175 , ( 0.5 * ( float ) sin ( frameCount * 4 / 60.0 ) + 0.5 ) * 80 + 175 , ( 0.5 * ( float ) sin ( frameCount * 4 / 60.0 ) + 0.5 ) * 80 + 175 , 255 } ) ;
targetX = ent . x ; targetY = ent . y ;
} else {
DrawDecal ( { ( enc . x + ent . x - PLAYER_COORDS [ 0 ] ) * 32 + WIDTH / 2 , ( enc . y + ent . y - PLAYER_COORDS [ 1 ] ) * 32 + HEIGHT / 2 } , ent . spr ) ;
}
}
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 , { BATTLE_CARD_SELECTION - > range * 2 / 32.0 , BATTLE_CARD_SELECTION - > range * 2 / 32.0 } , { 255 , 60 , 0 , ( 0.5 * ( float ) sin ( frameCount * 4 / 60.0 ) + 0.5 ) * 100 } ) ;
}
}
}
@ -1040,6 +1095,27 @@ public:
PLAYER_COORDS [ 1 ] > = obj . y & & PLAYER_COORDS [ 1 ] < = obj . y + HEIGHT / 32 ;
}
void DrawWrappedText ( vf2d pos , std : : string text , int targetWidth , Pixel col , vf2d scale ) {
std : : string wrappedText ;
int marker = 0 ;
while ( marker < text . length ( ) ) {
wrappedText + = text [ marker ] ;
if ( GetTextSize ( wrappedText ) . x * scale . x > targetWidth ) {
int tempMarker = marker ;
while ( wrappedText [ tempMarker ] ! = ' ' ) {
wrappedText . erase ( tempMarker - - ) ;
}
wrappedText . erase ( tempMarker + + ) ;
wrappedText + = ' \n ' ;
while ( tempMarker < marker + 1 ) {
wrappedText + = text [ tempMarker + + ] ;
}
}
marker + + ;
}
DrawStringDecal ( pos , wrappedText , col , scale ) ;
}
void DrawWrappedPropText ( vf2d pos , std : : string text , int targetWidth , Pixel col , vf2d scale ) {
std : : string wrappedText ;
int marker = 0 ;