feat: quick scaffolding for game window
Init: Created initial NPC data structures UI: Created basic ncurses TUI for development Types: Created basic helper types
This commit is contained in:
parent
03d6ee47fa
commit
8b6b1f1ac0
8 changed files with 159 additions and 22 deletions
80
main.go
80
main.go
|
@ -1,10 +1,82 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"gitlab.com/stvnliu/ai_game/menu"
|
||||
"time"
|
||||
|
||||
. "github.com/gbin/goncurses"
|
||||
"gitlab.com/stvnliu/ai_game/menu"
|
||||
. "gitlab.com/stvnliu/ai_game/utils/types"
|
||||
// "gitlab.com/stvnliu/ai_game/utils/window_helper"
|
||||
)
|
||||
|
||||
func main() {
|
||||
menu_items := []string{"New game", "Continue", "Exit"}
|
||||
menu.CreateMenu(menu_items)
|
||||
const (
|
||||
INPUT_PROMPT_LENGTH = 40
|
||||
INPUT_PROMPT_HEIGHT = 10
|
||||
)
|
||||
|
||||
func InputPrompt(scr *Window) string {
|
||||
my, mx := scr.MaxYX()
|
||||
w, err := NewWindow(INPUT_PROMPT_HEIGHT, INPUT_PROMPT_LENGTH, (my/2)-(INPUT_PROMPT_HEIGHT/2), (mx/2)-(INPUT_PROMPT_LENGTH/2))
|
||||
if err != nil {
|
||||
panic("Oh no sth went wrong in input!!")
|
||||
}
|
||||
w.Box(0, 0)
|
||||
Echo(true)
|
||||
msg := "Game name: "
|
||||
w.MovePrint(0, 1, " New game information ")
|
||||
w.MovePrint(2, 2, msg)
|
||||
w.Move(2, 2+len(msg))
|
||||
input, err := w.GetString(16) // character input box
|
||||
if err != nil {
|
||||
panic("Oh no sth went wrong in input 2!!")
|
||||
}
|
||||
w.MovePrint(3, 2, input)
|
||||
w.Refresh()
|
||||
Echo(false)
|
||||
for {
|
||||
ch := w.GetChar()
|
||||
switch Key(ch) {
|
||||
case 'q':
|
||||
return input
|
||||
}
|
||||
}
|
||||
}
|
||||
func NewGame(scr *Window) {
|
||||
//_, _ := scr.MaxYX()
|
||||
game_name := InputPrompt(scr)
|
||||
// create new game state
|
||||
// println("Creating new game %v...", game_name)
|
||||
game := Game{
|
||||
SaveGame: game_name,
|
||||
LastSaved: time.Now(),
|
||||
}
|
||||
my_npcs := MakeNpcs()
|
||||
game.DataStored.Npcs = my_npcs
|
||||
scr.MovePrintf(1, 2, "Created new game \"%v\"!", game.SaveGame)
|
||||
for i:=0; i<len(game.DataStored.Npcs); i++ {
|
||||
scr.MovePrintf(2+i, 2, "Initialising \"%v\"...", game.DataStored.Npcs[i].Name)
|
||||
scr.MovePrintf(3+i, 2, "Found NPC query string!")
|
||||
scr.Refresh()
|
||||
|
||||
}
|
||||
// println(game.DataStored.Npcs[0].Name)
|
||||
}
|
||||
func Continue(scr *Window) {
|
||||
// recover state from last save?
|
||||
}
|
||||
func Exit(scr *Window) {
|
||||
// save game state?
|
||||
}
|
||||
func main() {
|
||||
scr, err := Init()
|
||||
if err != nil {
|
||||
println("Something went wrong with Ncurses! Aborting!")
|
||||
return
|
||||
}
|
||||
menu_items := []GameMenuItem{
|
||||
{Name: "New game!", Operation: NewGame},
|
||||
{Name: "Continue!", Operation: Continue},
|
||||
{Name: "Exit!", Operation: Exit},
|
||||
}
|
||||
menu.CreateMenu(scr, menu_items)
|
||||
}
|
||||
|
|
22
menu/menu.go
22
menu/menu.go
|
@ -2,7 +2,8 @@ package menu
|
|||
|
||||
import (
|
||||
. "github.com/gbin/goncurses"
|
||||
"log"
|
||||
. "gitlab.com/stvnliu/ai_game/utils/types"
|
||||
// "log"
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -10,12 +11,8 @@ const (
|
|||
WIDTH = 30
|
||||
)
|
||||
|
||||
func CreateMenu(menu []string) {
|
||||
func CreateMenu(stdscr *Window, menu []GameMenuItem) {
|
||||
var active int
|
||||
stdscr, err := Init()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
defer End()
|
||||
|
||||
Raw(true)
|
||||
|
@ -28,7 +25,7 @@ func CreateMenu(menu []string) {
|
|||
y, x := 2, (mx/2)-(WIDTH/2)
|
||||
|
||||
win, _ := NewWindow(HEIGHT, WIDTH, y, x)
|
||||
win.Keypad(true)
|
||||
win.Keypad(true)
|
||||
|
||||
stdscr.Print("Use arrow keys to go up and down, Press enter to select")
|
||||
stdscr.Refresh()
|
||||
|
@ -55,7 +52,8 @@ func CreateMenu(menu []string) {
|
|||
case KEY_RETURN, KEY_ENTER, Key('\r'):
|
||||
stdscr.MovePrintf(my-2, 0, "Choice #%d: %s selected",
|
||||
active,
|
||||
menu[active])
|
||||
menu[active].Name)
|
||||
menu[active].Operation(stdscr)
|
||||
stdscr.ClearToEOL()
|
||||
stdscr.Refresh()
|
||||
default:
|
||||
|
@ -69,16 +67,16 @@ func CreateMenu(menu []string) {
|
|||
}
|
||||
}
|
||||
|
||||
func printmenu(w *Window, menu []string, active int) {
|
||||
func printmenu(w *Window, menu []GameMenuItem, active int) {
|
||||
y, x := 2, 2
|
||||
w.Box(0, 0)
|
||||
for i, s := range menu {
|
||||
for i, item := range menu {
|
||||
if i == active {
|
||||
w.AttrOn(A_REVERSE)
|
||||
w.MovePrint(y+i, x, s)
|
||||
w.MovePrint(y+i, x, item.Name)
|
||||
w.AttrOff(A_REVERSE)
|
||||
} else {
|
||||
w.MovePrint(y+i, x, s)
|
||||
w.MovePrint(y+i, x, item.Name)
|
||||
}
|
||||
}
|
||||
w.Refresh()
|
||||
|
|
18
mknpcs.go
Normal file
18
mknpcs.go
Normal file
|
@ -0,0 +1,18 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
. "gitlab.com/stvnliu/ai_game/utils/types"
|
||||
)
|
||||
|
||||
func MakeNpcs() []Npc {
|
||||
npcs := []Npc {}
|
||||
helper01 := Npc{
|
||||
Name: "Helper01_NPC",
|
||||
Ai: NpcAi{
|
||||
PromptCharacterString: "You are a new helper assisting new players of a role-playing game set in $SCENE$, in a village called $VILLAGE$. With the information immediately preceeding, output only what you would say to a new player who just arrived in the village to provide helpful guidance.",
|
||||
QueryFromTableName: "helper",
|
||||
},
|
||||
}
|
||||
npcs = append(npcs, helper01)
|
||||
return npcs
|
||||
}
|
10
utils/types/menus.go
Normal file
10
utils/types/menus.go
Normal file
|
@ -0,0 +1,10 @@
|
|||
package types
|
||||
|
||||
import (
|
||||
. "github.com/gbin/goncurses"
|
||||
)
|
||||
|
||||
type GameMenuItem struct {
|
||||
Name string
|
||||
Operation func(*Window)
|
||||
}
|
12
utils/types/npcs.go
Normal file
12
utils/types/npcs.go
Normal file
|
@ -0,0 +1,12 @@
|
|||
package types
|
||||
|
||||
type NpcAi struct {
|
||||
PromptCharacterString string
|
||||
QueryFromTableName string
|
||||
}
|
||||
type Npc struct {
|
||||
Name string
|
||||
Ai NpcAi
|
||||
}
|
||||
|
||||
|
20
utils/types/types.go
Normal file
20
utils/types/types.go
Normal file
|
@ -0,0 +1,20 @@
|
|||
package types
|
||||
|
||||
import "time"
|
||||
|
||||
|
||||
type Data struct {
|
||||
Npcs []Npc
|
||||
}
|
||||
type Game struct {
|
||||
SaveGame string
|
||||
LastSaved time.Time
|
||||
DataStored Data
|
||||
}
|
||||
|
||||
func (game Game) NewGame(game_name string, data Data) Game {
|
||||
game.SaveGame = game_name
|
||||
game.LastSaved = time.Now()
|
||||
game.DataStored = data
|
||||
return game
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
package window
|
||||
import (
|
||||
. "github.com/gbin/goncurses"
|
||||
)
|
||||
func createWindow(scr Screen) Window {}
|
||||
}
|
13
utils/window_helper/window_helper.go
Normal file
13
utils/window_helper/window_helper.go
Normal file
|
@ -0,0 +1,13 @@
|
|||
package window_helper
|
||||
import (
|
||||
. "github.com/gbin/goncurses"
|
||||
)
|
||||
|
||||
func CreateMenu(win *Window, menu_string []string) {
|
||||
x, y := 2, 2
|
||||
win.Clear()
|
||||
win.Box(0, 0)
|
||||
for i, str := range menu_string {
|
||||
win.MovePrint(y+i, x, str)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue