1
0
mirror of https://github.com/klmp200/sarl-fireworks.git synced 2024-06-01 04:19:39 +00:00
sarl-fireworks/src/main/sarl/io/sarl/demos/fireworks/agents/Fire.sarl

115 lines
2.5 KiB
Plaintext
Raw Normal View History

package io.sarl.demos.fireworks.agents
2017-04-27 19:32:44 +00:00
import io.sarl.core.AgentTask
import io.sarl.core.Behaviors
import io.sarl.core.DefaultContextInteractions
import io.sarl.core.Initialize
import io.sarl.core.Lifecycle
import io.sarl.core.Logging
import io.sarl.core.Schedules
2017-05-02 14:47:40 +00:00
import io.sarl.demos.fireworks.Positions
import io.sarl.demos.fireworks.events.Exit
import io.sarl.demos.fireworks.events.FireReady
import io.sarl.demos.fireworks.events.Freeze
import io.sarl.demos.fireworks.events.UpdateFirePosition
2017-04-27 19:32:44 +00:00
import io.sarl.util.Scopes
import java.util.ArrayList
import java.util.List
import java.util.UUID
import java.util.Vector
agent Fire {
uses Lifecycle, Logging, Behaviors, DefaultContextInteractions, Schedules
2017-04-27 19:32:44 +00:00
var x: List<Double>
var y: List<Double>
var lifetime = 300
var frozen = false
var destroyed = false
var exited = false
var grid: Positions
var xf: Double
var yf: Double
var id = UUID.randomUUID
var parentID: UUID
var move: AgentTask
var parentAgent: UUID
on Freeze {
this.frozen = occurrence.value
if (frozen)
cancel(move, true)
else
wake(new UpdateFirePosition)
}
on Initialize {
x = new ArrayList()
y = new ArrayList()
if (occurrence.parameters.size.equals(4)){
x.add(occurrence.parameters.get(0) as Double)
y.add(occurrence.parameters.get(1) as Double)
grid = occurrence.parameters.get(2) as Positions
parentID = occurrence.parameters.get(3) as UUID
} else {
info("Error in fire Initialize : bad parameter number")
}
parentAgent = occurrence.spawner
xf = Math.random() * 10.0 - Math.random() * 5
yf = Math.random() * 10.0 + 1.0
}
on FireReady {
move = atFixedDelay(30)[try{
wake(new UpdateFirePosition);}
catch(e: Exception) {e.printStackTrace}]
}
on UpdateFirePosition [isFromMe(occurrence) && !frozen && !destroyed]{
var newx = x.last + xf
var newy = y.last + yf
x.add(newx)
y.add(newy)
if (grid !== null){
var list = new ArrayList<Vector<Double>>
x.forEach[pos | {
var nvect = new Vector(2)
nvect.add(pos)
list.add(nvect)
}]
y.forEach[pos, i | {
var nvect = list.get(i)
nvect.add(pos)
list.set(i, nvect)
}]
grid.setFirePosition(id, parentID, list)
}
lifetime = lifetime - 10
if (lifetime <= 0){
grid.removeFirePosition(id)
this.cleanBeforeExit
in(1000)[killMe]
}
}
def cleanBeforeExit(){
cancel(move, true)
exited = true
destroyed = true
}
on Exit [!exited && isFrom(getParentID)] {
frozen = true
this.cleanBeforeExit
emit(new Exit, Scopes.addresses(defaultSpace.getAddress(parentAgent)))
killMe
}
}