Parse HD HireMenuPanel
This commit is contained in:
@@ -5,6 +5,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"math"
|
"math"
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -47,6 +49,8 @@ var WidgetStateFlags = map[string]uint64{
|
|||||||
"WeaponSwap": 0xF2D7CF8E9CC08212,
|
"WeaponSwap": 0xF2D7CF8E9CC08212,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var firstNumberText = regexp.MustCompile(`\d[\d,]*`)
|
||||||
|
|
||||||
func NewGameReader(process *Process) *GameReader {
|
func NewGameReader(process *Process) *GameReader {
|
||||||
return &GameReader{
|
return &GameReader{
|
||||||
offset: calculateOffsets(process),
|
offset: calculateOffsets(process),
|
||||||
@@ -364,8 +368,7 @@ func (gd *GameReader) GetCharacterList() []string {
|
|||||||
return characterNames
|
return characterNames
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetMercList returns the list of mercenaries available for hire in the Hire Menu
|
// GetMercList returns the list of mercenaries available for hire in the Hire Menu.
|
||||||
// Only works if the Hire Menu is open in legacy graphics mode
|
|
||||||
func (gd *GameReader) GetMercList() []MercOption {
|
func (gd *GameReader) GetMercList() []MercOption {
|
||||||
panel := gd.GetPanel("HireMenuPanel", "ListContainer", "View", "Container")
|
panel := gd.GetPanel("HireMenuPanel", "ListContainer", "View", "Container")
|
||||||
|
|
||||||
@@ -376,13 +379,30 @@ func (gd *GameReader) GetMercList() []MercOption {
|
|||||||
mercOptions := make([]MercOption, panel.NumChildren)
|
mercOptions := make([]MercOption, panel.NumChildren)
|
||||||
|
|
||||||
for i := 0; i < panel.NumChildren; i++ {
|
for i := 0; i < panel.NumChildren; i++ {
|
||||||
merc := panel.PanelChildren[fmt.Sprintf("ListItem%d", i)].PanelChildren["TextBox"].ExtraText3
|
row := panel.PanelChildren[fmt.Sprintf("ListItem%d", i)]
|
||||||
|
merc := row.PanelChildren["TextBox"].ExtraText3
|
||||||
|
|
||||||
var name, skillName string
|
var name, skillName string
|
||||||
var level, life, def, cost int
|
var level, life, def, cost int
|
||||||
|
|
||||||
n, err := fmt.Sscanf(merc, "%s - Lvl: %d Life: %d Def: %d Cost: %d\n", &name, &level, &life, &def, &cost)
|
n, err := fmt.Sscanf(merc, "%s - Lvl: %d Life: %d Def: %d Cost: %d\n", &name, &level, &life, &def, &cost)
|
||||||
if err != nil || n < 5 {
|
if err != nil || n < 5 {
|
||||||
|
// HD (non-legacy)
|
||||||
|
option := MercOption{
|
||||||
|
Index: i,
|
||||||
|
Name: GetText(row.PanelChildren["HireName"]),
|
||||||
|
}
|
||||||
|
if option.Name == "" {
|
||||||
|
option.Name = GetText(row.PanelChildren["Name"])
|
||||||
|
}
|
||||||
|
option.Level, _ = strconv.Atoi(firstNumberText.FindString(GetText(row.PanelChildren["HireLevel"])))
|
||||||
|
option.Cost, _ = strconv.Atoi(GetText(row.PanelChildren["CostContainer"].PanelChildren["HireCost"]))
|
||||||
|
|
||||||
|
if sk, ok := gd.mercSkillFromPanel(row.PanelChildren["Skill1"]); ok {
|
||||||
|
option.Skill = sk
|
||||||
|
}
|
||||||
|
|
||||||
|
mercOptions[i] = option
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -416,6 +436,18 @@ func (gd *GameReader) GetMercList() []MercOption {
|
|||||||
return mercOptions
|
return mercOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (gd *GameReader) mercSkillFromPanel(p data.Panel) (skill.Skill, bool) {
|
||||||
|
if p.PanelPtr == 0 {
|
||||||
|
return skill.Skill{}, false
|
||||||
|
}
|
||||||
|
id := skill.ID(gd.ReadUInt(p.PanelPtr+0x960, Uint32))
|
||||||
|
if id <= 0 {
|
||||||
|
return skill.Skill{}, false
|
||||||
|
}
|
||||||
|
sk, ok := skill.Skills[id]
|
||||||
|
return sk, ok
|
||||||
|
}
|
||||||
|
|
||||||
// IsBlocking checks if there's a blocking popup or loading screen present
|
// IsBlocking checks if there's a blocking popup or loading screen present
|
||||||
func (gd *GameReader) IsBlocking() bool {
|
func (gd *GameReader) IsBlocking() bool {
|
||||||
panel := gd.GetPanel("BlockingPanel")
|
panel := gd.GetPanel("BlockingPanel")
|
||||||
|
|||||||
Reference in New Issue
Block a user