sarl-fireworks/src/main/sarl/io/sarl/demos/fireworks/agents/Rocket.sarl

155 lines
3.6 KiB
Plaintext

package io.sarl.demos.fireworks.agents
import io.sarl.core.AgentTask
import io.sarl.core.Behaviors
import io.sarl.core.DefaultContextInteractions
import io.sarl.core.Initialize
import io.sarl.core.InnerContextAccess
import io.sarl.core.Lifecycle
import io.sarl.core.Logging
import io.sarl.core.MemberJoined
import io.sarl.core.MemberLeft
import io.sarl.core.Schedules
import io.sarl.demos.fireworks.Configuration
import io.sarl.demos.fireworks.Positions
import io.sarl.demos.fireworks.events.Exit
import io.sarl.demos.fireworks.events.Explode
import io.sarl.demos.fireworks.events.FireReady
import io.sarl.demos.fireworks.events.Freeze
import io.sarl.demos.fireworks.events.UpdateRocketPosition
import java.util.Random
import java.util.UUID
import java.util.Vector
/*
* A Rocket that contains fire particles
*/
agent Rocket {
uses Lifecycle, Logging, Schedules, Behaviors, DefaultContextInteractions, InnerContextAccess
var x : Double
var y : Double
var gravity : Double
var speedx : Double
var speedy : Double
var fireQuantity : Integer
var lifetime : Integer
var frozen = false
var exploded = false
var exited = false
var grid : Positions
var id : UUID
var move : AgentTask
/*
* Kill itself after an Exit signal
*/
on Exit [!hasMemberAgent] {
emit(new Exit)
killMe
}
/*
* Transmit an Exit signal to inner context
*/
on Exit [hasMemberAgent && !exited] {
exploded = true
frozen = true
exited = true
move.cancel(true)
innerContext.defaultSpace.emit(new Exit)
}
/*
* Freeze itself
*/
on Freeze {
this.frozen = occurrence.value
if (frozen)
move.cancel(true)
if (!frozen)
wake(new UpdateRocketPosition)
}
/*
* Initialization step
*/
on Initialize {
info("New rocket launched")
var rnd = new Random()
if (occurrence.parameters.size.equals(7)) {
x = occurrence.parameters.get(0) as Double
y = occurrence.parameters.get(1) as Double
speedx = occurrence.parameters.get(2) as Double
speedy = occurrence.parameters.get(3) as Double
gravity = occurrence.parameters.get(4) as Double
fireQuantity = occurrence.parameters.get(5) as Integer
grid = occurrence.parameters.get(6) as Positions
} else {
info("Error in Fireworks Initialize : bad parameters number")
}
lifetime = rnd.nextInt(5) * 300 + 300
id = UUID.randomUUID
// Create a background task to update its own position
move = atFixedDelay(Configuration.RocketLifeCycleSchedulingRate) [
try {
wake(new UpdateRocketPosition);
} catch (e : Exception) {
e.printStackTrace
}
]
}
/*
* Update its position at every UpdateRocketPosition event from itself
*/
on UpdateRocketPosition [isFromMe(occurrence) && !frozen && !exploded] {
var vect = new Vector(2)
x = x + speedx
y = y + speedy
vect.clear()
vect.add(x)
vect.add(y)
lifetime = lifetime - 10
if (grid !== null)
grid.setRocketPosition(id, vect)
if (lifetime <= 0) {
exploded = true
move.cancel(true)
grid.hideHocketPosition(id)
wake(new Explode)
}
}
/*
* Explode and generate fire
*/
on Explode {
for (var i = 0; i < fireQuantity; i++) {
spawnInContext(Fire, innerContext, x, y, grid, id, gravity)
}
// emit(new Launch)
}
/*
* Kill itself when all its inner agents are killed
*/
on MemberLeft [!isFromMe(occurrence) && !frozen && !hasMemberAgent] {
exited = true
grid.removeRocketPosition(id)
// emit(new Launch)
killMe
}
/*
* Emit a FireReady signal when all fire are created
*/
on MemberJoined [!isFromMe(occurrence) && hasMemberAgent && memberAgentCount == fireQuantity] {
innerContext.defaultSpace.emit(new FireReady)
}
}