ui starting, menu screen, ingame help

This commit is contained in:
2019-11-08 03:36:26 +03:00
parent 4532320ce3
commit cb7718860a
11 changed files with 271 additions and 40 deletions

View File

@ -24,6 +24,9 @@ func DefaultGen(l *gamemap.Level) (*gamemap.Level, []*gamemap.Room) {
rooms := make([]*gamemap.Room, 0)
//one wall around whole level guaranteed
levelBoundary := types.NewRect(l.X + 1, l.Y + 1, l.W - 2, l.H - 2)
for i := 0; i < maxrooms; i++ {
newRoom := &gamemap.Room{
Rect: types.NewRect(
@ -36,7 +39,7 @@ func DefaultGen(l *gamemap.Level) (*gamemap.Level, []*gamemap.Room) {
failed := false
if !l.InBounds(types.Coords{newRoom.X, newRoom.Y}) {
if !levelBoundary.InBounds(types.Coords{newRoom.X, newRoom.Y}) {
failed = true
}

View File

@ -14,18 +14,24 @@ type GameScreen struct {
state *gamestate.GameState
vp *mainwindow.ViewPort
controller *ecs.Controller
scm *types.ScreenManager
}
func NewGameScreen(mw *mainwindow.MainWindow, state *gamestate.GameState, viewPort *mainwindow.ViewPort, controller *ecs.Controller) *GameScreen {
return &GameScreen{mw: mw, state: state, vp: viewPort, controller: controller}
func NewGameScreen(mw *mainwindow.MainWindow, state *gamestate.GameState, viewPort *mainwindow.ViewPort, controller *ecs.Controller, scm *types.ScreenManager) *GameScreen {
ts := &GameScreen{mw: mw, state: state, vp: viewPort, controller: controller, scm: scm}
renderMobs := systems.MobRenderSystem{EntityController: ts.controller}
ts.controller.AddSystem(renderMobs, 1)
return ts
}
func (ts *GameScreen) UseEcs() bool { return true }
func (ts *GameScreen) Enter() {
renderMobs := systems.MobRenderSystem{EntityController: ts.controller}
ts.controller.AddSystem(renderMobs, 1)
ts.mw.GetLayer("overlay").ClearArea(0, ts.mw.H - 3, 30, 3)
ts.mw.GetLayer("overlay").WithColor("#77777777").
Print(1, ts.mw.H - 2, "Press [color=white]?[/color] for help")
}
func (ts *GameScreen) Exit() {
ts.mw.GetLayer("base").ClearArea(1, ts.mw.H -2, 30, 1)
//remove what we dont need
}
@ -56,6 +62,9 @@ func (ts *GameScreen) HandleInput(input string) {
case "n", "3":
ts.walk(ts.state, 1, 1)
break
case "Shift+/":
ts.scm.SetScreenByName("help")
break
default:
ts.mw.GetLayer("base").ClearArea(0, 3, 40, 1)
ts.mw.GetLayer("base").Print(1, 3, "Key: "+input)

116
engine/screens/menu.go Normal file
View File

@ -0,0 +1,116 @@
package screens
import (
"lab.zaar.be/thefish/alchemyst-go/engine/types"
"lab.zaar.be/thefish/alchemyst-go/ui/mainwindow"
blt "lab.zaar.be/thefish/bearlibterminal"
"strings"
)
const runeIndex = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
type MenuScreen struct {
*types.Rect
mw *mainwindow.MainWindow
scm *types.ScreenManager
renderParent bool
items []interface{}
title string
header string
footer string
redraw bool
bgColor string
fgColor string
}
func NewMenuScreen(mw *mainwindow.MainWindow, scm *types.ScreenManager, title, header, footer string, rect *types.Rect, renderParent bool) *MenuScreen {
return &MenuScreen{
title: title,
header: header,
footer: footer,
Rect: rect,
mw: mw,
scm: scm,
renderParent: renderParent,
}
}
func (ms *MenuScreen) SetBgColor(color string) *MenuScreen {
ms.bgColor = color
return ms
}
func (ms *MenuScreen) SetFgColor(color string) *MenuScreen {
ms.fgColor = color
return ms
}
//fixme!!
func (ms *MenuScreen) SetItems(items []interface{}) *MenuScreen {
ms.items = items
return ms
}
func (ms *MenuScreen) UseEcs() bool { return false }
func (ms *MenuScreen) Enter() {
ms.redraw = true
}
func (ms *MenuScreen) HandleInput(input string) {
//
//if input != "" {
// ms.redraw = true
//}
switch input {
case "Space":
ms.scm.SetScreen(ms.scm.PreviousScreen)
break
}
}
func (ms *MenuScreen) Exit() {
menuLayer := ms.mw.GetLayer("menu")
menuLayer.ClearRect(ms.Rect)
bgLayer := ms.mw.GetLayer("menubg")
bgLayer.ClearRect(ms.Rect)
}
func (ms *MenuScreen) Render() {
if ms.renderParent {
ms.scm.PreviousScreen.Render()
}
if (ms.redraw || ms.renderParent) {
ms.redraw = false
menuLayer := ms.mw.GetLayer("menu")
menuLayer.ClearRect(ms.Rect)
bgLayer := ms.mw.GetLayer("menubg")
bgLayer.ClearRect(ms.Rect)
bgLayer.WithColor(ms.bgColor).NewWindow(ms.Rect).Splash()
menuLayer.WithColor(ms.fgColor).NewWindow(ms.Rect).DoubleBordered(ms.title)
menuLayer.Print(ms.X+(ms.W/2)-7, ms.Y+ms.H-1, "╡"+"[color=green]Space[/color] to close"+"╞")
footerHeight := 0
if ms.footer != "" {
_, footerHeight = menuLayer.PrintInside(ms.Rect, ms.footer, 9)
footerHeight = footerHeight + 2
}
_, headerHeight := menuLayer.PrintInside(ms.Rect, ms.header, blt.TK_ALIGN_LEFT)
itemField := types.Rect{ms.X, ms.Y + headerHeight + 1, ms.W, ms.H - headerHeight - footerHeight}
_ = itemField
if (len(ms.items) > 0) {
//fixme itemfield object, scroller, inputhandler, current selected item
menuItems := make([]string, 0)
for i, _ := range ms.items {
if string(ms.items[i].(string)) != "" {
menuItems = append(menuItems, ms.items[i].(string))
}
}
menuLayer.PrintInside(&itemField, strings.Join(menuItems, "\n"), blt.TK_ALIGN_LEFT)
}
}
}

11
engine/screens/sample.go Normal file
View File

@ -0,0 +1,11 @@
package screens
type SampleScreen struct {
}
func (ss *SampleScreen) UseEcs() bool {return false}
func (ss *SampleScreen) Enter() {}
func (ss *SampleScreen) HandleInput(input string) {}
func (ss *SampleScreen) Exit() {}
func (ss *SampleScreen) Render() {}

View File

@ -1,11 +1,66 @@
package screens
type TitleScreen struct {
import (
"lab.zaar.be/thefish/alchemyst-go/engine/types"
"lab.zaar.be/thefish/alchemyst-go/ui/mainwindow"
blt "lab.zaar.be/thefish/bearlibterminal"
)
type TitleScreen struct {
mw *mainwindow.MainWindow
scm *types.ScreenManager
}
func (ts *TitleScreen) UseEcs() bool {return false}
func (ts *TitleScreen) Enter() {}
func (ts *TitleScreen) HandleInput(input string) {}
func (ts *TitleScreen) Exit() {}
func (ts *TitleScreen) Render() {}
func NewTitleScreen(mw *mainwindow.MainWindow, scm *types.ScreenManager) *TitleScreen {
return &TitleScreen{mw: mw, scm: scm}
}
func (ts *TitleScreen) UseEcs() bool { return false }
func (ts *TitleScreen) Enter() {
blt.Clear()
}
func (ts *TitleScreen) HandleInput(input string) {
switch input {
case "n":
ts.scm.SetScreenByName("game")
}
}
func (ts *TitleScreen) Exit() {
blt.Clear()
}
func (ts *TitleScreen) Render() {
blt.PrintExt(0, 0, ts.mw.W, ts.mw.H, 15, logo)
}
var logo = `
.ddxo. .c c xlx
.kd. .0o:O, c0uO'
xc 0; x: ko ,,
;l Y; c, .Yct;
.. .. .......
:o: :k; .cxloOo x0. kO .olldk; do .;k lO. dO 'xllxk; ocokk:dl
.lKO, .kl 'dl c l0l..;dK lkx..;d: dOx .cOx ,0o c0 kk. .Y .Oo
.l0.k0. .0l lK. l0oxxxOK OK;xxx kKOklOkx ,kO;'do. ;xO: .Oo
:OoooxO .Ol ;Xc , cK' dK xX. , Ox YY xx ,O0. . .oKx. .0o
;k. .Ox Ok..'.,l ;Kk:;dk cKl lX: dKc,;oc kx kk OO dKl;lk: .0O
l; ,o .kK0KKK; :Ok; c; l: .oxc. x: Ol xl .dk: .o
Alchemyst (c) 2011-2014 thefish <thefish@zaar.be>
[color=green]N[/color]ew dungeon run
[color=green]L[/color]oad saved game
Read [color=green]h[/color]elp file
Highest [color=green]S[/color]cores
Roguebasin Libtcod Tutorial (c) 2010-2011, Jotaf Henriques
Brogue 1.3 (c) 2010 Brian Walker
Madness (c) 2010 hmp <humpolec@gmail.com>
BearLibTerminal (c) Cfyz 2009-2019 <http://foo.wyrd.name/en:bearlibterminal>
Gogue (c) jcerise
`

View File

@ -12,10 +12,16 @@ func NewRect(x, y, w, h int) *Rect {
return &Rect{x, y, w, h}
}
func NewCenteredRect(source *Rect, w, h int) *Rect {
targetX := source.X + source.W / 2 - w / 2
targetY := source.Y + source.H / 2 - h / 2
return &Rect{targetX, targetY, w, h}
}
func (r *Rect) Blit(fillage RectFill, layer Putable) {
if fillage.Body != "" {
for i := r.X + 1; i < r.X+r.W; i++ {
for i := r.X+1; i < r.X+r.W - 1; i++ {
for j := r.Y + 1; j < r.Y+r.H; j++ {
layer.Put(i, j, fillage.Body)
//lii.Put(i, j, "X");
@ -23,27 +29,27 @@ func (r *Rect) Blit(fillage RectFill, layer Putable) {
}
}
for i := r.X + 1; i < r.X+r.W; i++ {
for i := r.X; i < r.X+r.W - 1; i++ {
layer.Put(i, r.Y, fillage.Top)
//lii.Put(i, Y-1, "Q");
layer.Put(i, r.Y+r.H, fillage.Bottom)
layer.Put(i, r.Y+r.H - 1, fillage.Bottom)
//lii.Put(i, Y+H, "H");
}
for j := r.Y + 1; j < r.Y+r.H; j++ {
for j := r.Y; j < r.Y+r.H; j++ {
layer.Put(r.X, j, fillage.Left)
//lii.Put(X-1, j, "U");
layer.Put(r.X+r.W, j, fillage.Right)
layer.Put(r.X+r.W - 1, j, fillage.Right)
//lii.Put(X+W, j, "M");
}
layer.Put(r.X, r.Y, fillage.TopLeft)
//lii.Put(X-1, Y-1, "T");
layer.Put(r.X, r.Y+r.H, fillage.BottomLeft)
layer.Put(r.X, r.Y+r.H - 1, fillage.BottomLeft)
//lii.Put(X-1, Y+H, "q");
layer.Put(r.X+r.W, r.Y, fillage.TopRight)
layer.Put(r.X+r.W - 1, r.Y, fillage.TopRight)
//lii.Put(X+W, Y-1, "L");
layer.Put(r.X+r.W, r.Y+r.H, fillage.BottomRight)
layer.Put(r.X+r.W - 1, r.Y+r.H - 1, fillage.BottomRight)
}
func (self *Rect) Intersects(other *Rect) bool {