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:
Zhongheng Liu 2024-10-22 21:08:43 +03:00
commit 8b6b1f1ac0
Signed by: steven
GPG key ID: DC8F48E7B4C40905
8 changed files with 159 additions and 22 deletions

78
main.go
View file

@ -1,10 +1,82 @@
package main
import (
"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)
}

View file

@ -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)
@ -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
View 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
View 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
View 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
View 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
}

View file

@ -1,6 +0,0 @@
package window
import (
. "github.com/gbin/goncurses"
)
func createWindow(scr Screen) Window {}
}

View 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)
}
}