Mercurial > wow > breuesk
view State.lua @ 71:d5e2dfe0c269
Starting to track loot state separately
author | John@Yosemite-PC |
---|---|
date | Tue, 03 Apr 2012 23:23:22 -0400 |
parents | |
children | 9e5b0a2368ad |
line wrap: on
line source
local bsk=bsk local _G=_G local table=table local pairs=pairs local setmetatable=setmetatable local ipairs=ipairs local string=string local sformat=string.format local tostring=tostring local type=type local unpack=unpack local getn=getn setfenv(1,bsk) -- simple state machine --Begin loot --Activate list ... only during looting? --open bidding/rolling --bid/roll occurred --remove bid/roll --close bidding --remove item -- we'll track state, but that may or may not result in a GUI change until down -- the road -- todo: transmit this all to only the raid, not the guild? -- sample procedure -- person B opens GUI. -- person A begins looting, sets a list -- person A begins bidding, transmists the state -- person B goes into bidding state, their button activates -- person B clicks the button. button changes state. -- person B broadcasts their bid. if a bid, everyone just accepts it. -- - if a roll, then the master does the roll and rebroadcasts state = "neutral" local looting = false stateactive = nil stateitem = nil statebids = {} staterolls = {} local rollListeners = {} function RegisterListenerRolls(listener) table.insert(rollListeners,listener) end function AlertRollListeners() for i,v in pairs(rollListeners) do print("roll out") v["RollEvent"](v) end end function BeginLoot(listValue) if state == "neutral" then state = "looting" looting = true active = listValue else _G.error("Bad state transition", state, "looting") end end function ActivateList(value) -- doesn't cause a transition, but we only enforce a list selection during certain times if state == "looting" then active = value end end function OpenBid(packet) local item = unpack(packet) --if state == "looting" then state = "bidding" item = value --end end function InitiateOpenBid(item) --if state == "looting" then Comm:SendStateChange("OB",item) --end end function DispatchState(packet) local state = table.remove(packet,1) print("Dispatching", state) if state == "RB" then ReceivedBid(packet) elseif state == "RR" then ReceivedRetraction(packet) elseif state == "OB" then OpenBid(packet) else -- todo ... end end function ReceivedBid(packet) -- no state transition, but only matters during one state local person, roll = unpack(packet) if state == "bidding" then if roll then table.insert(statebids,person) -- todo: else table.insert(statebids,person) -- todo: keep sorted end AlertRollListeners() end -- else ignore ... end function InitiateBid(person,roll) if state == "bidding" then for i,v in pairs(statebids) do if person.value == v.value then print(person.value .. " is already on the list") return -- no double adds please end end Comm:SendStateChange("RB",person,roll) end end function ReceivedRetraction(packet) local person = unpack(packet) if state == "bidding" then for i,v in pairs(statebids) do if v.value == person.value then table.remove(statebids,i) AlertRollListeners() return end end end end function InitiateRetract(person) if state == "bidding" then Comm:SendStateChange("RR",person,roll) end end function CloseBidding(awardedTo) state = "looting" -- remove the item, record history end function CloseLooting() state = "neutral" active = nil item = nil bids = {} rolls = {} end