1
0
mirror of https://github.com/klmp200/sarl-fireworks.git synced 2025-07-05 16:55:15 +00:00
2017-06-13 14:50:59 +02:00

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)
}
}