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