Mercurial > wow > breuesk
diff 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 diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/State.lua Tue Apr 03 23:23:22 2012 -0400 @@ -0,0 +1,160 @@ +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