diff --git a/src/Main.cc b/src/Main.cc index edda445e..c187ae5d 100644 --- a/src/Main.cc +++ b/src/Main.cc @@ -1136,9 +1136,8 @@ Action a_decrypt_dcv2_executable( executable (DP_ADDRESS.JPN), INDEXES should be the path to the index fixup\n\ table (KATSUO.SEA), and VALUES should be the path to the value fixup table\n\ (IWASHI.SEA). The output is written to EXEC.dec.\n\ - If --simple is given, uses the simpler encryption method used in some\n\ - community modifications of the game (Enhancement Pack, for example). In\n\ - this case, --seed is not required; if not given, finds the seed\n\ + If --simple is given, uses the encryption method used in Ives\' Enhancement\n\ + Pack. In this case, --seed is not required; if not given, finds the seed\n\ automatically, and prints it to stderr so you will be able to use it when\n\ re-encrypting.\n", +[](phosg::Arguments& args) { @@ -1166,8 +1165,8 @@ Action a_encrypt_dcv2_executable( executable (DP_ADDRESS.JPN) and INDEXES should be the path to the index\n\ fixup table (KATSUO.SEA). The output is written to EXEC.enc and\n\ INDEXES.enc.\n\ - If --simple is given, uses the simpler encryption method used in some\n\ - community modifications of the game. In this case, --seed is required.\n", + If --simple is given, uses the simpler encryption method used in Ives\'\n\ + Enhancement Pack. In this case, --seed is required.\n", +[](phosg::Arguments& args) { string executable_filename = args.get("executable", true); string executable_data = phosg::load_file(executable_filename); @@ -1188,7 +1187,7 @@ Action a_encrypt_dcv2_executable( Action a_decode_gci_snapshot( "decode-gci-snapshot", "\ decode-gci-snapshot [INPUT-FILENAME [OUTPUT-FILENAME]]\n\ - Decode a PSO GC snapshot file into a Windows BMP image.\n", + Decode a PSO GC snapshot file (in GCI format) into a Windows BMP image.\n", +[](phosg::Arguments& args) { auto data = read_input_data(args); phosg::StringReader r(data); diff --git a/src/Map.cc b/src/Map.cc index f27bce93..4709d3ce 100644 --- a/src/Map.cc +++ b/src/Map.cc @@ -866,9 +866,10 @@ static const vector dat_object_definitions({ // param5; if the dot product is positive, param2 is used) // param3 = room ID to use if the dot product described above is zero or negative // param5 = angle (see param2) - // param6 = if equal to 0x00010000, only the player's room_id field is set, and game flag 0x02000000 is set on - // the player; if not equal to 0x00010000, then both room_id and room_id2 are set and no game flag is set - // (TODO: What are the visible behavior differences due to this parameter?) + // param6 = on v2 and before, this is ignored; on v3 and later, if param6 is equal to 0x00010000, only the + // player's room_id field is set, and player flag 0x02000000 is set on the player; if not equal to 0x00010000, + // then both room_id and room_id_in_custom_area (if in a non-rearrangeable area, like Pioneer 2 or Forest) are + // set and no game flag is set (TODO: What are the visible behavior differences due to this parameter?) {0x000E, F_V0_V4, 0x00005FFFFFF83FFE, "TObjRoomId"}, // Sensor of some kind (TODO). Params: @@ -6607,7 +6608,7 @@ void MapState::import_enemy_states_from_sync(Version from_version, const SyncEne // Only set the state if it's not an alias if (ene_st->super_ene == ene) { if (ene_st->game_flags != entry.flags) { - this->log.warning_f("({:04X} => E-{:03X}) Flags from client ({:08X}) do not match game flags from map ({:08X})", + this->log.warning_f("({:04X} => E-{:03X}) Game flags from client ({:08X}) do not match game flags from map ({:08X})", enemy_index, ene_st->e_id, entry.flags, ene_st->game_flags); ene_st->game_flags = entry.flags; } diff --git a/src/PlayerSubordinates.cc b/src/PlayerSubordinates.cc index 3e980501..8915f380 100644 --- a/src/PlayerSubordinates.cc +++ b/src/PlayerSubordinates.cc @@ -721,7 +721,7 @@ const ChallengeTemplateDefinition& get_challenge_template_definition(Version ver } PlayerHoldState::PlayerHoldState(const PlayerHoldState_DCProtos& proto) - : unknown_a1(proto.unknown_a1), + : expiration_frames(proto.expiration_frames), unknown_a2(proto.unknown_a2), unknown_a3(0), trigger_radius2(proto.trigger_radius2), @@ -730,7 +730,7 @@ PlayerHoldState::PlayerHoldState(const PlayerHoldState_DCProtos& proto) PlayerHoldState::operator PlayerHoldState_DCProtos() const { PlayerHoldState_DCProtos ret; - ret.unknown_a1 = this->unknown_a1; + ret.expiration_frames = this->expiration_frames; ret.unknown_a2 = this->unknown_a2; ret.trigger_radius2 = this->trigger_radius2; ret.x = this->x; diff --git a/src/PlayerSubordinates.hh b/src/PlayerSubordinates.hh index f838e6d6..e0db3466 100644 --- a/src/PlayerSubordinates.hh +++ b/src/PlayerSubordinates.hh @@ -1129,7 +1129,7 @@ struct TelepipeState { struct PlayerHoldState_DCProtos { // This is used in all versions of this command except DCNTE and 11/2000. - /* 00 */ le_uint16_t unknown_a1 = 0; + /* 00 */ le_uint16_t expiration_frames = 0; /* 02 */ le_uint16_t unknown_a2 = 0; // unknown_a3 is missing in this format, unlike the v1+ format below /* 04 */ le_float trigger_radius2 = 0.0f; @@ -1140,7 +1140,7 @@ struct PlayerHoldState_DCProtos { struct PlayerHoldState { // This is used in all versions of this command except DCNTE and 11/2000. - /* 00 */ le_uint16_t unknown_a1 = 0; + /* 00 */ le_uint16_t expiration_frames = 0; /* 02 */ le_uint16_t unknown_a2 = 0; /* 04 */ le_uint32_t unknown_a3 = 0; /* 08 */ le_float trigger_radius2 = 0.0f; diff --git a/src/ReceiveSubcommands.cc b/src/ReceiveSubcommands.cc index 2fb601a2..01b80143 100644 --- a/src/ReceiveSubcommands.cc +++ b/src/ReceiveSubcommands.cc @@ -1148,42 +1148,43 @@ uint32_t Parsed6x70Data::convert_player_flags(uint32_t player_flags, bool to_v3) // other bits were added, so it doesn't suffice to simply store the most complete format of this field - we have to // be able to convert between the two. What's known about these bits (? indicates meaning/behavior is unverified): // V1/V2 V3/V4 - // 00000001 00000001 = player hold is set (see notes on 6x2C and 6x2D in CommandFormats.hh) - // 00000002 00000002 = player hold is set for the purpose of dropping an item - // 00000004 00000004 = is on a different floor from the local player (or is loading into game) - // 00000008 00000008 ? = unknown (TODO: appears to be entirely unused, at least in v3) - // 00000010 00000010 = player has sent any update command (position, attack, etc.) this frame - // 00000020 00000020 ? = unknown (TODO: appears to be entirely unused, at least in v3) - // 00000040 00000040 ? = unknown (TODO: appears to be entirely unused, at least in v3) - // 00000080 00000080 = is in windup animation for technique or PB - // 00000100 -------- ? = unknown (TODO) - // 00000200 00000100 = chat, pause, or quick menu is open (suppresses action palette) - // 00000400 00000200 = is in PB cutscene - // 00000800 -------- ? = unknown (TODO) - // 00001000 -------- ? = unknown (TODO) - // 00002000 00000400 = action palette is disabled by p_action_disable or one of the TObjQuestColA* objects - // 00004000 00000800 = is about to return to Pioneer 2 after a death (TODO: also set by p_return_guild) - // 00008000 00001000 = cannot use telepipe / Ryuker (e.g. boss warps set this flag when the player is nearby) - // 00010000 00002000 ? = unknown (TODO: appears to be entirely unused, at least in v3) - // 00020000 00004000 = is teleporting as a result of 6x24 (set only briefly after appearing at destination) - // 00040000 00008000 = is dead NPC (set by e.g. npc_crptalk_id when regsA[4] == 1) - // 00080000 -------- ? = unknown (TODO) - // 00100000 00010000 = has permanent trap vision (e.g. is android) - // 00200000 00020000 = equipped items are invisible / intangible (e.g. in Pioneer 2) - // 00400000 00040000 = is loading / changing floors (set by 6x22 and at game join, cleared by 6x23) - // 00800000 00080000 = player data is in the process of being exported to save file format - // 01000000 00100000 = initial cutscene with the Principal has started in offline free-play single-mode - // 02000000 00200000 = is visible (set shortly after warping into a floor; remains set until next warp) - // 04000000 00400000 = position is valid (therefore player can be rendered) - // 08000000 00800000 = player is invisible if not local, but items are still visible (TODO: what about on BB?) - // 10000000 01000000 = if set, player does not drop weapon on death - // -------- 02000000 ? = used by TObjRoomId when param6 == 0x00010000 (TODO: figure out what this does) - // -------- 04000000 = is sitting in lobby chair - // -------- 08000000 = using male animations / poses in lobby chair - // -------- 10000000 = using alternate lobby chair pose (X+B instead of X+A on GC, for example) - // -------- 20000000 ? = if set, the player will freeze when attempting any lobby animation (TODO: what does this - // actually do? it doesn't appear to be set anywhere normally) - // -------- 40000000 ? = unknown (TODO: used in offline multi-player Challenge mode; see tree from 3OE1:801BE594) + // 00000001 00000001 = player hold is set (see notes on 6x2C and 6x2D in CommandFormats.hh) + // 00000002 00000002 = player hold is set for the purpose of dropping an item + // 00000004 00000004 = is on a different floor from the local player (or is loading into game) + // 00000008 00000008 = unknown (TODO: appears to be entirely unused, at least in v2 and later) + // 00000010 00000010 = player has sent any update command (position, attack, etc.) this frame + // 00000020 00000020 = unknown (TODO: appears to be entirely unused, at least in v2 and later) + // 00000040 00000040 = unknown (TODO: appears to be entirely unused, at least in v2 and later) + // 00000080 00000080 = is in windup animation for technique or PB + // 00000100 -------- = unknown (TODO: appears to be entirely unused, at least in v2) + // 00000200 00000100 = chat, pause, or quick menu is open (suppresses action palette) + // 00000400 00000200 = is in PB cutscene + // 00000800 -------- = player is standing in water (steps create splash particles) + // 00001000 -------- = player is standing in grass (steps create grass particles) + // 00002000 00000400 = action palette is disabled by p_action_disable or one of the TObjQuestColA* objects + // 00004000 00000800 = is about to return to Pioneer 2 after a death (TODO: also set by p_return_guild) + // 00008000 00001000 = cannot use telepipe / Ryuker (e.g. boss warps set this flag when the player is nearby) + // 00010000 00002000 = unknown (TODO: appears to be entirely unused, at least in v3) + // 00020000 00004000 = is teleporting as a result of 6x24 (set only briefly after appearing at destination) + // 00040000 00008000 = is dead NPC (set by e.g. npc_crptalk_id when regsA[4] == 1) + // 00080000 -------- = unknown (TODO: appears to be entirely unused, at least in v2) + // 00100000 00010000 = has permanent trap vision (e.g. is android) + // 00200000 00020000 = equipped items are invisible / intangible (e.g. in Pioneer 2) + // 00400000 00040000 = is loading / changing floors (set by 6x22 and at game join, cleared by 6x23) + // 00800000 00080000 = player data is in the process of being exported to save file format + // 01000000 00100000 = initial cutscene with the Principal has started in offline free-play single-mode + // 02000000 00200000 = is visible (set shortly after warping into a floor; remains set until next warp) + // 04000000 00400000 = position is valid (therefore player can be rendered) + // 08000000 00800000 = player is invisible if not local, but items are still visible (TODO: what about on BB?) + // 10000000 01000000 = if set, player does not drop weapon on death + // -------- 02000000 = player's room_id_in_custom_area does not match player's room_id (used by TObjRoomId when + // param6 == 0x00010000; TODO: figure out what this does) + // -------- 04000000 = is sitting in lobby chair + // -------- 08000000 = using male animations / poses in lobby chair + // -------- 10000000 = using alternate lobby chair pose (X+B instead of X+A on GC, for example) + // -------- 20000000 = appears to be unused (there is no codepath that sets this flag); if set, the player will + // freeze when attempting any lobby animation + // -------- 40000000 = unknown (TODO: used in offline multi-player Challenge mode; see tree from 3OE1:801BE594) if (to_v3) { return (player_flags & 0x000000FF) |