// Performs an Interact action to toggle the opened/closed state of a door. // Format // res = doDoorToggle(d) // // Input: // d - door - A door. // // Output: // res - boolean - True if the door was opened, false if it was closed. // res will be nil if the action could not be performed for some reason. func DoDoorToggleFunc(a *Ai) lua.GoFunction { return func(L *lua.State) int { if !game.LuaCheckParamsOk(L, "doDoorToggle", game.LuaDoor) { return 0 } door := game.LuaToDoor(L, a.ent.Game(), -1) if door == nil { game.LuaDoError(L, "DoDoorToggle: Specified an invalid door.") return 0 } var interact *actions.Interact for _, action := range a.ent.Actions { var ok bool interact, ok = action.(*actions.Interact) if ok { break } } if interact == nil { game.LuaDoError(L, fmt.Sprintf("Tried to toggle a door, but don't have an interact action.")) L.PushNil() return 1 } exec := interact.AiToggleDoor(a.ent, door) if exec != nil { a.execs <- exec <-a.pause L.PushBoolean(door.IsOpened()) } else { L.PushNil() } return 1 } }
// Queries whether a door is currently open. // Format // open = doorIsOpen(d) // // Input: // d - door - A door. // // Output: // open - boolean - True if the door is open, false otherwise. func DoorIsOpenFunc(a *Ai) lua.GoFunction { return func(L *lua.State) int { if !game.LuaCheckParamsOk(L, "doorIsOpen", game.LuaDoor) { return 0 } door := game.LuaToDoor(L, a.ent.Game(), -1) if door == nil { game.LuaDoError(L, "DoorIsOpen: Specified an invalid door.") return 0 } L.PushBoolean(door.IsOpened()) return 1 } }
// Returns a list of all positions that the specified door can be opened and // closed from. // Format // ps = doorPositions(d) // // Input: // d - door - A door. // // Output: // ps - array[table[x,y]] - List of all position this door can be opened // and closed from. func DoorPositionsFunc(a *Ai) lua.GoFunction { return func(L *lua.State) int { if !game.LuaCheckParamsOk(L, "DoorPositions", game.LuaDoor) { return 0 } room := game.LuaToRoom(L, a.ent.Game(), -1) door := game.LuaToDoor(L, a.ent.Game(), -1) if door == nil || room == nil { game.LuaDoError(L, "DoorPositions: Specified an invalid door.") return 0 } var x, y, dx, dy int switch door.Facing { case house.FarLeft: x = door.Pos y = room.Size.Dy - 1 dx = 1 case house.FarRight: x = room.Size.Dx - 1 y = door.Pos dy = 1 case house.NearLeft: x = -1 y = door.Pos dy = 1 case house.NearRight: x = door.Pos y = -1 dx = 1 default: game.LuaDoError(L, fmt.Sprintf("Found a door with a bad facing.")) } L.NewTable() count := 1 for i := 0; i < door.Width; i++ { L.PushInteger(count*2 - 1) game.LuaPushPoint(L, room.X+x+dx*i, room.Y+y+dy*i) L.SetTable(-3) L.PushInteger(count * 2) game.LuaPushPoint(L, room.X+x+dx*i+dy, room.Y+y+dy*i+dx) L.SetTable(-3) count++ } return 1 } }