diff --git a/d2core/d2hero/hero_stats_state.go b/d2core/d2hero/hero_stats_state.go index 5fb66386..2e71a3e6 100644 --- a/d2core/d2hero/hero_stats_state.go +++ b/d2core/d2hero/hero_stats_state.go @@ -30,8 +30,8 @@ type HeroStatsState struct { PoisonResistance int `json:"poisonResistance"` // values which are not saved/loaded(computed) - Stamina int `json:"-"` // only MaxStamina is saved, Stamina gets reset on entering world - NextLevelExp int `json:"-"` + Stamina float64 `json:"-"` // only MaxStamina is saved, Stamina gets reset on entering world + NextLevelExp int `json:"-"` } // CreateHeroStatsState generates a running state from a hero stats. @@ -53,7 +53,7 @@ func (f *HeroStateFactory) CreateHeroStatsState(heroClass d2enum.Hero, classStat result.Mana = result.MaxMana result.Health = result.MaxHealth - result.Stamina = result.MaxStamina + result.Stamina = float64(result.MaxStamina) // TODO: For demonstration purposes (hp, mana, exp, & character stats panel gets updated depending on stats) result.Health = 50 diff --git a/d2core/d2map/d2mapentity/factory.go b/d2core/d2map/d2mapentity/factory.go index ae67e383..1c0cb06b 100644 --- a/d2core/d2map/d2mapentity/factory.go +++ b/d2core/d2map/d2mapentity/factory.go @@ -77,7 +77,7 @@ func (f *MapEntityFactory) NewPlayer(id, name string, x, y, direction int, heroT } stats.NextLevelExp = f.asset.Records.GetExperienceBreakpoint(heroType, stats.Level) - stats.Stamina = stats.MaxStamina + stats.Stamina = float64(stats.MaxStamina) defaultCharStats := f.asset.Records.Character.Stats[heroType] statsState := f.HeroStateFactory.CreateHeroStatsState(heroType, defaultCharStats) @@ -249,7 +249,7 @@ func (f *MapEntityFactory) NewCastOverlay(x, y int, overlayRecord *d2records.Ove result := &CastOverlay{ AnimatedEntity: entity, record: overlayRecord, - playLoop: playLoop, + playLoop: playLoop, } return result, nil diff --git a/d2core/d2map/d2mapentity/player.go b/d2core/d2map/d2mapentity/player.go index 8f8c66cd..c57e07d9 100644 --- a/d2core/d2map/d2mapentity/player.go +++ b/d2core/d2map/d2mapentity/player.go @@ -2,7 +2,6 @@ package d2mapentity import ( "fmt" - "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2math/d2vector" @@ -106,6 +105,20 @@ func (p *Player) Advance(tickTime float64) { if p.composite.GetAnimationMode() != p.animationMode { p.animationMode = p.composite.GetAnimationMode() } + + // Drain and regenerate Stamina + if p.IsRunning() && !p.atTarget() && !p.IsInTown() { + p.Stats.Stamina -= float64(p.composite.AssetManager.Records.Character.Stats[p.Class].StaminaRunDrain) * tickTime / 5 + if p.Stats.Stamina < 0 { + p.SetSpeed(baseWalkSpeed) + p.Stats.Stamina = 0 + } + } else if p.Stats.Stamina < float64(p.Stats.MaxStamina) { + p.Stats.Stamina += float64(p.composite.AssetManager.Records.Character.Stats[p.Class].StaminaRunDrain) * tickTime / 5 + if p.IsRunning() { + p.SetSpeed(baseRunSpeed) + } + } } // Render renders the animated composite for this entity. diff --git a/d2game/d2player/hero_stats_panel.go b/d2game/d2player/hero_stats_panel.go index b917191a..79784d31 100644 --- a/d2game/d2player/hero_stats_panel.go +++ b/d2game/d2player/hero_stats_panel.go @@ -341,7 +341,7 @@ func (s *HeroStatsPanel) initStatValueLabels() { s.labels.Energy = s.createStatValueLabel(s.heroState.Energy, 175, 355) s.labels.MaxStamina = s.createStatValueLabel(s.heroState.MaxStamina, 330, 295) - s.labels.Stamina = s.createStatValueLabel(s.heroState.Stamina, 370, 295) + s.labels.Stamina = s.createStatValueLabel(int(s.heroState.Stamina), 370, 295) s.labels.MaxHealth = s.createStatValueLabel(s.heroState.MaxHealth, 330, 320) s.labels.Health = s.createStatValueLabel(s.heroState.Health, 370, 320) @@ -364,7 +364,7 @@ func (s *HeroStatsPanel) renderStatValues(target d2interface.Surface) { s.renderStatValueNum(s.labels.Health, s.heroState.Health, target) s.renderStatValueNum(s.labels.MaxStamina, s.heroState.MaxStamina, target) - s.renderStatValueNum(s.labels.Stamina, s.heroState.Stamina, target) + s.renderStatValueNum(s.labels.Stamina, int(s.heroState.Stamina), target) s.renderStatValueNum(s.labels.MaxMana, s.heroState.MaxMana, target) s.renderStatValueNum(s.labels.Mana, s.heroState.Mana, target)