refactor lobby state
parent
938348ce26
commit
a330d87b4c
@ -1,24 +1,5 @@
|
|||||||
space-dragons-in-outer-space
|
space-dragons-in-outer-space
|
||||||
============================
|
============================
|
||||||
|
|
||||||
there's no url because it's not a web app
|
This is a [real-time strategy
|
||||||
|
game](https://en.wikipedia.org/wiki/Real-time_strategy) in the style of a [MUD](https://en.wikipedia.org/wiki/MUD).
|
||||||
it's just a tcp server
|
|
||||||
|
|
||||||
you go
|
|
||||||
|
|
||||||
like this
|
|
||||||
|
|
||||||
`nc 104.236.57.163 9220`
|
|
||||||
|
|
||||||
and that is how
|
|
||||||
|
|
||||||
you be a dragon
|
|
||||||
|
|
||||||
in space
|
|
||||||
|
|
||||||
in space
|
|
||||||
|
|
||||||
in space
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,128 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
var banner = `
|
||||||
|
##############################################################################################
|
||||||
|
|
||||||
|
|
||||||
|
/$$$$$$$$ /$$
|
||||||
|
| $$_____/ | $$
|
||||||
|
| $$ /$$ /$$ /$$$$$$ /$$$$$$$ /$$$$$$ | $$ /$$$$$$ /$$$$$$$ /$$ /$$ /$$$$$$$
|
||||||
|
| $$$$$ | $$ /$$/ /$$__ $$ /$$_____/ /$$__ $$| $$ /$$__ $$| $$__ $$| $$ | $$ /$$_____/
|
||||||
|
| $$__/ \ $$$$/ | $$ \ $$| $$ | $$ \ $$| $$| $$ \ $$| $$ \ $$| $$ | $$| $$$$$$
|
||||||
|
| $$ >$$ $$ | $$ | $$| $$ | $$ | $$| $$| $$ | $$| $$ | $$| $$ | $$ \____ $$
|
||||||
|
| $$$$$$$$ /$$/\ $$| $$$$$$/| $$$$$$$| $$$$$$/| $$| $$$$$$/| $$ | $$| $$$$$$/ /$$$$$$$/
|
||||||
|
|________/|__/ \__/ \______/ \_______/ \______/ |__/ \______/ |__/ |__/ \______/ |_______/
|
||||||
|
|
||||||
|
|
||||||
|
~+
|
||||||
|
|
||||||
|
* +
|
||||||
|
' |
|
||||||
|
() .-.,="''"=. - o -
|
||||||
|
'=/_ \ |
|
||||||
|
* | '=._ |
|
||||||
|
\ '=./', '
|
||||||
|
. '=.__.=' '=' *
|
||||||
|
+ +
|
||||||
|
O * ' .
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
##############################################################################################
|
||||||
|
`
|
||||||
|
|
||||||
|
type LobbyState struct {
|
||||||
|
CommandSuite
|
||||||
|
NopExit
|
||||||
|
}
|
||||||
|
|
||||||
|
func EnterLobby() ConnectionState {
|
||||||
|
return &LobbyState{
|
||||||
|
CommandSuite: CommandSet{
|
||||||
|
commandsCommand,
|
||||||
|
helpCommand,
|
||||||
|
newGameCommand,
|
||||||
|
joinGameCommand,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (st *LobbyState) String() string { return "Lobby" }
|
||||||
|
|
||||||
|
func (st *LobbyState) Enter(c *Connection) {
|
||||||
|
c.Printf(strings.TrimSpace(banner))
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
|
||||||
|
for {
|
||||||
|
c.Printf("\n\nwhat is your name, adventurer?\n")
|
||||||
|
name, err := c.ReadString('\n')
|
||||||
|
if err == nil {
|
||||||
|
name = strings.TrimSpace(name)
|
||||||
|
} else {
|
||||||
|
log_error("player failed to connect: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !ValidName(name) {
|
||||||
|
c.Printf("that name is illegal.\n")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
log_info("player connected: %v", name)
|
||||||
|
profile, err := loadProfile(name)
|
||||||
|
if err != nil {
|
||||||
|
log_error("could not read profile: %v", err)
|
||||||
|
profile = &Profile{name: name}
|
||||||
|
if err := profile.Create(); err != nil {
|
||||||
|
log_error("unable to create profile record: %v", err)
|
||||||
|
}
|
||||||
|
c.Printf("you look new around these parts, %s.\n", profile.name)
|
||||||
|
c.Printf(`if you'd like a description of how to play, type the "help" command\n`)
|
||||||
|
c.profile = profile
|
||||||
|
} else {
|
||||||
|
c.profile = profile
|
||||||
|
c.Printf("welcome back, %s.\n", profile.name)
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (st *LobbyState) Tick(c *Connection, frame int64) ConnectionState { return st }
|
||||||
|
|
||||||
|
var newGameCommand = Command{
|
||||||
|
name: "new",
|
||||||
|
help: "starts a new game",
|
||||||
|
arity: 0,
|
||||||
|
variadic: false,
|
||||||
|
handler: func(c *Connection, args ...string) {
|
||||||
|
c.Printf("Starting a new game...\n")
|
||||||
|
game := gm.NewGame()
|
||||||
|
log_info("Created game: %s", game.id)
|
||||||
|
go game.Run()
|
||||||
|
c.game = game
|
||||||
|
c.Printf("Now playing in game: %s\n\n", game.id)
|
||||||
|
c.Line()
|
||||||
|
c.game.Join(c)
|
||||||
|
c.SetState(SpawnRandomly())
|
||||||
|
},
|
||||||
|
debug: false,
|
||||||
|
}
|
||||||
|
|
||||||
|
var joinGameCommand = Command{
|
||||||
|
name: "join",
|
||||||
|
help: "joins an existing game",
|
||||||
|
arity: 1,
|
||||||
|
variadic: false,
|
||||||
|
handler: func(c *Connection, args ...string) {
|
||||||
|
id := args[0]
|
||||||
|
c.game = gm.Get(id)
|
||||||
|
c.SetState(SpawnRandomly())
|
||||||
|
c.game.Join(c)
|
||||||
|
},
|
||||||
|
debug: false,
|
||||||
|
}
|
Loading…
Reference in New Issue