mirror of
https://github.com/Mezeporta/Erupe.git
synced 2026-05-06 14:24:15 +02:00
feat(protbot): add boost and gacha inspection scenarios
Adds non-destructive test scenarios for the #187 boost-time fix and the #175 / gacha-logging changes so regressions in those paths can be caught without a full game client. - boost: queries GET_BOOST_TIME_LIMIT, GET_BOOST_RIGHT, and GET_KEEP_LOGIN_BOOST_STATUS, flagging a zero boost_limit and all-zero login boost entries as the expected DisableBoostTime/DisableLoginBoost state. - gacha: snapshots GET_GACHA_POINT and RECEIVE_GACHA_ITEM (freeze=true, so temp storage is not cleared), with an opt-in --roll flag that exercises PLAY_NORMAL_GACHA end-to-end. Detects the post-#175 single-byte validation-failure ACK.
This commit is contained in:
@@ -3,24 +3,37 @@ package protocol
|
||||
|
||||
// Packet opcodes (subset from Erupe's network/packetid.go iota).
|
||||
const (
|
||||
MSG_SYS_ACK uint16 = 0x0012
|
||||
MSG_SYS_LOGIN uint16 = 0x0014
|
||||
MSG_SYS_LOGOUT uint16 = 0x0015
|
||||
MSG_SYS_PING uint16 = 0x0017
|
||||
MSG_SYS_CAST_BINARY uint16 = 0x0018
|
||||
MSG_SYS_TIME uint16 = 0x001A
|
||||
MSG_SYS_CASTED_BINARY uint16 = 0x001B
|
||||
MSG_SYS_ISSUE_LOGKEY uint16 = 0x001D
|
||||
MSG_SYS_ENTER_STAGE uint16 = 0x0022
|
||||
MSG_SYS_ENUMERATE_STAGE uint16 = 0x002F
|
||||
MSG_SYS_INSERT_USER uint16 = 0x0050
|
||||
MSG_SYS_DELETE_USER uint16 = 0x0051
|
||||
MSG_SYS_UPDATE_RIGHT uint16 = 0x0058
|
||||
MSG_SYS_RIGHTS_RELOAD uint16 = 0x005D
|
||||
MSG_MHF_LOADDATA uint16 = 0x0061
|
||||
MSG_MHF_ENUMERATE_QUEST uint16 = 0x009F
|
||||
MSG_SYS_ACK uint16 = 0x0012
|
||||
MSG_SYS_LOGIN uint16 = 0x0014
|
||||
MSG_SYS_LOGOUT uint16 = 0x0015
|
||||
MSG_SYS_PING uint16 = 0x0017
|
||||
MSG_SYS_CAST_BINARY uint16 = 0x0018
|
||||
MSG_SYS_TIME uint16 = 0x001A
|
||||
MSG_SYS_CASTED_BINARY uint16 = 0x001B
|
||||
MSG_SYS_ISSUE_LOGKEY uint16 = 0x001D
|
||||
MSG_SYS_ENTER_STAGE uint16 = 0x0022
|
||||
MSG_SYS_ENUMERATE_STAGE uint16 = 0x002F
|
||||
MSG_SYS_INSERT_USER uint16 = 0x0050
|
||||
MSG_SYS_DELETE_USER uint16 = 0x0051
|
||||
MSG_SYS_UPDATE_RIGHT uint16 = 0x0058
|
||||
MSG_SYS_RIGHTS_RELOAD uint16 = 0x005D
|
||||
MSG_MHF_LOADDATA uint16 = 0x0061
|
||||
MSG_MHF_ENUMERATE_QUEST uint16 = 0x009F
|
||||
MSG_MHF_GET_ACHIEVEMENT uint16 = 0x00D4
|
||||
MSG_MHF_ADD_ACHIEVEMENT uint16 = 0x00D6
|
||||
MSG_MHF_DISPLAYED_ACHIEVEMENT uint16 = 0x00D8
|
||||
MSG_MHF_GET_WEEKLY_SCHED uint16 = 0x00E1
|
||||
|
||||
// Boost time / login boost (issue #187)
|
||||
MSG_MHF_GET_BOOST_TIME uint16 = 0x0126
|
||||
MSG_MHF_GET_BOOST_TIME_LIMIT uint16 = 0x0128
|
||||
MSG_MHF_GET_BOOST_RIGHT uint16 = 0x013E
|
||||
MSG_MHF_START_BOOST_TIME uint16 = 0x013F
|
||||
MSG_MHF_GET_KEEP_LOGIN_BOOST_STATUS uint16 = 0x0159
|
||||
MSG_MHF_USE_KEEP_LOGIN_BOOST uint16 = 0x015A
|
||||
|
||||
// Gacha (issues #175, gacha logging)
|
||||
MSG_MHF_GET_GACHA_POINT uint16 = 0x0131
|
||||
MSG_MHF_RECEIVE_GACHA_ITEM uint16 = 0x0137
|
||||
MSG_MHF_PLAY_NORMAL_GACHA uint16 = 0x0150
|
||||
)
|
||||
|
||||
@@ -265,6 +265,87 @@ func BuildDisplayedAchievementPacket() []byte {
|
||||
return bf.Data()
|
||||
}
|
||||
|
||||
// BuildSimpleAckPacket builds a packet whose body is just an ack handle.
|
||||
// Used by several trivial query packets (boost time, gacha point, ...).
|
||||
//
|
||||
// uint16 opcode
|
||||
// uint32 ackHandle
|
||||
// 0x00 0x10 terminator
|
||||
func BuildSimpleAckPacket(opcode uint16, ackHandle uint32) []byte {
|
||||
bf := byteframe.NewByteFrame()
|
||||
bf.WriteUint16(opcode)
|
||||
bf.WriteUint32(ackHandle)
|
||||
bf.WriteBytes([]byte{0x00, 0x10})
|
||||
return bf.Data()
|
||||
}
|
||||
|
||||
// BuildStartBoostTimePacket builds a MSG_MHF_START_BOOST_TIME packet.
|
||||
func BuildStartBoostTimePacket(ackHandle uint32) []byte {
|
||||
return BuildSimpleAckPacket(MSG_MHF_START_BOOST_TIME, ackHandle)
|
||||
}
|
||||
|
||||
// BuildGetBoostTimeLimitPacket builds a MSG_MHF_GET_BOOST_TIME_LIMIT packet.
|
||||
func BuildGetBoostTimeLimitPacket(ackHandle uint32) []byte {
|
||||
return BuildSimpleAckPacket(MSG_MHF_GET_BOOST_TIME_LIMIT, ackHandle)
|
||||
}
|
||||
|
||||
// BuildGetBoostRightPacket builds a MSG_MHF_GET_BOOST_RIGHT packet.
|
||||
func BuildGetBoostRightPacket(ackHandle uint32) []byte {
|
||||
return BuildSimpleAckPacket(MSG_MHF_GET_BOOST_RIGHT, ackHandle)
|
||||
}
|
||||
|
||||
// BuildGetKeepLoginBoostStatusPacket builds a MSG_MHF_GET_KEEP_LOGIN_BOOST_STATUS packet.
|
||||
func BuildGetKeepLoginBoostStatusPacket(ackHandle uint32) []byte {
|
||||
return BuildSimpleAckPacket(MSG_MHF_GET_KEEP_LOGIN_BOOST_STATUS, ackHandle)
|
||||
}
|
||||
|
||||
// BuildGetGachaPointPacket builds a MSG_MHF_GET_GACHA_POINT packet.
|
||||
func BuildGetGachaPointPacket(ackHandle uint32) []byte {
|
||||
return BuildSimpleAckPacket(MSG_MHF_GET_GACHA_POINT, ackHandle)
|
||||
}
|
||||
|
||||
// BuildPlayNormalGachaPacket builds a MSG_MHF_PLAY_NORMAL_GACHA packet.
|
||||
// Layout mirrors Erupe's MsgMhfPlayNormalGacha.Parse:
|
||||
//
|
||||
// uint16 opcode
|
||||
// uint32 ackHandle
|
||||
// uint32 gachaID
|
||||
// uint8 rollType (0=single, 1=ten-pull)
|
||||
// uint8 gachaType
|
||||
// 0x00 0x10 terminator
|
||||
func BuildPlayNormalGachaPacket(ackHandle, gachaID uint32, rollType, gachaType uint8) []byte {
|
||||
bf := byteframe.NewByteFrame()
|
||||
bf.WriteUint16(MSG_MHF_PLAY_NORMAL_GACHA)
|
||||
bf.WriteUint32(ackHandle)
|
||||
bf.WriteUint32(gachaID)
|
||||
bf.WriteUint8(rollType)
|
||||
bf.WriteUint8(gachaType)
|
||||
bf.WriteBytes([]byte{0x00, 0x10})
|
||||
return bf.Data()
|
||||
}
|
||||
|
||||
// BuildReceiveGachaItemPacket builds a MSG_MHF_RECEIVE_GACHA_ITEM packet.
|
||||
// Layout mirrors Erupe's MsgMhfReceiveGachaItem.Parse:
|
||||
//
|
||||
// uint16 opcode
|
||||
// uint32 ackHandle
|
||||
// uint8 max
|
||||
// uint8 freeze (bool; if non-zero, server does not clear the stored items)
|
||||
// 0x00 0x10 terminator
|
||||
func BuildReceiveGachaItemPacket(ackHandle uint32, max uint8, freeze bool) []byte {
|
||||
bf := byteframe.NewByteFrame()
|
||||
bf.WriteUint16(MSG_MHF_RECEIVE_GACHA_ITEM)
|
||||
bf.WriteUint32(ackHandle)
|
||||
bf.WriteUint8(max)
|
||||
if freeze {
|
||||
bf.WriteUint8(1)
|
||||
} else {
|
||||
bf.WriteUint8(0)
|
||||
}
|
||||
bf.WriteBytes([]byte{0x00, 0x10})
|
||||
return bf.Data()
|
||||
}
|
||||
|
||||
// BuildGetWeeklySchedulePacket builds a MSG_MHF_GET_WEEKLY_SCHEDULE packet.
|
||||
//
|
||||
// uint16 opcode
|
||||
|
||||
Reference in New Issue
Block a user