Mindustry

Mindustry

Universal resource delivery / Универсальный заполнитель ресурсами.
LED  [developer] 20 Jul, 2024 @ 5:18am
Import/Export Scheme - Iteration building problem
There just some kind of building iterations problem that depends on fast linking play, and i don't know what i need to do to make scheme fast and good enough, so i make kind of base logic. If some people interested in, you can evolve this code or say something about it. BUT i make this post only for report purposes, cuz i working on it but have not time or getting logic problems :/
Code:

# with more than 1 unit this is a lot of problems with finding Function about different ID-s/ Okey just realize for one now!/ ok
# last update: fix inf unbind
# Variable Constant

set IsImport true # IsImport true == Import functionality/ IsImport false == export functionality
set PreferUnitType null # preferred unit worker. null - auto find free unit in order: mega, poly, mono, oct, quad, mega, etc. / @<unit> - try to find free <unit>
set MinToReturn null # minimum resources in unit to return to current import building. null => 0 - value, otherwice remains items will be destroyed in unit by dropping then into air cuz it can ba garbage in some of buildings.
set MinToGo null # minimum resources in unit to delivering to current import building. null - auto derermine by unit items capasity * 0.9
set ExportLowResCount null # minimum resource count in export building to start dilivering. null - auto determine by unit items capasity.
set ImportCapacityFloor null # minimum resource count in import building to start filling. null - auto determine by building capasity * 0.8. Better not be changed, (%)
set CloseToHeal null # maximum range distance from imput/export building for healing. null - auto determine by building range. 0 - No healing. >600 - heal any building on map while idling
set ResourseType null # Type of resource that needs to delivering. null - auto determine by sorter building.

set ResourseHolder null # @sorter building for determining ResourseType. null - auto determine by sorter or inv-sorter building.
set InfoMessanger null # @messange building for Info output. null - auto determine by messanger building.
set FunctionalitySwitch # @switch building for Import / Export Functionality Switch. BE CAREFUL WITH SPECIFIC BUILDINGS LOGIC, otherwice logic will drop Error. null - auto determine by switch building.
set ProcessID null # Unicue identificator for associated unit. null - auto determine by thisX<<52 | thisY<<40 | ControlMask
set ControlMask 1968 # flag that associated with unit of this logic processor. just _RANDOM_ number

# You CAN choose the specific Import/Export building.
# BUT if you use Import functionality(IsImport = true) you CAN NOT linked list of import buildings.
# BUT if you use Export functionality(IsImport = false) you CAN NOT linked list of export buildings.
# That means, that building iteration functionality will NOT work.
# This logic CAN WORK:
# (Import) List of Linked import buildings(or 1 specific) <- from export building(Specific or Core)
# (Export) List of Linked export buildings(or 1 specific) -> to import building(Specific or Core)
# This logic CAN NOT WORK:
# Many -> to Many
# FuQ
set ImportBuilding null # the import building on map.
set ImportBuildingX null # Or import building coordinates.
set ImportBuildingY null
set ExportBuilding null # the export building on map.
set ExportBuildingX null # Or export building coordinates.
set ExportBuildingY null
#if (ImportBuilding === null)
#{
# if (ImportBuildingX === null || ImportBuildingY === null)
# {
# if (IsImport) # is this import functionality?
# {
# ExportBuilding = CoreBuilding # Core building is a resource provider
# }
# }
#}
#if (ExportBuilding === null)
#{
# if (ExportBuildingX === null || ExportBuildingY === null)
# {
# if(!IsImport)
# {
# ImportBuilding = CoreBuilding # Core building is a resource consumer
# }
# }
#}
wait 0.3
set CloseToDrop 7.25 # minimum range distance to dropping items.
set CloseToMove 6.25 # distance to get close to the building.
set CloseToRepair 9 # minimum range distance to start healing

jump InProcess equal inWork true # one time logic for avoiding "jump End"
set inWork true
set InID 22 # start from mega
set LinkIter 0 # Buildings iterations

sensor minTurretId @duo @id # first turret in game
sensor maxTurretId @meltdown @id # last turret in game
sensor sorterID @sorter @id # sorter building ID
sensor invSorterID @inverted-sorter @id # second sorter building ID
sensor messageID @message @id # Messanger building identificator
sensor switchID @switch @id

sensor ThisX @this @x
sensor ThisY @this @y

jump AutoRange strictEqual CloseToHeal null # determine max range for healing buildings
jump NoAutoRange always
AutoRange:
sensor CloseToHeal @this @range
NoAutoRange:

op add Return @counter 1
jump ImportBuildingDeterminationFunc always

op add Return @counter 1
jump ExportBuildingDeterminationFunc always

op add Return @counter 1
jump CreateProcessIDFunc always
InProcess:

start:
set CurrentBuildingLinkIter 0
set CanHeal false
set CloseToEnemy 0
set CloseToBuild 0
set CurrentBuilding 0
set CurrentUnit 0
set CurrentItemType 0
set ItemTypeInUnit 0

op add ReturnInfoMessanger @counter 1
jump FindInfoMessangerFunc always # first optional debug building.

op add ReturnSorter @counter 1
jump FindSorterFunc always # second important sotrer

op add ReturnSwitch @counter 1
jump FindSwitchFunc always # third optional switch logic

print "Waiting for CurrentItemType"
printflush InfoMessanger
jump start strictEqual CurrentItemType null # waiting for item


SetUnit:
op add ReturnUnit @counter 1
jump FindUnitFunc always # fourth important unit

# will make it by automate logic, faster, better, easyer

# To(Import/Export)Funk Structure:
# # Check Unit death.
# # Check items in unit
# # Check building coordinates
# # Check Unit within building
# # Take/Drop items
# # Iterate building.

# determine state
jump ImportBuildingNotExist strictEqual ImportBuilding null
# ImportBuildingExist:
jump SpecificImport strictEqual ExportBuilding null
jump SpecificImportExport always
ImportBuildingNotExist:
jump NoSpecificImportExport strictEqual ExportBuilding null
jump SpecificExport always


# If ImportBuilding not null && ExportBuilding null
SpecificImport:
ToExportI:
op add Return @counter 1
jump ToExportIFunc always
ToImportI:
op add Return @counter 1
jump ToImportIFunc always
jump SpecificImport always


# If ImportBuilding null && ExportBuilding not null
SpecificExport:
ToExportE:
op add Return @counter 1
jump ToExportEFunc always
ToImportE:
op add Return @counter 1
jump ToImportEFunc always
jump SpecificExport always


# If ImportBuilding not null && ExportBuilding not null
SpecificImportExport:
ToExportIE:
op add Return @counter 1
jump ToExportIEFunc always
ToImportIE:
op add Return @counter 1
jump ToImportIEFunc always
jump SpecificImportExport always


# If ImportBuilding null && ExportBuilding null
NoSpecificImportExport:
ToExportNIE:
op add Return @counter 1
jump ToExportNIEFunc always
ToImportNIE:
op add Return @counter 1
jump ToImportNIEFunc always
jump NoSpecificImportExport always


# logic:
# if IsImport == true (the connected buildings are resource receivers) -> Export building: IS A Core, OR Specific ExportBuilding
# if IsImport == false (connected buildings are resource producers) -> Import building: IS A Core, OR Specific ExportBuilding


# Args: Everything
# Out: Nothing
ToExportNIEFunc:

# Unit dead?
sensor isUnitDead @unit @dead # check dead of unit
sensor ControlBy @unit @controlled
jump SetUnit equal ControlBy @ctrlPlayer
jump NoDeadTE strictEqual isUnitDead false
jump SetUnit always # null or true
NoDeadTE:

# Enougth items in unit?
sensor ItemTypeIn @unit @firstItem
sensor ItemsCount @unit @totalItems
jump MoveToExportContinue notEqual CurrentItemType ItemTypeIn
jump ToImportNIE greaterThan ItemsCount MinToGo
MoveToExportContinue:

# Building in list?
set InLinksIter 0
ToExportBuildingIteration:
jump NoSpecificItemTE strictEqual ResourseType null # check resource type
set CurrentItemType ResourseType
jump ItemTypeLabel always
NoSpecificItemTE:
sensor CurrentItemType ResourseHolder @config
ItemTypeLabel:
jump ToExportNIEFunc strictEqual CurrentItemType null

jump NoSwitch strictEqual FunctionalitySwitch null # check functionality
sensor IsImport FunctionalitySwitch @config
NoSwitch:

jump NoExportIterations equal IsImport true
getlink InLinksBuilding InLinksIter # check building in links
op add InLinksIter InLinksIter 1
jump BuildingInLinks strictEqual InLinksBuilding CurrentBuilding
jump ToExportBuildingIteration lessThan InLinksIter @links
op add ReturnBuilding @counter 1 # building not in list.
jump FindBuildingFunc always
BuildingInLinks:
sensor CurrentBuildingX CurrentBuilding @x
sensor CurrentBuildingY CurrentBuilding @y
jump MoveToExport always
NoExportIterations:
ulocate building core false @copper CurrentBuildingX CurrentBuildingY isfound CurrentBuilding
MoveToExport:

# Unit within building?
ucontrol within CurrentBuildingX CurrentBuildingY CloseToDrop NearToExport 0
jump CollectItems equal NearToExport true
ucontrol approach CurrentBuildingX CurrentBuildingY CloseToMove
jump ToExportNIEFunc always # while approaching, analize situation.
CollectItems:

# destroy item in
ucontrol itemDrop @air MaxResInUnit

# Enougth resource in building?
sensor ResInExport CurrentBuilding CurrentItemType
jump IterateToExportNIE lessThan ResInExport ExportLowResCount
ucontrol itemTake CurrentBuilding CurrentItemType MaxResInUnit
IterateToExportNIE:
jump ToExportNIEFunc equal IsImport true
op add ReturnBuilding @counter 1
jump FindBuildingFunc always

jump ToExportNIEFunc always
ToExportNIEFuncEnd:
set @counter Return


# Args: Something
# Out: meh
ToImportNIEFunc:

jump PrepareToImport equal IsImport true
op add ReturnBuilding @counter 1
jump FindBuildingFunc always
PrepareToImport:

jump NoItemTI strictEqual ResourseType null # check resource type
sensor CurrentItemType ResourseHolder @config
NoItemTI:
jump Main strictEqual CurrentItemType null # nothing to dilivering -> iterate buildings.

jump NoSwitchTI strictEqual FunctionalitySwitch null # check functionality
sensor IsImport FunctionalitySwitch @config
NoSwitchTI:

# SetCoordinates:

jump NoSpecificTI equal SpecificImport false # does it specific export
set CurrentBuildingX ImportBuildingX
set CurrentBuildingY ImportBuildingY
jump MoveToImport always
NoSpecificTI:

jump IsExportTI equal IsImport false # determine coordinates to move
# IsImportTI: # import to building
sensor CurrentBuildingX CurrentBuilding @x
sensor CurrentBuildingY CurrentBuilding @y
jump MoveToImport always
IsExportTI: # import to core
ulocate building core false @copper CurrentBuildingX CurrentBuildingY isfound CurrentBuilding

MoveToImport:

sensor isUnitDead @unit @dead # check dead of unit
sensor ControlBy @unit @controlled
jump SetUnit equal ControlBy @ctrlPlayer
jump NoDeadTI strictEqual isUnitDead false
jump SetUnit always # null or true
NoDeadTI:

sensor ItemTypeIn @unit @firstItem
jump MoveToImportContinue equal CurrentItemType ItemTypeIn
jump ToExport always
MoveToImportContinue:

sensor ItemsCount @unit @totalItems
jump ToExport lessThanEq ItemsCount MinToReturn

ucontrol itemDrop CurrentBuilding MaxResInUnit

jump ToImportFunc always

ToImportNIEFuncEnd:
set @counter Return

# Args: PreferUnitType, CurrentUnit, ProcessID,
# Out: CurrentUnit, InID
FindUnitFunc:
print "Searching for Unit"
printflush InfoMessanger
jump LookUp equal PreferUnitType 0
set CurrentUnit PreferUnitType
SearchingForPreferUnitExisted: # for situation than user changed settings in a middle of a logic, and unit already working
set inRowCounter -1
SearchExistedUnit:
op add inRowCounter inRowCounter 1
ubind CurrentUnit
sensor ControlBy @unit @controlled
jump SearchingForPreferUnitAny equal inRowCounter 24 # unit controlled by this processor is not exist.
jump SearchExistedUnit equal ControlBy @ctrlFormation
jump SearchExistedUnit equal ControlBy @ctrlPlayer
sensor UnitFlag @unit @flag # if control by processor or 0 -> check flags
jump FindUnitFuncEnd equal UnitFlag ProcessID # existed unit was finded.
jump SearchExistedUnit always
SearchingForPreferUnitAny: # find any unit of Prefer Unit Type
set inRowCounter -1
SearchUnit:
op add inRowCounter inRowCounter 1
ubind CurrentUnit
sensor ControlBy @unit @controlled
jump ErrorNoUnitAreFree equal inRowCounter 24
jump FindUnitFuncEnd equal ControlBy 0
jump FindUnitFuncEnd equal ControlBy @ctrlFormation
jump SearchUnit equal ControlBy @ctrlPlayer
sensor UnitFlag @unit @flag # if controlled by processor.
jump FindUnitFuncEnd equal UnitFlag 0 # processor controll are weak, free to take (this is my "protocol" of my processors logic. see my else steam workshop works :P)
jump SearchUnit always
SubID:
op sub InID InID 1
LookUp:
set inRowCounter -1
set FirstInRow null
jump AddRowCounter greaterThanEq InID 20
set InID 24
jump ErrorNoUnitAreFree equal InRound true # that means -there are no exixt free units in all unit Line in all ids
set InRound true

AddRowCounter:
op add inRowCounter inRowCounter 1
jump TryBind lessThan inRowCounter 24 # check dead
jump SubID strictEqual FirstInRow null # if First null - that means on 25 iterations there are no units of this type
sensor isFirstDead FirstInRow @dead
jump TryBind strictEqual isFirstDead false
set FirstInRow null
set inRowCounter 0 # Every 24units check on death to not get inf loop
# but continue searching
TryBind:

jump SpecificRes strictEqual ResourseType null
sensor CurrentItemType ResourseHolder @config
jump AbsoluteStop strictEqual CurrentItemType null
SpecificRes:

lookup unit CurrentUnit InID
ubind CurrentUnit

sensor isUnitDead @unit @dead #iterate only life units
jump AddRowCounter equal isUnitDead true
jump AddRowCounter strictEqual isUnitDead null

jump FirstNotNull notEqual FirstInRow null
set FirstInRow @unit
jump LoopIsChecked always
FirstNotNull:

jump SubID strictEqual FirstInRow @unit #if unit is first in row - that means we do round and all units are busy
LoopIsChecked:

sensor ControlBy @unit @controlled
jump AddRowCounter equal ControlBy @ctrlPlayer
jump FindUnitFuncEnd notEqual ControlBy @ctrlProcessor
sensor UnitFlag @unit @flag
op sub inRowCounter inRowCounter 1 # return on prev unit id
jump AddRowCounter notEqual UnitFlag 0

FindUnitFuncEnd:
ucontrol move ThisX ThisY # Set Control as fast as possible
ucontrol flag ProcessID
sensor UnitFlag @unit @flag

jump FindUnitFunc notEqual UnitFlag ProcessID # for situation than 2 processors take control in a same time
set IsUnitAnderControll true
op add ReturnUnitInfo @counter 1
jump AboutUnitFunc always

set @counter ReturnUnit


# Args: CloseToBuild, @unit
# Out: CloseToBuild, CanBuild, CanHeal, CloseToBuild
AboutUnitFunc:
sensor MaxResInUnit @unit @itemCapacity
jump NoAutoExportLowResCount notEqual null
set ExportLowResCount MaxResInUnit
NoAutoExportLowResCount:
op mul MinToReturn MaxResInUnit 0
op mul MinToGo MaxResInUnit 0.9

jump NoClose notEqual CloseToBuild null
sensor CloseToBuild @unit @range
NoClose:

sensor CloseToEnemy @unit @range

sensor UnitType @unit @type
sensor UnitID UnitType @id

jump AboutUnitFuncEnd lessThan UnitID 21
jump AboutUnitFuncEnd greaterThan UnitID 24
set CanBuild true # poly mega quad oqt
jump AboutUnitFuncEnd equal UnitID 24 # oqt cant heal buildings
set CanHeal true # poly mega quad
jump AboutUnitFuncEnd notEqual UnitID 23
set CloseToBuild 3 # quad - cuz near

AboutUnitFuncEnd:
set @counter ReturnUnitInfo


# Args: uhhh, ChangeBuilding
# Out: nah
CheckBuildingListFunc:
set HasSorter false
set HasSwitch false
set HasMessage false
set HasBuilding false
set IsNewCurrentBuilding false
set CurrentLinkIter 0
CheckBuildingListFuncStart:
getlink CurrentBuilding CurrentLinkIter

sensor CurrentBuildingType CurrentBuilding @type
sensor CurrentBuildingID CurrentBuildingType @id

jump IfSorterCB equal CurrentBuildingID sorterID
jump IfSorterCB equal CurrentBuildingID invSorterID
jump IfSwitchCB equal CurrentBuildingID switchID
jump IfMessageCB equal CurrentBuildingID messageID


# IfBuildingCB: # how do i need to iterate this??? if player will link\unlink building while i have only index of current building

jump IterateList always


IfSorterCB:

jump IterateList always


IfSwitchCB:

jump IterateList always


IfMessageCB:

# jump IterateList always
IterateList:

op add CurrentLinkIter CurrentLinkIter 1
jump CheckBuildingListFuncStart lessThan CurrentLinkIter @links

CheckBuildingListFuncEnd:

set @counter ReturnBuilding


# Args: ImportBuilding, ExportBuilding
# Out: ImportBuilding or ExportBuilding as CurrentBuilding or Wait
FindBuildingFunc:
print "Searching for Building..."
printflush InfoMessanger
set inBuildingRow false
Iterate:
getlink CurrentBuilding LinkIter
op add LinkIter LinkIter 1

jump DerermineBuilding greaterThan LinkIter @links
jump ErrorNoBuildingInList equal inBuildingRow true
set LinkIter 0
set inBuildingRow true
DerermineBuilding:

sensor CurrentBuildingType CurrentBuilding @type
sensor CurrentBuildingID CurrentBuildingType @id

jump IfSwitch equal CurrentBuildingID switchID
jump IfMessage equal CurrentBuildingID messageID
jump IfSorter equal CurrentBuildingID sorterID
jump IfBuilding always

IfSwitch:
jump Iterate equal FunctionalitySwitch CurrentBuilding
jump SetSwitch strictEqual FunctionalitySwitch null
op add ReturnSwitch @counter 1
jump FindSwitchFunc always # second switch in list or change?
jump Iterate always
SetSwitch:
set FunctionalitySwitch CurrentBuilding
# IfSwitchEnd:
jump Iterate always


IfMessage:
jump Iterate equal InfoMessanger CurrentBuilding
jump SetMassage strictEqual InfoMessanger null
op add ReturnInfoMessanger @counter 1
jump FindInfoMessangerFunc always # second messanger in list or change?
jump Iterate always
SetMassage:
set InfoMessanger CurrentBuilding
# IfMessageEnd:
jump Iterate always


IfSorter:
jump SetSorter strictEqual ResourseType null
jump Iterate always
SetSorter:
jump Iterate equal ResourseHolder CurrentBuilding
op add ReturnSorter @counter 1
jump FindSorterFunc always # second sorter in list or change?
# IfSorterEnd:
jump Iterate always


IfBuilding:
jump SetBuilding strictEqual FunctionalitySwitch null
sensor IsImport FunctionalitySwitch @config
SetBuilding:

jump IfImport equal IsImport true

# IfExport:
jump FindBuildingFuncEnd equal SpecificExport false
set CurrentBuilding ExportBuilding
jump FindBuildingFuncEnd always
IfImport:
jump FindBuildingFuncEnd equal SpecificImport false
set CurrentBuilding ImportBuilding
jump FindBuildingFuncEnd always
FindBuildingFuncEnd:

op ReturnBuildingInfo @counter 1
jump BuildingInfoFunc always
set @counter ReturnBuilding


# Args: CurrentBuilding
# Out: CurrentBuildingImportCapacityFloor, isTurret
BuildingInfoFunc:
jump BuildingInfoFuncEnd strictEqual CurrentBuilding null

sensor CurrentBuildingType CurrentBuilding @type
sensor CurrentBuildingID CurrentBuildingType @id

jump NotTurret lessThan CurrentBuildingID minTurretId
jump NotTurret greaterThan CurrentBuildingID maxTurretId
#ForTurret:
set isTurret true
sensor BuildingItemsCapacity CurrentBuilding @ammoCapacity
set AutoCapacityFloor 0.8
jump DefineCapacity always
NotTurret:
set isTurret false
sensor BuildingItemsCapacity CurrentBuilding @itemCapacity
set AutoCapacityFloor 1000 # that value prevent unstable volume of large storages buildings
DefineCapacity:
jump SetAutoCapacityFloor strictEqual ImportCapacityFloor null
op mul CurrentBuildingImportCapacityFloor BuildingItemsCapacity ImportCapacityFloor
jump BuildingInfoFuncEnd always
SetAutoCapacityFloor:
op mul CurrentBuildingImportCapacityFloor BuildingItemsCapacity AutoCapacityFloor
BuildingInfoFuncEnd:
set @counter ReturnBuildingInfo


# Args: ResourseHolder, ResourseType
# Out: ResourseHolder, ResourseType or Exception
FindSorterFunc:
set InLinkingSorterLoop false
set secondLinkSorter null
set LinkSorterIter -1

set CurrentItemType ResourseType
jump FindSorterFuncEnd notEqual ResourseType null

LinkingSorter:
op add LinkSorterIter LinkSorterIter 1
getlink CurrentBuilding LinkSorterIter
jump ErrorNoSorterInLinks greaterThan LinkSorterIter @links
sensor CurrentBuildingType CurrentBuilding @type
sensor CurrentBuildingID CurrentBuildingType @id

jump SetResourseHolder equal CurrentBuildingID sorterID
jump SetResourseHolder equal CurrentBuildingID invSorterID
jump LinkingSorter always
SetResourseHolder:
set ResourseHolder CurrentBuilding
sensor CurrentItemType ResourseHolder @config

LinkingSorterNewRow: # second loop for dublicate buildings
set LinkSorterIter 0
jump LinkingSorterEnd equal InLinkingSorterLoop true
set InLinkingSorterLoop true
LinkingSorterContinue:
getlink CurrentBuilding LinkSorterIter
op add LinkSorterIter LinkSorterIter 1
jump LinkingSorterNewRow greaterThan LinkSorterIter @links
jump LinkingSorterEnd equal CurrentBuilding InfoMessanger
sensor CurrentBuildingType CurrentBuilding @type
sensor CurrentBuildingID CurrentBuildingType @id

jump SetSecondResourseHolder equal CurrentBuildingID sorterID
jump SetSecondResourseHolder equal CurrentBuildingID invSorterID
jump LinkingSorterContinue always
SetSecondResourseHolder:
set secondLinkSorter CurrentBuilding
jump LinkingSorterContinue always
LinkingSorterEnd:
jump FindSorterFuncEnd strictEqual secondLinkSorter null
jump ErrorDublicateSorterBuilding always

FindSorterFuncEnd:
set @counter ReturnSorter


# Args: ImportBuilding, ImportBuildingX, ImportBuildingY
# Out: CheckImportCoordinates, ExportBuildingIsCoreBuilding, SpecificImport, ImportBuildingX, ImportBuildingY
ImportBuildingDeterminationFunc:
jump ImportBuildingNoCoordinatesEnd strictEqual ImportBuildingX null
jump ImportBuildingNoCoordinatesEnd strictEqual ImportBuildingY null
set SpecificImport true
set CheckImportCoordinates true
set ImportBuilding 0 # building potentionally exist.
jump ImportBuildingDeterminationFuncEnd always
ImportBuildingNoCoordinatesEnd:

jump ImportBuildingDeterminationByContex strictEqual ImportBuilding null
set SpecificImport true
sensor ImportBuildingX ImportBuilding @x
sensor ImportBuildingY ImportBuilding @y
jump ImportBuildingDeterminationFuncEnd always
ImportBuildingDeterminationByContex:
jump ImportBuildingDeterminationFuncEnd equal IsImport false
set ExportBuildingIsCoreBuilding true
ImportBuildingDeterminationFuncEnd:
set @counter Return


# Args: ExportBuilding, ExportBuildingX, ExportBuildingY
# Out: CheckExportCoordinates, ImportBuildingIsCoreBuilding
ExportBuildingDeterminationFunc:
jump ExportBuildingNoCoordinatesEnd strictEqual ExportBuildingX null
jump ExportBuildingNoCoordinatesEnd strictEqual ExportBuildingY null
set SpecificExport true
set CheckExportCoordinates true
set ExportBuilding 0 # building potentionally exist.
jump ExportBuildingDeterminationFuncEnd always
ExportBuildingNoCoordinatesEnd:

jump ExportBuildingDeterminationByContex strictEqual ExportBuilding null
set SpecificExport true
sensor ExportBuildingX ExportBuilding @x
sensor ExportBuildingY ExportBuilding @y
jump ExportBuildingDeterminationFuncEnd always
ExportBuildingDeterminationByContex:
jump ExportBuildingDeterminationFuncEnd equal IsImport true
set ImportBuildingIsCoreBuilding true
ExportBuildingDeterminationFuncEnd:
set @counter Return


# Args: InfoMessanger
# Out: InfoMessanger or Exception
FindInfoMessangerFunc:
jump FindInfoMessangerFuncEnd notEqual InfoMessanger null
set InLinkingMessageLoop false
set secondLinkMessage null
set LinkMessageIter -1
LinkingMessage:
op add LinkMessageIter LinkMessageIter 1
getlink CurrentBuilding LinkMessageIter
jump FindInfoMessangerFuncEnd greaterThan LinkMessageIter @links
sensor CurrentBuildingType CurrentBuilding @type
sensor CurrentBuildingID CurrentBuildingType @id
jump LinkingMessage notEqual CurrentBuildingID messageID
set InfoMessanger CurrentBuilding
jump LinkingMessageContinue always
LinkingMessageNewRow: # second loop for dublicate buildings
set LinkMessageIter 0
jump LinkingMessageEnd equal InLinkingMessageLoop true
set InLinkingMessageLoop true
LinkingMessageContinue:
getlink CurrentBuilding LinkMessageIter
op add LinkMessageIter LinkMessageIter 1
jump LinkingMessageNewRow greaterThan LinkMessageIter @links
jump LinkingMessageEnd equal CurrentBuilding InfoMessanger
sensor CurrentBuildingType CurrentBuilding @type
sensor CurrentBuildingID CurrentBuildingType @id
jump LinkingMessageContinue notEqual CurrentBuildingID messageID
set secondLinkMessage CurrentBuilding
jump LinkingMessageContinue always
LinkingMessageEnd:
jump FindInfoMessangerFuncEnd strictEqual secondLinkMessage null
jump ErrorDublicateMassangeBuilding always
FindInfoMessangerFuncEnd:
set @counter ReturnInfoMessanger

# ProcessID - must be unicue for any processors of this type
# Args: ProcessID, ThisX, ThisY, ControlMask
# Out: ProcessID
CreateProcessIDFunc:
jump CreateProcessID strictEqual ProcessID null
jump CreateProcessIDFuncEnd always
CreateProcessID:
set ProcessID 0
op shl LogicWork 13 60
op shl ProcessIDX ThisX 40
op shl ProcessIDY ThisX 20
op or ProcessID ProcessID LogicWork
op or ProcessID ProcessID ProcessIDX
op or ProcessID ProcessID ProcessIDY
op xor ProcessID ProcessID ControlMask
CreateProcessIDFuncEnd:
set @counter Return


# Args: FunctionalitySwitch
# Out: FunctionalitySwitch or Exception
FindSwitchFunc:
jump FindSwitchFuncEnd notEqual FunctionalitySwitch null
set InLinkingSwitchLoop false
set secondLinkSwitch null
set LinkSwitchIter -1
LinkingSwitch:
op add LinkSwitchIter LinkSwitchIter 1
getlink CurrentBuilding LinkSwitchIter
jump FindSwitchFuncEnd greaterThan LinkSwitchIter @links
sensor CurrentBuildingType CurrentBuilding @type
sensor CurrentBuildingID CurrentBuildingType @id
jump LinkingSwitch notEqual CurrentBuildingID switchID
set FunctionalitySwitch CurrentBuilding
jump FindSwitchFuncEnd always
LinkingSwitchNewRow: # second loop for dublicate buildings
set LinkSwitchIter 0
jump LinkingSwitchEnd equal InLinkingSwitchLoop true
set InLinkingSwitchLoop true
LinkingSwitchContinue:
getlink CurrentBuilding LinkSwitchIter
op add LinkSwitchIter LinkSwitchIter 1
jump LinkingSwitchNewRow greaterThan LinkSwitchIter @links
jump LinkingSwitchEnd equal CurrentBuilding FunctionalitySwitch
sensor CurrentBuildingType CurrentBuilding @type
sensor CurrentBuildingID CurrentBuildingType @id
jump LinkingSwitchContinue notEqual CurrentBuildingID switchID
set secondLinkSwitch CurrentBuilding
jump LinkingSwitchContinue always
LinkingSwitchEnd:
jump FindSwitchFuncEnd strictEqual secondLinkSwitch null
jump ErrorDublicateSwitchBuilding always
FindSwitchFuncEnd:
set @counter ReturnSwitch


BrockenState:
op add ReturnUnit @counter 1
jump FindUnitFunc always
set @counter FromCounter

NoSorter:
jump start equal isCleared true
set isCleared true
#jump AbsoluteStop always

AbsoluteStop:
control config ResourseHolder null
jump NoUnbind equal IsUnitAnderControll false
ucontrol stop
ucontrol flag 0
ucontrol unbind
set IsUnitAnderControll false
NoUnbind:
wait 1
jump start always


ErrorNoItemType:
print "Nothing to delivering."
printflush InfoMessanger
jump AbsoluteStop always


ErrorNoBuildingInList:
print "Error: No Buildings in linked list"
printflush InfoMessanger
jump AbsoluteStop always


ErrorDublicateSorterBuilding:
print "Error: Dublicate Sorter building in linked list"
printflush InfoMessanger
jump AbsoluteStop always


ErrorDublicateSwitchBuilding:
print "Error: Dublicate Switch building in linked list"
printflush InfoMessanger
jump AbsoluteStop always


ErrorNoSorterInLinks:
print "Error: No Sorter in linked list"
printflush InfoMessanger
jump AbsoluteStop always


ErrorDublicateMassangeBuilding:
print "Error: Dublicate Messange building in linked list"
printflush InfoMessanger
jump AbsoluteStop always


ErrorNoUnitAreFree:
print "Error: No @unit are free"
printflush InfoMessanger
jump AbsoluteStop always
Last edited by LED; 20 Jul, 2024 @ 5:18am