WIP on moving/exits
This commit is contained in:
		
							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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user