WIP on moving/exits
parent
3fc647389c
commit
0c6df57629
|
@ -46,14 +46,16 @@ TODO draft something new
|
||||||
- [x] grpc server
|
- [x] grpc server
|
||||||
- [x] session handling (opening/closing)
|
- [x] session handling (opening/closing)
|
||||||
- [x] verb handling
|
- [x] verb handling
|
||||||
- [x] WITCH: initial setup
|
- [ ] build out some more default rooms
|
||||||
- [x] DB: initial schema
|
- [x] DB: initial schema
|
||||||
- [ ] DB: sundry error handling
|
- [ ] DB: sundry error handling
|
||||||
- [ ] build out some more default rooms
|
- [ ] DB/WITCH: locking objects
|
||||||
|
- [x] WITCH: initial setup
|
||||||
- [ ] WITCH: ability to send verbs outward
|
- [ ] WITCH: ability to send verbs outward
|
||||||
- [ ] WITCH: transitive verb support
|
- [ ] WITCH: transitive verb support
|
||||||
- [ ] WITCH: provides function
|
- [ ] WITCH: provides function
|
||||||
- [ ] WITCH: movement stuff (teleport, move)
|
- [ ] WITCH: movement stuff (teleport, move)
|
||||||
|
- [ ] WITCH: bidirectional has() support
|
||||||
- [ ] VERBS: create
|
- [ ] VERBS: create
|
||||||
- [ ] VERBS: announce (for gods)
|
- [ ] VERBS: announce (for gods)
|
||||||
- [ ] VERBS: movement
|
- [ ] VERBS: movement
|
||||||
|
|
|
@ -125,6 +125,42 @@ func (db *pgDB) Ensure() error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub, err := db.GetObject("system", "pub")
|
||||||
|
if err != nil {
|
||||||
|
// TODO actually check error. for now assuming it means does not exist
|
||||||
|
data := map[string]string{}
|
||||||
|
data["name"] = "pub"
|
||||||
|
data["description"] = "a warm pub constructed of hard wood and brass"
|
||||||
|
pub = &Object{
|
||||||
|
Data: data,
|
||||||
|
Script: "",
|
||||||
|
// TODO default room script
|
||||||
|
}
|
||||||
|
if err = db.CreateObject(sysAcc, pub); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
oakDoor, err := db.GetObject("system", "oak door")
|
||||||
|
if err != nil {
|
||||||
|
// TODO actually check error. for now assuming it means does not exist
|
||||||
|
data := map[string]string{}
|
||||||
|
data["name"] = "oak door"
|
||||||
|
data["description"] = "a heavy oak door with a brass handle. an ornate sign says PUB."
|
||||||
|
oakDoor = &Object{
|
||||||
|
Data: data,
|
||||||
|
Script: `
|
||||||
|
go("north", function
|
||||||
|
tellMe("the heavy door swings forward with ease. It creaks gently")
|
||||||
|
moveSender("system", "pub")
|
||||||
|
end)
|
||||||
|
`,
|
||||||
|
}
|
||||||
|
if err = db.CreateObject(sysAcc, oakDoor); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sysAva, err := db.GetAccountAvatar(*sysAcc)
|
sysAva, err := db.GetAccountAvatar(*sysAcc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("could not find avatar for system account: %w", err)
|
return fmt.Errorf("could not find avatar for system account: %w", err)
|
||||||
|
@ -132,6 +168,7 @@ func (db *pgDB) Ensure() error {
|
||||||
|
|
||||||
db.MoveInto(*sysAva, *foyer)
|
db.MoveInto(*sysAva, *foyer)
|
||||||
db.MoveInto(*egg, *foyer)
|
db.MoveInto(*egg, *foyer)
|
||||||
|
db.MoveInto(*oakDoor, *foyer)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -474,7 +511,7 @@ func (db *pgDB) CreateObject(owner *Account, obj *Object) error {
|
||||||
RETURNING id
|
RETURNING id
|
||||||
`
|
`
|
||||||
|
|
||||||
obj.Script = hasInvocation(obj)
|
obj.Script = hasInvocation(obj) + obj.Script
|
||||||
|
|
||||||
err := db.pool.QueryRow(ctx, stmt,
|
err := db.pool.QueryRow(ctx, stmt,
|
||||||
obj.Avatar, obj.Bedroom, obj.Data, obj.Script, owner.ID).Scan(
|
obj.Avatar, obj.Bedroom, obj.Data, obj.Script, owner.ID).Scan(
|
||||||
|
|
|
@ -37,3 +37,11 @@ CREATE TABLE contains (
|
||||||
container integer REFERENCES objects ON DELETE RESTRICT,
|
container integer REFERENCES objects ON DELETE RESTRICT,
|
||||||
contained integer REFERENCES objects ON DELETE CASCADE
|
contained integer REFERENCES objects ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CREATE TYPE heading AS ENUM ('north', 'south', 'east', 'west', 'above', 'below');
|
||||||
|
|
||||||
|
CREATE TABLE exits (
|
||||||
|
startroom integer REFERENCES objects ON DELETE CASCADE,
|
||||||
|
endroom integer REFERENCES objects ON DELETE CASCADE,
|
||||||
|
direction heading NOT NULL
|
||||||
|
);
|
||||||
|
|
|
@ -23,6 +23,13 @@ func witchSees(l *lua.LState) int {
|
||||||
return addHandler(l, "emote")
|
return addHandler(l, "emote")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func witchGo(l *lua.LState) int {
|
||||||
|
// TODO get the handler map
|
||||||
|
// - check if handler map has a Go handler already, exit early if so
|
||||||
|
// TODO register this object as an exit in DB
|
||||||
|
return addHandler(l, "go")
|
||||||
|
}
|
||||||
|
|
||||||
func witchDoes(ls *lua.LState) int {
|
func witchDoes(ls *lua.LState) int {
|
||||||
// TODO how to feed events back into the server?
|
// TODO how to feed events back into the server?
|
||||||
// it needs to behave like an event showing up in Commands stream
|
// it needs to behave like an event showing up in Commands stream
|
||||||
|
|
|
@ -54,11 +54,13 @@ func NewScriptContext(sAPI ServerAPI) (*ScriptContext, error) {
|
||||||
for {
|
for {
|
||||||
vc = <-sc.incoming
|
vc = <-sc.incoming
|
||||||
if vc.Target.Script != sc.script {
|
if vc.Target.Script != sc.script {
|
||||||
|
// TODO clear this object out of the exits table
|
||||||
sc.script = vc.Target.Script
|
sc.script = vc.Target.Script
|
||||||
l = lua.NewState()
|
l = lua.NewState()
|
||||||
l.SetGlobal("has", l.NewFunction(witchHas))
|
l.SetGlobal("has", l.NewFunction(witchHas))
|
||||||
l.SetGlobal("hears", l.NewFunction(witchHears))
|
l.SetGlobal("hears", l.NewFunction(witchHears))
|
||||||
l.SetGlobal("sees", l.NewFunction(witchSees))
|
l.SetGlobal("sees", l.NewFunction(witchSees))
|
||||||
|
l.SetGlobal("go", l.NewFunction(witchGo))
|
||||||
l.SetGlobal("_handlers", l.NewTable())
|
l.SetGlobal("_handlers", l.NewTable())
|
||||||
if err := l.DoString(vc.Target.Script); err != nil {
|
if err := l.DoString(vc.Target.Script); err != nil {
|
||||||
log.Printf("error parsing script %s: %s", vc.Target.Script, err.Error())
|
log.Printf("error parsing script %s: %s", vc.Target.Script, err.Error())
|
||||||
|
@ -72,6 +74,12 @@ func NewScriptContext(sAPI ServerAPI) (*ScriptContext, error) {
|
||||||
return 0
|
return 0
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
l.SetGlobal("moveSender", l.NewFunction(func(l *lua.LState) int {
|
||||||
|
// TODO get sender
|
||||||
|
// TODO add another func to serverAPI for moving an object
|
||||||
|
return 0
|
||||||
|
}))
|
||||||
|
|
||||||
l.SetGlobal("showMe", l.NewFunction(func(l *lua.LState) int {
|
l.SetGlobal("showMe", l.NewFunction(func(l *lua.LState) int {
|
||||||
sender := l.GetGlobal("sender").(*lua.LTable)
|
sender := l.GetGlobal("sender").(*lua.LTable)
|
||||||
senderID := int(lua.LVAsNumber(sender.RawGetString("ID")))
|
senderID := int(lua.LVAsNumber(sender.RawGetString("ID")))
|
||||||
|
|
Loading…
Reference in New Issue