I've been coding some List functions which might be of use, anyone want to improve/optimize it. It still needs ListDeleteFirst/Last and ListAddAtIndex but they should be simple to add.
Const TLIST_DATA_SIZE = 4
Type TList
Field list
End Type
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function CreateList.TList()
;DebugLog "list created"
ThisList.TList = New TList
ThisList\list = CreateBank(TLIST_DATA_SIZE)
Return ThisList.TList
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function DeleteList(ThisList.TList)
If ThisList.TList = Null DebugLog "No list to delete" : Return -1
FreeBank ThisList\list
Delete ThisList
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListAddFirst(ThisList.TList,ObjectHandle%)
If ThisList.TList = Null DebugLog "ListAddLast failed no list" : Return -1
If ObjectHandle%<1 DebugLog "ListAddLast failed no object" : Return -1
count = CountList(ThisList.TList)
If Not count
ListAddLast(ThisList.TList,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(ThisList.TList,ObjectHandle%)
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(ThisList.TList,index%)
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(ThisList.TList)
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(ThisList.TList)
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(ThisList.TList,index%)
If index<1 Return -1
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(source.TList,dest.TList)
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(ThisList.TList)
If ThisList.TList = Null Return -1
Return PeekInt(ThisList\list,0)
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ClearList(ThisList.TList)
If ThisList.TList = Null Return -1
ResizeBank ThisList\list,TLIST_DATA_SIZE
PokeInt ThisList\list,0,0
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function ListIsEmpty(ThisList.TList)
;returns if a list is empty or not
ListCount = PeekInt(ThisList\list,0)
If ListCount Return 1 Else Return 0
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Function CheckList(ThisList.TList,ObjectHandle%)
;remove any <1 values from a list, although none
;should get added
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(ThisList.TList,ObjectHandle%,all% = 0)
;remove the first object from a list, option to remove all instances, however list should only contain one instance!
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(ThisList.TList,ObjectHandle%)
;get if an object exists in the list
;use to stop duplicates being added to same list
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(Thislist.TList)
;swap the order of the list around
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( ThislistA.TList,ThislistB.TList )
;swap the contents of 2 lists
If ThisListA = Null Return 0
If ThisListB = Null Return 0
TempListB.TList = CreateList()
CopyList(ThislistB.TList,TempListB.TList)
CopyList(ThislistA.TList,ThislistB.TList)
CopyList(TempListB.TList,ThislistA.TList)
DeleteList(TempListB)
Return 1
End Function
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
;-----------------------------------------------------------------------------------------
Usage:
type TActor
field name$
end type
Type TMap
field name$
field actors.TList
end type
ThisMap.TMap = new TMap
ThisMap\name = "Town"
ThisVillage\actors = CreateList()
for i = 0 to 5
ThisActor.TActor = New TActor
ThisActor\name = "Player_"+i
ListAddLast(ThisMap\actors,handle(ThisActor))
next
;Then..
count = CountList(ThisMap\actors)
if count
for i = 1 to count
ThisActor.TACtor = object.TActor(ListAtIndex(ThisMap\actors,i))
if not ThisActor = null
;code
endif
next
endif
|