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