@ -151,6 +151,8 @@ public:
int OVERWORLD_MENU_SELECTION = 0 ;
int OVERWORLD_MENU_SELECTION = 0 ;
std : : vector < std : : string > INTERACTION_MESSAGES ;
std : : vector < std : : string > INTERACTION_MESSAGES ;
bool CLOSE_OVERWORLD_WINDOW = false ; //When set to true, should cause the overworld menu to close as well once the dialog box is closed.
bool CLOSE_OVERWORLD_WINDOW = false ; //When set to true, should cause the overworld menu to close as well once the dialog box is closed.
int OVERWORLD_POWER_SELECTION_OFFSET [ 4 ] = { 0 , 0 , 0 , 0 } ;
int OVERWORLD_POWER_SELECTION_MEMBER = 0 ;
bool MOUSE_PRESSED_DOWN = false , MOUSE_DOWN = false , MOUSE_RELEASED = false ; //TODO Implement Mouse things.
bool MOUSE_PRESSED_DOWN = false , MOUSE_DOWN = false , MOUSE_RELEASED = false ; //TODO Implement Mouse things.
@ -650,35 +652,7 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"),
switch ( BATTLE_SELECTION_CURSOR ) {
switch ( BATTLE_SELECTION_CURSOR ) {
case 0 : { //Power selected.
case 0 : { //Power selected.
BATTLE_STATE = BattleState : : POWER_SELECT ;
BATTLE_STATE = BattleState : : POWER_SELECT ;
BATTLE_MOVELIST_DISPLAY . clear ( ) ;
PopulateBattleMoveList ( - CURRENT_TURN - 1 ) ;
Entity * member = PARTY_MEMBER_STATS [ PARTY_MEMBER_ID [ - CURRENT_TURN - 1 ] ] ;
Object * obj = PARTY_MEMBER_OBJ [ - CURRENT_TURN - 1 ] ;
for ( int i = 0 ; i < member - > moveSet . size ( ) ; i + + ) {
Battle : : Move * move = member - > moveSet [ i ] ;
bool exists = false ;
for ( int j = 0 ; j < BATTLE_MOVELIST_DISPLAY . size ( ) ; j + + ) {
if ( BATTLE_MOVELIST_DISPLAY [ j ] [ 0 ] - > name . compare ( move - > name ) = = 0 ) {
bool found = false ;
for ( int k = 0 ; k < BATTLE_MOVELIST_DISPLAY [ j ] . size ( ) ; k + + ) {
if ( ADDITIONAL_FONT_VALS [ move - > grade ] < ADDITIONAL_FONT_VALS [ BATTLE_MOVELIST_DISPLAY [ j ] [ k ] - > grade ] ) {
BATTLE_MOVELIST_DISPLAY [ j ] . insert ( BATTLE_MOVELIST_DISPLAY [ j ] . begin ( ) + i , move ) ;
found = true ;
break ;
}
}
if ( ! found ) {
BATTLE_MOVELIST_DISPLAY [ j ] . push_back ( move ) ;
}
exists = true ;
break ;
}
}
if ( ! exists ) {
std : : vector < Battle : : Move * > vec ;
vec . push_back ( move ) ;
BATTLE_MOVELIST_DISPLAY . push_back ( vec ) ;
}
}
} break ;
} break ;
case 1 : { //Attack selected.
case 1 : { //Attack selected.
PARTY_MEMBER_STATS [ PARTY_MEMBER_ID [ - CURRENT_TURN - 1 ] ] - > selectedMove = MOVELIST [ BattleMoveName : : BASH ] ;
PARTY_MEMBER_STATS [ PARTY_MEMBER_ID [ - CURRENT_TURN - 1 ] ] - > selectedMove = MOVELIST [ BattleMoveName : : BASH ] ;
@ -1076,7 +1050,8 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"),
}
}
} break ;
} break ;
case 1 : { //Power is selected.
case 1 : { //Power is selected.
PopulateBattleMoveList ( 0 , true ) ;
GAME_STATE = GameState : : OVERWORLD_POWER_MENU ;
} break ;
} break ;
case 2 : { //Items is selected.
case 2 : { //Items is selected.
@ -1209,9 +1184,14 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"),
}
}
switch ( GAME_STATE ) {
switch ( GAME_STATE ) {
case GameState : : GAME_WORLD :
case GameState : : GAME_WORLD :
case GameState : : OVERWORLD_MENU : {
case GameState : : OVERWORLD_MENU :
case GameState : : OVERWORLD_POWER_MENU :
case GameState : : OVERWORLD_GRADE_MENU :
case GameState : : OVERWORLD_ITEMS_MENU :
case GameState : : OVERWORLD_EQUIP_MENU :
case GameState : : OVERWORLD_STATUS_MENU : {
DrawGameWorld ( ) ;
DrawGameWorld ( ) ;
if ( GAME_STATE = = GameState : : OVERWORLD_MENU ) {
if ( GAME_STATE ! = GameState : : GAME_WORLD ) {
SetDrawTarget ( layer : : INTERFACE ) ;
SetDrawTarget ( layer : : INTERFACE ) ;
vi2d boxPos = { 2 , 2 } ;
vi2d boxPos = { 2 , 2 } ;
DrawDialogBox ( boxPos , { ( int ) ( WIDTH * 0.25 + 4 ) , 5 * 16 + 4 } , Pixel ( 70 , 33 , 105 , 220 ) , Pixel ( 62 , 54 , 69 , 220 ) , Pixel ( 185 , 148 , 255 , 220 ) ) ;
DrawDialogBox ( boxPos , { ( int ) ( WIDTH * 0.25 + 4 ) , 5 * 16 + 4 } , Pixel ( 70 , 33 , 105 , 220 ) , Pixel ( 62 , 54 , 69 , 220 ) , Pixel ( 185 , 148 , 255 , 220 ) ) ;
@ -1220,7 +1200,10 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"),
vi2d textPos = { 12 , i * 16 + 6 } ;
vi2d textPos = { 12 , i * 16 + 6 } ;
DrawStringPropDecal ( boxPos + textPos , MENU_ITEMS [ i ] ) ;
DrawStringPropDecal ( boxPos + textPos , MENU_ITEMS [ i ] ) ;
}
}
DrawDecal ( { static_cast < float > ( 2 + 4 ) , static_cast < float > ( 2 + 6 + OVERWORLD_MENU_SELECTION * 16 ) } , SPRITES [ " cursor.png " ] ) ;
DrawDecal ( { static_cast < float > ( 2 + 4 ) , static_cast < float > ( 2 + 6 + OVERWORLD_MENU_SELECTION * 16 ) } , SPRITES [ " cursor.png " ] ) ;
}
if ( GAME_STATE = = GameState : : OVERWORLD_POWER_MENU | | GAME_STATE = = GameState : : OVERWORLD_GRADE_MENU ) {
DrawBattleMoveList ( OVERWORLD_POWER_SELECTION_OFFSET [ OVERWORLD_POWER_SELECTION_MEMBER ] ) ;
}
}
} break ;
} break ;
case GameState : : EDITOR : {
case GameState : : EDITOR : {
@ -1339,93 +1322,7 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"),
DrawDecal ( { static_cast < float > ( BATTLE_SELECTION_CURSOR / 2 * 64 + 3 ) , static_cast < float > ( 9 + ( ( BATTLE_SELECTION_CURSOR % 2 = = 0 ) ? 0 : 14 ) ) } , SPRITES [ " cursor.png " ] ) ;
DrawDecal ( { static_cast < float > ( BATTLE_SELECTION_CURSOR / 2 * 64 + 3 ) , static_cast < float > ( 9 + ( ( BATTLE_SELECTION_CURSOR % 2 = = 0 ) ? 0 : 14 ) ) } , SPRITES [ " cursor.png " ] ) ;
}
}
if ( BATTLE_STATE = = BattleState : : POWER_SELECT | | BATTLE_STATE = = BattleState : : GRADE_SELECT ) {
if ( BATTLE_STATE = = BattleState : : POWER_SELECT | | BATTLE_STATE = = BattleState : : GRADE_SELECT ) {
SetDrawTarget ( layer : : INTERFACE ) ;
DrawBattleMoveList ( - CURRENT_TURN - 1 ) ;
DrawDialogBox ( { 1 , 1 } , { ( int ) ( WIDTH / 2 ) , HEIGHT / 4 } , Pixel ( 70 , 33 , 105 , 220 ) , Pixel ( 62 , 54 , 69 , 220 ) , Pixel ( 185 , 148 , 255 , 220 ) ) ;
vd2d descBoxPos = { WIDTH - ( int ) ( WIDTH / 2.5 ) - 2 , 1 } ;
vi2d textStartingOffset = { 4 , 4 } ;
DrawDialogBox ( descBoxPos , { ( int ) ( WIDTH / 2.5 ) , HEIGHT / 4 } , Pixel ( 70 , 33 , 105 , 220 ) , Pixel ( 62 , 54 , 69 , 220 ) , Pixel ( 185 , 148 , 255 , 220 ) ) ;
DrawStringPropDecal ( descBoxPos + textStartingOffset , Wrap ( BATTLE_MOVELIST_DISPLAY [ POWER_SELECTION_CURSOR [ - CURRENT_TURN - 1 ] ] [ 0 ] - > desc , ( ( int ) ( WIDTH / 2.5 - 8 ) ) , true , { 0.8 , 0.8 } ) , WHITE , { 0.8 , 0.8 } ) ;
vd2d ppCostBoxPos = { WIDTH - WIDTH / 3 - 2 , HEIGHT / 4 + 2 } ;
DrawDialogBox ( ppCostBoxPos , { ( int ) ( WIDTH / 6 ) , HEIGHT / 8 } , Pixel ( 70 , 33 , 105 , 220 ) , Pixel ( 62 , 54 , 69 , 220 ) , Pixel ( 185 , 148 , 255 , 220 ) ) ;
DrawStringPropDecal ( ppCostBoxPos + textStartingOffset , " PP Cost " , WHITE , { 0.7 , 0.8 } ) ;
std : : string label = std : : to_string ( BATTLE_MOVELIST_DISPLAY [ POWER_SELECTION_CURSOR [ - CURRENT_TURN - 1 ] ] [ POWER_GRADE_CURSOR [ - CURRENT_TURN - 1 ] ] - > PPCost ) ;
DrawStringPropDecal ( { static_cast < float > ( ppCostBoxPos . x + textStartingOffset . x + ( WIDTH / 6 ) - 8 - GetTextSizeProp ( label ) . x * 1.5 ) , static_cast < float > ( ppCostBoxPos . y + textStartingOffset . y + 8 ) } , label , WHITE , { 1.5 , 1.5 } ) ;
vd2d damageBoxPos = { WIDTH - WIDTH / 3 + WIDTH / 6 - 1 , HEIGHT / 4 + 2 } ;
DrawDialogBox ( { WIDTH - WIDTH / 3 + WIDTH / 6 - 1 , HEIGHT / 4 + 2 } , { ( int ) ( WIDTH / 6 ) , HEIGHT / 8 } , Pixel ( 70 , 33 , 105 , 220 ) , Pixel ( 62 , 54 , 69 , 220 ) , Pixel ( 185 , 148 , 255 , 220 ) ) ;
DrawStringPropDecal ( damageBoxPos + textStartingOffset , " Damage " , WHITE , { 0.7 , 0.8 } ) ;
label = ( BATTLE_MOVELIST_DISPLAY [ POWER_SELECTION_CURSOR [ - CURRENT_TURN - 1 ] ] [ POWER_GRADE_CURSOR [ - CURRENT_TURN - 1 ] ] - > baseDmg ! = 0 ) ? std : : to_string ( BATTLE_MOVELIST_DISPLAY [ POWER_SELECTION_CURSOR [ - CURRENT_TURN - 1 ] ] [ POWER_GRADE_CURSOR [ - CURRENT_TURN - 1 ] ] - > baseDmg + PARTY_MEMBER_STATS [ - CURRENT_TURN - 1 ] - > baseAtk ) + " ~ " + std : : to_string ( BATTLE_MOVELIST_DISPLAY [ POWER_SELECTION_CURSOR [ - CURRENT_TURN - 1 ] ] [ POWER_GRADE_CURSOR [ - CURRENT_TURN - 1 ] ] - > randomDmg + BATTLE_MOVELIST_DISPLAY [ POWER_SELECTION_CURSOR [ - CURRENT_TURN - 1 ] ] [ POWER_GRADE_CURSOR [ - CURRENT_TURN - 1 ] ] - > baseDmg + PARTY_MEMBER_STATS [ - CURRENT_TURN - 1 ] - > baseAtk ) : " N/A " ;
DrawStringPropDecal ( { static_cast < float > ( damageBoxPos . x + textStartingOffset . x + ( WIDTH / 6 ) - 8 - GetTextSizeProp ( label ) . x * ( std : : min ( ( double ) ( ( WIDTH / 6 ) - 8 ) / GetTextSizeProp ( label ) . x , 1.5 ) ) ) , static_cast < float > ( damageBoxPos . y + textStartingOffset . y + 8 ) } , label , WHITE , { static_cast < float > ( std : : min ( ( double ) ( ( WIDTH / 6 ) - 8 ) / GetTextSizeProp ( label ) . x , 1.5 ) ) , 1.5 } ) ;
vd2d rangeBoxPos = { WIDTH - WIDTH / 3 + WIDTH / 6 - 1 , HEIGHT / 4 + HEIGHT / 8 + 3 } ;
DrawDialogBox ( { WIDTH - WIDTH / 3 + WIDTH / 6 - 1 , HEIGHT / 4 + HEIGHT / 8 + 3 } , { ( int ) ( WIDTH / 6 ) , HEIGHT / 8 } , Pixel ( 70 , 33 , 105 , 220 ) , Pixel ( 62 , 54 , 69 , 220 ) , Pixel ( 185 , 148 , 255 , 220 ) ) ;
DrawStringPropDecal ( rangeBoxPos + textStartingOffset , " Range " , WHITE , { 0.7 , 0.8 } ) ;
label = std : : to_string ( BATTLE_MOVELIST_DISPLAY [ POWER_SELECTION_CURSOR [ - CURRENT_TURN - 1 ] ] [ POWER_GRADE_CURSOR [ - CURRENT_TURN - 1 ] ] - > range ) ;
DrawStringPropDecal ( { static_cast < float > ( rangeBoxPos . x + textStartingOffset . x + ( WIDTH / 6 ) - 8 - GetTextSizeProp ( label ) . x * ( std : : min ( ( double ) ( ( WIDTH / 6 ) - 8 ) / GetTextSizeProp ( label ) . x , 1.5 ) ) ) , static_cast < float > ( rangeBoxPos . y + textStartingOffset . y + 8 ) } , label , WHITE , { static_cast < float > ( std : : min ( ( double ) ( ( WIDTH / 6 ) - 8 ) / GetTextSizeProp ( label ) . x , 1.5 ) ) , 1.5 } ) ;
vd2d channelTimeBoxPos = { WIDTH - WIDTH / 3 - 1 , HEIGHT / 4 + HEIGHT / 8 + 3 } ;
DrawDialogBox ( { WIDTH - WIDTH / 3 - 1 , HEIGHT / 4 + HEIGHT / 8 + 3 } , { ( int ) ( WIDTH / 6 ) , HEIGHT / 8 } , Pixel ( 70 , 33 , 105 , 220 ) , Pixel ( 62 , 54 , 69 , 220 ) , Pixel ( 185 , 148 , 255 , 220 ) ) ;
DrawStringPropDecal ( channelTimeBoxPos + textStartingOffset , " Cast " , WHITE , { 0.7 , 0.8 } ) ;
label = std : : to_string ( ( float ) BATTLE_MOVELIST_DISPLAY [ POWER_SELECTION_CURSOR [ - CURRENT_TURN - 1 ] ] [ POWER_GRADE_CURSOR [ - CURRENT_TURN - 1 ] ] - > channelTime / 60 ) . erase ( 3 ) ;
DrawStringPropDecal ( { static_cast < float > ( channelTimeBoxPos . x + textStartingOffset . x + ( WIDTH / 6 ) - 8 - GetTextSizeProp ( label ) . x * ( std : : min ( ( double ) ( ( WIDTH / 6 ) - 8 ) / GetTextSizeProp ( label ) . x , 1.5 ) ) ) , static_cast < float > ( channelTimeBoxPos . y + textStartingOffset . y + 8 ) } , label , WHITE , { static_cast < float > ( std : : min ( ( double ) ( ( WIDTH / 6 ) - 8 ) / GetTextSizeProp ( label ) . x , 1.5 ) ) , 1.5 } ) ;
int counter = 0 ;
int displayLimit = 0 ;
for ( int i = 0 ; i < BATTLE_MOVELIST_DISPLAY . size ( ) ; i + + ) {
if ( counter > = POWER_SELECTION_OFFSET [ - CURRENT_TURN - 1 ] & & counter < = POWER_SELECTION_OFFSET [ - CURRENT_TURN - 1 ] + 3 ) {
int displayYOffset = - POWER_SELECTION_OFFSET [ - CURRENT_TURN - 1 ] * 12 ;
std : : vector < Battle : : Move * > moves = BATTLE_MOVELIST_DISPLAY [ i ] ;
std : : string name = moves [ 0 ] - > name ;
if ( GetTextSizeProp ( name ) . x > WIDTH / 4 ) {
DrawStringPropDecal ( { 12 , static_cast < float > ( 12 * counter + 8 + displayYOffset ) } , name , WHITE , { ( WIDTH / 4 ) / ( float ) GetTextSizeProp ( name ) . x , 1 } ) ;
} else {
DrawStringPropDecal ( { 12 , static_cast < float > ( 12 * counter + 8 + displayYOffset ) } , name ) ;
}
for ( int i = 0 ; i < moves . size ( ) ; i + + ) {
Pixel drawCol ;
if ( BATTLE_STATE = = BattleState : : GRADE_SELECT & & POWER_SELECTION_CURSOR [ - CURRENT_TURN - 1 ] = = counter ) {
if ( POWER_GRADE_CURSOR [ - CURRENT_TURN - 1 ] = = i ) {
if ( PARTY_MEMBER_STATS [ PARTY_MEMBER_ID [ - CURRENT_TURN - 1 ] ] - > GetPP ( ) > = moves [ i ] - > PPCost ) {
drawCol = WHITE ;
} else {
drawCol = RED ;
}
} else {
if ( PARTY_MEMBER_STATS [ PARTY_MEMBER_ID [ - CURRENT_TURN - 1 ] ] - > GetPP ( ) > = moves [ i ] - > PPCost ) {
drawCol = DARK_GREY ;
} else {
drawCol = DARK_RED ;
}
}
} else {
drawCol = WHITE ;
if ( PARTY_MEMBER_STATS [ PARTY_MEMBER_ID [ - CURRENT_TURN - 1 ] ] - > GetPP ( ) > = moves [ i ] - > PPCost ) {
drawCol = WHITE ;
} else {
drawCol = RED ;
}
}
DrawFancyStringDecal ( { static_cast < float > ( 8 + WIDTH / 4 + 12 + i * 8 ) , static_cast < float > ( 12 * counter + 8 + displayYOffset ) } , std : : wstring ( 1 , moves [ i ] - > grade ) , drawCol ) ;
}
}
+ + counter ;
}
if ( BATTLE_STATE = = BattleState : : POWER_SELECT ) {
DrawDecal ( { 4 , static_cast < float > ( 12 * ( POWER_SELECTION_CURSOR [ - CURRENT_TURN - 1 ] - POWER_SELECTION_OFFSET [ - CURRENT_TURN - 1 ] ) + 8 ) } , SPRITES [ " cursor.png " ] ) ;
} else {
DrawDecal ( { ( float ) ( WIDTH / 4 + 4 + POWER_GRADE_CURSOR [ - CURRENT_TURN - 1 ] * 8 + 8 ) , static_cast < float > ( 12 * ( POWER_SELECTION_CURSOR [ - CURRENT_TURN - 1 ] - POWER_SELECTION_OFFSET [ - CURRENT_TURN - 1 ] ) + 8 ) } , SPRITES [ " cursor.png " ] ) ;
}
if ( BATTLE_MOVELIST_DISPLAY . size ( ) > 4 ) {
if ( POWER_SELECTION_OFFSET [ - CURRENT_TURN - 1 ] > 0 ) {
DrawRotatedDecal ( { WIDTH / 2 - 16 , 7 } , SPRITES [ " cursor.png " ] , - M_PI_2 , { 4 , 4 } ) ;
}
if ( POWER_SELECTION_OFFSET [ - CURRENT_TURN - 1 ] + 3 < BATTLE_MOVELIST_DISPLAY . size ( ) - 1 ) {
DrawRotatedDecal ( { WIDTH / 2 - 16 , HEIGHT / 4 - 7 } , SPRITES [ " cursor.png " ] , M_PI_2 , { 4 , 4 } ) ;
}
}
}
}
if ( BATTLE_STATE = = BattleState : : TARGET_SELECT ) {
if ( BATTLE_STATE = = BattleState : : TARGET_SELECT ) {
SetDrawTarget ( layer : : GROUND ) ;
SetDrawTarget ( layer : : GROUND ) ;
@ -2033,10 +1930,10 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"),
MOVELIST [ BattleMoveName : : PKSHIELD_B ] = new Battle : : Move { " PK Shield " , " Protects against physical attacks. " , BETA , baseDmg : 0 , randomDmg : 0 , PPCost : 20 , range : 1 , channelTime : 0 , friendly : true , composition : { 0 , 0 , 20 , 0 } } ;
MOVELIST [ BattleMoveName : : PKSHIELD_B ] = new Battle : : Move { " PK Shield " , " Protects against physical attacks. " , BETA , baseDmg : 0 , randomDmg : 0 , PPCost : 20 , range : 1 , channelTime : 0 , friendly : true , composition : { 0 , 0 , 20 , 0 } } ;
MOVELIST [ BattleMoveName : : PKSHIELD_O ] = new Battle : : Move { " PK Shield " , " Protects against physical attacks. " , OMEGA , baseDmg : 0 , randomDmg : 0 , PPCost : 59 , range : 4 , channelTime : 0 , friendly : true , composition : { 0 , 0 , 20 , 0 } } ;
MOVELIST [ BattleMoveName : : PKSHIELD_O ] = new Battle : : Move { " PK Shield " , " Protects against physical attacks. " , OMEGA , baseDmg : 0 , randomDmg : 0 , PPCost : 59 , range : 4 , channelTime : 0 , friendly : true , composition : { 0 , 0 , 20 , 0 } } ;
MOVELIST [ BattleMoveName : : PKSHIELD_S ] = new Battle : : Move { " PK Shield " , " Protects against physical attacks. " , SIGMA , baseDmg : 0 , randomDmg : 0 , PPCost : 80 , range : 10 , channelTime : 0 , friendly : true , composition : { 0 , 0 , 20 , 0 } } ;
MOVELIST [ BattleMoveName : : PKSHIELD_S ] = new Battle : : Move { " PK Shield " , " Protects against physical attacks. " , SIGMA , baseDmg : 0 , randomDmg : 0 , PPCost : 80 , range : 10 , channelTime : 0 , friendly : true , composition : { 0 , 0 , 20 , 0 } } ;
MOVELIST [ BattleMoveName : : PKLIFEUP_A ] = new Battle : : Move { " PK Lifeup " , " Restores a small amount of health. " , ALPHA , baseDmg : 80 , randomDmg : 10 , PPCost : 4 , range : 1 , channelTime : 0 , friendly : true , composition : { 0 , 0 , 20 , 0 } } ;
MOVELIST [ BattleMoveName : : PKLIFEUP_A ] = new Battle : : Move { " PK Lifeup " , " Restores a small amount of health. " , ALPHA , baseDmg : 80 , randomDmg : 10 , PPCost : 4 , range : 1 , channelTime : 0 , friendly : true , composition : { 0 , 0 , 20 , 0 } , overworld : true } ;
MOVELIST [ BattleMoveName : : PKLIFEUP_B ] = new Battle : : Move { " PK Lifeup " , " Restores a moderate amount of health. " , BETA , baseDmg : 240 , randomDmg : 60 , PPCost : 9 , range : 1 , channelTime : 0 , friendly : true , composition : { 0 , 0 , 20 , 0 } } ;
MOVELIST [ BattleMoveName : : PKLIFEUP_B ] = new Battle : : Move { " PK Lifeup " , " Restores a moderate amount of health. " , BETA , baseDmg : 240 , randomDmg : 60 , PPCost : 9 , range : 1 , channelTime : 0 , friendly : true , composition : { 0 , 0 , 20 , 0 } , overworld : true } ;
MOVELIST [ BattleMoveName : : PKLIFEUP_G ] = new Battle : : Move { " PK Lifeup " , " Restores a large amount of health. " , GAMMA , baseDmg : 400 , randomDmg : 50 , PPCost : 21 , range : 3 , channelTime : 0 , friendly : true , composition : { 0 , 0 , 20 , 0 } } ;
MOVELIST [ BattleMoveName : : PKLIFEUP_G ] = new Battle : : Move { " PK Lifeup " , " Restores a large amount of health. " , GAMMA , baseDmg : 400 , randomDmg : 50 , PPCost : 21 , range : 3 , channelTime : 0 , friendly : true , composition : { 0 , 0 , 20 , 0 } , overworld : true } ;
MOVELIST [ BattleMoveName : : PKLIFEUP_O ] = new Battle : : Move { " PK Lifeup " , " Restores a great amount of health to all allies. " , OMEGA , baseDmg : 800 , randomDmg : 100 , PPCost : 64 , range : 6 , channelTime : 0 , friendly : true , composition : { 0 , 0 , 20 , 0 } } ;
MOVELIST [ BattleMoveName : : PKLIFEUP_O ] = new Battle : : Move { " PK Lifeup " , " Restores a great amount of health to all allies. " , OMEGA , baseDmg : 800 , randomDmg : 100 , PPCost : 64 , range : 6 , channelTime : 0 , friendly : true , composition : { 0 , 0 , 20 , 0 } , overworld : true } ;
MOVELIST [ BattleMoveName : : PKFUN_A ] = new Battle : : Move { " PK Fun " , " A very fun barrage. Hits for large damage. " , ALPHA , baseDmg : 100 , randomDmg : 10 , PPCost : 15 , range : 6 , channelTime : 0 , friendly : false , composition : { 0 , 0 , 20 , 0 } , L " $USER uses $POWER " , FOUNTAIN_EFFECT } ;
MOVELIST [ BattleMoveName : : PKFUN_A ] = new Battle : : Move { " PK Fun " , " A very fun barrage. Hits for large damage. " , ALPHA , baseDmg : 100 , randomDmg : 10 , PPCost : 15 , range : 6 , channelTime : 0 , friendly : false , composition : { 0 , 0 , 20 , 0 } , L " $USER uses $POWER " , FOUNTAIN_EFFECT } ;
MOVELIST [ BattleMoveName : : PKFUN_B ] = new Battle : : Move { " PK Fun " , " A very fun barrage. Hits for large damage. " , BETA , baseDmg : 240 , randomDmg : 40 , PPCost : 30 , range : 6 , channelTime : 0 , friendly : false , composition : { 0 , 0 , 20 , 0 } , L " $USER uses $POWER " , FOUNTAIN_EFFECT } ;
MOVELIST [ BattleMoveName : : PKFUN_B ] = new Battle : : Move { " PK Fun " , " A very fun barrage. Hits for large damage. " , BETA , baseDmg : 240 , randomDmg : 40 , PPCost : 30 , range : 6 , channelTime : 0 , friendly : false , composition : { 0 , 0 , 20 , 0 } , L " $USER uses $POWER " , FOUNTAIN_EFFECT } ;
MOVELIST [ BattleMoveName : : PKFUN_G ] = new Battle : : Move { " PK Fun " , " A very fun barrage. Hits for large damage. " , GAMMA , baseDmg : 360 , randomDmg : 80 , PPCost : 45 , range : 7 , channelTime : 0 , friendly : false , composition : { 0 , 0 , 20 , 0 } , L " $USER uses $POWER " , FOUNTAIN_EFFECT } ;
MOVELIST [ BattleMoveName : : PKFUN_G ] = new Battle : : Move { " PK Fun " , " A very fun barrage. Hits for large damage. " , GAMMA , baseDmg : 360 , randomDmg : 80 , PPCost : 45 , range : 7 , channelTime : 0 , friendly : false , composition : { 0 , 0 , 20 , 0 } , L " $USER uses $POWER " , FOUNTAIN_EFFECT } ;
@ -3690,6 +3587,131 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"),
}
}
return label ;
return label ;
}
}
void PopulateBattleMoveList ( int partyMemberSlot , bool overworld = false ) {
BATTLE_MOVELIST_DISPLAY . clear ( ) ;
Entity * member = PARTY_MEMBER_STATS [ PARTY_MEMBER_ID [ partyMemberSlot ] ] ;
for ( int i = 0 ; i < member - > moveSet . size ( ) ; i + + ) {
Battle : : Move * move = member - > moveSet [ i ] ;
if ( overworld & & move - > overworld | | ! overworld ) {
bool exists = false ;
for ( int j = 0 ; j < BATTLE_MOVELIST_DISPLAY . size ( ) ; j + + ) {
if ( BATTLE_MOVELIST_DISPLAY [ j ] [ 0 ] - > name . compare ( move - > name ) = = 0 ) {
bool found = false ;
for ( int k = 0 ; k < BATTLE_MOVELIST_DISPLAY [ j ] . size ( ) ; k + + ) {
if ( ADDITIONAL_FONT_VALS [ move - > grade ] < ADDITIONAL_FONT_VALS [ BATTLE_MOVELIST_DISPLAY [ j ] [ k ] - > grade ] ) {
BATTLE_MOVELIST_DISPLAY [ j ] . insert ( BATTLE_MOVELIST_DISPLAY [ j ] . begin ( ) + i , move ) ;
found = true ;
break ;
}
}
if ( ! found ) {
BATTLE_MOVELIST_DISPLAY [ j ] . push_back ( move ) ;
}
exists = true ;
break ;
}
}
if ( ! exists ) {
std : : vector < Battle : : Move * > vec ;
vec . push_back ( move ) ;
BATTLE_MOVELIST_DISPLAY . push_back ( vec ) ;
}
}
}
}
void DrawBattleMoveList ( int partyMemberSlot ) {
SetDrawTarget ( layer : : INTERFACE ) ;
DrawDialogBox ( { 1 , 1 } , { ( int ) ( WIDTH / 2 ) , HEIGHT / 4 } , Pixel ( 70 , 33 , 105 , 220 ) , Pixel ( 62 , 54 , 69 , 220 ) , Pixel ( 185 , 148 , 255 , 220 ) ) ;
vd2d descBoxPos = { WIDTH - ( int ) ( WIDTH / 2.5 ) - 2 , 1 } ;
vi2d textStartingOffset = { 4 , 4 } ;
DrawDialogBox ( descBoxPos , { ( int ) ( WIDTH / 2.5 ) , HEIGHT / 4 } , Pixel ( 70 , 33 , 105 , 220 ) , Pixel ( 62 , 54 , 69 , 220 ) , Pixel ( 185 , 148 , 255 , 220 ) ) ;
DrawStringPropDecal ( descBoxPos + textStartingOffset , Wrap ( BATTLE_MOVELIST_DISPLAY [ POWER_SELECTION_CURSOR [ partyMemberSlot ] ] [ 0 ] - > desc , ( ( int ) ( WIDTH / 2.5 - 8 ) ) , true , { 0.8 , 0.8 } ) , WHITE , { 0.8 , 0.8 } ) ;
vd2d ppCostBoxPos = { WIDTH - WIDTH / 3 - 2 , HEIGHT / 4 + 2 } ;
DrawDialogBox ( ppCostBoxPos , { ( int ) ( WIDTH / 6 ) , HEIGHT / 8 } , Pixel ( 70 , 33 , 105 , 220 ) , Pixel ( 62 , 54 , 69 , 220 ) , Pixel ( 185 , 148 , 255 , 220 ) ) ;
DrawStringPropDecal ( ppCostBoxPos + textStartingOffset , " PP Cost " , WHITE , { 0.7 , 0.8 } ) ;
std : : string label = std : : to_string ( BATTLE_MOVELIST_DISPLAY [ POWER_SELECTION_CURSOR [ partyMemberSlot ] ] [ POWER_GRADE_CURSOR [ partyMemberSlot ] ] - > PPCost ) ;
DrawStringPropDecal ( { static_cast < float > ( ppCostBoxPos . x + textStartingOffset . x + ( WIDTH / 6 ) - 8 - GetTextSizeProp ( label ) . x * 1.5 ) , static_cast < float > ( ppCostBoxPos . y + textStartingOffset . y + 8 ) } , label , WHITE , { 1.5 , 1.5 } ) ;
vd2d damageBoxPos = { WIDTH - WIDTH / 3 + WIDTH / 6 - 1 , HEIGHT / 4 + 2 } ;
DrawDialogBox ( { WIDTH - WIDTH / 3 + WIDTH / 6 - 1 , HEIGHT / 4 + 2 } , { ( int ) ( WIDTH / 6 ) , HEIGHT / 8 } , Pixel ( 70 , 33 , 105 , 220 ) , Pixel ( 62 , 54 , 69 , 220 ) , Pixel ( 185 , 148 , 255 , 220 ) ) ;
DrawStringPropDecal ( damageBoxPos + textStartingOffset , " Damage " , WHITE , { 0.7 , 0.8 } ) ;
label = ( BATTLE_MOVELIST_DISPLAY [ POWER_SELECTION_CURSOR [ partyMemberSlot ] ] [ POWER_GRADE_CURSOR [ partyMemberSlot ] ] - > baseDmg ! = 0 ) ? std : : to_string ( BATTLE_MOVELIST_DISPLAY [ POWER_SELECTION_CURSOR [ partyMemberSlot ] ] [ POWER_GRADE_CURSOR [ partyMemberSlot ] ] - > baseDmg + PARTY_MEMBER_STATS [ partyMemberSlot ] - > baseAtk ) + " ~ " + std : : to_string ( BATTLE_MOVELIST_DISPLAY [ POWER_SELECTION_CURSOR [ partyMemberSlot ] ] [ POWER_GRADE_CURSOR [ partyMemberSlot ] ] - > randomDmg + BATTLE_MOVELIST_DISPLAY [ POWER_SELECTION_CURSOR [ partyMemberSlot ] ] [ POWER_GRADE_CURSOR [ partyMemberSlot ] ] - > baseDmg + PARTY_MEMBER_STATS [ partyMemberSlot ] - > baseAtk ) : " N/A " ;
DrawStringPropDecal ( { static_cast < float > ( damageBoxPos . x + textStartingOffset . x + ( WIDTH / 6 ) - 8 - GetTextSizeProp ( label ) . x * ( std : : min ( ( double ) ( ( WIDTH / 6 ) - 8 ) / GetTextSizeProp ( label ) . x , 1.5 ) ) ) , static_cast < float > ( damageBoxPos . y + textStartingOffset . y + 8 ) } , label , WHITE , { static_cast < float > ( std : : min ( ( double ) ( ( WIDTH / 6 ) - 8 ) / GetTextSizeProp ( label ) . x , 1.5 ) ) , 1.5 } ) ;
if ( BATTLE_ENCOUNTER ! = nullptr ) {
vd2d rangeBoxPos = { WIDTH - WIDTH / 3 + WIDTH / 6 - 1 , HEIGHT / 4 + HEIGHT / 8 + 3 } ;
DrawDialogBox ( { WIDTH - WIDTH / 3 + WIDTH / 6 - 1 , HEIGHT / 4 + HEIGHT / 8 + 3 } , { ( int ) ( WIDTH / 6 ) , HEIGHT / 8 } , Pixel ( 70 , 33 , 105 , 220 ) , Pixel ( 62 , 54 , 69 , 220 ) , Pixel ( 185 , 148 , 255 , 220 ) ) ;
DrawStringPropDecal ( rangeBoxPos + textStartingOffset , " Range " , WHITE , { 0.7 , 0.8 } ) ;
label = std : : to_string ( BATTLE_MOVELIST_DISPLAY [ POWER_SELECTION_CURSOR [ partyMemberSlot ] ] [ POWER_GRADE_CURSOR [ partyMemberSlot ] ] - > range ) ;
DrawStringPropDecal ( { static_cast < float > ( rangeBoxPos . x + textStartingOffset . x + ( WIDTH / 6 ) - 8 - GetTextSizeProp ( label ) . x * ( std : : min ( ( double ) ( ( WIDTH / 6 ) - 8 ) / GetTextSizeProp ( label ) . x , 1.5 ) ) ) , static_cast < float > ( rangeBoxPos . y + textStartingOffset . y + 8 ) } , label , WHITE , { static_cast < float > ( std : : min ( ( double ) ( ( WIDTH / 6 ) - 8 ) / GetTextSizeProp ( label ) . x , 1.5 ) ) , 1.5 } ) ;
}
if ( BATTLE_ENCOUNTER ! = nullptr ) {
vd2d channelTimeBoxPos = { WIDTH - WIDTH / 3 - 1 , HEIGHT / 4 + HEIGHT / 8 + 3 } ;
DrawDialogBox ( { WIDTH - WIDTH / 3 - 1 , HEIGHT / 4 + HEIGHT / 8 + 3 } , { ( int ) ( WIDTH / 6 ) , HEIGHT / 8 } , Pixel ( 70 , 33 , 105 , 220 ) , Pixel ( 62 , 54 , 69 , 220 ) , Pixel ( 185 , 148 , 255 , 220 ) ) ;
DrawStringPropDecal ( channelTimeBoxPos + textStartingOffset , " Cast " , WHITE , { 0.7 , 0.8 } ) ;
label = std : : to_string ( ( float ) BATTLE_MOVELIST_DISPLAY [ POWER_SELECTION_CURSOR [ partyMemberSlot ] ] [ POWER_GRADE_CURSOR [ partyMemberSlot ] ] - > channelTime / 60 ) . erase ( 3 ) ;
DrawStringPropDecal ( { static_cast < float > ( channelTimeBoxPos . x + textStartingOffset . x + ( WIDTH / 6 ) - 8 - GetTextSizeProp ( label ) . x * ( std : : min ( ( double ) ( ( WIDTH / 6 ) - 8 ) / GetTextSizeProp ( label ) . x , 1.5 ) ) ) , static_cast < float > ( channelTimeBoxPos . y + textStartingOffset . y + 8 ) } , label , WHITE , { static_cast < float > ( std : : min ( ( double ) ( ( WIDTH / 6 ) - 8 ) / GetTextSizeProp ( label ) . x , 1.5 ) ) , 1.5 } ) ;
}
int counter = 0 ;
int displayLimit = 0 ;
for ( int i = 0 ; i < BATTLE_MOVELIST_DISPLAY . size ( ) ; i + + ) {
if ( counter > = POWER_SELECTION_OFFSET [ partyMemberSlot ] & & counter < = POWER_SELECTION_OFFSET [ partyMemberSlot ] + 3 ) {
int displayYOffset = - POWER_SELECTION_OFFSET [ partyMemberSlot ] * 12 ;
std : : vector < Battle : : Move * > moves = BATTLE_MOVELIST_DISPLAY [ i ] ;
std : : string name = moves [ 0 ] - > name ;
if ( GetTextSizeProp ( name ) . x > WIDTH / 4 ) {
DrawStringPropDecal ( { 12 , static_cast < float > ( 12 * counter + 8 + displayYOffset ) } , name , WHITE , { ( WIDTH / 4 ) / ( float ) GetTextSizeProp ( name ) . x , 1 } ) ;
} else {
DrawStringPropDecal ( { 12 , static_cast < float > ( 12 * counter + 8 + displayYOffset ) } , name ) ;
}
for ( int i = 0 ; i < moves . size ( ) ; i + + ) {
Pixel drawCol ;
if ( ( GAME_STATE = = GameState : : OVERWORLD_GRADE_MENU | | BATTLE_STATE = = BattleState : : GRADE_SELECT ) & & POWER_SELECTION_CURSOR [ partyMemberSlot ] = = counter ) {
if ( POWER_GRADE_CURSOR [ partyMemberSlot ] = = i ) {
if ( PARTY_MEMBER_STATS [ PARTY_MEMBER_ID [ partyMemberSlot ] ] - > GetPP ( ) > = moves [ i ] - > PPCost ) {
drawCol = WHITE ;
} else {
drawCol = RED ;
}
} else {
if ( PARTY_MEMBER_STATS [ PARTY_MEMBER_ID [ partyMemberSlot ] ] - > GetPP ( ) > = moves [ i ] - > PPCost ) {
drawCol = DARK_GREY ;
} else {
drawCol = DARK_RED ;
}
}
} else {
drawCol = WHITE ;
if ( PARTY_MEMBER_STATS [ PARTY_MEMBER_ID [ partyMemberSlot ] ] - > GetPP ( ) > = moves [ i ] - > PPCost ) {
drawCol = WHITE ;
} else {
drawCol = RED ;
}
}
DrawFancyStringDecal ( { static_cast < float > ( 8 + WIDTH / 4 + 12 + i * 8 ) , static_cast < float > ( 12 * counter + 8 + displayYOffset ) } , std : : wstring ( 1 , moves [ i ] - > grade ) , drawCol ) ;
}
}
+ + counter ;
}
if ( BATTLE_STATE = = BattleState : : POWER_SELECT | | GAME_STATE = = GameState : : OVERWORLD_POWER_MENU ) {
DrawDecal ( { 4 , static_cast < float > ( 12 * ( POWER_SELECTION_CURSOR [ partyMemberSlot ] - POWER_SELECTION_OFFSET [ partyMemberSlot ] ) + 8 ) } , SPRITES [ " cursor.png " ] ) ;
} else {
DrawDecal ( { ( float ) ( WIDTH / 4 + 4 + POWER_GRADE_CURSOR [ partyMemberSlot ] * 8 + 8 ) , static_cast < float > ( 12 * ( POWER_SELECTION_CURSOR [ partyMemberSlot ] - POWER_SELECTION_OFFSET [ partyMemberSlot ] ) + 8 ) } , SPRITES [ " cursor.png " ] ) ;
}
if ( BATTLE_MOVELIST_DISPLAY . size ( ) > 4 ) {
if ( POWER_SELECTION_OFFSET [ partyMemberSlot ] > 0 ) {
DrawRotatedDecal ( { WIDTH / 2 - 16 , 7 } , SPRITES [ " cursor.png " ] , - M_PI_2 , { 4 , 4 } ) ;
}
if ( POWER_SELECTION_OFFSET [ partyMemberSlot ] + 3 < BATTLE_MOVELIST_DISPLAY . size ( ) - 1 ) {
DrawRotatedDecal ( { WIDTH / 2 - 16 , HEIGHT / 4 - 7 } , SPRITES [ " cursor.png " ] , M_PI_2 , { 4 , 4 } ) ;
}
}
}
} ;
} ;
int main ( )
int main ( )