155 lines
3.6 KiB
Plaintext
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)
|
|
}
|
|
|
|
}
|