changeset 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 99c279ab0b75
files Lists.lua
diffstat 1 files changed, 48 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/Lists.lua	Wed Mar 07 14:56:25 2012 -0500
+++ b/Lists.lua	Wed Mar 07 17:43:30 2012 -0500
@@ -52,6 +52,8 @@
 --                     * if a stream contains a random-add after an add-to-end
 --                     it is declared invalid. tough tits. it's just not a fair
 --                     distribution at that point.
+--                     * actually, fuck it. I'll give them an unlock command and
+--                     let them screw over their lists :)
 
 -- todo: list-of-lists must not use int indices. those will lead to peril.
 bsk.lists = {}
@@ -216,8 +218,10 @@
         bsk:DoAddPerson(change)
     elseif change.action == "CreateList" then
         bsk:DoCreateList(change)
-    elseif change.action == "AddPersonToList" then
-        bsk:DoAddPersonToList(change)
+    elseif change.action == "AddToListEnd" then
+        bsk:DoAddPersonToListEnd(change)
+    elseif change.action == "AddToListRand" then
+        bsk:DoAddPersonToListRandom(change)
     elseif change.action == "SuicidePerson" then
         bsk:DoSuicidePerson(change)
     else
@@ -309,31 +313,53 @@
     end
 end
 
--- TODO: break into AddPersonToListEnd and AddPersonToListRandom
-function bsk:DoAddPersonToList(change)
-    local listIndex = change.arg.listIndex
-    local slist = change.arg.slist
-    local list = bsk.lists[listIndex]
+function bsk:DoAddPersonToListEnd(change)
+    local list = bsk.lists[change.arg.listIndex]
+    local index = list[#list].index + 0.1;
+    local entry = {index=index, id=change.arg.id}
 
-    if #slist == 1 then -- end of list insertion - just one person
-        tinsert(list,slist[1])
-        list.time = change.time
-    else
-        self:Print("Adding to middle of list is not yet supported")
-        return false
-    end
+    tinsert(list,entry)
+    list.time = change.time
+    list.closedRandom = true
+
     return true
 end
 
-function bsk:AddPersonToList(name,list)
+function bsk:AddPersonToListEnd(name,list)
     -- require admin
     local listIndex = bsk:GetListIndex(list)
     local id = personsReverse[name]
     bsk:Print(sformat("Adding %s (%s) to list %s (%s)", name, id, list, listIndex))
-    local slist = {id} -- TODO: support adding to elsewhere besides the end
-    local change = {action="AddPersonToList",arg={id=id,listIndex=listIndex,slist=slist}}
+    local change = {action="AddToListEnd",arg={id=id,listIndex=listIndex}}
     bsk:StartChange(change)
-    if bsk:DoAddPersonToList(change) then
+    if bsk:DoAddPersonToListEnd(change) then
+        bsk:CommitChange(change)
+    end
+end
+
+function bsk:DoAddPersonToListRandom(change)
+    local list = bsk.lists[change.arg.listIndex]
+    local entry = {index=change.arg.roll, id=change.arg.id}
+
+    tinsert(list,entry)
+    table.sort(list,function(a,b) return a.roll < b.roll end)
+    list.time = change.time
+
+    return true
+end
+
+function bsk:AddPersonToListRandom(name,list)
+    -- require admin
+    local listIndex = bsk:GetListIndex(list)
+    if bsk.lists[listIndex].closedRandom then
+        self:Print("Cannot add person to list by random roll because an add-to-end operation has already occurred")
+    end
+    local id = personsReverse[name]
+    local roll = math.random()
+    bsk:Print(sformat("Adding %s (%s) to list %s (%s) with roll (%f)", name, id, list, listIndex, roll))
+    local change = {action="AddToListRand",arg={id=id,listIndex=listIndex,roll=roll}}
+    bsk:StartChange(change)
+    if bsk:DoAddPersonToListRandom(change) then
         bsk:CommitChange(change)
     end
 end
@@ -360,15 +386,13 @@
     --bsk:Print(sformat("Before suicide of %s on list %s",slist[1],list.name))
     --bsk:PrintTable(list)
     for i = 1, #list do
-        if list[i] == slist[1] then
+        if list[i].id == slist[1] then
             table.remove(slist,1)
-            list[i] = stemp[1]
+            list[i].id = stemp[1]
             table.remove(stemp,1)
         end
     end
     list.time=change.time
-    --bsk:Print("After")
-    --bsk:PrintTable(list)
     return true
 end
 
@@ -378,6 +402,7 @@
     local listIndex = bsk:GetListIndex(list)
     local slist=bsk:GetSuicideList(name,bsk.lists[listIndex])
     local change = {action="SuicidePerson",arg={names=names,list=slist,listIndex=listIndex}}
+    bsk:PrintTable(change)
     bsk:StartChange(change)
     if bsk:DoSuicidePerson(change) then
        bsk:CommitChange(change)
@@ -521,7 +546,7 @@
             pushing = true
         end
         if pushing and (raidList[list[i]] or reserveList[list[i]]) then
-            tinsert(ret,list[i])
+            tinsert(ret,list[i].id)
         end
     end
     return ret