diff --git a/src/CommandFormats.hh b/src/CommandFormats.hh index cabd2796..d6c534bd 100644 --- a/src/CommandFormats.hh +++ b/src/CommandFormats.hh @@ -4054,7 +4054,7 @@ struct G_AddStatusEffect_6x0C { // 12 = Confuse (slot 1; 10 seconds) // Anything else = command is ignored le_uint32_t effect_type = 0; - le_uint32_t level = 0; // Only used for Shifta/Deband/Jellen/Zalure + le_float amount = 0; // Only used for Shifta/Deband/Jellen/Zalure } __packed_ws__(G_AddStatusEffect_6x0C, 0x0C); // 6x0D: Clear status effect slot (protected on V3/V4) @@ -4783,7 +4783,9 @@ struct G_UseStarAtomizer_6x66 { // 6x67: Trigger set event struct G_TriggerSetEvent_6x67 { - G_UnusedHeader header; + // If this command is sent by a box that triggers a set event, the entity ID + // in the header is the box's object ID. + G_EntityIDHeader header; le_uint32_t floor = 0; le_uint32_t event_id = 0; // NOT event index le_uint32_t client_id = 0; diff --git a/src/Map.cc b/src/Map.cc index 1d9eb218..4fe8d5b2 100644 --- a/src/Map.cc +++ b/src/Map.cc @@ -1432,11 +1432,11 @@ const char* MapFile::name_for_object_type(uint16_t type) { // param4 = event number {0x0091, "TObjContainerEnemy"}, - // Large box (usually used for specialized drops). See TObjContainerBase2 - // for parameters. + // Large box (usually used for specialized drops). Same parameters as + // 0x0088 (TObjContainerBase2) {0x0092, "TObjContainerBase"}, - // Large enemy box. See TObjContainerEnemy for parameters. + // Large enemy box. Same parameters as 0x0091 (TObjContainerEnemy). {0x0093, "TObjContainerAbeEnemy"}, // Always-empty box. @@ -1710,31 +1710,126 @@ const char* MapFile::name_for_object_type(uint16_t type) { // param5 = color (clamped to [0, 3]) {0x014D, "TOKeyAncient01"}, + // Ruins fence objects. Params: + // param4 = switch flag number (negative = always unlocked) + // param5 = color (clamped to [0, 3]) + {0x014E, "TOFenceAncient01"}, // 4x2 + {0x014F, "TOFenceAncient02"}, // 6x2 + {0x0150, "TOFenceAncient03"}, // 4x4 + {0x0151, "TOFenceAncient04"}, // 6x4 + + // Ruins poison-spewing blob. This object is technically an item box, and + // drops an item when destroyed. Unlike most other item boxes, it cannot + // be specialized (ignore_def is always true). Params: + // param1 = TODO (value used is param1 + 299) + // param2 = TODO (value used is param2 + 209) + // param3 = TODO (value used is param3 + 399) + // param6 = TODO (value used is param6 + 4) + {0x0152, "TContainerAncient01"}, + + // Ruins falling trap. Trap power seems to be scaled by difficulty + // (Normal = x1, Hard = x2, Very Hard = x3, Ultimate = x6). Params: + // param1 = trigger radius delta (value used is (param1 / 2) + 30) + // param2 = TODO (clamped below to 0) + // param3 = TODO (clamped below to 1) + // param4 = TODO (seems it only matters if this is negative or not in + // the base class (TOTrap), but TOTrapAncient01 clamps it below to 0) + // param5 = TODO (clamped to [0, 5]; calls player->vtable[0x19] on + // explode unless this is 5) + // param6 = TODO (value used is param6 + 30, multipled by 0.33 if + // offline) + {0x0153, "TOTrapAncient01"}, + + // Ruins pop-up trap. Params: + // param1 = trigger radius delta (value used is (param1 / 2) + 30) + // param4 = delay (value used is param4 + 30; clamped below to 0) + // angle.z = TODO (seems it only matters if angle.z is > 0 or not) + {0x0154, "TOTrapAncient02"}, + + // Ruins crystal monument. Same parameters as TOCapsuleAncient01. + {0x0155, "TOMonumentAncient01"}, + + // Non-Ruins monument. Sets a quest flag when activated. The quest flag + // depends on which area the object appears in: + // Mine 2 = 0x2E + // Cave 2 = 0x2D + // Any other area = 0x2C + // When all three of the above quest flags are active, this object also + // sets quest flag 0x2F. + // There appear to be no parameters. + {0x0156, "TOMonumentAncient02"}, + + // Ruins rocks. None of these take any parameters. + {0x0159, "TOWreckAncient01"}, + {0x015A, "TOWreckAncient02"}, + {0x015B, "TOWreckAncient03"}, + {0x015C, "TOWreckAncient04"}, + {0x015D, "TOWreckAncient05"}, + {0x015E, "TOWreckAncient06"}, + {0x015F, "TOWreckAncient07"}, + + // This ID constructs different objects depending on where it's used. On + // floor 0D (Vol Opt), it constructs TObjWarpBoss03; on other floors + // where it's valid, it constructs TObjFogCollisionPoison. + // TObjFogCollisionPoison creates a switchable, foggy area that's visible + // and hurts the player if the switch flag isn't on. Params: + // param1 = radius + // param2 = poison power (scaled by difficulty: Normal = x1, Hard = x2, + // Very Hard = x3, Ultimate = x6) + // param3 = if >= 1, fog is on when switch flag is on; otherwise, fog + // is on when switch flag is off + // param4 = fog entry number (TODO: the client handles this value being + // >= 0x1000 by subtracting 0x1000; what is this for?) + // param5 = transition type (0 = fade in, 1 = instantly switch) + // param6 = switch flag number + // TObjWarpBoss03 creates an invisible warp. This is used for the warp + // behind the door to Ruins. Params: + // param4 = destination floor + {0x0160, "TObjFogCollisionPoison/TObjWarpBoss03"}, + + // Ruins specialized box. Same parameters as 0x0088 (TObjContainerBase2). + {0x0161, "TOContainerAncientItemCommon"}, + + // Ruins random box. Same parameters as 0x0088 (TObjContainerBase2). + {0x0162, "TOContainerAncientItemRare"}, + + // Ruins enemy boxes, disguised as either of the above two objects. + // Params: + // param4 = event number + {0x0163, "TOContainerAncientEnemyCommon"}, + {0x0164, "TOContainerAncientEnemyRare"}, + + // Ruins always-empty box. No parameters. + // Availability: v2+ only + {0x0165, "TOContainerAncientItemNone"}, + + // Ruins breakable rock. Params: + // param4 = switch flag number (when enabled, destroys this object) + // Availability: v2+ only + {0x0166, "TOWreckAncientBrakable05"}, + + // Ruins pop-up trap with techs. Params: + // param1 = trigger radius delta (value used is (param1 / 2) + 30) + // param2 = number of hits to destroy trap (clamped to [1, 256]) + // param3 = tech level modifier: + // Normal: level = param3 + 1 (clamped to [0, 14]) + // Hard: level = (param3 * 2) + 1 (clamped to [0, 14]) + // Very Hard: level = (param3 * 4) + 1 (clamped to [0, 14]) + // Ultimate: level = (param3 * 6) + 1 (clamped to [0, 29]) + // (Note: level is offset by 1, so a value of 0 means tech level 1) + // param4 = delay (value used is param4 + 30; clamped below to 0) + // param5 = switch flag number (negative = always active) + // param6 = tech number: + // 0 = Foie + // 1 = Gizonde + // 2 = Gibarta + // 3 = Megid + // anything else = Gifoie + // angle.z = TODO (seems it only matters if angle.z is > 0 or not) + // Availability: v2+ only + {0x0167, "TOTrapAncient02R"}, + // TODO: Describe the rest of the object types. - {0x014E, "TOFenceAncient01"}, // Constructor in 3OE1: 80166A4C - {0x014F, "TOFenceAncient02"}, // Constructor in 3OE1: 80166E2C - {0x0150, "TOFenceAncient03"}, // Constructor in 3OE1: 801671D0 - {0x0151, "TOFenceAncient04"}, // Constructor in 3OE1: 80167574 - {0x0152, "TContainerAncient01"}, // Constructor in 3OE1: 8018B9B0 - {0x0153, "TOTrapAncient01"}, // Constructor in 3OE1: 80179C90 - {0x0154, "TOTrapAncient02"}, // Constructor in 3OE1: 8017B348 - {0x0155, "TOMonumentAncient01"}, // Constructor in 3OE1: 801725B4 - {0x0156, "TOMonumentAncient02"}, // Constructor in 3OE1: 80172BAC - {0x0159, "TOWreckAncient01"}, // Constructor in 3OE1: 8017DA9C - {0x015A, "TOWreckAncient02"}, // Constructor in 3OE1: 8017DDF0 - {0x015B, "TOWreckAncient03"}, // Constructor in 3OE1: 8017DF10 - {0x015C, "TOWreckAncient04"}, // Constructor in 3OE1: 8017D978 - {0x015D, "TOWreckAncient05"}, // Constructor in 3OE1: 8017D854 - {0x015E, "TOWreckAncient06"}, // Constructor in 3OE1: 8017D730 - {0x015F, "TOWreckAncient07"}, // Constructor in 3OE1: 8017D60C - {0x0160, "TObjFogCollisionPoison/TObjWarpBoss03"}, // Constructor in 3OE1: 80153768 OR 801A29C8 - {0x0161, "TOContainerAncientItemCommon"}, // Constructor in 3OE1: 8015BFE8 - {0x0162, "TOContainerAncientItemRare"}, // Constructor in 3OE1: 801A2A14 - {0x0163, "TOContainerAncientEnemyCommon"}, // Constructor in 3OE1: 8015B69C - {0x0164, "TOContainerAncientEnemyRare"}, // Constructor in 3OE1: 801A2A5C - {0x0165, "TOContainerAncientItemNone"}, // Constructor in 3OE1: 8015BD78 (v2+ only) - {0x0166, "TOWreckAncientBrakable05"}, // Constructor in 3OE1: 8017D1DC (v2+ only) - {0x0167, "TOTrapAncient02R"}, // Constructor in 3OE1: 8017A96C (v2+ only) {0x0170, "TOBoss4Bird"}, // Constructor in 3OE1: 8015982C {0x0171, "TOBoss4Tower"}, // Constructor in 3OE1: 801592E0 {0x0172, "TOBoss4Rock"}, // Constructor in 3OE1: 80158D90 diff --git a/src/SendCommands.cc b/src/SendCommands.cc index 97f7f06f..6e29bcb6 100644 --- a/src/SendCommands.cc +++ b/src/SendCommands.cc @@ -2551,7 +2551,7 @@ void send_remove_negative_conditions(shared_ptr c) { G_AddStatusEffect_6x0C cmd; cmd.header = {0x0C, sizeof(G_AddStatusEffect_6x0C) >> 2, c->lobby_client_id}; cmd.effect_type = 7; // Healing ring - cmd.level = 0; + cmd.amount = 0; send_protected_command(c, &cmd, sizeof(cmd), true); } @@ -2559,7 +2559,7 @@ void send_remove_negative_conditions(Channel& ch, uint16_t client_id) { G_AddStatusEffect_6x0C cmd; cmd.header = {0x0C, sizeof(G_AddStatusEffect_6x0C) >> 2, client_id}; cmd.effect_type = 7; // Healing ring - cmd.level = 0; + cmd.amount = 0; ch.send(0x60, 0x00, &cmd, sizeof(cmd)); }