mirror of
https://github.com/Mezeporta/Erupe.git
synced 2025-12-15 08:25:09 +01:00
simplify Savedata pointers
This commit is contained in:
@@ -12,41 +12,29 @@ import (
|
|||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type SavePointer int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
pointerGender = 0x51 // +1
|
pGender = iota // +1
|
||||||
|
pRP // +2
|
||||||
pointerRP = 0x22D16 // +2
|
pHouseTier // +5
|
||||||
pointerHouseTier = 0x1FB6C // +5
|
pHouseData // +195
|
||||||
pointerHouseData = 0x1FE01 // +195
|
pBookshelfData // +5576
|
||||||
pointerBookshelfData = 0x22298 // +5576
|
pGalleryData // +1748
|
||||||
// Gallery data also exists at 0x21578, is this the contest submission?
|
pToreData // +240
|
||||||
pointerGalleryData = 0x22320 // +1748
|
pGardenData // +68
|
||||||
pointerToreData = 0x1FCB4 // +240
|
pWeaponType // +1
|
||||||
pointerGardenData = 0x22C58 // +68
|
pWeaponID // +2
|
||||||
pointerWeaponType = 0x1F715 // +1
|
pHRP // +2
|
||||||
pointerWeaponID = 0x1F60A // +2
|
pGRP // +4
|
||||||
pointerHRP = 0x1FDF6 // +2
|
pKQF // +8
|
||||||
pointerGRP = 0x1FDFC // +4
|
|
||||||
pointerKQF = 0x23D20 // +8
|
|
||||||
|
|
||||||
pointerRPZ = 0x1A076
|
|
||||||
pointerHouseTierZ = 0x16ECC
|
|
||||||
pointerHouseDataZ = 0x17161
|
|
||||||
pointerBookshelfDataZ = 0x195F8
|
|
||||||
pointerGalleryDataZ = 0x19680
|
|
||||||
pointerToreDataZ = 0x17014
|
|
||||||
pointerGardenDataZ = 0x19FB8
|
|
||||||
pointerWeaponTypeZ = 0x16A75
|
|
||||||
pointerWeaponIDZ = 0x1696A
|
|
||||||
pointerHRPZ = 0x17156
|
|
||||||
pointerGRPZ = 0x1715C
|
|
||||||
pointerKQFZ = 0x1B080
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type CharacterSaveData struct {
|
type CharacterSaveData struct {
|
||||||
CharID uint32
|
CharID uint32
|
||||||
Name string
|
Name string
|
||||||
IsNewCharacter bool
|
IsNewCharacter bool
|
||||||
|
Pointers map[SavePointer]int
|
||||||
|
|
||||||
Gender bool
|
Gender bool
|
||||||
RP uint16
|
RP uint16
|
||||||
@@ -66,6 +54,39 @@ type CharacterSaveData struct {
|
|||||||
decompSave []byte
|
decompSave []byte
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getPointers() map[SavePointer]int {
|
||||||
|
pointers := map[SavePointer]int{pGender: 81}
|
||||||
|
switch _config.ErupeConfig.RealClientMode {
|
||||||
|
case _config.ZZ:
|
||||||
|
pointers[pWeaponID] = 128522
|
||||||
|
pointers[pWeaponType] = 128789
|
||||||
|
pointers[pHouseTier] = 129900
|
||||||
|
pointers[pToreData] = 130228
|
||||||
|
pointers[pHRP] = 130550
|
||||||
|
pointers[pGRP] = 130556
|
||||||
|
pointers[pHouseData] = 130561
|
||||||
|
pointers[pBookshelfData] = 139928
|
||||||
|
pointers[pGalleryData] = 140064
|
||||||
|
pointers[pGardenData] = 142424
|
||||||
|
pointers[pRP] = 142614
|
||||||
|
pointers[pKQF] = 146720
|
||||||
|
case _config.Z2, _config.Z1, _config.G101, _config.G10:
|
||||||
|
pointers[pWeaponID] = 92522
|
||||||
|
pointers[pWeaponType] = 92789
|
||||||
|
pointers[pHouseTier] = 93900
|
||||||
|
pointers[pToreData] = 94228
|
||||||
|
pointers[pHRP] = 94550
|
||||||
|
pointers[pGRP] = 94556
|
||||||
|
pointers[pHouseData] = 94561
|
||||||
|
pointers[pBookshelfData] = 103928
|
||||||
|
pointers[pGalleryData] = 104064
|
||||||
|
pointers[pGardenData] = 106424
|
||||||
|
pointers[pRP] = 106614
|
||||||
|
pointers[pKQF] = 110720
|
||||||
|
}
|
||||||
|
return pointers
|
||||||
|
}
|
||||||
|
|
||||||
func GetCharacterSaveData(s *Session, charID uint32) (*CharacterSaveData, error) {
|
func GetCharacterSaveData(s *Session, charID uint32) (*CharacterSaveData, error) {
|
||||||
result, err := s.server.db.Query("SELECT id, savedata, is_new_character, name FROM characters WHERE id = $1", charID)
|
result, err := s.server.db.Query("SELECT id, savedata, is_new_character, name FROM characters WHERE id = $1", charID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -79,7 +100,9 @@ func GetCharacterSaveData(s *Session, charID uint32) (*CharacterSaveData, error)
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
saveData := &CharacterSaveData{}
|
saveData := &CharacterSaveData{
|
||||||
|
Pointers: getPointers(),
|
||||||
|
}
|
||||||
err = result.Scan(&saveData.CharID, &saveData.compSave, &saveData.IsNewCharacter, &saveData.Name)
|
err = result.Scan(&saveData.CharID, &saveData.compSave, &saveData.IsNewCharacter, &saveData.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Error("Failed to scan savedata", zap.Error(err), zap.Uint32("charID", charID))
|
s.logger.Error("Failed to scan savedata", zap.Error(err), zap.Uint32("charID", charID))
|
||||||
@@ -148,54 +171,36 @@ func (save *CharacterSaveData) Decompress() error {
|
|||||||
func (save *CharacterSaveData) updateSaveDataWithStruct() {
|
func (save *CharacterSaveData) updateSaveDataWithStruct() {
|
||||||
rpBytes := make([]byte, 2)
|
rpBytes := make([]byte, 2)
|
||||||
binary.LittleEndian.PutUint16(rpBytes, save.RP)
|
binary.LittleEndian.PutUint16(rpBytes, save.RP)
|
||||||
if _config.ErupeConfig.RealClientMode == _config.ZZ {
|
if _config.ErupeConfig.RealClientMode >= _config.G10 {
|
||||||
copy(save.decompSave[pointerRP:pointerRP+2], rpBytes)
|
copy(save.decompSave[save.Pointers[pRP]:save.Pointers[pRP]+2], rpBytes)
|
||||||
copy(save.decompSave[pointerKQF:pointerKQF+8], save.KQF)
|
copy(save.decompSave[save.Pointers[pKQF]:save.Pointers[pKQF]+8], save.KQF)
|
||||||
} else if _config.ErupeConfig.RealClientMode >= _config.Z1 {
|
|
||||||
copy(save.decompSave[pointerRPZ:pointerRPZ+2], rpBytes)
|
|
||||||
copy(save.decompSave[pointerKQFZ:pointerKQFZ+8], save.KQF)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This will update the save struct with the values stored in the character save
|
// This will update the save struct with the values stored in the character save
|
||||||
func (save *CharacterSaveData) updateStructWithSaveData() {
|
func (save *CharacterSaveData) updateStructWithSaveData() {
|
||||||
save.Name = stringsupport.SJISToUTF8(bfutil.UpToNull(save.decompSave[88:100]))
|
save.Name = stringsupport.SJISToUTF8(bfutil.UpToNull(save.decompSave[88:100]))
|
||||||
if save.decompSave[pointerGender] == 1 {
|
if save.decompSave[save.Pointers[pGender]] == 1 {
|
||||||
save.Gender = true
|
save.Gender = true
|
||||||
} else {
|
} else {
|
||||||
save.Gender = false
|
save.Gender = false
|
||||||
}
|
}
|
||||||
if !save.IsNewCharacter {
|
if !save.IsNewCharacter {
|
||||||
if _config.ErupeConfig.RealClientMode == _config.ZZ {
|
if _config.ErupeConfig.RealClientMode >= _config.G10 {
|
||||||
save.RP = binary.LittleEndian.Uint16(save.decompSave[pointerRP : pointerRP+2])
|
save.RP = binary.LittleEndian.Uint16(save.decompSave[save.Pointers[pRP] : save.Pointers[pRP]+2])
|
||||||
save.HouseTier = save.decompSave[pointerHouseTier : pointerHouseTier+5]
|
save.HouseTier = save.decompSave[save.Pointers[pHouseTier] : save.Pointers[pHouseTier]+5]
|
||||||
save.HouseData = save.decompSave[pointerHouseData : pointerHouseData+195]
|
save.HouseData = save.decompSave[save.Pointers[pHouseData] : save.Pointers[pHouseData]+195]
|
||||||
save.BookshelfData = save.decompSave[pointerBookshelfData : pointerBookshelfData+5576]
|
save.BookshelfData = save.decompSave[save.Pointers[pBookshelfData] : save.Pointers[pBookshelfData]+5576]
|
||||||
save.GalleryData = save.decompSave[pointerGalleryData : pointerGalleryData+1748]
|
save.GalleryData = save.decompSave[save.Pointers[pGalleryData] : save.Pointers[pGalleryData]+1748]
|
||||||
save.ToreData = save.decompSave[pointerToreData : pointerToreData+240]
|
save.ToreData = save.decompSave[save.Pointers[pToreData] : save.Pointers[pToreData]+240]
|
||||||
save.GardenData = save.decompSave[pointerGardenData : pointerGardenData+68]
|
save.GardenData = save.decompSave[save.Pointers[pGardenData] : save.Pointers[pGardenData]+68]
|
||||||
save.WeaponType = save.decompSave[pointerWeaponType]
|
save.WeaponType = save.decompSave[save.Pointers[pWeaponType]]
|
||||||
save.WeaponID = binary.LittleEndian.Uint16(save.decompSave[pointerWeaponID : pointerWeaponID+2])
|
save.WeaponID = binary.LittleEndian.Uint16(save.decompSave[save.Pointers[pWeaponID] : save.Pointers[pWeaponID]+2])
|
||||||
save.HRP = binary.LittleEndian.Uint16(save.decompSave[pointerHRP : pointerHRP+2])
|
save.HRP = binary.LittleEndian.Uint16(save.decompSave[save.Pointers[pHRP] : save.Pointers[pHRP]+2])
|
||||||
if save.HRP == uint16(999) {
|
if save.HRP == uint16(999) {
|
||||||
save.GR = grpToGR(binary.LittleEndian.Uint32(save.decompSave[pointerGRP : pointerGRP+4]))
|
save.GR = grpToGR(binary.LittleEndian.Uint32(save.decompSave[save.Pointers[pGRP] : save.Pointers[pGRP]+4]))
|
||||||
}
|
}
|
||||||
save.KQF = save.decompSave[pointerKQF : pointerKQF+8]
|
save.KQF = save.decompSave[save.Pointers[pKQF] : save.Pointers[pKQF]+8]
|
||||||
} else if _config.ErupeConfig.RealClientMode >= _config.Z1 {
|
|
||||||
save.RP = binary.LittleEndian.Uint16(save.decompSave[pointerRPZ : pointerRPZ+2])
|
|
||||||
save.HouseTier = save.decompSave[pointerHouseTierZ : pointerHouseTierZ+5]
|
|
||||||
save.HouseData = save.decompSave[pointerHouseDataZ : pointerHouseDataZ+195]
|
|
||||||
save.BookshelfData = save.decompSave[pointerBookshelfDataZ : pointerBookshelfDataZ+5576]
|
|
||||||
save.GalleryData = save.decompSave[pointerGalleryDataZ : pointerGalleryDataZ+1748]
|
|
||||||
save.ToreData = save.decompSave[pointerToreDataZ : pointerToreDataZ+240]
|
|
||||||
save.GardenData = save.decompSave[pointerGardenDataZ : pointerGardenDataZ+68]
|
|
||||||
save.WeaponType = save.decompSave[pointerWeaponTypeZ]
|
|
||||||
save.WeaponID = binary.LittleEndian.Uint16(save.decompSave[pointerWeaponIDZ : pointerWeaponIDZ+2])
|
|
||||||
save.HRP = binary.LittleEndian.Uint16(save.decompSave[pointerHRPZ : pointerHRPZ+2])
|
|
||||||
if save.HRP == uint16(999) {
|
|
||||||
save.GR = grpToGR(binary.LittleEndian.Uint32(save.decompSave[pointerGRPZ : pointerGRPZ+4]))
|
|
||||||
}
|
|
||||||
save.KQF = save.decompSave[pointerKQFZ : pointerKQFZ+8]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user