package rabbitescape.ui.text;
import static rabbitescape.engine.i18n.Translation.*;
import static rabbitescape.engine.util.Util.*;
import java.util.Map;
import rabbitescape.engine.LevelWinListener;
import rabbitescape.engine.Token;
import rabbitescape.engine.World;
import rabbitescape.engine.World.CompletionState;
import rabbitescape.engine.solution.SandboxGame;
import rabbitescape.engine.textworld.TextWorldManip;
import rabbitescape.engine.util.MegaCoder;
import rabbitescape.render.GameLaunch;
public class TextGameLaunch implements GameLaunch
{
private final SandboxGame sandboxGame;
private final LevelWinListener winListener;
private final Terminal terminal;
public TextGameLaunch(
World world, LevelWinListener winListener, Terminal terminal )
{
this.sandboxGame = new SandboxGame( world );
this.winListener = winListener;
this.terminal = terminal;
}
@Override
public void run( String[] args )
{
boolean useInput = true;
if ( args.length > 1 && args[1].equals( "noinput" ) )
{
useInput = false;
}
InputHandler inputHandler =
new InputHandler( sandboxGame, terminal );
int commandIndex = 1;
while(
sandboxGame.getWorld().completionState() == CompletionState.RUNNING
)
{
try
{
if ( !useInput )
{
printWorldWithState();
Thread.sleep( 200 );
}
printWorld(inputHandler);
if ( useInput )
{
//noinspection StatementWithEmptyBody
while ( !inputHandler.handle( commandIndex ) )
{
}
++commandIndex;
}
else
{
Thread.sleep( 200 );
}
}
catch ( InterruptedException e )
{
e.printStackTrace();
}
checkWon();
}
printSolution( inputHandler.solution(), true );
}
private void printSolution( String solution, boolean withObfuscation )
{
terminal.out.println(
t( ":solution.1=${solution}", newMap( "solution", solution ) ) );
if ( withObfuscation )
{
terminal.out.println(
t(
":solution.1.code=${solution}",
newMap( "solution", MegaCoder.encode( solution ) )
)
);
}
}
private void checkWon()
{
if ( sandboxGame.getWorld().completionState() == CompletionState.WON )
{
winListener.won();
}
}
private void printWorld( InputHandler inputHandler )
{
printSolution( inputHandler.solution(), false );
printWorldImpl( false );
printState();
}
private void printWorldWithState()
{
printWorldImpl( true );
}
private void printState()
{
terminal.out.println();
for (
Map.Entry<Token.Type, Integer> entry :
sandboxGame.getWorld().abilities.entrySet()
)
{
terminal.out.println(
t(
"${token}: ${number_left}${selected}",
newMap(
"token", entry.getKey().name(),
"number_left", String.valueOf( entry.getValue() ),
"selected", isSelected( entry.getKey() ) ? "*" : ""
)
)
);
}
terminal.out.println();
}
private boolean isSelected( Token.Type ability )
{
return ability.equals( sandboxGame.getSelectedType() );
}
private void printWorldImpl( boolean showChanges )
{
String[] txt = TextWorldManip.renderWorld(
sandboxGame.getWorld(), showChanges, true );
terminal.out.println();
terminal.out.println( join( "\n", txt ) );
}
@Override
public void showResult()
{
if ( sandboxGame.getWorld().completionState() == CompletionState.WON )
{
terminal.out.println( t( "You won!" ) );
}
else
{
terminal.out.println( t( "You lost." ) );
}
}
}