comparison Lists.lua @ 10:433d31ea992a

Separated add methods into "end of list" and "random"
author John@Doomsday
date Wed, 07 Mar 2012 17:43:30 -0500
parents daed0597deba
children a6bc3f2d3207
comparison
equal deleted inserted replaced
9:daed0597deba 10:433d31ea992a
50 -- don't get an even distibution from then on (in fact 50 -- don't get an even distibution from then on (in fact
51 -- they'll end up getting top favor) 51 -- they'll end up getting top favor)
52 -- * if a stream contains a random-add after an add-to-end 52 -- * if a stream contains a random-add after an add-to-end
53 -- it is declared invalid. tough tits. it's just not a fair 53 -- it is declared invalid. tough tits. it's just not a fair
54 -- distribution at that point. 54 -- distribution at that point.
55 -- * actually, fuck it. I'll give them an unlock command and
56 -- let them screw over their lists :)
55 57
56 -- todo: list-of-lists must not use int indices. those will lead to peril. 58 -- todo: list-of-lists must not use int indices. those will lead to peril.
57 bsk.lists = {} 59 bsk.lists = {}
58 bsk.persons = {} 60 bsk.persons = {}
59 61
214 function bsk:ProcessChange(change) 216 function bsk:ProcessChange(change)
215 if change.action == "AddPerson" then 217 if change.action == "AddPerson" then
216 bsk:DoAddPerson(change) 218 bsk:DoAddPerson(change)
217 elseif change.action == "CreateList" then 219 elseif change.action == "CreateList" then
218 bsk:DoCreateList(change) 220 bsk:DoCreateList(change)
219 elseif change.action == "AddPersonToList" then 221 elseif change.action == "AddToListEnd" then
220 bsk:DoAddPersonToList(change) 222 bsk:DoAddPersonToListEnd(change)
223 elseif change.action == "AddToListRand" then
224 bsk:DoAddPersonToListRandom(change)
221 elseif change.action == "SuicidePerson" then 225 elseif change.action == "SuicidePerson" then
222 bsk:DoSuicidePerson(change) 226 bsk:DoSuicidePerson(change)
223 else 227 else
224 bsk:Print("Unknown message encountered") 228 bsk:Print("Unknown message encountered")
225 bsk:PrintTable(change) 229 bsk:PrintTable(change)
307 if bsk:DoCreateList(change) then 311 if bsk:DoCreateList(change) then
308 bsk:CommitChange(change) 312 bsk:CommitChange(change)
309 end 313 end
310 end 314 end
311 315
312 -- TODO: break into AddPersonToListEnd and AddPersonToListRandom 316 function bsk:DoAddPersonToListEnd(change)
313 function bsk:DoAddPersonToList(change) 317 local list = bsk.lists[change.arg.listIndex]
314 local listIndex = change.arg.listIndex 318 local index = list[#list].index + 0.1;
315 local slist = change.arg.slist 319 local entry = {index=index, id=change.arg.id}
316 local list = bsk.lists[listIndex] 320
317 321 tinsert(list,entry)
318 if #slist == 1 then -- end of list insertion - just one person 322 list.time = change.time
319 tinsert(list,slist[1]) 323 list.closedRandom = true
320 list.time = change.time 324
321 else
322 self:Print("Adding to middle of list is not yet supported")
323 return false
324 end
325 return true 325 return true
326 end 326 end
327 327
328 function bsk:AddPersonToList(name,list) 328 function bsk:AddPersonToListEnd(name,list)
329 -- require admin 329 -- require admin
330 local listIndex = bsk:GetListIndex(list) 330 local listIndex = bsk:GetListIndex(list)
331 local id = personsReverse[name] 331 local id = personsReverse[name]
332 bsk:Print(sformat("Adding %s (%s) to list %s (%s)", name, id, list, listIndex)) 332 bsk:Print(sformat("Adding %s (%s) to list %s (%s)", name, id, list, listIndex))
333 local slist = {id} -- TODO: support adding to elsewhere besides the end 333 local change = {action="AddToListEnd",arg={id=id,listIndex=listIndex}}
334 local change = {action="AddPersonToList",arg={id=id,listIndex=listIndex,slist=slist}}
335 bsk:StartChange(change) 334 bsk:StartChange(change)
336 if bsk:DoAddPersonToList(change) then 335 if bsk:DoAddPersonToListEnd(change) then
336 bsk:CommitChange(change)
337 end
338 end
339
340 function bsk:DoAddPersonToListRandom(change)
341 local list = bsk.lists[change.arg.listIndex]
342 local entry = {index=change.arg.roll, id=change.arg.id}
343
344 tinsert(list,entry)
345 table.sort(list,function(a,b) return a.roll < b.roll end)
346 list.time = change.time
347
348 return true
349 end
350
351 function bsk:AddPersonToListRandom(name,list)
352 -- require admin
353 local listIndex = bsk:GetListIndex(list)
354 if bsk.lists[listIndex].closedRandom then
355 self:Print("Cannot add person to list by random roll because an add-to-end operation has already occurred")
356 end
357 local id = personsReverse[name]
358 local roll = math.random()
359 bsk:Print(sformat("Adding %s (%s) to list %s (%s) with roll (%f)", name, id, list, listIndex, roll))
360 local change = {action="AddToListRand",arg={id=id,listIndex=listIndex,roll=roll}}
361 bsk:StartChange(change)
362 if bsk:DoAddPersonToListRandom(change) then
337 bsk:CommitChange(change) 363 bsk:CommitChange(change)
338 end 364 end
339 end 365 end
340 366
341 function bsk:DoRemovePerson(change) 367 function bsk:DoRemovePerson(change)
358 local temp = table.remove(stemp,1) -- pop 384 local temp = table.remove(stemp,1) -- pop
359 tinsert(stemp,temp) -- push_back 385 tinsert(stemp,temp) -- push_back
360 --bsk:Print(sformat("Before suicide of %s on list %s",slist[1],list.name)) 386 --bsk:Print(sformat("Before suicide of %s on list %s",slist[1],list.name))
361 --bsk:PrintTable(list) 387 --bsk:PrintTable(list)
362 for i = 1, #list do 388 for i = 1, #list do
363 if list[i] == slist[1] then 389 if list[i].id == slist[1] then
364 table.remove(slist,1) 390 table.remove(slist,1)
365 list[i] = stemp[1] 391 list[i].id = stemp[1]
366 table.remove(stemp,1) 392 table.remove(stemp,1)
367 end 393 end
368 end 394 end
369 list.time=change.time 395 list.time=change.time
370 --bsk:Print("After")
371 --bsk:PrintTable(list)
372 return true 396 return true
373 end 397 end
374 398
375 function bsk:SuicidePerson(name,list) 399 function bsk:SuicidePerson(name,list)
376 -- require admin 400 -- require admin
377 bsk:PopulateRaidList() 401 bsk:PopulateRaidList()
378 local listIndex = bsk:GetListIndex(list) 402 local listIndex = bsk:GetListIndex(list)
379 local slist=bsk:GetSuicideList(name,bsk.lists[listIndex]) 403 local slist=bsk:GetSuicideList(name,bsk.lists[listIndex])
380 local change = {action="SuicidePerson",arg={names=names,list=slist,listIndex=listIndex}} 404 local change = {action="SuicidePerson",arg={names=names,list=slist,listIndex=listIndex}}
405 bsk:PrintTable(change)
381 bsk:StartChange(change) 406 bsk:StartChange(change)
382 if bsk:DoSuicidePerson(change) then 407 if bsk:DoSuicidePerson(change) then
383 bsk:CommitChange(change) 408 bsk:CommitChange(change)
384 end 409 end
385 end 410 end
519 for i = 1, #list do 544 for i = 1, #list do
520 if list[i] == name then 545 if list[i] == name then
521 pushing = true 546 pushing = true
522 end 547 end
523 if pushing and (raidList[list[i]] or reserveList[list[i]]) then 548 if pushing and (raidList[list[i]] or reserveList[list[i]]) then
524 tinsert(ret,list[i]) 549 tinsert(ret,list[i].id)
525 end 550 end
526 end 551 end
527 return ret 552 return ret
528 end 553 end
529 554