comparison 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
comparison
equal deleted inserted replaced
70:236117ab8a49 71:d5e2dfe0c269
1 local bsk=bsk
2 local _G=_G
3 local table=table
4 local pairs=pairs
5 local setmetatable=setmetatable
6 local ipairs=ipairs
7 local string=string
8 local sformat=string.format
9 local tostring=tostring
10 local type=type
11 local unpack=unpack
12 local getn=getn
13 setfenv(1,bsk)
14
15 -- simple state machine
16
17 --Begin loot
18 --Activate list ... only during looting?
19 --open bidding/rolling
20 --bid/roll occurred
21 --remove bid/roll
22 --close bidding
23 --remove item
24
25
26 -- we'll track state, but that may or may not result in a GUI change until down
27 -- the road
28
29 -- todo: transmit this all to only the raid, not the guild?
30
31 -- sample procedure
32 -- person B opens GUI.
33 -- person A begins looting, sets a list
34 -- person A begins bidding, transmists the state
35 -- person B goes into bidding state, their button activates
36 -- person B clicks the button. button changes state.
37 -- person B broadcasts their bid. if a bid, everyone just accepts it.
38 -- - if a roll, then the master does the roll and rebroadcasts
39
40 state = "neutral"
41 local looting = false
42 stateactive = nil
43 stateitem = nil
44 statebids = {}
45 staterolls = {}
46
47 local rollListeners = {}
48 function RegisterListenerRolls(listener)
49 table.insert(rollListeners,listener)
50 end
51 function AlertRollListeners()
52 for i,v in pairs(rollListeners) do
53 print("roll out")
54 v["RollEvent"](v)
55 end
56 end
57
58 function BeginLoot(listValue)
59 if state == "neutral" then
60 state = "looting"
61 looting = true
62 active = listValue
63 else
64 _G.error("Bad state transition", state, "looting")
65 end
66 end
67
68 function ActivateList(value) -- doesn't cause a transition, but we only enforce a list selection during certain times
69 if state == "looting" then
70 active = value
71 end
72 end
73
74 function OpenBid(packet)
75 local item = unpack(packet)
76 --if state == "looting" then
77 state = "bidding"
78 item = value
79 --end
80 end
81
82 function InitiateOpenBid(item)
83 --if state == "looting" then
84 Comm:SendStateChange("OB",item)
85 --end
86 end
87
88 function DispatchState(packet)
89 local state = table.remove(packet,1)
90 print("Dispatching", state)
91 if state == "RB" then
92 ReceivedBid(packet)
93 elseif state == "RR" then
94 ReceivedRetraction(packet)
95 elseif state == "OB" then
96 OpenBid(packet)
97 else -- todo ...
98
99 end
100 end
101
102 function ReceivedBid(packet) -- no state transition, but only matters during one state
103 local person, roll = unpack(packet)
104
105 if state == "bidding" then
106 if roll then
107 table.insert(statebids,person) -- todo:
108 else
109 table.insert(statebids,person) -- todo: keep sorted
110 end
111 AlertRollListeners()
112 end
113
114 -- else ignore ...
115 end
116
117 function InitiateBid(person,roll)
118 if state == "bidding" then
119 for i,v in pairs(statebids) do
120 if person.value == v.value then
121 print(person.value .. " is already on the list")
122 return -- no double adds please
123 end
124 end
125 Comm:SendStateChange("RB",person,roll)
126 end
127 end
128
129
130 function ReceivedRetraction(packet)
131 local person = unpack(packet)
132 if state == "bidding" then
133 for i,v in pairs(statebids) do
134 if v.value == person.value then
135 table.remove(statebids,i)
136 AlertRollListeners()
137 return
138 end
139 end
140 end
141 end
142
143 function InitiateRetract(person)
144 if state == "bidding" then
145 Comm:SendStateChange("RR",person,roll)
146 end
147 end
148
149 function CloseBidding(awardedTo)
150 state = "looting"
151 -- remove the item, record history
152 end
153
154 function CloseLooting()
155 state = "neutral"
156 active = nil
157 item = nil
158 bids = {}
159 rolls = {}
160 end