Try this, it's dynamic and you can have unlimited lists with unlimited object types
usage:
global ListA = CreateList()
global ListB = CreateList()
ThisBullet.bullet = new bullet
listaddlast listA,handle(bullet)
ThisBullet.bullet = new bullet
listaddlast listB,handle(bullet)
count = countlist(listA)
if count
for i = 1 to count
ThisBullet.TBullet = object.bullet(listatindex(listA,i))
if not ThisBullet = null
;do stuff
endif
next
end if
Const TLIST_DATA_SIZE = 4
Type TList
Field list
End Type
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function CreateList%()
;DebugLog "list created"
ThisList.TList = New TList
ThisList\list = CreateBank(TLIST_DATA_SIZE)
Return Handle(ThisList)
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function DeleteList(id%)
ThisList.TList = Object.TList(id)
If ThisList.TList = Null DebugLog "No list to delete" : Return -1
FreeBank ThisList\list
Delete ThisList
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListAddFirst%(id%,ObjectHandle%)
ThisList.TList = Object.TList(id)
If ThisList.TList = Null DebugLog "ListAddLast failed no list" : Return -1
If ObjectHandle%<1 DebugLog "ListAddLast failed no object" : Return -1
count = CountList(id)
If Not count
ListAddLast(id,ObjectHandle%)
Return 1
EndIf
TempBank = CreateBank(BankSize(ThisList\list))
CopyBank ThisList\list,TLIST_DATA_SIZE,TempBank,TLIST_DATA_SIZE,BankSize(ThisList\list)-TLIST_DATA_SIZE
PokeInt ThisList\list,TLIST_DATA_SIZE,ObjectHandle%
PokeInt ThisList\list,0,count + 1
ResizeBank ThisList\list,BankSize(ThisList\list)+TLIST_DATA_SIZE
CopyBank TempBank,TLIST_DATA_SIZE,ThisList\list,TLIST_DATA_SIZE*2,BankSize(TempBank)-TLIST_DATA_SIZE
FreeBank TempBank
Return 1
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListAddLast%(id%,ObjectHandle%)
ThisList.TList = Object.TList(id)
If ThisList.TList = Null DebugLog "ListAddLast failed no list" : Return -1
If ObjectHandle%<1 DebugLog "ListAddLast failed no object" : Return -1
PokeInt ThisList\list,0,PeekInt(ThisList\list,0)+1
ResizeBank(ThisList\list,BankSize(ThisList\list)+TLIST_DATA_SIZE)
PokeInt ThisList\list,BankSize(ThisList\list)-TLIST_DATA_SIZE,ObjectHandle
Return 1
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListAtIndex%(id%,index%)
ThisList.TList = Object.TList(id)
If ThisList.TList = Null DebugLog "No list to ListAtIndex" : Return -1
If index<1 Return -1
If ThisList.TList = Null Return -1
Local Offset = index*TLIST_DATA_SIZE
If BankSize(ThisList\list)<(Offset+TLIST_DATA_SIZE) Return -1
Count = PeekInt(ThisList\list,0)
If count<1 Return -1
Return PeekInt(ThisList\list,Offset)
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListFirst%(id%)
ThisList.TList = Object.TList(id)
If ThisList.TList = Null Return -1
Local Offset = TLIST_DATA_SIZE
If BankSize(ThisList\list)<(Offset+TLIST_DATA_SIZE) Return -1
Return PeekInt(ThisList\list,Offset)
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListLast%(id%)
ThisList.TList = Object.TList(id)
If ThisList.TList = Null Return -1
index = PeekInt(ThisList\list,0)
Local Offset = index*TLIST_DATA_SIZE
If BankSize(ThisList\list)<(Offset+TLIST_DATA_SIZE) Return -1
Return PeekInt(ThisList\list,Offset)
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListDeleteAtIndex%(id%,index%)
If index<1 Return -1
ThisList.TList = Object.TList(id)
If ThisList.TList = Null DebugLog "No list to ListDeleteAtIndex" : Return -1
Local Offset = index*TLIST_DATA_SIZE
If BankSize(ThisList\list)<(Offset+TLIST_DATA_SIZE) Return -1
Count = PeekInt(ThisList\list,0)
If count<1 Return -1
Local offset_2
For i = index To Count-1
Offset_2 = i*TLIST_DATA_SIZE
PokeInt ThisList\list,Offset_2,PeekInt(ThisList\list,Offset_2+TLIST_DATA_SIZE)
Next
PokeInt ThisList\list,0,count - 1
ResizeBank ThisList\list,BankSize(ThisList\list)-TLIST_DATA_SIZE
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function CopyList(id%,id2%)
source.TList = Object.TList(id)
dest.TList = Object.TList(id2)
If source = Null Return -1
If dest = Null Return -1
count = PeekInt(source\list,0)
PokeInt dest\list,0,count
ResizeBank dest\list,(count*TLIST_DATA_SIZE)+TLIST_DATA_SIZE
CopyBank source\list,0,dest\list,0,BankSize(source\list);(count*TLIST_DATA_SIZE)+TLIST_DATA_SIZE
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function CountList%(id)
ThisList.TList = Object.TList(id)
If ThisList.TList = Null Return -1
Return PeekInt(ThisList\list,0)
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ClearList(id)
ThisList.TList = Object.TList(id)
If ThisList.TList = Null Return -1
ResizeBank ThisList\list,TLIST_DATA_SIZE
PokeInt ThisList\list,0,0
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListIsEmpty%(id%)
;returns if a list is empty or not
ThisList.TList = Object.TList(id)
ListCount = PeekInt(ThisList\list,0)
If ListCount Return 1 Else Return 0
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function CheckList(id%,ObjectHandle%)
;remove any <1 values from a list
ThisList.TList = Object.TList(id)
If ThisList = Null Return -1
If ObjectHandle<1 Return -1
Count = PeekInt(ThisList\list,0)
Local Offset_2
TempList = CreateBank(TLIST_DATA_SIZE)
PokeInt TempList,0,0
For i = 1 To Count
Offset_2 = i*TLIST_DATA_SIZE
If PeekInt(ThisList\list,Offset_2)>0
ResizeBank(TempList,BankSize(TempList)+TLIST_DATA_SIZE);resize list
PokeInt TempList,0,PeekInt(TempList,0)+1;add to list count
PokeInt TempList,BankSize(TempList)-TLIST_DATA_SIZE,PeekInt(ThisList\list,Offset_2)
EndIf
Next
Count = PeekInt(TempList,0)
ResizeBank ThisList\list,TLIST_DATA_SIZE
PokeInt ThisList\list,0,0
For i = 1 To Count
Offset_2 = i*TLIST_DATA_SIZE
If PeekInt(TempList,Offset_2)>0
ResizeBank(ThisList\list,BankSize(ThisList\list)+TLIST_DATA_SIZE)
PokeInt ThisList\list,0,PeekInt(ThisList\list,0)+1
PokeInt ThisList\list,BankSize(ThisList\list)-TLIST_DATA_SIZE,PeekInt(TempList,Offset_2)
EndIf
Next
FreeBank TempList
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListRemove(id%,ObjectHandle%,all% = 0)
;remove the first object from a list, option to remove all instances!!
ThisList.TList = Object.TList(id)
If ThisList = Null Return -1
If ObjectHandle<1 Return -1
Count = PeekInt(ThisList\list,0)
Local found
Local Offset_2
For i = 1 To Count
Offset_2 = i*TLIST_DATA_SIZE
If PeekInt(ThisList\list,Offset_2) = ObjectHandle
PokeInt ThisList\list,Offset_2,0
found = True
If all>0
Exit
EndIf
EndIf
Next
If found = True
TempList = CreateBank(TLIST_DATA_SIZE)
PokeInt TempList,0,0
For i = 1 To Count
Offset_2 = i*TLIST_DATA_SIZE
If PeekInt(ThisList\list,Offset_2)>0
ResizeBank(TempList,BankSize(TempList)+TLIST_DATA_SIZE);resize list
PokeInt TempList,0,PeekInt(TempList,0)+1;add to list count
PokeInt TempList,BankSize(TempList)-TLIST_DATA_SIZE,PeekInt(ThisList\list,Offset_2)
EndIf
Next
Count = PeekInt(TempList,0)
ResizeBank ThisList\list,TLIST_DATA_SIZE
PokeInt ThisList\list,0,0
For i = 1 To Count
Offset_2 = i*TLIST_DATA_SIZE
If PeekInt(TempList,Offset_2)>0
ResizeBank(ThisList\list,BankSize(ThisList\list)+TLIST_DATA_SIZE)
PokeInt ThisList\list,0,PeekInt(ThisList\list,0)+1
PokeInt ThisList\list,BankSize(ThisList\list)-TLIST_DATA_SIZE,PeekInt(TempList,Offset_2)
EndIf
Next
FreeBank TempList
EndIf
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListContains%(id%,ObjectHandle%)
;get if an object exists in the list
ThisList.TList = Object.TList(id)
If ThisList = Null Return -1
If ObjectHandle<1 Return -1
Count = PeekInt(ThisList\list,0)
If count
For i = 1 To Count
If PeekInt(ThisList\list,i*TLIST_DATA_SIZE) = ObjectHandle
Return 1
EndIf
Next
EndIf
Return 0
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ReverseList(id%)
;swap the order of the list around
ThisList.TList = Object.TList(id)
If ThisList = Null Return -1
Count = PeekInt(ThisList\list,0)
If count<1 Return -1
TempList = CreateBank(TLIST_DATA_SIZE)
PokeInt TempList,0,0
PokeInt ThisList\list,(index*TLIST_DATA_SIZE),0
For i = count To 1 Step -1
ResizeBank(TempList,BankSize(TempList)+TLIST_DATA_SIZE)
PokeInt TempList,0,PeekInt(TempList,0)+1
PokeInt TempList,BankSize(TempList)-TLIST_DATA_SIZE,PeekInt(ThisList\list,(i*TLIST_DATA_SIZE))
Next
Count = PeekInt(TempList,0)
ResizeBank ThisList\list,TLIST_DATA_SIZE
PokeInt ThisList\list,0,0
For i = 1 To count
ResizeBank(ThisList\list,BankSize(ThisList\list)+TLIST_DATA_SIZE)
PokeInt ThisList\list,0,PeekInt(ThisList\list,0)+1
PokeInt ThisList\list,BankSize(ThisList\list)-TLIST_DATA_SIZE,PeekInt(TempList,(i*TLIST_DATA_SIZE))
Next
FreeBank TempList
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function SwapLists%(id%,id2%)
;swap the contents of 2 lists
ThisListA.TList = Object.TList(id)
ThisListB.TList = Object.TList(id2)
If ThisListA = Null Return -1
If ThisListB = Null Return -1
TempListB = CreateList()
CopyList(id2,TempListB)
CopyList(id,id2)
CopyList(TempListB,id)
DeleteList(TempListB)
Return 1
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
|