bool Game_BattleAlgorithm::Normal::Execute() { Reset(); int to_hit; if (source->GetType() == Game_Battler::Type_Ally) { Game_Actor* ally = static_cast<Game_Actor*>(source); int hit_chance = source->GetHitChance(); if (ally->GetWeaponId() == 0) { // No Weapon // Todo: Two Sword style animation = &Data::animations[Data::actors[ally->GetId() - 1].unarmed_animation - 1]; } else { animation = &Data::animations[Data::items[ally->GetWeaponId() - 1].animation_id - 1]; hit_chance = Data::items[ally->GetWeaponId() - 1].hit; } to_hit = (int)(100 - (100 - hit_chance) * (1 + (1.0 * (*current_target)->GetAgi() / ally->GetAgi() - 1) / 2)); } else { // Source is Enemy //int hit = src->IsMissingOften() ? 70 : 90; int hit = source->GetHitChance(); to_hit = (int)(100 - (100 - hit) * (1 + (1.0 * (*current_target)->GetAgi() / source->GetAgi() - 1) / 2)); } // Damage calculation if (rand() % 100 < to_hit) { if (!source->IsCharged() && rand() % 100 < source->GetCriticalHitChance()) { critical_hit = true; } int effect = (source->GetAtk() / 2 - (*current_target)->GetDef() / 4); if (effect < 0) effect = 0; int act_perc = (rand() % 40) - 20; // Change rounded up int change = (int)(std::ceil(effect * act_perc / 100.0)); effect += change; this->hp = (effect * (critical_hit ? 3 : 1) * (source->IsCharged() ? 2 : 1)) / ((*current_target)->IsDefending() ? 2 : 1); if ((*current_target)->GetHp() - this->hp <= 0) { // Death state killed_by_attack_damage = true; conditions.push_back(Data::states[0]); } } else { this->success = false; return this->success; } this->success = true; return this->success; }
int Game_Party::GetItemCount(int item_id, bool get_equipped) { if (get_equipped && item_id > 0) { int number = 0; for (int i = 0; i < (int) data.party.size(); i++) { Game_Actor* actor = Game_Actors::GetActor(data.party[i]); if (actor->GetWeaponId() == item_id) { ++number; } if (actor->GetShieldId() == item_id) { ++number; } if (actor->GetArmorId() == item_id) { ++number; } if (actor->GetHelmetId() == item_id) { ++number; } if (actor->GetAccessoryId() == item_id) { ++number; } } return number; } else { for (int i = 0; i < (int) data.item_ids.size(); i++) if (data.item_ids[i] == item_id) return data.item_counts[i]; } return 0; }
// Command control vars bool Game_Interpreter::CommandControlVariables(RPG::EventCommand const& com) { // Code ControlVars int i, value = 0; Game_Actor* actor; Game_Character* character; switch (com.parameters[4]) { case 0: // Constant value = com.parameters[5]; break; case 1: // Var A ops B value = Game_Variables[com.parameters[5]]; break; case 2: // Number of var A ops B value = Game_Variables[Game_Variables[com.parameters[5]]]; break; case 3: // Random between range int a, b; a = max(com.parameters[5], com.parameters[6]); b = min(com.parameters[5], com.parameters[6]); value = rand() % (a-b+1)+b; break; case 4: // Items switch (com.parameters[6]) { case 0: // Number of items posessed value = Game_Party::ItemNumber(com.parameters[5]); break; case 1: // How often the item is equipped value = Game_Party::ItemNumber(com.parameters[5], true); break; } break; case 5: // Hero actor = Game_Actors::GetActor(com.parameters[5]); if (actor != NULL) { switch (com.parameters[6]) { case 0: // Level value = actor->GetLevel(); break; case 1: // Experience value = actor->GetExp(); break; case 2: // Current HP value = actor->GetHp(); break; case 3: // Current MP value = actor->GetSp(); break; case 4: // Max HP value = actor->GetMaxHp(); break; case 5: // Max MP value = actor->GetMaxSp(); break; case 6: // Attack value = actor->GetAtk(); break; case 7: // Defense value = actor->GetDef(); break; case 8: // Intelligence value = actor->GetSpi(); break; case 9: // Agility value = actor->GetAgi(); break; case 10: // Weapon ID value = actor->GetWeaponId(); break; case 11: // Shield ID value = actor->GetShieldId(); break; case 12: // Armor ID value = actor->GetArmorId(); break; case 13: // Helmet ID value = actor->GetHelmetId(); break; case 14: // Accesory ID value = actor->GetAccessoryId(); break; } } break; case 6: // Characters if (com.parameters[6] != 0){ character = GetCharacter(com.parameters[5]); } else { // Special case for Player Map ID character = NULL; value = Game_Map::GetMapId(); } // Other cases if (character != NULL) { switch (com.parameters[6]) { case 1: // X Coordinate value = character->GetX(); break; case 2: // Y Coordinate value = character->GetY(); break; case 3: // TODO Orientation // Needs testing value = character->GetDirection(); break; case 4: // Screen X value = character->GetScreenX(); break; case 5: // Screen Y value = character->GetScreenY(); } } break; case 7: // More switch (com.parameters[5]) { case 0: // Gold value = Game_Party::GetGold(); break; case 1: value = Game_Party::ReadTimer(Game_Party::Timer1); break; case 2: // Number of heroes in party value = Game_Party::GetActors().size(); break; case 3: // Number of saves value = Game_System::GetSaveCount(); break; case 4: // Number of battles value = Game_Party::GetBattleCount(); break; case 5: // Number of wins value = Game_Party::GetWinCount(); break; case 6: // Number of defeats value = Game_Party::GetDefeatCount(); break; case 7: // Number of escapes (aka run away) value = Game_Party::GetRunCount(); break; case 8: // TODO: MIDI play position break; case 9: value = Game_Party::ReadTimer(Game_Party::Timer2); break; } break; default: ; } switch (com.parameters[0]) { case 0: case 1: // Single and Var range for (i = com.parameters[1]; i <= com.parameters[2]; i++) { switch (com.parameters[3]) { case 0: // Assignement Game_Variables[i] = value; break; case 1: // Addition Game_Variables[i] += value; break; case 2: // Subtraction Game_Variables[i] -= value; break; case 3: // Multiplication Game_Variables[i] *= value; break; case 4: // Division if (value != 0) { Game_Variables[i] /= value; } break; case 5: // Module if (value != 0) { Game_Variables[i] %= value; } else { Game_Variables[i] = 0; } } if (Game_Variables[i] > MaxSize) { Game_Variables[i] = MaxSize; } if (Game_Variables[i] < MinSize) { Game_Variables[i] = MinSize; } } break; case 2: switch (com.parameters[3]) { case 0: // Assignement Game_Variables[com.parameters[1]] = value; break; case 1: // Addition Game_Variables[com.parameters[1]] += value; break; case 2: // Subtraction Game_Variables[com.parameters[1]] -= value; break; case 3: // Multiplication Game_Variables[com.parameters[1]] *= value; break; case 4: // Division if (value != 0) { Game_Variables[com.parameters[1]] /= value; } break; case 5: // Module if (value != 0) { Game_Variables[com.parameters[1]] %= value; } } if (Game_Variables[com.parameters[1]] > MaxSize) { Game_Variables[com.parameters[1]] = MaxSize; } if (Game_Variables[com.parameters[1]] < MinSize) { Game_Variables[com.parameters[1]] = MinSize; } } Game_Map::SetNeedRefresh(true); return true; }
void Window_ShopParty::Refresh() { contents->Clear(); BitmapRef system = Cache::System(); if (item_id <= 0 || item_id > Data::items.size()) return; const std::vector<Game_Actor*>& actors = Main_Data::game_party->GetActors(); for (size_t i = 0; i < actors.size() && i < 4; i++) { Game_Actor *actor = actors[i]; int phase = (cycle / anim_rate) % 4; if (phase == 3) { phase = 1; } bool equippable = actor->IsEquippable(item_id); BitmapRef bm = bitmaps[i][equippable ? phase : 1][equippable ? 1 : 0]; if (bm) { contents->Blit(i * 32, 0, *bm, bm->GetRect(), 255); } if (equippable) { //check if item is equipped by each member bool is_equipped = false; for (int j = 0; j < 5; ++j) { const RPG::Item* item = actor->GetEquipment(j); if (item) { is_equipped |= (item->ID == item_id); } } if (is_equipped) contents->Blit(i * 32 + 20, 24, *system, Rect(128 + 8 * phase, 24, 8, 8), 255); else { RPG::Item* new_item = &Data::items[item_id - 1]; int item_type = new_item->type; RPG::Item* current_item = NULL; switch (item_type) { //get the current equipped item case RPG::Item::Type_weapon: if (actor->GetWeaponId() > 0) current_item = &Data::items[actor->GetWeaponId() - 1]; else current_item = &Data::items[0]; break; case RPG::Item::Type_helmet: if (actor->GetHelmetId() > 0) current_item = &Data::items[actor->GetHelmetId() - 1]; else current_item = &Data::items[0]; break; case RPG::Item::Type_shield: if (actor->GetShieldId() > 0) current_item = &Data::items[actor->GetShieldId() - 1]; else current_item = &Data::items[0]; break; case RPG::Item::Type_armor: if (actor->GetArmorId() > 0) current_item = &Data::items[actor->GetArmorId() - 1]; else current_item = &Data::items[0]; break; case RPG::Item::Type_accessory: if (actor->GetAccessoryId() > 0) current_item = &Data::items[actor->GetAccessoryId() -1]; else current_item = &Data::items[0]; break; } if (current_item != NULL) { int diff_atk = new_item->atk_points1 - current_item->atk_points1; int diff_def = new_item->def_points1 - current_item->def_points1; int diff_spi = new_item->spi_points1 - current_item->spi_points1; int diff_agi = new_item->agi_points1 - current_item->agi_points1; if (diff_atk > 0 || diff_def > 0 || diff_spi > 0 || diff_agi > 0) contents->Blit(i * 32 + 20, 24, *system, Rect(128 + 8 * phase, 0, 8, 8), 255); else if (diff_atk < 0 || diff_def < 0 || diff_spi < 0 || diff_agi < 0) contents->Blit(i * 32 + 20, 24, *system, Rect(128 + 8 * phase, 16, 8, 8), 255); else contents->Blit(i * 32 + 20, 24, *system, Rect(128 + 8 * phase, 8, 8, 8), 255); } } } } }
bool Game_BattleAlgorithm::Normal::Execute() { Reset(); int to_hit; float multiplier = 1; int crit_chance = source->GetCriticalHitChance(); if (source->GetType() == Game_Battler::Type_Ally) { Game_Actor* ally = static_cast<Game_Actor*>(source); int hit_chance = source->GetHitChance(); int weaponID = ally->GetWeaponId() - 1; if (weaponID == -1) { // No Weapon // Todo: Two Sword style animation = &Data::animations[Data::actors[ally->GetId() - 1].unarmed_animation - 1]; } else { animation = &Data::animations[Data::items[weaponID].animation_id - 1]; RPG::Item weapon = Data::items[weaponID]; hit_chance = weapon.hit; crit_chance += weapon.critical_hit; multiplier = GetAttributeMultiplier(weapon.attribute_set); } to_hit = (int)(100 - (100 - hit_chance)); if(weaponID != -1 && !Data::items[weaponID].ignore_evasion) { to_hit *= (1 + (1.0 * (*current_target)->GetAgi() / ally->GetAgi() - 1) / 2); } } else { // Source is Enemy int hit = source->GetHitChance(); to_hit = (int)(100 - (100 - hit) * (1 + (1.0 * (*current_target)->GetAgi() / source->GetAgi() - 1) / 2)); } // Damage calculation if (rand() % 100 < to_hit) { if (!source->IsCharged() && rand() % 100 < crit_chance) { critical_hit = true; } int effect = (source->GetAtk() / 2 - (*current_target)->GetDef() / 4); if (effect < 0) effect = 0; int act_perc = (rand() % 40) - 20; // Change rounded up int change = (int)(std::ceil(effect * act_perc / 100.0)); effect += change; effect *= multiplier; if(effect < 0) { effect = 0; } this->hp = (effect * (critical_hit ? 3 : 1) * (source->IsCharged() ? 2 : 1)) / ((*current_target)->IsDefending() ? 2 : 1); if ((*current_target)->GetHp() - this->hp <= 0) { // Death state killed_by_attack_damage = true; conditions.push_back(Data::states[0]); } else { if (source->GetType() == Game_Battler::Type_Ally) { int weaponID = static_cast<Game_Actor*>(source)->GetWeaponId() - 1; if (weaponID != -1) { RPG::Item item = Data::items[static_cast<Game_Actor*>(source)->GetWeaponId() - 1]; for (int i = 0; i < item.state_set.size(); i++) { if (item.state_set[i] && rand() % 100 < (item.state_chance * (*current_target)->GetStateProbability(Data::states[i].ID) / 100)) { if (item.state_effect) { healing = true; } conditions.push_back(Data::states[i]); } } } } } } else { this->success = false; return this->success; } this->success = true; return this->success; }