package rabbitescape.engine.textworld;
import rabbitescape.engine.ChangeDescription;
import rabbitescape.engine.ChangeDescription.Change;
import rabbitescape.engine.RabbitStates;
import rabbitescape.engine.StateAndPosition;
import rabbitescape.engine.util.Position;
public class ChangeRenderer
{
public static void render( Chars chars, ChangeDescription desc )
{
for ( ChangeDescription.Change change : desc.changes )
{
charForChange( change, chars );
}
}
private static void charForChange( Change change, Chars chars )
{
// Handle bridging specially
Position bridgingPos = RabbitStates.whereBridging(
new StateAndPosition( change.state, change.x, change.y ) );
if ( bridgingPos != null )
{
chars.set(
bridgingPos.x,
bridgingPos.y,
RabbitStates.bridgingStage( change.state )
);
return;
}
// Everything else is relatively simple
switch( change.state )
{
case NOTHING:
break;
case FIRE_A:
case FIRE_B:
case FIRE_C:
case FIRE_D:
case FIRE_A_RISE_RIGHT:
case FIRE_B_RISE_RIGHT:
case FIRE_C_RISE_RIGHT:
case FIRE_D_RISE_RIGHT:
case FIRE_A_RISE_LEFT:
case FIRE_B_RISE_LEFT:
case FIRE_C_RISE_LEFT:
case FIRE_D_RISE_LEFT:
break;
case FIRE_A_FALLING:
case FIRE_B_FALLING:
case FIRE_C_FALLING:
case FIRE_D_FALLING:
case FIRE_A_FALL_TO_RISE_RIGHT:
case FIRE_B_FALL_TO_RISE_RIGHT:
case FIRE_C_FALL_TO_RISE_RIGHT:
case FIRE_D_FALL_TO_RISE_RIGHT:
case FIRE_A_FALL_TO_RISE_LEFT:
case FIRE_B_FALL_TO_RISE_LEFT:
case FIRE_C_FALL_TO_RISE_LEFT:
case FIRE_D_FALL_TO_RISE_LEFT:
chars.set( change.x, change.y + 1, 'g' );
break;
case FIRE_EXTINGUISHING:
break;
case PIPE:
chars.set( change.x, change.y, 'P' );
break;
case RABBIT_BURNING:
case RABBIT_BURNING_ON_SLOPE:
chars.set( change.x, change.y, 'X' );
break;
case RABBIT_WALKING_LEFT:
chars.set( change.x-1, change.y, '<' );
break;
case RABBIT_TURNING_LEFT_TO_RIGHT:
chars.set( change.x, change.y, '|' );
break;
case RABBIT_TURNING_LEFT_TO_RIGHT_RISING:
chars.set( change.x, change.y, '|' );
break;
case RABBIT_TURNING_LEFT_TO_RIGHT_LOWERING:
chars.set( change.x, change.y, '[' );
break;
case RABBIT_WALKING_RIGHT:
chars.set( change.x + 1, change.y, '>' );
break;
case RABBIT_TURNING_RIGHT_TO_LEFT:
chars.set( change.x, change.y, '?' );
break;
case RABBIT_TURNING_RIGHT_TO_LEFT_RISING:
chars.set( change.x, change.y, '?' );
break;
case RABBIT_TURNING_RIGHT_TO_LEFT_LOWERING:
chars.set( change.x, change.y, ']' );
break;
case RABBIT_RISING_RIGHT_START:
chars.set( change.x + 1, change.y, '~' );
break;
case RABBIT_RISING_RIGHT_CONTINUE:
chars.set( change.x + 1, change.y - 1, '$' );
break;
case RABBIT_RISING_RIGHT_END:
chars.set( change.x + 1, change.y - 1, '\'' );
break;
case RABBIT_RISING_LEFT_START:
chars.set( change.x - 1, change.y, '`' );
break;
case RABBIT_RISING_LEFT_CONTINUE:
chars.set( change.x - 1, change.y - 1, '^' );
break;
case RABBIT_RISING_LEFT_END:
chars.set( change.x - 1, change.y - 1, '!' );
break;
case RABBIT_LOWERING_RIGHT_START:
chars.set( change.x + 1, change.y + 1, '-' );
break;
case RABBIT_LOWERING_RIGHT_CONTINUE:
chars.set( change.x + 1, change.y + 1, '@' );
break;
case RABBIT_LOWERING_RIGHT_END:
chars.set( change.x + 1, change.y, '_' );
break;
case RABBIT_LOWERING_LEFT_START:
chars.set( change.x - 1, change.y + 1, '=' );
break;
case RABBIT_LOWERING_LEFT_CONTINUE:
chars.set( change.x - 1, change.y + 1, '%' );
break;
case RABBIT_LOWERING_LEFT_END:
chars.set( change.x - 1, change.y, '+' );
break;
case RABBIT_LOWERING_AND_RISING_RIGHT:
chars.set( change.x + 1, change.y, ',' );
break;
case RABBIT_LOWERING_AND_RISING_LEFT:
chars.set( change.x - 1, change.y, '.' );
break;
case RABBIT_RISING_AND_LOWERING_RIGHT:
chars.set( change.x + 1, change.y, '&' );
break;
case RABBIT_RISING_AND_LOWERING_LEFT:
chars.set( change.x - 1, change.y, 'm' );
break;
case RABBIT_BROLLYCHUTING:
chars.set( change.x, change.y + 1, ':' );
break;
case RABBIT_FALLING:
chars.set( change.x, change.y + 1, 'f' );
chars.set( change.x, change.y + 2, 'f' );
break;
case RABBIT_FALLING_ONTO_LOWER_RIGHT:
chars.set( change.x, change.y + 1, 'f' );
chars.set( change.x, change.y + 2, 'e' );
break;
case RABBIT_FALLING_ONTO_LOWER_LEFT:
chars.set( change.x, change.y + 1, 'f' );
chars.set( change.x, change.y + 2, 's' );
break;
case RABBIT_FALLING_ONTO_RISE_RIGHT:
chars.set( change.x, change.y + 1, 'f' );
chars.set( change.x, change.y + 2, 'h' );
break;
case RABBIT_FALLING_ONTO_RISE_LEFT:
chars.set( change.x, change.y + 1, 'f' );
chars.set( change.x, change.y + 2, 'a' );
break;
case RABBIT_FALLING_1:
chars.set( change.x, change.y + 1, 'f' );
break;
case RABBIT_FALLING_1_ONTO_LOWER_RIGHT:
chars.set( change.x, change.y + 1, 'e' );
break;
case RABBIT_FALLING_1_ONTO_LOWER_LEFT:
chars.set( change.x, change.y + 1, 's' );
break;
case RABBIT_DYING_OF_FALLING_2_SLOPE_RISE_LEFT:
case RABBIT_DYING_OF_FALLING_2_SLOPE_RISE_RIGHT:
chars.set( change.x, change.y + 1, 'f' );
chars.set( change.x, change.y + 2, 'x' );
break;
case RABBIT_DYING_OF_FALLING_2_SLOPE_RISE_RIGHT_2:
case RABBIT_DYING_OF_FALLING_2_SLOPE_RISE_LEFT_2:
chars.set( change.x, change.y, 'X' );
break;
case RABBIT_FALLING_1_ONTO_RISE_RIGHT:
chars.set( change.x, change.y + 1, 'h' );
break;
case RABBIT_FALLING_1_ONTO_RISE_LEFT:
chars.set( change.x, change.y + 1, 'a' );
break;
case RABBIT_DYING_OF_FALLING_SLOPE_RISE_LEFT:
case RABBIT_DYING_OF_FALLING_SLOPE_RISE_RIGHT:
chars.set( change.x, change.y + 1, 'x' );
break;
case RABBIT_DYING_OF_FALLING_SLOPE_RISE_RIGHT_2:
case RABBIT_DYING_OF_FALLING_SLOPE_RISE_LEFT_2:
chars.set( change.x, change.y, 'y' );
break;
case RABBIT_FALLING_1_TO_DEATH:
chars.set( change.x, change.y + 1, 'x' );
break;
case RABBIT_DYING_OF_FALLING_2:
chars.set( change.x, change.y, 'y' );
break;
case RABBIT_DYING_OF_FALLING:
chars.set( change.x, change.y, 'X' );
break;
case RABBIT_ENTERING_EXIT:
chars.set( change.x, change.y, 'R' );
break;
case RABBIT_BASHING_RIGHT:
chars.set( change.x + 1, change.y, 'K' );
break;
case RABBIT_BASHING_LEFT:
chars.set( change.x - 1, change.y, 'W' );
break;
case RABBIT_BASHING_UP_RIGHT:
chars.set( change.x + 1, change.y - 1, 'K' );
break;
case RABBIT_BASHING_UP_LEFT:
chars.set( change.x - 1, change.y - 1, 'W' );
break;
case RABBIT_BASHING_USELESSLY_RIGHT:
chars.set( change.x + 1, change.y, 'I' );
break;
case RABBIT_BASHING_USELESSLY_LEFT:
chars.set( change.x - 1, change.y, 'J' );
break;
case RABBIT_BASHING_USELESSLY_RIGHT_UP:
chars.set( change.x + 1, change.y, 'I' );
break;
case RABBIT_BASHING_USELESSLY_LEFT_UP:
chars.set( change.x - 1, change.y, 'J' );
break;
case RABBIT_CLIMBING_LEFT_START:
chars.set( change.x, change.y, 'T' );
break;
case RABBIT_CLIMBING_LEFT_CONTINUE_1:
case RABBIT_CLIMBING_LEFT_CONTINUE_2:
chars.set( change.x, change.y - 1, 'Y' );
break;
case RABBIT_CLIMBING_LEFT_END:
chars.set( change.x - 1, change.y - 1, 'U' );
break;
case RABBIT_CLIMBING_LEFT_BANG_HEAD:
chars.set( change.x, change.y, 'Y' );
break;
case RABBIT_CLIMBING_RIGHT_START:
chars.set( change.x, change.y, 'G' );
break;
case RABBIT_CLIMBING_RIGHT_CONTINUE_1:
case RABBIT_CLIMBING_RIGHT_CONTINUE_2:
chars.set( change.x, change.y - 1, 'F' );
break;
case RABBIT_CLIMBING_RIGHT_END:
chars.set( change.x + 1, change.y - 1, 'L' );
break;
case RABBIT_CLIMBING_RIGHT_BANG_HEAD:
chars.set( change.x, change.y, 'F' );
break;
case RABBIT_DIGGING:
chars.set( change.x, change.y + 1, 'D' );
break;
case RABBIT_DIGGING_USELESSLY:
chars.set( change.x, change.y + 1, 'D' );
break;
case RABBIT_DIGGING_ON_SLOPE:
chars.set( change.x, change.y, 'D' );
break;
case RABBIT_DIGGING_2:
chars.set( change.x, change.y, 'D' );
break;
case RABBIT_BLOCKING:
case RABBIT_BLOCKING_RISE_RIGHT:
case RABBIT_BLOCKING_RISE_LEFT:
chars.set( change.x, change.y, 'H' );
break;
case RABBIT_EXPLODING:
chars.set( change.x, change.y, 'P' );
break;
case RABBIT_DROWNING:
chars.set( change.x, change.y, 'R' );
break;
case RABBIT_OUT_OF_BOUNDS:
break;
case TOKEN_BASH_STILL:
case TOKEN_BASH_ON_SLOPE:
case TOKEN_DIG_STILL:
case TOKEN_DIG_ON_SLOPE:
case TOKEN_BRIDGE_STILL:
case TOKEN_BRIDGE_ON_SLOPE:
case TOKEN_BLOCK_STILL:
case TOKEN_BLOCK_ON_SLOPE:
case TOKEN_CLIMB_STILL:
case TOKEN_CLIMB_ON_SLOPE:
case TOKEN_EXPLODE_STILL:
case TOKEN_EXPLODE_ON_SLOPE:
case TOKEN_BROLLY_STILL:
case TOKEN_BROLLY_ON_SLOPE:
break;
case TOKEN_BASH_FALLING:
case TOKEN_BASH_FALL_TO_SLOPE:
case TOKEN_DIG_FALLING:
case TOKEN_DIG_FALL_TO_SLOPE:
case TOKEN_BRIDGE_FALLING:
case TOKEN_BRIDGE_FALL_TO_SLOPE:
case TOKEN_BLOCK_FALLING:
case TOKEN_BLOCK_FALL_TO_SLOPE:
case TOKEN_CLIMB_FALLING:
case TOKEN_CLIMB_FALL_TO_SLOPE:
case TOKEN_EXPLODE_FALLING:
case TOKEN_EXPLODE_FALL_TO_SLOPE:
case TOKEN_BROLLY_FALLING:
case TOKEN_BROLLY_FALL_TO_SLOPE:
chars.set( change.x, change.y + 1, 'f' );
break;
case WATER_REGION:
chars.set( change.x, change.y, 'N' );
break;
case WATER_REGION_HALF:
chars.set( change.x, change.y, 'n' );
break;
case WATER_REGION_FALLING:
chars.set( change.x, change.y, 'n' );
break;
case WATER_REGION_EMPTY:
break;
case ENTRANCE:
break;
case EXIT:
break;
default:
throw new AssertionError(
"Unknown Change state: " + change.state.name() );
}
}
}