class Rock : Item { var fallImmediately = true override fun createAction() : Action { return this:>movement.action() } fun movement() : bool { if ( actor.stage == null ) { println( "Stage is null" ) } else if (! actor.stage.actors.contains( actor ) ) { println( "Hmm, weird" ) println( actor.stage ) println( actor.stage.actors.size() ) } val below = lookSouth() if ( ! below.isSolid() ) { if ( fallImmediately ) { fall( below ) } else { replaceAction( delayedFall() ) } } return false } fun fall( below : Item ) { fallImmediately = true if ( below is Enemy ) { val spawns = actor.stage.findRolesByClass( Spawn ) if ( spawns.size() > 0 ) { var spawned = false for ( n in 0..10 ) { // Try 10 times to find a free spot, then give up val spawn = spawns[ Rand.between( 0, spawns.size() ) ] val swawnBlock = spawn.block() if ( look( swawnBlock ).isEmpty() ) { below.getBlock().remove(below) below.actor.createChild( "squash" ) below.actor.position.set( spawn.actor.position ) block.add( below ) spawned = true break } } if ( ! spawned ) { below.getBlock().remove(below) below.actor.createChild( "squash" ) below.kill() } } } else if ( below is Player ) { below.actor.event("squash") below.getBlock().remove(below) // Just to prevent the warning message. below.actor.createChild( "squash" ) below.kill() } else { moveSouth() } } fun delayedFall() : Action { fallImmediately = true return Delay( 0.6 ).then( createAction() ) } }