package com.shade.states; import org.newdawn.slick.GameContainer; import org.newdawn.slick.Graphics; import org.newdawn.slick.SlickException; import org.newdawn.slick.gui.AbstractComponent; import org.newdawn.slick.gui.ComponentListener; import org.newdawn.slick.gui.TextField; import org.newdawn.slick.state.BasicGameState; import org.newdawn.slick.state.StateBasedGame; import com.shade.controls.Button; import com.shade.controls.ClickListener; import com.shade.controls.SerialStats; import com.shade.controls.SlickButton; import com.shade.util.ResourceManager; import com.shade.score.FailSafeHighScoreWriter; import com.shade.score.HighScoreWriter; public class EnterScoreState extends BasicGameState { private static final String PROMPT_WINNER = "Way to go! Er... what's your name?"; private static final String PROMPT_LOSER = "Nice try! Er... what's your name?"; private static final String[] RESPONSES = { "(Is that really a name?)", "Never heard of ya.", "Bet you can't beat me!", "Buffer Overflow at line 6.", "Cool guy, huh?", "You beat little Johnny!", "Go tell your friends!" }; public static final int ID = 6; private MasterState master; private ResourceManager resource; private SlickButton play, highscores, back; private int timer; private TextField input; private String message; private HighScoreWriter writer; private boolean completed; // private Music badEnding, goodEnding; // private boolean played; public EnterScoreState(MasterState m) throws SlickException { master = m; resource = m.resource; resource.register("playagain-up", "states/enter/playagain-up.png"); resource.register("playagain-down", "states/enter/playagain-down.png"); resource.register("losers-wreath", "states/enter/losers-wreath.png"); resource.register("winners-wreath", "states/enter/winners-wreath.png"); writer = new FailSafeHighScoreWriter(); // badEnding = new Music("states/enter/loser.ogg", true); // goodEnding = new Music("states/enter/winner.ogg", true); } @Override public int getID() { return ID; } public void init(GameContainer container, StateBasedGame game) throws SlickException { throw new RuntimeException("EnterScoreState was init'd!"); } @Override public void enter(GameContainer container, StateBasedGame game) throws SlickException { initButtons(); timer = 0; if (master.dimmer.reversed()) { master.dimmer.rewind(); } completed = false; initTextField(container); message = (master.scorecard.isGameBeaten()) ? PROMPT_WINNER : PROMPT_LOSER; // master.music.fade(500, 0, true); } // render the aquarium public void render(GameContainer container, StateBasedGame game, Graphics g) throws SlickException { master.control.render(game, g, resource.get("background")); master.dimmer.render(game, g); resource.get("winners-wreath").drawCentered(400, 260); drawScore(container, master.scorecard.getScore() + "", 218); if (!completed) { input.render(container, g); } drawCentered(container, message, 440); resource.get("header").draw(400, 0); play.render(game, g); highscores.render(game, g); back.render(game, g); resource.get("trim").draw(); } // render the aquarium public void update(GameContainer container, StateBasedGame game, int delta) throws SlickException { master.control.update(game, delta); master.dimmer.update(game, delta); timer += delta; // if (!played && !master.music.playing()) { // played = true; // if (master.scorecard.isCleared()) { // goodEnding.setVolume(0); // goodEnding.play(); // goodEnding.fade(1000, 1, false); // } else { // badEnding.setVolume(.5f); // badEnding.play(); // badEnding.fade(1000, 1, false); // } // } if (timer > MasterState.STATE_TRANSITION_DELAY) { play.update(game, delta); highscores.update(game, delta); back.update(game, delta); } } private void drawCentered(GameContainer c, String s, int y) { int x = (c.getWidth() - master.daisyMedium.getWidth(s)) / 2; master.daisyMedium.drawString(x, y, s); } private void drawScore(GameContainer c, String s, int y) { int x = (c.getWidth() - master.daisyLarge.getWidth(s)) / 2; master.daisyLarge.drawString(x, y, s); } private void initTextField(GameContainer container) throws SlickException { int w = 320; int h = 40; int x = (container.getWidth() - w) / 2; int y = (container.getHeight() - h) / 2 + 100; input = new TextField(container, master.jekyllLarge, x, y, w, h); input.setMaxLength(12); input.setFocus(true); input.addListener(new ComponentListener() { public void componentActivated(AbstractComponent c) { String name = input.getText().trim(); if (name.equals("")) { name = "Anon"; } int numTries = 3; boolean written = false; while (!written && numTries > 0) { written = writer.write(name, master.scorecard .getScore(), 0, SerialStats.allClear()); numTries--; } input.setAcceptingInput(false); completed = true; message = "Way to go " + input.getText() + "!! ... " + randomResponse(); } }); } private String randomResponse() { int r = (int) (Math.floor(Math.random() * RESPONSES.length)); return RESPONSES[r]; } private void initButtons() throws SlickException { initPlayButton(); initHighscoresButton(); initBackButton(); } private void initPlayButton() throws SlickException { play = new SlickButton(620, 110, resource.get("playagain-up"), resource .get("playagain-down")); play.addListener(new ClickListener() { public void onClick(StateBasedGame game, Button clicked) { game.enterState(SelectState.ID); // master.music.play(); // master.music.fade(1000, 1f, false); // played = false; } }); } private void initHighscoresButton() throws SlickException { highscores = new SlickButton(620, 130, resource.get("highscore-up"), resource.get("highscore-down")); highscores.addListener(new ClickListener() { public void onClick(StateBasedGame game, Button clicked) { game.enterState(HighscoreState.ID); // master.music.play(); // master.music.fade(1000, 1f, false); // played = false; } }); } private void initBackButton() throws SlickException { back = new SlickButton(620, 150, resource.get("back-up"), resource .get("back-down")); back.addListener(new ClickListener() { public void onClick(StateBasedGame game, Button clicked) { game.enterState(SelectState.ID); // master.music.play(); // master.music.fade(1000, 1f, false); // played = false; master.dimmer.reverse(); } }); } }