-
Notifications
You must be signed in to change notification settings - Fork 4
/
mud.go
98 lines (85 loc) · 2.36 KB
/
mud.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package main
import ("os"
"net"
"math/rand"
"time"
"flag"
"mud"
"fmt")
type NamePrompt struct {
mud.ConnectionState
universe *mud.Universe
StartRoom *mud.Room
PlayerRemoveChan chan *mud.Player
}
func (n *NamePrompt) Name() string { return "name prompt" }
func (n *NamePrompt) Init(c *mud.UserConnection) {
c.Write(Preamble)
c.Write("Welcome. Please enter your name:\n\r")
}
func (n *NamePrompt) Respond(c *mud.UserConnection) bool {
playerName := <- c.FromUser
c.Data["playerName"] = playerName
newP := n.universe.PlayerFromUserConn(c)
mud.PlacePlayerInRoom(n.StartRoom, newP)
mud.Look(newP, []string{})
go newP.ReadLoop(n.PlayerRemoveChan)
go newP.ExecCommandLoop()
go mud.StimuliLoop(newP)
return false
}
func main() {
flagPort := flag.Int("port", 3000,
"port to listen for mud clients")
flagUseSeed := flag.Bool("seed", false,
"flush DB and seed universe with prototype's seed.go")
flagUseLoad := flag.Bool("load", true,
"load objects from DB")
flagSpeedupFactor := flag.Float64("speedup", 1.0,
"factor to speed up heartbeat loop (2.0 means heartbeats come twice as often)")
flagRedisDbNo := flag.Int("dbno", 3,
"redis DB# to load from/seed into")
flag.Usage = func() {
flag.PrintDefaults()
}
flag.Parse()
mud.Log("program args: ", os.Args)
rand.Seed(time.Now().Unix())
listener, err := net.Listen("tcp", fmt.Sprintf(":%d",*flagPort))
universe := mud.NewUniverse(*flagRedisDbNo)
universe.Maker = BuildFFInRoom
playerRemoveChan := make(chan *mud.Player)
var theRoom *mud.Room
if *flagUseSeed {
mud.Log("Seeding Universe")
universe.ClearDB()
theRoom = InitUniverse(universe)
} else if *flagUseLoad {
mud.Log("Loading Universe")
theRoom = LoadUniverse(universe)
mud.Log("theRoom",theRoom)
}
mud.Log("len(rooms) =",len(universe.Rooms))
go universe.HandlePersist()
go universe.HeartbeatLoop(*flagSpeedupFactor)
if err == nil {
go mud.PlayerListManager(playerRemoveChan, universe.Players)
defer listener.Close()
mud.Log("Listening on port", *flagPort)
for {
conn, aerr := listener.Accept()
if aerr == nil {
namePrompt := new(NamePrompt)
namePrompt.universe = universe
namePrompt.StartRoom = theRoom
namePrompt.PlayerRemoveChan = playerRemoveChan
mud.NewUserConnection(conn, namePrompt)
} else {
mud.Log("Error in accept")
mud.Log(aerr)
}
}
} else {
mud.Log("Error in listen", err)
}
}