class Door : ActionRole() { @Attribute var doorName = "door" // Distance that the door opens @Attribute var linear = 200 // Amount the door opens rotationally. @Attribute var degrees = 0 @Attribute var duration = 1.0 @Attribute var closeAfterSeconds = 0 val openPosition = Vector2() val closedPosition = Vector2() val closedAngle = Angle() val openAngle = Angle() override fun begin() { closedPosition.set(actor.position) openPosition.set(actor.direction.vector()) openPosition *= -linear openPosition += actor.position closedAngle.set( actor.direction ) openAngle.set( actor.direction ) openAngle.degrees += degrees super.begin() } var closed = true fun open() { if (closed) { replaceAction( createOpenAction() ) actor.event( "open" ) closed = false } } fun close() { if (!closed) { replaceAction( createCloseAction() ) actor.event( "close" ) closed = true } } fun toggle() { if (closed) { open() } else { close() } } fun createOpenAction() : Action { val linear = MoveTo( actor.position, duration, openPosition, Eases.easeInOut ) val rotation = TurnTo( actor.direction, duration, openAngle, Eases.easeInOut ) val open = linear.and( rotation ) return if (closeAfterSeconds > 0) { open then Delay( closeAfterSeconds ) thenOnce this:>close } else { open } } fun createCloseAction() : Action { val linear = MoveTo( actor.position, duration, closedPosition, Eases.easeInOut ) val rotation = TurnTo( actor.direction, duration, closedAngle, Eases.easeInOut ) return linear.and( rotation ) } }