refine some Ep3 structures

This commit is contained in:
Martin Michelsen
2024-10-13 22:49:31 -07:00
parent 59124678bf
commit 8cc8d804bc
3 changed files with 29 additions and 17 deletions
+5 -5
View File
@@ -7066,13 +7066,13 @@ struct G_ServerVersionStrings_Ep3NTE_6xB4x46 {
pstring<TextEncoding::MARKED, 0x40> date_str1;
} __packed_ws__(G_ServerVersionStrings_Ep3NTE_6xB4x46, 0x88);
// 6xB5x47: Set spectator's CARD level
// header.sender_client_id is the spectator's client ID.
// 6xB5x47: Set online player's CARD level
// header.sender_client_id is the player's client ID.
struct G_SetSpectatorCARDLevel_Ep3_6xB5x47 {
G_CardBattleCommandHeader header = {0xB5, sizeof(G_SetSpectatorCARDLevel_Ep3_6xB5x47) / 4, 0, 0x47, 0, 0, 0};
struct G_SetPlayerCARDLevel_Ep3_6xB5x47 {
G_CardBattleCommandHeader header = {0xB5, sizeof(G_SetPlayerCARDLevel_Ep3_6xB5x47) / 4, 0, 0x47, 0, 0, 0};
le_uint32_t clv = 0;
} __packed_ws__(G_SetSpectatorCARDLevel_Ep3_6xB5x47, 0x0C);
} __packed_ws__(G_SetPlayerCARDLevel_Ep3_6xB5x47, 0x0C);
// 6xB3x48 / CAx48: End turn
+3 -1
View File
@@ -1177,6 +1177,7 @@ PlayerConfigNTE::PlayerConfigNTE(const PlayerConfig& config)
offline_clv_exp(config.offline_clv_exp),
online_clv_exp(config.online_clv_exp),
recent_human_opponents(config.recent_human_opponents),
recent_battle_start_timestamps(config.recent_battle_start_timestamps),
unknown_a10(config.unknown_a10),
init_timestamp(config.init_timestamp),
last_online_battle_start_timestamp(config.last_online_battle_start_timestamp),
@@ -1206,6 +1207,7 @@ PlayerConfigNTE::operator PlayerConfig() const {
ret.offline_clv_exp = this->offline_clv_exp;
ret.online_clv_exp = this->online_clv_exp;
ret.recent_human_opponents = this->recent_human_opponents;
ret.recent_battle_start_timestamps = this->recent_battle_start_timestamps;
ret.unknown_a10 = this->unknown_a10;
ret.init_timestamp = this->init_timestamp;
ret.last_online_battle_start_timestamp = this->last_online_battle_start_timestamp;
@@ -1964,7 +1966,7 @@ string MapDefinition::str(const CardIndex* card_index, uint8_t language) const {
lines.emplace_back(phosg::string_printf(" field_offset: (x: %hd units, y:%hd units) (x: %lg tiles, y: %lg tiles)", this->field_offset_x.load(), this->field_offset_y.load(), static_cast<double>(this->field_offset_x) / 25.0, static_cast<double>(this->field_offset_y) / 25.0));
lines.emplace_back(phosg::string_printf(" map_category: %02hhX", this->map_category));
lines.emplace_back(phosg::string_printf(" cyber_block_type: %02hhX", this->cyber_block_type));
lines.emplace_back(phosg::string_printf(" a11: %02hhX%02hhX", this->unknown_a11[0], this->unknown_a11[1]));
lines.emplace_back(phosg::string_printf(" a11: %04hX", this->unknown_a11.load()));
static const array<const char*, 0x18> sc_card_entry_names = {
"00 (Guykild; 0005)",
"01 (Kylria; 0006)",
+21 -11
View File
@@ -523,7 +523,6 @@ struct CardDefinition {
// rules; for example, the expression "4+4//2" results in 4, not 6.
/* 02 */ pstring<TextEncoding::ASCII, 0x0F> expr;
// when specifies in which phase the effect should activate.
// TODO: There are many values that can be used here; document them.
/* 11 */ EffectWhen when;
// arg1 generally specifies how long the effect activates for.
/* 12 */ pstring<TextEncoding::ASCII, 4> arg1;
@@ -918,13 +917,15 @@ struct PlayerConfig {
/* 00 */ be_uint32_t guild_card_number;
/* 04 */ pstring<TextEncoding::MARKED, 0x18> name;
} __packed_ws__(PlayerReference, 0x1C);
// This array is updated when a battle is started (via a 6xB4x05 command). The
// client adds the opposing players' info to ths first two entries here if the
// opponents are human. (The existing entries are always moved back by two
// slots, but if one or both opponents are not humans, one or both of the
// newly-vacated slots is not filled in.)
// These two arrays are updated when a battle is started (via a 6xB4x05
// command). The client adds the opposing players' info to ths first two
// entries in recent_human_opponents if the opponents are human. (The
// existing entries are always moved back by two slots, but if one or both
// opponents are not humans, one or both of the newly-vacated slots is not
// filled in.) Both arrays have the most recent entries at the beginning.
/* 2128:1FD4 */ parray<PlayerReference, 10> recent_human_opponents;
/* 2240:20EC */ parray<uint8_t, 0x28> unknown_a10;
/* 2240:20EC */ parray<be_uint32_t, 5> recent_battle_start_timestamps;
/* 2254:2100 */ parray<uint8_t, 0x14> unknown_a10;
/* 2268:2114 */ be_uint32_t init_timestamp;
/* 226C:2118 */ be_uint32_t last_online_battle_start_timestamp;
// In a certain situation, unknown_t3 is set to init_timestamp plus a multiple
@@ -961,7 +962,8 @@ struct PlayerConfigNTE {
/* 1B70 */ be_uint32_t offline_clv_exp;
/* 1B74 */ be_uint32_t online_clv_exp;
/* 1B78 */ parray<PlayerConfig::PlayerReference, 10> recent_human_opponents;
/* 1C90 */ parray<uint8_t, 0x28> unknown_a10;
/* 1C90 */ parray<be_uint32_t, 5> recent_battle_start_timestamps;
/* 1CA4 */ parray<uint8_t, 0x14> unknown_a10;
/* 1CB8 */ be_uint32_t init_timestamp;
/* 1CBC */ be_uint32_t last_online_battle_start_timestamp;
/* 1CC0 */ be_uint32_t unknown_t3;
@@ -1150,6 +1152,8 @@ struct OverlayState {
// Any other value here will behave like 00 (no special tile behavior).
parray<parray<uint8_t, 0x10>, 0x10> tiles;
// This field appears to be unused in both NTE and the final version. Perhaps
// it had some meaning in a pre-NTE version.
parray<le_uint32_t, 5> unused1;
// TODO: Figure out exactly where these colors are used
@@ -1382,7 +1386,13 @@ struct MapDefinition { // .mnmd format; also the format of (decompressed) quests
/* 28F0 */ parray<parray<DialogueSet, 0x10>, 3> dialogue_sets;
// These card IDs are always given to the player when they win a battle on
// this map. Unused entries should be set to FFFF.
// this map. Unused entries should be set to FFFF. Cards in this array are
// ignored if they have any of these features (in the card definition):
// - type is HUNTERS_SC or ARKZ_SC
// - card_class is BOSS_ATTACK_ACTION or BOSS_TECH
// - rank is D1, D2, or D3
// - cannot_drop is 1 (specifically 1; other values don't prevent cards from
// appearing)
/* 59B0 */ parray<be_uint16_t, 0x10> reward_card_ids;
// These fields are used when determining which cards to drop after the battle
@@ -1406,7 +1416,7 @@ struct MapDefinition { // .mnmd format; also the format of (decompressed) quests
// There are 10 block types (0-9); if this value is > 9, type 0 is used.
/* 59DD */ uint8_t cyber_block_type;
/* 59DE */ parray<uint8_t, 2> unknown_a11;
/* 59DE */ be_uint16_t unknown_a11;
// This array specifies which SC characters can't participate in the quest
// (that is, the player is not allowed to choose decks with these SC cards).
@@ -1513,7 +1523,7 @@ struct MapDefinitionTrial {
/* 4172 */ be_int16_t field_offset_y;
/* 4174 */ uint8_t map_category;
/* 4175 */ uint8_t cyber_block_type;
/* 4176 */ parray<uint8_t, 2> unknown_a11;
/* 4176 */ be_uint16_t unknown_a11;
// TODO: This field may contain some version of unavailable_sc_cards and/or
// entry_states from MapDefinition, but the format isn't the same
/* 4178 */ parray<uint8_t, 0x28> unknown_t12;