コード例 #1
0
ファイル: script_utils.go プロジェクト: FlyingCar/haunts
// Gets the id out of the table at the specified index and returns the
// associated Entity, or nil if there is none.
func LuaToEntity(L *lua.State, game *Game, index int) *Entity {
	L.PushString("id")
	L.GetTable(index - 1)
	id := EntityId(L.ToInteger(-1))
	L.Pop(1)
	return game.EntityById(id)
}
コード例 #2
0
ファイル: script_utils.go プロジェクト: FlyingCar/haunts
func LuaToSpawnPoint(L *lua.State, game *Game, pos int) *house.SpawnPoint {
	L.PushString("id")
	L.GetTable(pos - 1)
	index := L.ToInteger(-1)
	L.Pop(1)
	if index < 0 || index >= len(game.House.Floors[0].Spawns) {
		return nil
	}
	return game.House.Floors[0].Spawns[index]
}
コード例 #3
0
ファイル: script_utils.go プロジェクト: FlyingCar/haunts
func LuaToPoint(L *lua.State, pos int) (x, y int) {
	L.PushString("X")
	L.GetTable(pos - 1)
	x = L.ToInteger(-1)
	L.Pop(1)
	L.PushString("Y")
	L.GetTable(pos - 1)
	y = L.ToInteger(-1)
	L.Pop(1)
	return
}
コード例 #4
0
ファイル: script_utils.go プロジェクト: FlyingCar/haunts
func LuaIsEntity(L *lua.State, index int) bool {
	L.PushString("type")
	L.GetTable(index - 1)
	if L.IsNil(-1) {
		L.Pop(1)
		return false
	}
	if L.ToString(-1) == "Entity" {
		L.Pop(1)
		return true
	}
	L.Pop(1)
	return false
}
コード例 #5
0
ファイル: script_utils.go プロジェクト: FlyingCar/haunts
func LuaToRoom(L *lua.State, game *Game, index int) *house.Room {
	L.PushString("floor")
	L.GetTable(index - 1)
	floor := L.ToInteger(-1)
	L.Pop(1)
	L.PushString("room")
	L.GetTable(index - 1)
	room := L.ToInteger(-1)
	L.Pop(1)

	if floor < 0 || floor >= len(game.House.Floors) {
		return nil
	}
	if room < 0 || room >= len(game.House.Floors[floor].Rooms) {
		return nil
	}

	return game.House.Floors[floor].Rooms[room]
}
コード例 #6
0
ファイル: script_utils.go プロジェクト: FlyingCar/haunts
// Encodes a lua value, only bool, number, nil, table, and string can be
// encoded.  If an unencodable value is encountered an error will be
// returned.
func LuaEncodeValue(w io.Writer, L *lua.State, index int) error {
	var err1, err2, err3 error
	switch {
	case L.IsBoolean(index):
		err1 = binary.Write(w, binary.LittleEndian, luaEncBool)
		var v byte = 0
		if L.ToBoolean(index) {
			v = 1
		}
		err2 = binary.Write(w, binary.LittleEndian, v)
	case L.IsNumber(index):
		err1 = binary.Write(w, binary.LittleEndian, luaEncNumber)
		err2 = binary.Write(w, binary.LittleEndian, L.ToNumber(index))
	case L.IsNil(index):
		err1 = binary.Write(w, binary.LittleEndian, luaEncNil)
	case LuaIsEntity(L, index):
		err1 = binary.Write(w, binary.LittleEndian, luaEncEntity)
		L.PushString("id")
		L.GetTable(index - 1)
		err2 = binary.Write(w, binary.LittleEndian, uint64(L.ToInteger(-1)))
		L.Pop(1)
	case L.IsTable(index):
		err1 = binary.Write(w, binary.LittleEndian, luaEncTable)
		err2 = LuaEncodeTable(w, L, index)
	case L.IsString(index):
		err1 = binary.Write(w, binary.LittleEndian, luaEncString)
		str := L.ToString(index)
		err2 = binary.Write(w, binary.LittleEndian, uint32(len(str)))
		err3 = binary.Write(w, binary.LittleEndian, []byte(str))
	default:
		return errors.New(fmt.Sprintf("Cannot encode lua type id == %d.", L.Type(index)))
	}
	switch {
	case err1 != nil:
		return err1
	case err2 != nil:
		return err2
	case err3 != nil:
		return err3
	}
	return nil
}