Implemented use of recovery and consumable items in the overworld.

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
master
sigonasr2 2 years ago
parent 79321dc127
commit fc1bdfd4d3
  1. BIN
      C++ProjectTemplate
  2. 138
      main.cpp

Binary file not shown.

@ -161,6 +161,7 @@ public:
bool HEALING_OVERWORLD_MEMBERS=false; //When set to true, members will be healed as dialog boxes are closed using the HEALING_OVERWORLD_MEMBER variable. bool HEALING_OVERWORLD_MEMBERS=false; //When set to true, members will be healed as dialog boxes are closed using the HEALING_OVERWORLD_MEMBER variable.
int HEALING_OVERWORLD_MEMBER=0; int HEALING_OVERWORLD_MEMBER=0;
bool HEALING_OVERWORLD_SINGLE_MEMBER=false; //When set to true, a single member is being healed. bool HEALING_OVERWORLD_SINGLE_MEMBER=false; //When set to true, a single member is being healed.
bool OVERWORLD_ITEM_BEING_USED=false; //When set to true, we need to equip an item after target selected.
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.
@ -1100,7 +1101,7 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"),
} }
}break; }break;
case 2:{//Items is selected. case 2:{//Items is selected.
GAME_STATE=GameState::OVERWORLD_ITEMS_MENU;
}break; }break;
case 3:{//Equip is selected. case 3:{//Equip is selected.
@ -1228,10 +1229,89 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"),
PARTY_MEMBER_OBJ[OVERWORLD_TARGET_SELECTION]->highlighted=true; PARTY_MEMBER_OBJ[OVERWORLD_TARGET_SELECTION]->highlighted=true;
} }
if (UpPressed()){ if (UpPressed()){
if (OVERWORLD_ITEM_BEING_USED) {
GAME_STATE=GameState::OVERWORLD_ITEMS_MENU;
} else {
GAME_STATE=GameState::OVERWORLD_GRADE_MENU; GAME_STATE=GameState::OVERWORLD_GRADE_MENU;
}
PARTY_MEMBER_OBJ[OVERWORLD_TARGET_SELECTION]->highlighted=false; PARTY_MEMBER_OBJ[OVERWORLD_TARGET_SELECTION]->highlighted=false;
} }
if (ACTIONKEYPRESSED) { if (ACTIONKEYPRESSED) {
if (OVERWORLD_ITEM_BEING_USED) { //Equipping an item.
int prevPartyInvenSize=PARTY_INVENTORY.size();
if (PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->stats.equip!=EquipSlot::NONE) {
PARTY_MEMBER_STATS[PARTY_MEMBER_ID[OVERWORLD_TARGET_SELECTION]]->EquipItem(ITEM_SELECTION_CURSOR);
GAME_STATE=GameState::OVERWORLD_ITEMS_MENU;
PARTY_MEMBER_OBJ[OVERWORLD_TARGET_SELECTION]->highlighted=true;
} else
if (PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->stats.consumable!=Consumable::NOT_A_CONSUMABLE) {
if (PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->stats.consumable==Consumable::FRIENDLY||PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->stats.consumable==Consumable::FRIENDLY_PERMANENT) {
//PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove=MOVELIST[BattleMoveName::CONSUMABLE];
Entity*target=PARTY_MEMBER_STATS[PARTY_MEMBER_ID[OVERWORLD_TARGET_SELECTION]];
Item*item=PARTY_INVENTORY[ITEM_SELECTION_CURSOR];
std::string messages=item->name+" is used.";
for (int i=0;i<item->messages.size();i++) {
CustomItemMessage msg = item->messages[i];
if (msg.s.find("$TARGET")!=std::string::npos) {
if (msg.a!=ItemAction::LEARNMOVE) {
messages+=" "+msg.s.replace(msg.s.find("$TARGET"),7,target->obj->name);
}
} else {
messages+=" "+msg.s;
}
switch (msg.a) {
case ItemAction::HPRECOVERY:{
target->AddHP(item->stats.hpRecovery);
vi2d box = {(128-32*PARTY_MEMBER_COUNT)+OVERWORLD_TARGET_SELECTION*64+29,170};
DAMAGE_NUMBERS.push_back(new DamageNumber(-item->stats.hpRecovery,box+cameraPos));
}break;
case ItemAction::PPRECOVERY:{
target->AddPP(item->stats.ppRecovery);
}break;
case ItemAction::ATKINCREASE:{
target->baseAtk+=item->stats.atkIncrease;
}break;
case ItemAction::HPINCREASE:{
target->maxHP+=item->stats.hpIncrease;
target->AddHP(item->stats.hpIncrease);
vi2d box = {(128-32*PARTY_MEMBER_COUNT)+OVERWORLD_TARGET_SELECTION*64+29,170};
DAMAGE_NUMBERS.push_back(new DamageNumber(-item->stats.hpIncrease,box+cameraPos));
}break;
case ItemAction::PPINCREASE:{
target->maxPP+=item->stats.ppIncrease;
target->AddPP(item->stats.ppIncrease);
}break;
case ItemAction::SPDINCREASE:{
target->speed+=item->stats.spdIncrease;
}break;
case ItemAction::LEARNMOVE:{
bool moveLearned=false;
for (int i=0;i<target->moveSet.size();i++) {
if (item->stats.learnAbility==target->moveSet[i]) {
moveLearned=true;
break;
}
}
if (!moveLearned) {
messages+=" "+msg.s.replace(msg.s.find("$TARGET"),7,target->obj->name);
target->moveSet.push_back(item->stats.learnAbility);
} else {
messages+=" Failed to learn "+item->stats.learnAbility->GetPowerName();
}
}break;
}
}
DisplayMessageBox(messages);
PARTY_MEMBER_STATS[PARTY_MEMBER_ID[OVERWORLD_TARGET_SELECTION]]->RemoveItem(ITEM_SELECTION_CURSOR);
}
}
if (ITEM_SELECTION_CURSOR>=PARTY_INVENTORY.size()&&prevPartyInvenSize&1&&PARTY_INVENTORY.size()==prevPartyInvenSize-1) {
ITEM_SELECTION_OFFSET-=2;
}
ITEM_SELECTION_CURSOR=std::clamp(ITEM_SELECTION_CURSOR,0,(int)PARTY_INVENTORY.size()-1);
OVERWORLD_ITEM_BEING_USED=false;
GAME_STATE=GameState::OVERWORLD_ITEMS_MENU;
} else { //Using a power instead.
HEALING_OVERWORLD_SINGLE_MEMBER=true; HEALING_OVERWORLD_SINGLE_MEMBER=true;
Battle::Move*move=BATTLE_MOVELIST_DISPLAY[OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]][OVERWORLD_POWER_GRADE_CURSOR]; Battle::Move*move=BATTLE_MOVELIST_DISPLAY[OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]][OVERWORLD_POWER_GRADE_CURSOR];
PARTY_MEMBER_STATS[PARTY_MEMBER_ID[OVERWORLD_POWER_SELECTION_MEMBER]]->SubtractPP(move->PPCost); PARTY_MEMBER_STATS[PARTY_MEMBER_ID[OVERWORLD_POWER_SELECTION_MEMBER]]->SubtractPP(move->PPCost);
@ -1239,6 +1319,26 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"),
GAME_STATE=GameState::OVERWORLD_GRADE_MENU; GAME_STATE=GameState::OVERWORLD_GRADE_MENU;
PARTY_MEMBER_OBJ[OVERWORLD_TARGET_SELECTION]->highlighted=false; PARTY_MEMBER_OBJ[OVERWORLD_TARGET_SELECTION]->highlighted=false;
} }
}
}break;
case GameState::OVERWORLD_ITEMS_MENU:{
if (LeftPressed()&&!(ITEM_SELECTION_CURSOR&1)) {
GAME_STATE=GameState::OVERWORLD_MENU;
} else {
HandleInventoryNavigation();
}
if (ACTIONKEYPRESSED) {
if (PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->stats.equip!=EquipSlot::NONE||PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->stats.consumable!=Consumable::NOT_A_CONSUMABLE) {
if (PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->stats.equip!=EquipSlot::NONE||PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->stats.consumable==Consumable::FRIENDLY||PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->stats.consumable==Consumable::FRIENDLY_PERMANENT) {
GAME_STATE=GameState::OVERWORLD_TARGET_MENU;
OVERWORLD_ITEM_BEING_USED=true;
} else {
DisplayMessageBox("Cannot use that here.");
}
} else {
DisplayMessageBox("Cannot use that here.");
}
}
}break; }break;
case GameState::EDITOR:{ case GameState::EDITOR:{
if (IsTextEntryEnabled()) { if (IsTextEntryEnabled()) {
@ -1598,6 +1698,23 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"),
} }
} }
if (BATTLE_ENCOUNTER!=nullptr&&BATTLE_STATE==BattleState::ITEM_SELECT||GAME_STATE==GameState::OVERWORLD_ITEMS_MENU) {
DrawDialogBox({4,4},{(int)(WIDTH-8),(int)(HEIGHT/2)},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220));
DrawDialogBox({(int)(WIDTH*(3.0F/8)),HEIGHT/2+4},{(int)(WIDTH*(5.0F/8)-4),(int)(HEIGHT/4)},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220));
DrawDecal({static_cast<float>(8+(ITEM_SELECTION_CURSOR)%2*(WIDTH-8)/2),static_cast<float>(12*((ITEM_SELECTION_CURSOR-ITEM_SELECTION_OFFSET)/2)+8)},SPRITES["cursor.png"]);
DrawStringPropDecal({(int)(WIDTH*(3.0F/8))+4,HEIGHT/2+8},Wrap(PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->description,(int)(WIDTH*(5.0F/8))-4,true,{1,1}));
for (int i=0;i<18;i++) {
if (ITEM_SELECTION_OFFSET+i<PARTY_INVENTORY.size()) {
DrawStringPropDecal({static_cast<float>(16+i%2*(WIDTH-8)/2),static_cast<float>(12*(i/2)+8)},PARTY_INVENTORY[ITEM_SELECTION_OFFSET+i]->name,WHITE,{std::clamp((float)(WIDTH-48)/2/GetTextSizeProp(PARTY_INVENTORY[ITEM_SELECTION_OFFSET+i]->name).x,0.0F,1.0F),1.0F});
}
}
if (ITEM_SELECTION_OFFSET>0) {
DrawRotatedDecal({WIDTH-20,8},SPRITES["cursor.png"],-M_PI_2,{4,4});
}
if (ITEM_SELECTION_OFFSET+18<PARTY_INVENTORY.size()) {
DrawRotatedDecal({WIDTH-20,4+HEIGHT/2-4},SPRITES["cursor.png"],M_PI_2,{4,4});
}
}
if (BATTLE_ENCOUNTER!=nullptr) { if (BATTLE_ENCOUNTER!=nullptr) {
SetDrawTarget(layer::HIGH); SetDrawTarget(layer::HIGH);
@ -1665,23 +1782,6 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"),
} }
} }
} }
if (BATTLE_STATE==BattleState::ITEM_SELECT) {
DrawDialogBox({4,4},{(int)(WIDTH-8),(int)(HEIGHT/2)},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220));
DrawDialogBox({(int)(WIDTH*(3.0F/8)),HEIGHT/2+4},{(int)(WIDTH*(5.0F/8)-4),(int)(HEIGHT/4)},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220));
DrawDecal({static_cast<float>(8+(ITEM_SELECTION_CURSOR)%2*(WIDTH-8)/2),static_cast<float>(12*((ITEM_SELECTION_CURSOR-ITEM_SELECTION_OFFSET)/2)+8)},SPRITES["cursor.png"]);
DrawStringPropDecal({(int)(WIDTH*(3.0F/8))+4,HEIGHT/2+8},Wrap(PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->description,(int)(WIDTH*(5.0F/8))-4,true,{1,1}));
for (int i=0;i<18;i++) {
if (ITEM_SELECTION_OFFSET+i<PARTY_INVENTORY.size()) {
DrawStringPropDecal({static_cast<float>(16+i%2*(WIDTH-8)/2),static_cast<float>(12*(i/2)+8)},PARTY_INVENTORY[ITEM_SELECTION_OFFSET+i]->name,WHITE,{std::clamp((float)(WIDTH-48)/2/GetTextSizeProp(PARTY_INVENTORY[ITEM_SELECTION_OFFSET+i]->name).x,0.0F,1.0F),1.0F});
}
}
if (ITEM_SELECTION_OFFSET>0) {
DrawRotatedDecal({WIDTH-20,8},SPRITES["cursor.png"],-M_PI_2,{4,4});
}
if (ITEM_SELECTION_OFFSET+18<PARTY_INVENTORY.size()) {
DrawRotatedDecal({WIDTH-20,4+HEIGHT/2-4},SPRITES["cursor.png"],M_PI_2,{4,4});
}
}
} }
//////////////////INTERFACE LAYER. //////////////////INTERFACE LAYER.
@ -2969,7 +3069,7 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"),
if (!moveLearned) { if (!moveLearned) {
target->moveSet.push_back(BATTLE_CUSTOM_ITEM->stats.learnAbility); target->moveSet.push_back(BATTLE_CUSTOM_ITEM->stats.learnAbility);
} else { } else {
BATTLE_CURRENT_CUSTOM_MSG.s="Failed to learn "+BATTLE_CUSTOM_ITEM->stats.learnAbility->name; BATTLE_CURRENT_CUSTOM_MSG.s="Failed to learn "+BATTLE_CUSTOM_ITEM->stats.learnAbility->GetPowerName();
} }
}break; }break;
} }

Loading…
Cancel
Save