From d4d3fdfad3f2d51ffbfce7c674de928aa660374c Mon Sep 17 00:00:00 2001 From: Ziemas Date: Sun, 10 Nov 2019 23:17:42 +0100 Subject: [PATCH] Checkboxes! (#136) And add them to the hero class scene. --- d2common/d2resource/resource_paths.go | 1 + d2core/d2scene/select_hero_class.go | 68 ++++++++++++----- d2render/d2ui/Checkbox.go | 102 ++++++++++++++++++++++++++ 3 files changed, 154 insertions(+), 17 deletions(-) create mode 100644 d2render/d2ui/Checkbox.go diff --git a/d2common/d2resource/resource_paths.go b/d2common/d2resource/resource_paths.go index 31ece6a4..34b5fe37 100644 --- a/d2common/d2resource/resource_paths.go +++ b/d2common/d2resource/resource_paths.go @@ -118,6 +118,7 @@ const ( ShortButtonBlank = "/data/global/ui/CharSelect/ShortButtonBlank.dc6" TextBox2 = "/data/global/ui/FrontEnd/textbox2.dc6" TallButtonBlank = "/data/global/ui/CharSelect/TallButtonBlank.dc6" + Checkbox = "/data/global/ui/FrontEnd/clickbox.dc6" // --- GAME UI --- diff --git a/d2core/d2scene/select_hero_class.go b/d2core/d2scene/select_hero_class.go index 5163aff0..bb8e9642 100644 --- a/d2core/d2scene/select_hero_class.go +++ b/d2core/d2scene/select_hero_class.go @@ -36,23 +36,27 @@ type HeroRenderInfo struct { } type SelectHeroClass struct { - uiManager *d2ui.Manager - soundManager *d2audio.Manager - fileProvider d2interface.FileProvider - sceneProvider d2interface.SceneProvider - bgImage d2render.Sprite - campfire d2render.Sprite - headingLabel d2ui.Label - heroClassLabel d2ui.Label - heroDesc1Label d2ui.Label - heroDesc2Label d2ui.Label - heroDesc3Label d2ui.Label - heroNameTextbox d2ui.TextBox - heroNameLabel d2ui.Label - heroRenderInfo map[d2enum.Hero]*HeroRenderInfo - selectedHero d2enum.Hero - exitButton d2ui.Button - okButton d2ui.Button + uiManager *d2ui.Manager + soundManager *d2audio.Manager + fileProvider d2interface.FileProvider + sceneProvider d2interface.SceneProvider + bgImage d2render.Sprite + campfire d2render.Sprite + headingLabel d2ui.Label + heroClassLabel d2ui.Label + heroDesc1Label d2ui.Label + heroDesc2Label d2ui.Label + heroDesc3Label d2ui.Label + heroNameTextbox d2ui.TextBox + heroNameLabel d2ui.Label + heroRenderInfo map[d2enum.Hero]*HeroRenderInfo + selectedHero d2enum.Hero + exitButton d2ui.Button + okButton d2ui.Button + expansionCheckbox d2ui.Checkbox + expansionCharLabel d2ui.Label + hardcoreCheckbox d2ui.Checkbox + hardcoreCharLabel d2ui.Label } func CreateSelectHeroClass( @@ -142,6 +146,32 @@ func (v *SelectHeroClass) Load() []func() { v.heroNameTextbox.SetVisible(false) v.uiManager.AddWidget(&v.heroNameTextbox) }, + func() { + v.expansionCheckbox = d2ui.CreateCheckbox(v.fileProvider, true) + v.expansionCheckbox.MoveTo(318, 526) + v.expansionCheckbox.SetVisible(false) + v.uiManager.AddWidget(&v.expansionCheckbox) + }, + func() { + v.expansionCharLabel = d2ui.CreateLabel(v.fileProvider, d2resource.Font16, d2enum.Units) + v.expansionCharLabel.Alignment = d2ui.LabelAlignLeft + v.expansionCharLabel.Color = color.RGBA{216, 196, 128, 255} + v.expansionCharLabel.SetText(d2common.TranslateString("#803")) + v.expansionCharLabel.MoveTo(339, 526) + }, + func() { + v.hardcoreCheckbox = d2ui.CreateCheckbox(v.fileProvider, false) + v.hardcoreCheckbox.MoveTo(318, 548) + v.hardcoreCheckbox.SetVisible(false) + v.uiManager.AddWidget(&v.hardcoreCheckbox) + }, + func() { + v.hardcoreCharLabel = d2ui.CreateLabel(v.fileProvider, d2resource.Font16, d2enum.Units) + v.hardcoreCharLabel.Alignment = d2ui.LabelAlignLeft + v.hardcoreCharLabel.Color = color.RGBA{216, 196, 128, 255} + v.hardcoreCharLabel.SetText(d2common.TranslateString("#1696")) + v.hardcoreCharLabel.MoveTo(339, 548) + }, func() { v.heroRenderInfo[d2enum.HeroBarbarian] = &HeroRenderInfo{ d2enum.HeroStanceIdle, @@ -423,6 +453,8 @@ func (v *SelectHeroClass) Render(screen *ebiten.Image) { v.campfire.Draw(screen) if v.heroNameTextbox.GetVisible() { v.heroNameLabel.Draw(screen) + v.expansionCharLabel.Draw(screen) + v.hardcoreCharLabel.Draw(screen) } } @@ -480,6 +512,8 @@ func (v *SelectHeroClass) updateHeroSelectionHover(hero d2enum.Hero, canSelect b if mouseHover && v.uiManager.CursorButtonPressed(d2ui.CursorButtonLeft) { v.heroNameTextbox.SetVisible(true) v.okButton.SetVisible(true) + v.expansionCheckbox.SetVisible(true) + v.hardcoreCheckbox.SetVisible(true) renderInfo.Stance = d2enum.HeroStanceApproaching renderInfo.ForwardWalkSprite.ResetAnimation() if renderInfo.ForwardWalkSpriteOverlay.IsValid() { diff --git a/d2render/d2ui/Checkbox.go b/d2render/d2ui/Checkbox.go new file mode 100644 index 00000000..43140eb4 --- /dev/null +++ b/d2render/d2ui/Checkbox.go @@ -0,0 +1,102 @@ +package d2ui + +import ( + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource" + "github.com/OpenDiablo2/OpenDiablo2/d2data/d2datadict" + "github.com/OpenDiablo2/OpenDiablo2/d2render" + "github.com/hajimehoshi/ebiten" +) + +type Checkbox struct { + x, y int + pressed bool + visible bool + width, height uint32 + Image *ebiten.Image + checkedImage *ebiten.Image + onClick func() + enabled bool +} + +func CreateCheckbox(fileProvider d2interface.FileProvider, toggleState bool) Checkbox { + result := Checkbox{ + pressed: toggleState, + visible: true, + width: 0, + height: 0, + enabled: true, + } + checkboxSprite := d2render.CreateSprite(fileProvider.LoadFile(d2resource.Checkbox), d2datadict.Palettes[d2enum.Fechar]) + result.width, result.height = checkboxSprite.GetFrameSize(0) + checkboxSprite.MoveTo(0, 0) + + result.Image, _ = ebiten.NewImage(int(result.width), int(result.height), ebiten.FilterNearest) + checkboxSprite.DrawSegments(result.Image, 1, 1, 0) + + result.checkedImage, _ = ebiten.NewImage(int(result.width), int(result.height), ebiten.FilterNearest) + checkboxSprite.DrawSegments(result.checkedImage, 1, 1, 1) + return result +} + +func (v Checkbox) Draw(target *ebiten.Image) { + opts := &ebiten.DrawImageOptions{ + CompositeMode: ebiten.CompositeModeSourceAtop, + Filter: ebiten.FilterNearest, + } + opts.GeoM.Translate(float64(v.x), float64(v.y)) + if v.pressed == false { + target.DrawImage(v.Image, opts) + } else { + target.DrawImage(v.checkedImage, opts) + } +} +func (v Checkbox) GetEnabled() bool { + return v.enabled +} + +func (v *Checkbox) SetEnabled(enabled bool) { + v.enabled = enabled +} + +func (v *Checkbox) SetPressed(pressed bool) { + v.pressed = pressed +} + +func (v Checkbox) GetPressed() bool { + return v.pressed +} + +func (v *Checkbox) OnActivated(callback func()) { + v.onClick = callback +} + +func (v *Checkbox) Activate() { + v.pressed = !v.pressed + if v.onClick == nil { + return + } + v.onClick() +} + +func (v Checkbox) GetLocation() (int, int) { + return v.x, v.y +} + +func (v Checkbox) GetSize() (uint32, uint32) { + return v.width, v.height +} + +func (v Checkbox) GetVisible() bool { + return v.visible +} + +func (v *Checkbox) MoveTo(x int, y int) { + v.x = x + v.y = y +} + +func (v *Checkbox) SetVisible(visible bool) { + v.visible = visible +}