add HTTP server
This commit is contained in:
@@ -914,7 +914,7 @@ void Card::compute_action_chain_results(bool apply_action_conditions, bool ignor
|
||||
this->action_chain.chain.tp_effect_bonus = 0;
|
||||
|
||||
log.debug("(initial) medium=%s, strike_count=%hhu, ap_effect_bonus=%hhd, tp_effect_bonus=%hhd",
|
||||
name_for_attack_medium(this->action_chain.chain.attack_medium),
|
||||
name_for_enum(this->action_chain.chain.attack_medium),
|
||||
this->action_chain.chain.strike_count,
|
||||
this->action_chain.chain.ap_effect_bonus,
|
||||
this->action_chain.chain.tp_effect_bonus);
|
||||
|
||||
@@ -589,7 +589,7 @@ bool CardSpecial::apply_stat_deltas_to_card_from_condition_and_clear_cond(Condit
|
||||
break;
|
||||
trial_unimplemented:
|
||||
default:
|
||||
log.debug("%s: no adjustments for condition type", name_for_condition_type(cond_type));
|
||||
log.debug("%s: no adjustments for condition type", name_for_enum(cond_type));
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1777,7 +1777,7 @@ bool CardSpecial::execute_effect(
|
||||
auto log = s->log_stack(string_printf("execute_effect(@%04hX #%04hX): ", card->get_card_ref(), card->get_card_id()));
|
||||
{
|
||||
string cond_str = cond.str(s);
|
||||
log.debug("cond=%s, card=@%04hX, expr_value=%hd, unknown_p5=%hd, cond_type=%s, unknown_p7=%" PRIu32 ", attacker_card_ref=@%04hX", cond_str.c_str(), ref_for_card(card), expr_value, unknown_p5, name_for_condition_type(cond_type), unknown_p7, attacker_card_ref);
|
||||
log.debug("cond=%s, card=@%04hX, expr_value=%hd, unknown_p5=%hd, cond_type=%s, unknown_p7=%" PRIu32 ", attacker_card_ref=@%04hX", cond_str.c_str(), ref_for_card(card), expr_value, unknown_p5, name_for_enum(cond_type), unknown_p7, attacker_card_ref);
|
||||
}
|
||||
bool is_nte = s->options.is_nte();
|
||||
|
||||
@@ -2841,7 +2841,7 @@ vector<shared_ptr<const Card>> CardSpecial::get_targeted_cards_for_condition(
|
||||
AttackMedium attack_medium = card2
|
||||
? card2->action_chain.chain.attack_medium
|
||||
: AttackMedium::UNKNOWN;
|
||||
log.debug("attack_medium=%s", name_for_attack_medium(attack_medium));
|
||||
log.debug("attack_medium=%s", name_for_enum(attack_medium));
|
||||
|
||||
auto add_card_refs = [&](const vector<uint16_t>& result_card_refs) -> void {
|
||||
for (uint16_t result_card_ref : result_card_refs) {
|
||||
|
||||
+275
-221
@@ -80,168 +80,6 @@ const char* name_for_link_color(uint8_t color) {
|
||||
}
|
||||
}
|
||||
|
||||
const char* name_for_card_type(CardType type) {
|
||||
switch (type) {
|
||||
case CardType::HUNTERS_SC:
|
||||
return "HUNTERS_SC";
|
||||
case CardType::ARKZ_SC:
|
||||
return "ARKZ_SC";
|
||||
case CardType::ITEM:
|
||||
return "ITEM";
|
||||
case CardType::CREATURE:
|
||||
return "CREATURE";
|
||||
case CardType::ACTION:
|
||||
return "ACTION";
|
||||
case CardType::ASSIST:
|
||||
return "ASSIST";
|
||||
case CardType::INVALID_FF:
|
||||
return "INVALID_FF";
|
||||
default:
|
||||
throw invalid_argument("invalid card type");
|
||||
}
|
||||
}
|
||||
|
||||
const char* name_for_card_class(CardClass cc) {
|
||||
switch (cc) {
|
||||
case CardClass::HU_SC:
|
||||
return "HU_SC";
|
||||
case CardClass::RA_SC:
|
||||
return "RA_SC";
|
||||
case CardClass::FO_SC:
|
||||
return "FO_SC";
|
||||
case CardClass::NATIVE_CREATURE:
|
||||
return "NATIVE_CREATURE";
|
||||
case CardClass::A_BEAST_CREATURE:
|
||||
return "A_BEAST_CREATURE";
|
||||
case CardClass::MACHINE_CREATURE:
|
||||
return "MACHINE_CREATURE";
|
||||
case CardClass::DARK_CREATURE:
|
||||
return "DARK_CREATURE";
|
||||
case CardClass::GUARD_ITEM:
|
||||
return "GUARD_ITEM";
|
||||
case CardClass::MAG_ITEM:
|
||||
return "MAG_ITEM";
|
||||
case CardClass::SWORD_ITEM:
|
||||
return "SWORD_ITEM";
|
||||
case CardClass::GUN_ITEM:
|
||||
return "GUN_ITEM";
|
||||
case CardClass::CANE_ITEM:
|
||||
return "CANE_ITEM";
|
||||
case CardClass::ATTACK_ACTION:
|
||||
return "ATTACK_ACTION";
|
||||
case CardClass::DEFENSE_ACTION:
|
||||
return "DEFENSE_ACTION";
|
||||
case CardClass::TECH:
|
||||
return "TECH";
|
||||
case CardClass::PHOTON_BLAST:
|
||||
return "PHOTON_BLAST";
|
||||
case CardClass::CONNECT_ONLY_ATTACK_ACTION:
|
||||
return "CONNECT_ONLY_ATTACK_ACTION";
|
||||
case CardClass::BOSS_ATTACK_ACTION:
|
||||
return "BOSS_ATTACK_ACTION";
|
||||
case CardClass::BOSS_TECH:
|
||||
return "BOSS_TECH";
|
||||
case CardClass::ASSIST:
|
||||
return "ASSIST";
|
||||
default:
|
||||
throw invalid_argument("invalid card class");
|
||||
}
|
||||
}
|
||||
|
||||
const char* name_for_attack_medium(AttackMedium medium) {
|
||||
switch (medium) {
|
||||
case AttackMedium::UNKNOWN:
|
||||
return "UNKNOWN";
|
||||
case AttackMedium::PHYSICAL:
|
||||
return "PHYSICAL";
|
||||
case AttackMedium::TECH:
|
||||
return "TECH";
|
||||
case AttackMedium::UNKNOWN_03:
|
||||
return "UNKNOWN_03";
|
||||
case AttackMedium::INVALID_FF:
|
||||
return "INVALID_FF";
|
||||
default:
|
||||
return "__INVALID__";
|
||||
}
|
||||
}
|
||||
|
||||
const char* name_for_criterion_code(CriterionCode code) {
|
||||
switch (code) {
|
||||
case CriterionCode::NONE:
|
||||
return "NONE";
|
||||
case CriterionCode::HU_CLASS_SC:
|
||||
return "HU_CLASS_SC";
|
||||
case CriterionCode::RA_CLASS_SC:
|
||||
return "RA_CLASS_SC";
|
||||
case CriterionCode::FO_CLASS_SC:
|
||||
return "FO_CLASS_SC";
|
||||
case CriterionCode::SAME_TEAM:
|
||||
return "SAME_TEAM";
|
||||
case CriterionCode::SAME_PLAYER:
|
||||
return "SAME_PLAYER";
|
||||
case CriterionCode::SAME_TEAM_NOT_SAME_PLAYER:
|
||||
return "SAME_TEAM_NOT_SAME_PLAYER";
|
||||
case CriterionCode::FC:
|
||||
return "FC";
|
||||
case CriterionCode::NOT_SC:
|
||||
return "NOT_SC";
|
||||
case CriterionCode::SC:
|
||||
return "SC";
|
||||
case CriterionCode::HU_OR_RA_CLASS_SC:
|
||||
return "HU_OR_RA_CLASS_SC";
|
||||
case CriterionCode::HUNTER_NON_ANDROID_SC:
|
||||
return "HUNTER_NON_ANDROID_SC";
|
||||
case CriterionCode::HUNTER_HU_CLASS_MALE_SC:
|
||||
return "HUNTER_HU_CLASS_MALE_SC";
|
||||
case CriterionCode::HUNTER_FEMALE_SC:
|
||||
return "HUNTER_FEMALE_SC";
|
||||
case CriterionCode::HUNTER_NON_RA_CLASS_HUMAN_SC:
|
||||
return "HUNTER_NON_RA_CLASS_HUMAN_SC";
|
||||
case CriterionCode::HUNTER_HU_CLASS_ANDROID_SC:
|
||||
return "HUNTER_HU_CLASS_ANDROID_SC";
|
||||
case CriterionCode::HUNTER_NON_RA_CLASS_NON_NEWMAN_SC:
|
||||
return "HUNTER_NON_RA_CLASS_NON_NEWMAN_SC";
|
||||
case CriterionCode::HUNTER_NON_NEWMAN_NON_FORCE_MALE_SC:
|
||||
return "HUNTER_NON_NEWMAN_NON_FORCE_MALE_SC";
|
||||
case CriterionCode::HUNTER_HUNEWEARL_CLASS_SC:
|
||||
return "HUNTER_HUNEWEARL_CLASS_SC";
|
||||
case CriterionCode::HUNTER_RA_CLASS_MALE_SC:
|
||||
return "HUNTER_RA_CLASS_MALE_SC";
|
||||
case CriterionCode::HUNTER_RA_CLASS_FEMALE_SC:
|
||||
return "HUNTER_RA_CLASS_FEMALE_SC";
|
||||
case CriterionCode::HUNTER_RA_OR_FO_CLASS_FEMALE_SC:
|
||||
return "HUNTER_RA_OR_FO_CLASS_FEMALE_SC";
|
||||
case CriterionCode::HUNTER_HU_OR_RA_CLASS_HUMAN_SC:
|
||||
return "HUNTER_HU_OR_RA_CLASS_HUMAN_SC";
|
||||
case CriterionCode::HUNTER_RA_CLASS_ANDROID_SC:
|
||||
return "HUNTER_RA_CLASS_ANDROID_SC";
|
||||
case CriterionCode::HUNTER_FO_CLASS_FEMALE_SC:
|
||||
return "HUNTER_FO_CLASS_FEMALE_SC";
|
||||
case CriterionCode::HUNTER_HUMAN_FEMALE_SC:
|
||||
return "HUNTER_HUMAN_FEMALE_SC";
|
||||
case CriterionCode::HUNTER_ANDROID_SC:
|
||||
return "HUNTER_ANDROID_SC";
|
||||
case CriterionCode::HU_OR_FO_CLASS_SC:
|
||||
return "HU_OR_FO_CLASS_SC";
|
||||
case CriterionCode::RA_OR_FO_CLASS_SC:
|
||||
return "RA_OR_FO_CLASS_SC";
|
||||
case CriterionCode::PHYSICAL_OR_UNKNOWN_ATTACK_MEDIUM:
|
||||
return "PHYSICAL_OR_UNKNOWN_ATTACK_MEDIUM";
|
||||
case CriterionCode::TECH_OR_UNKNOWN_ATTACK_MEDIUM:
|
||||
return "TECH_OR_UNKNOWN_ATTACK_MEDIUM";
|
||||
case CriterionCode::PHYSICAL_OR_TECH_OR_UNKNOWN_ATTACK_MEDIUM:
|
||||
return "PHYSICAL_OR_TECH_OR_UNKNOWN_ATTACK_MEDIUM";
|
||||
case CriterionCode::NON_PHYSICAL_NON_UNKNOWN_ATTACK_MEDIUM_NON_SC:
|
||||
return "NON_PHYSICAL_NON_UNKNOWN_ATTACK_MEDIUM_NON_SC";
|
||||
case CriterionCode::NON_PHYSICAL_NON_TECH_ATTACK_MEDIUM_NON_SC:
|
||||
return "NON_PHYSICAL_NON_TECH_ATTACK_MEDIUM_NON_SC";
|
||||
case CriterionCode::NON_PHYSICAL_NON_TECH_NON_UNKNOWN_ATTACK_MEDIUM_NON_SC:
|
||||
return "NON_PHYSICAL_NON_TECH_NON_UNKNOWN_ATTACK_MEDIUM_NON_SC";
|
||||
default:
|
||||
throw invalid_argument("invalid criterion code");
|
||||
}
|
||||
}
|
||||
|
||||
Location::Location() : Location(0, 0) {}
|
||||
Location::Location(uint8_t x, uint8_t y) : Location(x, y, Direction::RIGHT) {}
|
||||
Location::Location(uint8_t x, uint8_t y, Direction direction)
|
||||
@@ -262,7 +100,7 @@ bool Location::operator!=(const Location& other) const {
|
||||
|
||||
std::string Location::str() const {
|
||||
return string_printf("Location[x=%hhu, y=%hhu, dir=%s, u=%hhu]",
|
||||
this->x, this->y, name_for_direction(this->direction), this->unused);
|
||||
this->x, this->y, name_for_enum(this->direction), this->unused);
|
||||
}
|
||||
|
||||
void Location::clear() {
|
||||
@@ -324,23 +162,6 @@ Direction turn_around(Direction d) {
|
||||
}
|
||||
}
|
||||
|
||||
const char* name_for_direction(Direction d) {
|
||||
switch (d) {
|
||||
case Direction::RIGHT:
|
||||
return "LEFT";
|
||||
case Direction::UP:
|
||||
return "DOWN";
|
||||
case Direction::LEFT:
|
||||
return "RIGHT";
|
||||
case Direction::DOWN:
|
||||
return "UP";
|
||||
case Direction::INVALID_FF:
|
||||
return "INVALID_FF";
|
||||
default:
|
||||
return "__INVALID__";
|
||||
}
|
||||
}
|
||||
|
||||
bool card_class_is_tech_like(CardClass cc, bool is_nte) {
|
||||
// NTE does not consider BOSS_TECH to be a tech-like card class, but that's
|
||||
// probably because that card class just doesn't exist on NTE.
|
||||
@@ -632,27 +453,6 @@ static const vector<ConditionDescription> description_for_condition_type({
|
||||
/* 0x7D */ {false, "UNKNOWN_7D", nullptr},
|
||||
});
|
||||
|
||||
const char* name_for_condition_type(ConditionType cond_type) {
|
||||
try {
|
||||
return description_for_condition_type.at(static_cast<size_t>(cond_type)).name;
|
||||
} catch (const out_of_range&) {
|
||||
return "__INVALID__";
|
||||
}
|
||||
}
|
||||
|
||||
const char* name_for_action_subphase(ActionSubphase subphase) {
|
||||
switch (subphase) {
|
||||
case ActionSubphase::ATTACK:
|
||||
return "ATTACK";
|
||||
case ActionSubphase::DEFENSE:
|
||||
return "DEFENSE";
|
||||
case ActionSubphase::INVALID_FF:
|
||||
return "INVALID_FF";
|
||||
default:
|
||||
return "__INVALID__";
|
||||
}
|
||||
}
|
||||
|
||||
void CardDefinition::Stat::decode_code() {
|
||||
this->type = static_cast<Type>(this->code / 1000);
|
||||
int16_t value = this->code - (this->type * 1000);
|
||||
@@ -801,7 +601,7 @@ string CardDefinition::Effect::str(const char* separator, const TextSet* text_ar
|
||||
uint8_t type = static_cast<uint8_t>(this->apply_criterion);
|
||||
string cond_str = string_printf("cond=%02hhX", type);
|
||||
try {
|
||||
const char* name = name_for_criterion_code(this->apply_criterion);
|
||||
const char* name = name_for_enum(this->apply_criterion);
|
||||
cond_str += ':';
|
||||
cond_str += name;
|
||||
} catch (const invalid_argument&) {
|
||||
@@ -1072,24 +872,9 @@ static const char* name_for_assist_ai_param_target(uint8_t target) {
|
||||
}
|
||||
|
||||
string CardDefinition::str(bool single_line, const TextSet* text_archive) const {
|
||||
string type_str;
|
||||
try {
|
||||
type_str = name_for_card_type(this->type);
|
||||
} catch (const invalid_argument&) {
|
||||
type_str = string_printf("%02hhX", static_cast<uint8_t>(this->type));
|
||||
}
|
||||
string criterion_str;
|
||||
try {
|
||||
criterion_str = name_for_criterion_code(this->usable_criterion);
|
||||
} catch (const invalid_argument&) {
|
||||
criterion_str = string_printf("%02hhX", static_cast<uint8_t>(this->usable_criterion));
|
||||
}
|
||||
string card_class_str;
|
||||
try {
|
||||
card_class_str = name_for_card_class(this->card_class());
|
||||
} catch (const invalid_argument&) {
|
||||
card_class_str = string_printf("%04hX", this->be_card_class.load());
|
||||
}
|
||||
string type_str = name_for_enum(this->type);
|
||||
string criterion_str = name_for_enum(this->usable_criterion);
|
||||
string card_class_str = name_for_enum(this->card_class());
|
||||
string rank_str = name_for_rank(this->rank);
|
||||
string target_mode_str = name_for_target_mode(this->target_mode);
|
||||
string assist_turns_str = string_for_assist_turns(this->assist_turns);
|
||||
@@ -2863,6 +2648,275 @@ const char* name_for_enum<Episode3::AllowedCards>(Episode3::AllowedCards allowed
|
||||
case Episode3::AllowedCards::N_R_S_ONLY:
|
||||
return "N_R_S_ONLY";
|
||||
default:
|
||||
throw out_of_range("invalid allowed cards");
|
||||
return "__INVALID__";
|
||||
}
|
||||
}
|
||||
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::BattlePhase>(Episode3::BattlePhase phase) {
|
||||
switch (phase) {
|
||||
case Episode3::BattlePhase::INVALID_00:
|
||||
return "INVALID_00";
|
||||
case Episode3::BattlePhase::DICE:
|
||||
return "DICE";
|
||||
case Episode3::BattlePhase::SET:
|
||||
return "SET";
|
||||
case Episode3::BattlePhase::MOVE:
|
||||
return "MOVE";
|
||||
case Episode3::BattlePhase::ACTION:
|
||||
return "ACTION";
|
||||
case Episode3::BattlePhase::DRAW:
|
||||
return "DRAW";
|
||||
case Episode3::BattlePhase::INVALID_FF:
|
||||
return "INVALID_FF";
|
||||
default:
|
||||
return "__INVALID__";
|
||||
}
|
||||
}
|
||||
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::SetupPhase>(Episode3::SetupPhase phase) {
|
||||
switch (phase) {
|
||||
case Episode3::SetupPhase::REGISTRATION:
|
||||
return "REGISTRATION";
|
||||
case Episode3::SetupPhase::STARTER_ROLLS:
|
||||
return "STARTER_ROLLS";
|
||||
case Episode3::SetupPhase::HAND_REDRAW_OPTION:
|
||||
return "HAND_REDRAW_OPTION";
|
||||
case Episode3::SetupPhase::MAIN_BATTLE:
|
||||
return "MAIN_BATTLE";
|
||||
case Episode3::SetupPhase::BATTLE_ENDED:
|
||||
return "BATTLE_ENDED";
|
||||
case Episode3::SetupPhase::INVALID_FF:
|
||||
return "INVALID_FF";
|
||||
default:
|
||||
return "__INVALID__";
|
||||
}
|
||||
}
|
||||
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::RegistrationPhase>(Episode3::RegistrationPhase phase) {
|
||||
switch (phase) {
|
||||
case Episode3::RegistrationPhase::AWAITING_NUM_PLAYERS:
|
||||
return "AWAITING_NUM_PLAYERS";
|
||||
case Episode3::RegistrationPhase::AWAITING_PLAYERS:
|
||||
return "AWAITING_PLAYERS";
|
||||
case Episode3::RegistrationPhase::AWAITING_DECKS:
|
||||
return "AWAITING_DECKS";
|
||||
case Episode3::RegistrationPhase::REGISTERED:
|
||||
return "REGISTERED";
|
||||
case Episode3::RegistrationPhase::BATTLE_STARTED:
|
||||
return "BATTLE_STARTED";
|
||||
case Episode3::RegistrationPhase::INVALID_FF:
|
||||
return "INVALID_FF";
|
||||
default:
|
||||
return "__INVALID__";
|
||||
}
|
||||
}
|
||||
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::ActionSubphase>(Episode3::ActionSubphase phase) {
|
||||
switch (phase) {
|
||||
case Episode3::ActionSubphase::ATTACK:
|
||||
return "ATTACK";
|
||||
case Episode3::ActionSubphase::DEFENSE:
|
||||
return "DEFENSE";
|
||||
case Episode3::ActionSubphase::INVALID_FF:
|
||||
return "INVALID_FF";
|
||||
default:
|
||||
return "__INVALID__";
|
||||
}
|
||||
}
|
||||
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::AttackMedium>(Episode3::AttackMedium medium) {
|
||||
switch (medium) {
|
||||
case Episode3::AttackMedium::UNKNOWN:
|
||||
return "UNKNOWN";
|
||||
case Episode3::AttackMedium::PHYSICAL:
|
||||
return "PHYSICAL";
|
||||
case Episode3::AttackMedium::TECH:
|
||||
return "TECH";
|
||||
case Episode3::AttackMedium::UNKNOWN_03:
|
||||
return "UNKNOWN_03";
|
||||
case Episode3::AttackMedium::INVALID_FF:
|
||||
return "INVALID_FF";
|
||||
default:
|
||||
return "__INVALID__";
|
||||
}
|
||||
}
|
||||
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::CriterionCode>(Episode3::CriterionCode code) {
|
||||
switch (code) {
|
||||
case Episode3::CriterionCode::NONE:
|
||||
return "NONE";
|
||||
case Episode3::CriterionCode::HU_CLASS_SC:
|
||||
return "HU_CLASS_SC";
|
||||
case Episode3::CriterionCode::RA_CLASS_SC:
|
||||
return "RA_CLASS_SC";
|
||||
case Episode3::CriterionCode::FO_CLASS_SC:
|
||||
return "FO_CLASS_SC";
|
||||
case Episode3::CriterionCode::SAME_TEAM:
|
||||
return "SAME_TEAM";
|
||||
case Episode3::CriterionCode::SAME_PLAYER:
|
||||
return "SAME_PLAYER";
|
||||
case Episode3::CriterionCode::SAME_TEAM_NOT_SAME_PLAYER:
|
||||
return "SAME_TEAM_NOT_SAME_PLAYER";
|
||||
case Episode3::CriterionCode::FC:
|
||||
return "FC";
|
||||
case Episode3::CriterionCode::NOT_SC:
|
||||
return "NOT_SC";
|
||||
case Episode3::CriterionCode::SC:
|
||||
return "SC";
|
||||
case Episode3::CriterionCode::HU_OR_RA_CLASS_SC:
|
||||
return "HU_OR_RA_CLASS_SC";
|
||||
case Episode3::CriterionCode::HUNTER_NON_ANDROID_SC:
|
||||
return "HUNTER_NON_ANDROID_SC";
|
||||
case Episode3::CriterionCode::HUNTER_HU_CLASS_MALE_SC:
|
||||
return "HUNTER_HU_CLASS_MALE_SC";
|
||||
case Episode3::CriterionCode::HUNTER_FEMALE_SC:
|
||||
return "HUNTER_FEMALE_SC";
|
||||
case Episode3::CriterionCode::HUNTER_NON_RA_CLASS_HUMAN_SC:
|
||||
return "HUNTER_NON_RA_CLASS_HUMAN_SC";
|
||||
case Episode3::CriterionCode::HUNTER_HU_CLASS_ANDROID_SC:
|
||||
return "HUNTER_HU_CLASS_ANDROID_SC";
|
||||
case Episode3::CriterionCode::HUNTER_NON_RA_CLASS_NON_NEWMAN_SC:
|
||||
return "HUNTER_NON_RA_CLASS_NON_NEWMAN_SC";
|
||||
case Episode3::CriterionCode::HUNTER_NON_NEWMAN_NON_FORCE_MALE_SC:
|
||||
return "HUNTER_NON_NEWMAN_NON_FORCE_MALE_SC";
|
||||
case Episode3::CriterionCode::HUNTER_HUNEWEARL_CLASS_SC:
|
||||
return "HUNTER_HUNEWEARL_CLASS_SC";
|
||||
case Episode3::CriterionCode::HUNTER_RA_CLASS_MALE_SC:
|
||||
return "HUNTER_RA_CLASS_MALE_SC";
|
||||
case Episode3::CriterionCode::HUNTER_RA_CLASS_FEMALE_SC:
|
||||
return "HUNTER_RA_CLASS_FEMALE_SC";
|
||||
case Episode3::CriterionCode::HUNTER_RA_OR_FO_CLASS_FEMALE_SC:
|
||||
return "HUNTER_RA_OR_FO_CLASS_FEMALE_SC";
|
||||
case Episode3::CriterionCode::HUNTER_HU_OR_RA_CLASS_HUMAN_SC:
|
||||
return "HUNTER_HU_OR_RA_CLASS_HUMAN_SC";
|
||||
case Episode3::CriterionCode::HUNTER_RA_CLASS_ANDROID_SC:
|
||||
return "HUNTER_RA_CLASS_ANDROID_SC";
|
||||
case Episode3::CriterionCode::HUNTER_FO_CLASS_FEMALE_SC:
|
||||
return "HUNTER_FO_CLASS_FEMALE_SC";
|
||||
case Episode3::CriterionCode::HUNTER_HUMAN_FEMALE_SC:
|
||||
return "HUNTER_HUMAN_FEMALE_SC";
|
||||
case Episode3::CriterionCode::HUNTER_ANDROID_SC:
|
||||
return "HUNTER_ANDROID_SC";
|
||||
case Episode3::CriterionCode::HU_OR_FO_CLASS_SC:
|
||||
return "HU_OR_FO_CLASS_SC";
|
||||
case Episode3::CriterionCode::RA_OR_FO_CLASS_SC:
|
||||
return "RA_OR_FO_CLASS_SC";
|
||||
case Episode3::CriterionCode::PHYSICAL_OR_UNKNOWN_ATTACK_MEDIUM:
|
||||
return "PHYSICAL_OR_UNKNOWN_ATTACK_MEDIUM";
|
||||
case Episode3::CriterionCode::TECH_OR_UNKNOWN_ATTACK_MEDIUM:
|
||||
return "TECH_OR_UNKNOWN_ATTACK_MEDIUM";
|
||||
case Episode3::CriterionCode::PHYSICAL_OR_TECH_OR_UNKNOWN_ATTACK_MEDIUM:
|
||||
return "PHYSICAL_OR_TECH_OR_UNKNOWN_ATTACK_MEDIUM";
|
||||
case Episode3::CriterionCode::NON_PHYSICAL_NON_UNKNOWN_ATTACK_MEDIUM_NON_SC:
|
||||
return "NON_PHYSICAL_NON_UNKNOWN_ATTACK_MEDIUM_NON_SC";
|
||||
case Episode3::CriterionCode::NON_PHYSICAL_NON_TECH_ATTACK_MEDIUM_NON_SC:
|
||||
return "NON_PHYSICAL_NON_TECH_ATTACK_MEDIUM_NON_SC";
|
||||
case Episode3::CriterionCode::NON_PHYSICAL_NON_TECH_NON_UNKNOWN_ATTACK_MEDIUM_NON_SC:
|
||||
return "NON_PHYSICAL_NON_TECH_NON_UNKNOWN_ATTACK_MEDIUM_NON_SC";
|
||||
default:
|
||||
return "__UNKNOWN__";
|
||||
}
|
||||
}
|
||||
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::CardType>(Episode3::CardType type) {
|
||||
switch (type) {
|
||||
case Episode3::CardType::HUNTERS_SC:
|
||||
return "HUNTERS_SC";
|
||||
case Episode3::CardType::ARKZ_SC:
|
||||
return "ARKZ_SC";
|
||||
case Episode3::CardType::ITEM:
|
||||
return "ITEM";
|
||||
case Episode3::CardType::CREATURE:
|
||||
return "CREATURE";
|
||||
case Episode3::CardType::ACTION:
|
||||
return "ACTION";
|
||||
case Episode3::CardType::ASSIST:
|
||||
return "ASSIST";
|
||||
case Episode3::CardType::INVALID_FF:
|
||||
return "INVALID_FF";
|
||||
default:
|
||||
return "__UNKNOWN__";
|
||||
}
|
||||
}
|
||||
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::CardClass>(Episode3::CardClass cc) {
|
||||
switch (cc) {
|
||||
case Episode3::CardClass::HU_SC:
|
||||
return "HU_SC";
|
||||
case Episode3::CardClass::RA_SC:
|
||||
return "RA_SC";
|
||||
case Episode3::CardClass::FO_SC:
|
||||
return "FO_SC";
|
||||
case Episode3::CardClass::NATIVE_CREATURE:
|
||||
return "NATIVE_CREATURE";
|
||||
case Episode3::CardClass::A_BEAST_CREATURE:
|
||||
return "A_BEAST_CREATURE";
|
||||
case Episode3::CardClass::MACHINE_CREATURE:
|
||||
return "MACHINE_CREATURE";
|
||||
case Episode3::CardClass::DARK_CREATURE:
|
||||
return "DARK_CREATURE";
|
||||
case Episode3::CardClass::GUARD_ITEM:
|
||||
return "GUARD_ITEM";
|
||||
case Episode3::CardClass::MAG_ITEM:
|
||||
return "MAG_ITEM";
|
||||
case Episode3::CardClass::SWORD_ITEM:
|
||||
return "SWORD_ITEM";
|
||||
case Episode3::CardClass::GUN_ITEM:
|
||||
return "GUN_ITEM";
|
||||
case Episode3::CardClass::CANE_ITEM:
|
||||
return "CANE_ITEM";
|
||||
case Episode3::CardClass::ATTACK_ACTION:
|
||||
return "ATTACK_ACTION";
|
||||
case Episode3::CardClass::DEFENSE_ACTION:
|
||||
return "DEFENSE_ACTION";
|
||||
case Episode3::CardClass::TECH:
|
||||
return "TECH";
|
||||
case Episode3::CardClass::PHOTON_BLAST:
|
||||
return "PHOTON_BLAST";
|
||||
case Episode3::CardClass::CONNECT_ONLY_ATTACK_ACTION:
|
||||
return "CONNECT_ONLY_ATTACK_ACTION";
|
||||
case Episode3::CardClass::BOSS_ATTACK_ACTION:
|
||||
return "BOSS_ATTACK_ACTION";
|
||||
case Episode3::CardClass::BOSS_TECH:
|
||||
return "BOSS_TECH";
|
||||
case Episode3::CardClass::ASSIST:
|
||||
return "ASSIST";
|
||||
default:
|
||||
return "__INVALID__";
|
||||
}
|
||||
}
|
||||
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::ConditionType>(Episode3::ConditionType cond_type) {
|
||||
try {
|
||||
return Episode3::description_for_condition_type.at(static_cast<size_t>(cond_type)).name;
|
||||
} catch (const out_of_range&) {
|
||||
return "__INVALID__";
|
||||
}
|
||||
}
|
||||
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::Direction>(Episode3::Direction d) {
|
||||
switch (d) {
|
||||
case Episode3::Direction::RIGHT:
|
||||
return "LEFT";
|
||||
case Episode3::Direction::UP:
|
||||
return "DOWN";
|
||||
case Episode3::Direction::LEFT:
|
||||
return "RIGHT";
|
||||
case Episode3::Direction::DOWN:
|
||||
return "UP";
|
||||
case Episode3::Direction::INVALID_FF:
|
||||
return "INVALID_FF";
|
||||
default:
|
||||
return "__INVALID__";
|
||||
}
|
||||
}
|
||||
|
||||
+22
-13
@@ -59,8 +59,6 @@ enum class AttackMedium : uint8_t {
|
||||
INVALID_FF = 0xFF,
|
||||
};
|
||||
|
||||
const char* name_for_attack_medium(AttackMedium medium);
|
||||
|
||||
enum class CriterionCode : uint8_t {
|
||||
NONE = 0x00,
|
||||
HU_CLASS_SC = 0x01,
|
||||
@@ -99,8 +97,6 @@ enum class CriterionCode : uint8_t {
|
||||
NON_PHYSICAL_NON_TECH_NON_UNKNOWN_ATTACK_MEDIUM_NON_SC = 0x22,
|
||||
};
|
||||
|
||||
const char* name_for_criterion_code(CriterionCode code);
|
||||
|
||||
enum class CardRank : uint8_t {
|
||||
N1 = 0x01,
|
||||
R1 = 0x02,
|
||||
@@ -138,8 +134,6 @@ enum class CardType : uint8_t {
|
||||
END_CARD_LIST = 0xFF,
|
||||
};
|
||||
|
||||
const char* name_for_card_type(CardType type);
|
||||
|
||||
enum class CardClass : uint16_t {
|
||||
HU_SC = 0x0000,
|
||||
RA_SC = 0x0001,
|
||||
@@ -163,7 +157,6 @@ enum class CardClass : uint16_t {
|
||||
ASSIST = 0x0028,
|
||||
};
|
||||
|
||||
const char* name_for_card_class(CardClass cc);
|
||||
bool card_class_is_tech_like(CardClass cc, bool is_nte);
|
||||
|
||||
enum class TargetMode : uint8_t {
|
||||
@@ -310,8 +303,6 @@ enum class ConditionType : uint8_t {
|
||||
ANY_FF = 0xFF, // Used as a wildcard in some search functions
|
||||
};
|
||||
|
||||
const char* name_for_condition_type(ConditionType cond_type);
|
||||
|
||||
enum class AssistEffect : uint16_t {
|
||||
NONE = 0x0000,
|
||||
DICE_HALF = 0x0001,
|
||||
@@ -408,8 +399,6 @@ enum class ActionSubphase : uint8_t {
|
||||
INVALID_FF = 0xFF,
|
||||
};
|
||||
|
||||
const char* name_for_action_subphase(ActionSubphase subphase);
|
||||
|
||||
enum class SetupPhase : uint8_t {
|
||||
REGISTRATION = 0,
|
||||
STARTER_ROLLS = 1,
|
||||
@@ -439,7 +428,6 @@ enum class Direction : uint8_t {
|
||||
Direction turn_left(Direction d);
|
||||
Direction turn_right(Direction d);
|
||||
Direction turn_around(Direction d);
|
||||
const char* name_for_direction(Direction d);
|
||||
|
||||
struct Location {
|
||||
/* 00 */ uint8_t x;
|
||||
@@ -519,7 +507,7 @@ struct CardDefinition {
|
||||
} __attribute__((packed));
|
||||
|
||||
/* 0000 */ be_uint32_t card_id;
|
||||
/* 0004 */ parray<uint8_t, 0x40> jp_name;
|
||||
/* 0004 */ pstring<TextEncoding::SJIS, 0x40> jp_name;
|
||||
|
||||
// The list of card definitions ends with a "sentinel" definition that isn't a
|
||||
// real card, but instead has a negative number in the type field here.
|
||||
@@ -1556,3 +1544,24 @@ template <>
|
||||
Episode3::AllowedCards enum_for_name<Episode3::AllowedCards>(const char* name);
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::AllowedCards>(Episode3::AllowedCards allowed_cards);
|
||||
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::BattlePhase>(Episode3::BattlePhase phase);
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::SetupPhase>(Episode3::SetupPhase phase);
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::RegistrationPhase>(Episode3::RegistrationPhase phase);
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::ActionSubphase>(Episode3::ActionSubphase phase);
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::AttackMedium>(Episode3::AttackMedium medium);
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::CriterionCode>(Episode3::CriterionCode code);
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::CardType>(Episode3::CardType type);
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::CardClass>(Episode3::CardClass cc);
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::ConditionType>(Episode3::ConditionType cond_type);
|
||||
template <>
|
||||
const char* name_for_enum<Episode3::Direction>(Episode3::Direction d);
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
namespace Episode3 {
|
||||
|
||||
struct NameEntry {
|
||||
/* 00 */ parray<char, 0x10> name;
|
||||
/* 00 */ pstring<TextEncoding::MARKED, 0x10> name;
|
||||
/* 10 */ uint8_t client_id;
|
||||
/* 11 */ uint8_t present;
|
||||
/* 12 */ uint8_t is_cpu_player;
|
||||
@@ -23,7 +23,7 @@ struct NameEntry {
|
||||
} __attribute__((packed));
|
||||
|
||||
struct DeckEntry {
|
||||
/* 00 */ pstring<TextEncoding::SJIS, 0x10> name;
|
||||
/* 00 */ pstring<TextEncoding::MARKED, 0x10> name;
|
||||
/* 10 */ le_uint32_t team_id;
|
||||
/* 14 */ parray<le_uint16_t, 31> card_ids;
|
||||
// If the following flag is not set to 3, then the God Whim assist effect can
|
||||
|
||||
@@ -1781,7 +1781,7 @@ bool PlayerState::set_action_cards_for_action_state(const ActionState& pa) {
|
||||
auto card = s->card_for_set_card_ref(pa.attacker_card_ref);
|
||||
if (card) {
|
||||
card->loc.direction = pa.facing_direction;
|
||||
log.debug("set facing direction to %s", name_for_direction(card->loc.direction));
|
||||
log.debug("set facing direction to %s", name_for_enum(card->loc.direction));
|
||||
|
||||
G_Unknown_Ep3_6xB4x4A cmd;
|
||||
cmd.card_refs.clear(0xFFFF);
|
||||
|
||||
@@ -68,7 +68,7 @@ std::string Condition::str(shared_ptr<const Server> s) const {
|
||||
"Condition[type=%s, turns=%hhu, a_arg=%hhd, dice=%hhu, flags=%02hhX, "
|
||||
"def_eff_index=%hhu, ref=%s, value=%hd, giver_ref=%s "
|
||||
"percent=%hhu value8=%hd order=%hu a8=%hu]",
|
||||
name_for_condition_type(this->type),
|
||||
name_for_enum(this->type),
|
||||
this->remaining_turns,
|
||||
this->a_arg_value,
|
||||
this->dice_roll_value,
|
||||
@@ -199,7 +199,7 @@ std::string ActionState::str(shared_ptr<const Server> s) const {
|
||||
"orig_attacker_ref=%s]",
|
||||
this->client_id.load(),
|
||||
this->unused,
|
||||
name_for_direction(this->facing_direction),
|
||||
name_for_enum(this->facing_direction),
|
||||
attacker_ref_s.c_str(),
|
||||
defense_ref_s.c_str(),
|
||||
target_refs_s.c_str(),
|
||||
@@ -258,9 +258,9 @@ std::string ActionChain::str(shared_ptr<const Server> s) const {
|
||||
unknown_card_ref_a3_s.c_str(),
|
||||
attack_action_card_refs_s.c_str(),
|
||||
this->attack_action_card_ref_count,
|
||||
name_for_attack_medium(this->attack_medium),
|
||||
name_for_enum(this->attack_medium),
|
||||
this->target_card_ref_count,
|
||||
name_for_action_subphase(this->action_subphase),
|
||||
name_for_enum(this->action_subphase),
|
||||
this->strike_count,
|
||||
this->damage_multiplier,
|
||||
this->attack_number,
|
||||
@@ -588,7 +588,7 @@ std::string ActionMetadata::str(shared_ptr<const Server> s) const {
|
||||
card_ref_s.c_str(),
|
||||
this->target_card_ref_count,
|
||||
this->defense_card_ref_count,
|
||||
name_for_action_subphase(this->action_subphase),
|
||||
name_for_enum(this->action_subphase),
|
||||
this->defense_power,
|
||||
this->defense_bonus,
|
||||
this->attack_bonus,
|
||||
|
||||
@@ -939,7 +939,7 @@ bool RulerServer::check_usability_or_condition_apply(
|
||||
bool is_item_usability_check,
|
||||
AttackMedium attack_medium) const {
|
||||
auto s = this->server();
|
||||
auto log = s->log_stack(string_printf("check_usability_or_condition_apply(%02hhX, #%04hX, %02hhX, #%04hX, #%04hX, %02hhX, %s, %s): ", client_id1, card_id1, client_id2, card_id2, card_id3, def_effect_index, is_item_usability_check ? "true" : "false", name_for_attack_medium(attack_medium)));
|
||||
auto log = s->log_stack(string_printf("check_usability_or_condition_apply(%02hhX, #%04hX, %02hhX, #%04hX, #%04hX, %02hhX, %s, %s): ", client_id1, card_id1, client_id2, card_id2, card_id3, def_effect_index, is_item_usability_check ? "true" : "false", name_for_enum(attack_medium)));
|
||||
|
||||
if (static_cast<uint8_t>(attack_medium) & 0x80) {
|
||||
attack_medium = AttackMedium::UNKNOWN;
|
||||
@@ -967,7 +967,7 @@ bool RulerServer::check_usability_or_condition_apply(
|
||||
}
|
||||
criterion_code = ce1->def.effects[def_effect_index].apply_criterion;
|
||||
}
|
||||
log.debug("criterion_code=%s", name_for_criterion_code(criterion_code));
|
||||
log.debug("criterion_code=%s", name_for_enum(criterion_code));
|
||||
|
||||
// For item usability checks, prevent criteria that depend on player
|
||||
// positioning/team setup
|
||||
|
||||
Reference in New Issue
Block a user