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

120 lines
2.9 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.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.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
2017-04-27 19:32:44 +00:00
import java.util.Random
import java.util.UUID
import java.util.Vector
agent Rocket {
uses Lifecycle, Logging, Schedules, Behaviors, DefaultContextInteractions, InnerContextAccess
2017-04-27 19:32:44 +00:00
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
on Exit [!hasMemberAgent]{
emit(new Exit)
killMe
}
on Exit [hasMemberAgent && !exited]{
exploded = true
frozen = true
exited = true
cancel(move, true)
innerContext.defaultSpace.emit(new Exit)
}
on Freeze {
this.frozen = occurrence.value
if (frozen)
cancel(move, true)
if (!frozen)
wake(new UpdateRocketPosition)
}
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
move = atFixedDelay(30)[try{
wake(new UpdateRocketPosition);}
catch(e: Exception) {e.printStackTrace}]
}
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
cancel(move, true)
grid.hideHocketPosition(id)
wake(new Explode)
}
}
on Explode {
for (var i=0; i < fireQuantity; i++){
spawnInContext(Fire, innerContext, x, y, grid, id)
}
// emit(new Launch)
}
on MemberLeft [!isFromMe(occurrence) && !frozen && !hasMemberAgent] {
exited = true
grid.removeRocketPosition(id)
// emit(new Launch)
killMe
}
on MemberJoined [!isFromMe(occurrence) && hasMemberAgent && memberAgentCount == fireQuantity]{
innerContext.defaultSpace.emit(new FireReady)
}
}