Mindustry

Mindustry

Universal resource delivery / Универсальный заполнитель ресурсами.
LED  [developer] 10 Oct, 2023 @ 10:00am
Ok, in those, Code: (Please anilise and tell me the problems if there are any)
# 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
start:
set PreferUnit 0
set MinToReturn 4
set LowResCount 128
set CapacityFloor -1
set CloseToHeal -1
wait 0.3
set CloseToDrop 7.25
set CloseToRepair 9
set ResoursePreferer 0

jump InProcess equal inWork true
set inWork true
set InID 22 # start from mega
set LinkIter 0
set LinkSorterIter 0
InProcess:

sensor ThisX @this @x
sensor ThisY @this @y
jump NoRange notEqual CloseToHeal -1
sensor CloseToHeal @this @range
NoRange:
op sub CloseToMove CloseToDrop 1

sensor minTurretId @duo @id # first turret in game
sensor maxTurretId @meltdown @id # last turret in game
sensor sorterID @sorter @id
sensor invSorterID @inverted-sorter @id
set ControlFlag 1968

set CanHeal false
set CanBuild false
set CloseToEnemy -1
set CloseToBuild -1
set CertainBuilding 0
set CertainUnit 0
set CertainFill 0
set ItemTypeIn 0

op add ReturnSorter @counter 1
jump FindSorterFunk always

sensor CertainFill ResoursePreferer @config
jump start strictEqual CertainFill null

op add ReturnUnit @counter 1
jump FindUnitFunk always

op add ReturnBuilding @counter 1
jump AboutBuildingFunk always

Main:
#1-Move To Core + Drop + Take items
ToCore:
op add Return @counter 1
jump MoveToCoreFunk always
ToArea:
#2- Move to building area
op add Return @counter 1
jump InAreaFunk always
ToBuilding:
#3-Move to building
op add Return @counter 1
jump MoveToBuildFunk always



jump Main always



MoveToBuildFunk:

sensor CertainFill ResoursePreferer @config
jump AbsoluteStop strictEqual CertainFill null

set BuildingToRepair CertainBuilding
sensor isBrocken BuildingToRepair @dead
jump NoRepairBuildInMove equal isBrocken false
op add ReturnRepair @counter 1
jump RepairFunk always
NoRepairBuildInMove:

sensor isUnitDead @unit @dead
jump ToCore equal isUnitDead true # if dead - change unit

sensor ControlBy @unit @controller
op add FromCounter @counter 1
jump BrockenState notEqual ControlBy @this # if lose control - brocken state

sensor ItemTypeIn @unit @firstItem
jump MoveToBuildFunkEnd notEqual CertainFill ItemTypeIn
sensor ItemsCount @unit @totalItems
jump MoveToBuildFunkEnd lessThanEq ItemsCount MinToReturn
MoveToBuild:

ucontrol within BuildingX BuildingY CloseToDrop NearToBuilding 0
jump MoveToBuildCheckEnd equal NearToBuilding true
ucontrol approach BuildingX BuildingY CloseToMove
jump MoveToBuildFunk always
MoveToBuildCheckEnd:

ucontrol itemDrop CertainBuilding MaxResInUnit

MoveToBuildFunkEnd:
set @counter Return



InAreaFunk:
sensor CertainFill ResoursePreferer @config
jump AbsoluteStop strictEqual CertainFill null

jump NoRepairs equal CanBuild false
set BuildingToRepair @this
sensor isBrocken BuildingToRepair @dead
jump NoRepairThis equal isBrocken false
op add ReturnRepair @counter 1
jump RepairFunk always
NoRepairThis:

set BuildingToRepair CertainBuilding
sensor isBrocken BuildingToRepair @dead
jump NoRepairBuild equal isBrocken false
op add ReturnRepair @counter 1
jump RepairFunk always
NoRepairBuild:

set BuildingToRepair ResoursePreferer
sensor isBrocken BuildingToRepair @dead
jump NoRepairSorter equal isBrocken false
op add ReturnRepair @counter 1
jump RepairFunk always
NoRepairSorter:
NoRepairs:

sensor isUnitDead @unit @dead
jump ToCore equal isUnitDead true # if dead - change unit

sensor ControlBy @unit @controller
op add FromCounter @counter 1
jump BrockenState notEqual ControlBy @this # if lose control - brocken state


ucontrol target damagedX damagedY false
jump ToEnemy equal CanHeal false
ulocate damaged core false @copper damagedX damagedY isDamaged nearBuild
jump ToEnemy equal isDamaged false

op sub HealX ThisX damagedX
op sub HealY ThisY damagedY
op len HealLenght HealX HealY
jump ToEnemy greaterThan HealLenght CloseToHeal #no heal is radius less than building

ucontrol approach damagedX damagedY CloseToBuild
ucontrol target damagedX damagedY true
ToEnemy:

uradar enemy any any distance 0 1 nearEnemy
jump EnemyEnd strictEqual nearEnemy null
sensor EnemyX nearEnemy @x
sensor EnemyY nearEnemy @y
ucontrol within EnemyX EnemyY CloseToEnemy NearToEnemy 0
jump EnemyEnd equal NearToEnemy false
ucontrol approach EnemyX EnemyY CloseToEnemy
jump ToBuildContinue always
EnemyEnd:

op add ReturnSorter @counter 1
jump FindSorterFunk always

op add ReturnBuilding @counter 1
jump AboutBuildingFunk always

sensor BuildingItems CertainBuilding @ammo
jump checkItemsAmmo equal isTurret true
sensor BuildingItems CertainBuilding @totalItems
checkItemsAmmo:
jump InAreaFunkEnd lessThan BuildingItems BuildingCapacityFloor

ToBuild:
ucontrol within BuildingX BuildingY CloseToBuild isCloseToBuild 0
jump ToBuildContinue equal isCloseToBuild true
ucontrol approach BuildingX BuildingY CloseToBuild
ToBuildContinue:

InAreaFunkEnd:
set @counter Return



RepairFunk:
sensor RBX BuildingToRepair @x
sensor RBY BuildingToRepair @y

MoveToRepair:

sensor isDead BuildingToRepair @dead
jump RepairFunkEnd equal false

ucontrol within RBX RBY CloseToRepair isCloseToBuild 0
jump Repair equal isCloseToBuild true
ucontrol approach RBX RBY CloseToRepair
Repair:

sensor BuildingType BuildingToRepair @type
sensor BuildingConfig BuildingToRepair @config
ucontrol build RBX RBY BuildingType 0 BuildingConfig

sensor RepairProgress @unit @progress
jump MoveToRepair notEqual 1

RepairFunkEnd:
set @counter ReturnRepair



MoveToCoreFunk:
sensor CertainFill ResoursePreferer @config
jump AbsoluteStop strictEqual CertainFill null

sensor isUnitDead @unit @dead
jump NoUnitProblem notEqual isUnitDead true # if dead - change unit
op add ReturnUnit @counter 1
jump FindUnitFunk always
NoUnitProblem:

sensor ControlBy @unit @controller
op add FromCounter @counter 1
jump BrockenState notEqual ControlBy @this # if lose control - brocken state


sensor ItemTypeIn @unit @firstItem
jump MoveToCore notEqual CertainFill ItemTypeIn
sensor ItemsCount @unit @totalItems
jump MoveToCoreFunkEnd greaterThan ItemsCount MinToReturn
MoveToCore:

jump CoreNoNull notEqual CoreBuild null
ulocate building core false @copper CoreX CoreY isfound CoreBuild
CoreNoNull:

ucontrol within CoreX CoreY CloseToDrop NearToCore 0
jump MoveToCoreCheckEnd equal NearToCore true
ucontrol approach CoreX CoreY CloseToMove
jump MoveToCoreFunk always

MoveToCoreCheckEnd:
sensor ItemTypeIn @unit @firstItem
jump Take strictEqual ItemTypeIn null
jump Take equal CertainFill ItemTypeIn
#Drop:
ucontrol itemDrop CoreBuild MaxResInUnit
ucontrol itemDrop @air MaxResInUnit # if core is full
Take:
sensor ResCore CoreBuild CertainFill
jump Main lessThan ResCore LowResCount
TakeIt:
ucontrol itemTake CoreBuild CertainFill MaxResInUnit
sensor ItemsCount @unit @totalItems
jump MoveToCoreFunk lessThan ItemsCount MaxResInUnit
MoveToCoreFunkEnd:
set @counter Return



FindUnitFunk:
jump LookUp equal PreferUnit 0
set CertainUnit PreferUnit
TryPrefer:
ubind CertainUnit
sensor ControlBy @unit @controlled
jump FindUnitFunkEnd equal ControlBy 0
jump FindUnitFunkEnd equal ControlBy @ctrlFormation
jump TryPrefer always

SubID:
op sub InID InID 1
LookUp:
set inRowCounter -1
set FirstInRow null
jump AddRowCounter greaterThanEq InID 20
set InID 24
jump AbsoluteStop 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:
sensor CertainFill ResoursePreferer @config
jump AbsoluteStop strictEqual CertainFill null

lookup unit CertainUnit InID
ubind CertainUnit

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 FindUnitFunkEnd notEqual ControlBy @ctrlProcessor
sensor UnitFlag @unit @flag
op sub inRowCounter inRowCounter 1 # return on prev unit id
jump AddRowCounter notEqual UnitFlag 0


FindUnitFunkEnd:
ucontrol move ThisX ThisY # Set Control as fast as possible
ucontrol flag ControlFlag

op add ReturnUnitInfo @counter 1
jump AboutUnitFunk always

set @counter ReturnUnit



AboutUnitFunk:
sensor MaxResInUnit @unit @itemCapacity
op add LowResCount LowResCount MaxResInUnit

jump NoClose notEqual CloseToBuild -1
sensor CloseToBuild @unit @range
NoClose:

sensor CloseToEnemy @unit @range

sensor UnitType @unit @type
sensor UnitID UnitType @id

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

AboutUnitFunkEnd:
set @counter ReturnUnitInfo



AboutBuildingFunk:
#Определить постройку по соединениям!
Linking:
jump AbsoluteStop lessThan @links 2

getlink CertainBuilding LinkIter
op add LinkIter LinkIter 1

jump InLinking lessThan LinkIter @links
set LinkIter 0
InLinking:

jump Linking equal ResoursePreferer CertainBuilding

sensor BuildingX CertainBuilding @x
sensor BuildingY CertainBuilding @y

sensor BuildingType CertainBuilding @type
sensor BuildingID BuildingType @id

jump NotTurret lessThan BuildingID minTurretId
jump NotTurret greaterThan BuildingID maxTurretId
#ForTurret:
set isTurret true
sensor BuildingItemsCapacity CertainBuilding @ammoCapacity
jump DefineCapacity notEqual CapacityFloor -1
set CapacityFloor 0.8
jump DefineCapacity always
NotTurret:
set isTurret false
sensor BuildingItemsCapacity CertainBuilding @itemCapacity
jump DefineCapacity notEqual CapacityFloor -1
set CapacityFloor 1000
DefineCapacity:
op mul BuildingCapacityFloor BuildingItemsCapacity CapacityFloor
AboutBuildingFunkEnd:
set @counter ReturnBuilding



FindSorterFunk:
set isFirstRow true
# determine sorter by links
LinkingSorter:
getlink CertainBuilding LinkSorterIter
sensor CertainBuildingType CertainBuilding @type
sensor CertainBuildingId CertainBuildingType @id
op add LinkSorterIter LinkSorterIter 1

jump InLinkingSorter lessThan LinkSorterIter @links
set LinkSorterIter 0
jump NoSorter equal isFirstRow false # no sorters in conection list.
set isFirstRow false
InLinkingSorter:

jump isSorter equal CertainBuildingId sorterID
jump isSorter equal CertainBuildingId invSorterID
jump LinkingSorter always
isSorter:
jump SetSorter equal ResoursePreferer null
jump NoSorter notEqual ResoursePreferer CertainBuilding # just remove else sorters cuz i dont want to work with unholded logic
SetSorter:
set ResoursePreferer CertainBuilding
set isCleared false
FindSorterFunkEnd:
jump FindSorterFunk equal ResoursePreferer null
set @counter ReturnSorter



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

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

AbsoluteStop:
control config ResoursePreferer null
ucontrol stop
ucontrol flag 0
ucontrol unbind
jump start always
Last edited by LED; 26 May, 2024 @ 8:18am