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

97 lines
2.1 KiB
Plaintext

package io.sarl.demos.fireworks.agents
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.MemberLeft
import io.sarl.demos.fireworks.Positions
import io.sarl.demos.fireworks.events.Exit
import io.sarl.demos.fireworks.events.Freeze
import io.sarl.demos.fireworks.events.Launch
import io.sarl.demos.fireworks.events.RocketReady
/*
* A rocket launcher that own a rocket in it's inner context
*/
agent RocketLauncher {
uses Logging, Behaviors, DefaultContextInteractions, InnerContextAccess, Lifecycle
var x : Double
var y : Double
var fireQuantity : Integer
var gravity : Double
var grid : Positions
var exited = false
/*
* Kill itself after an Exit signal
*/
on Exit [!hasMemberAgent] {
emit(new Exit)
killMe
}
/*
* Transmit an Exit signal to inner context
*/
on Exit [hasMemberAgent && !exited] {
exited = true
innerContext.defaultSpace.emit(new Exit)
}
/*
* Initialization step invoked with parameters
*/
on Initialize [!occurrence.parameters.empty] {
x = occurrence.parameters.get(0) as Double
y = occurrence.parameters.get(1) as Double
fireQuantity = occurrence.parameters.get(2) as Integer
gravity = occurrence.parameters.get(3) as Double
grid = occurrence.parameters.get(4) as Positions
info("New rocket launcher created")
}
/*
* Initialization step by default
*/
on Initialize [occurrence.parameters.empty] {
x = 0.0
y = 0.0
fireQuantity = 30
gravity = 0.5
grid = null
info("New rocket launcher created")
emit(new RocketReady)
}
/*
* Launch a new rocket after a Launch signal
*/
on Launch {
var vx = Math.random() * 2.0
var vy = Math.random() * 5.5 + 2.0
spawnInContext(Rocket, getInnerContext, x, y, vx, vy, gravity, fireQuantity, grid)
}
/*
* Transmit a Freeze signal
*/
on Freeze [!isFromMe(occurrence)] {
innerContext.defaultSpace.emit(occurrence)
}
/*
* Launch a new rocket when the previous is destroyed
*/
on MemberLeft [!isFromMe(occurrence) && !exited] {
wake(new Launch)
}
}