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.
Usage:
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