more object notes
This commit is contained in:
@@ -4054,7 +4054,7 @@ struct G_AddStatusEffect_6x0C {
|
|||||||
// 12 = Confuse (slot 1; 10 seconds)
|
// 12 = Confuse (slot 1; 10 seconds)
|
||||||
// Anything else = command is ignored
|
// Anything else = command is ignored
|
||||||
le_uint32_t effect_type = 0;
|
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);
|
} __packed_ws__(G_AddStatusEffect_6x0C, 0x0C);
|
||||||
|
|
||||||
// 6x0D: Clear status effect slot (protected on V3/V4)
|
// 6x0D: Clear status effect slot (protected on V3/V4)
|
||||||
@@ -4783,7 +4783,9 @@ struct G_UseStarAtomizer_6x66 {
|
|||||||
// 6x67: Trigger set event
|
// 6x67: Trigger set event
|
||||||
|
|
||||||
struct G_TriggerSetEvent_6x67 {
|
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 floor = 0;
|
||||||
le_uint32_t event_id = 0; // NOT event index
|
le_uint32_t event_id = 0; // NOT event index
|
||||||
le_uint32_t client_id = 0;
|
le_uint32_t client_id = 0;
|
||||||
|
|||||||
+122
-27
@@ -1432,11 +1432,11 @@ const char* MapFile::name_for_object_type(uint16_t type) {
|
|||||||
// param4 = event number
|
// param4 = event number
|
||||||
{0x0091, "TObjContainerEnemy"},
|
{0x0091, "TObjContainerEnemy"},
|
||||||
|
|
||||||
// Large box (usually used for specialized drops). See TObjContainerBase2
|
// Large box (usually used for specialized drops). Same parameters as
|
||||||
// for parameters.
|
// 0x0088 (TObjContainerBase2)
|
||||||
{0x0092, "TObjContainerBase"},
|
{0x0092, "TObjContainerBase"},
|
||||||
|
|
||||||
// Large enemy box. See TObjContainerEnemy for parameters.
|
// Large enemy box. Same parameters as 0x0091 (TObjContainerEnemy).
|
||||||
{0x0093, "TObjContainerAbeEnemy"},
|
{0x0093, "TObjContainerAbeEnemy"},
|
||||||
|
|
||||||
// Always-empty box.
|
// Always-empty box.
|
||||||
@@ -1710,31 +1710,126 @@ const char* MapFile::name_for_object_type(uint16_t type) {
|
|||||||
// param5 = color (clamped to [0, 3])
|
// param5 = color (clamped to [0, 3])
|
||||||
{0x014D, "TOKeyAncient01"},
|
{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.
|
// 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
|
{0x0170, "TOBoss4Bird"}, // Constructor in 3OE1: 8015982C
|
||||||
{0x0171, "TOBoss4Tower"}, // Constructor in 3OE1: 801592E0
|
{0x0171, "TOBoss4Tower"}, // Constructor in 3OE1: 801592E0
|
||||||
{0x0172, "TOBoss4Rock"}, // Constructor in 3OE1: 80158D90
|
{0x0172, "TOBoss4Rock"}, // Constructor in 3OE1: 80158D90
|
||||||
|
|||||||
+2
-2
@@ -2551,7 +2551,7 @@ void send_remove_negative_conditions(shared_ptr<Client> c) {
|
|||||||
G_AddStatusEffect_6x0C cmd;
|
G_AddStatusEffect_6x0C cmd;
|
||||||
cmd.header = {0x0C, sizeof(G_AddStatusEffect_6x0C) >> 2, c->lobby_client_id};
|
cmd.header = {0x0C, sizeof(G_AddStatusEffect_6x0C) >> 2, c->lobby_client_id};
|
||||||
cmd.effect_type = 7; // Healing ring
|
cmd.effect_type = 7; // Healing ring
|
||||||
cmd.level = 0;
|
cmd.amount = 0;
|
||||||
send_protected_command(c, &cmd, sizeof(cmd), true);
|
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;
|
G_AddStatusEffect_6x0C cmd;
|
||||||
cmd.header = {0x0C, sizeof(G_AddStatusEffect_6x0C) >> 2, client_id};
|
cmd.header = {0x0C, sizeof(G_AddStatusEffect_6x0C) >> 2, client_id};
|
||||||
cmd.effect_type = 7; // Healing ring
|
cmd.effect_type = 7; // Healing ring
|
||||||
cmd.level = 0;
|
cmd.amount = 0;
|
||||||
ch.send(0x60, 0x00, &cmd, sizeof(cmd));
|
ch.send(0x60, 0x00, &cmd, sizeof(cmd));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user