123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794 |
- package me.hammerle.supersnuvi.gamelogic;
- import java.io.File;
- import java.util.Arrays;
- import java.util.HashMap;
- import me.hammerle.supersnuvi.javafx.IKeyBinding;
- import me.hammerle.supersnuvi.javafx.KeyHandler;
- import me.hammerle.supersnuvi.savegame.SimpleConfig;
- import me.hammerle.supersnuvi.tiles.*;
- import me.hammerle.supersnuvi.util.SoundUtils;
- import me.hammerle.supersnuvi.rendering.IRenderer;
- public class StateRenderer
- {
- // constants
- public static final ColoredBaseTile FALLBACK_TILE = new ColoredBaseTile(0, 0, 0, 0);
-
- // rendering
- private final IRenderer renderer;
-
- // tiles
- private final HashMap<Integer, Tile> registeredTiles;
-
- // levels
- private Level currentLevel;
- private final Level[] levels;
- private int levelIndex;
-
- public static final SimpleConfig CONFIG = new SimpleConfig("options.txt", true);
- private static final SimpleConfig[] SAVE_SLOTS = new SimpleConfig[]
- {
- new SimpleConfig("slot1.txt", true), new SimpleConfig("slot2.txt", true), new SimpleConfig("slot3.txt", true)
- };
-
- private int screen = 0;
- private int startScreenIndex = 0;
- private int optionScreenIndex = 0;
- private int slotScreenIndex = 0;
-
- private boolean optionsDirty = false;
-
- // sound
- private static boolean sound = CONFIG.getBoolean("sound", false);
- public static boolean isSoundEnabled()
- {
- return sound;
- }
- public StateRenderer(IRenderer renderer)
- {
- this.renderer = renderer;
- this.registeredTiles = new HashMap<>();
-
- registerTiles();
-
- File[] files = new File("./levels").listFiles();
- Arrays.sort(files, (o1, o2) -> o1.compareTo(o2));
- levels = new Level[files.length];
- for(int i = 0; i < levels.length; i++)
- {
- levels[i] = new Level(this, files[i]);
- }
- currentLevel = null;
- levelIndex = 0;
- }
- // -------------------------------------------------------------------------
- // tile stuff
- // -------------------------------------------------------------------------
-
- private void registerTiles()
- {
- // dirt
- for(int i = 0; i < 16; i++)
- {
- registeredTiles.put(i, new BaseBoxTile("dirt/dirt" + i));
- }
-
- // grass
- registeredTiles.put(20, new BaseBoxTile("grass/grass4"));
- registeredTiles.put(21, new BaseBoxTile("grass/grass9"));
- registeredTiles.put(22, new BaseBoxTile("grass/grass8"));
- registeredTiles.put(23, new BaseBoxTile("grass/grass10"));
- registeredTiles.put(28, new BaseBoxTile("grass/grass7"));
- registeredTiles.put(29, new BaseBoxTile("grass/grass15"));
- registeredTiles.put(30, new BaseBoxTile("grass/grass16"));
- registeredTiles.put(31, new BaseBoxTile("grass/grass14"));
-
- // bottled soul
- registeredTiles.put(32, new BottledSoulTile(1));
- registeredTiles.put(33, new BottledSoulTile(2));
- registeredTiles.put(34, new BottledSoulTile(3));
-
- // bounce shroom
- registeredTiles.put(48, new TrampolinTile());
-
- // crumbling stones
- registeredTiles.put(64, new CrumblingStoneTile());
-
- // spike trap
- registeredTiles.put(80, new SpikeTile());
-
- // water
- registeredTiles.put(96, new WaterTile(true));
- registeredTiles.put(97, new WaterTile(false));
-
- // snuvi start block
- registeredTiles.put(StartTile.ID, new StartTile());
-
- // sky
- registeredTiles.put(128, new SkyTile());
-
- // ice
- registeredTiles.put(144, new SlipperyTile("ice/ice"));
-
- // slippery slime
- registeredTiles.put(148, new SlipperyTile("slippery_slime/slippery_slime148"));
- registeredTiles.put(149, new SlipperyTile("slippery_slime/slippery_slime149"));
- registeredTiles.put(150, new SlipperyTile("slippery_slime/slippery_slime150"));
- registeredTiles.put(151, new SlipperyTile("slippery_slime/slippery_slime151"));
- registeredTiles.put(156, new SlipperyTile("slippery_slime/slippery_slime156"));
- registeredTiles.put(157, new SlipperyTile("slippery_slime/slippery_slime157"));
- registeredTiles.put(158, new SlipperyTile("slippery_slime/slippery_slime158"));
- registeredTiles.put(159, new SlipperyTile("slippery_slime/slippery_slime159"));
-
- // end level
- registeredTiles.put(160, new GoalTile("end/end"));
- registeredTiles.put(161, new GoalTile("end/end2"));
-
- // thorns
- registeredTiles.put(176, new KillTile("thorns/thorns_bottom", 2));
- registeredTiles.put(177, new KillTile("thorns/thorns_mid", 2));
- registeredTiles.put(178, new KillTile("thorns/thorns_top", 2));
- registeredTiles.put(179, new KillTile("thorns/thorns_bottom", -3));
- registeredTiles.put(180, new KillTile("thorns/thorns_mid", -3));
- registeredTiles.put(181, new KillTile("thorns/thorns_top", -3));
-
- // decoration shrooms
- registeredTiles.put(208, new DecoShroomTile("shrooms/shroom"));
- registeredTiles.put(209, new DecoShroomTile("shrooms/shroom2"));
- registeredTiles.put(210, new DecoShroomTile("shrooms/shroom3"));
- registeredTiles.put(211, new DecoShroomTile("shrooms/shroom4"));
-
- // fog, starting late to make length changes possible
- for(int i = 0; i < 16; i++)
- {
- registeredTiles.put(16000 + i, new FogTile((i + 1) / 16.0));
- }
-
- // london stuff
- registeredTiles.put(224, new BaseBoxTile("london_background/london_background"));
-
- // london streets
- for(int i = 0; i < 16; i++)
- {
- registeredTiles.put(240 + i, new BaseBoxTile("london_streets/london_streets" + i));
- }
-
- // london street light
- for(int i = 0; i < 25; i++)
- {
- registeredTiles.put(256 + i, new BaseBoxTile("street_light/street_light" + (i % 5) + "_" + (i / 5)));
- }
- }
-
- public Tile getTile(int id)
- {
- Tile tile = registeredTiles.get(id);
- if(tile == null)
- {
- return FALLBACK_TILE;
- }
- return tile;
- }
-
- public Tile getInteractionTile(int id)
- {
- return registeredTiles.getOrDefault(id, FALLBACK_TILE);
- }
-
- public void resetTiles()
- {
- registeredTiles.values().forEach(v -> v.reset());
- }
-
- // -------------------------------------------------------------------------
- // tick, rendering
- // -------------------------------------------------------------------------
- public IRenderer getRenderer()
- {
- return renderer;
- }
-
- private static char[] getCharLine(char start, char mid, char end, char spacer)
- {
- char[] c = new char[MENU_WIDTH];
- Arrays.fill(c, 1, c.length - 1, mid);
- c[0] = start;
- c[c.length - 1] = end;
- c[c.length - 3] = spacer;
- return c;
- }
-
- private static char[] getCharLine(char start, String s, char end)
- {
- char[] chars = new char[MENU_WIDTH];
- chars[0] = start;
- chars[chars.length - 1] = end;
- int border = Math.min(MENU_WIDTH - 2, s.length());
- for(int i = 0; i < border; i++)
- {
- chars[i + 1] = s.charAt(i);
- }
- return chars;
- }
-
- private static char[] getLevelCharLine(char start, char mid, char end, char spacer)
- {
- char[] c = new char[MENU_WIDTH];
- Arrays.fill(c, 1, c.length - 1, mid);
- c[0] = start;
- c[c.length - 1] = end;
- c[c.length - 7] = spacer;
- c[c.length - 13] = spacer;
- return c;
- }
-
- private static char[] getMoreLevelCharLine(char start, char mid, char end, char spacer)
- {
- char[] c = new char[MENU_WIDTH];
- Arrays.fill(c, 1, c.length - 1, mid);
- c[0] = start;
- c[1] = '.';
- c[2] = '.';
- c[3] = '.';
- c[c.length - 1] = end;
- c[c.length - 7] = spacer;
- c[c.length - 13] = spacer;
- return c;
- }
-
- private static final int MENU_WIDTH = 36;
- private static final int MENU_MAX = 5;
-
- private static final char[] TABLE_TOP = getCharLine((char) 131, (char) 136, (char) 133, (char) 136);
- private static final char[] TABLE_HEADING = getCharLine((char) 134, "Choose a Level ...", (char) 134);
- private static final char[] TABLE_MID = getLevelCharLine((char) 130, (char) 136, (char) 132, (char) 129);
- private static final char[] TABLE_BOTTOM = getLevelCharLine((char) 137, (char) 136, (char) 138, (char) 135);
- private static final char[] TABLE_MORE = getMoreLevelCharLine((char) 134, ' ', (char) 134, (char) 134);
-
- private static final char[][] START_UP = new char[][]
- {
- getCharLine((char) 131, (char) 136, (char) 133, (char) 136),
- getCharLine((char) 134, "Super Snuvi", (char) 134),
- getCharLine((char) 130, (char) 136, (char) 132, (char) 136),
- getCharLine((char) 134, "Start Game", (char) 134),
- getCharLine((char) 134, "Options", (char) 134),
- getCharLine((char) 134, "Exit Game", (char) 134),
- getCharLine((char) 137, (char) 136, (char) 138, (char) 136)
- };
-
- private static final char[][] SLOTS = new char[][]
- {
- getCharLine((char) 131, (char) 136, (char) 133, (char) 136),
- getCharLine((char) 134, "Choose a Savegame ...", (char) 134),
- getCharLine((char) 130, (char) 136, (char) 132, (char) 136),
- getCharLine((char) 134, "Slot 1", (char) 134),
- getCharLine((char) 134, "Slot 2", (char) 134),
- getCharLine((char) 134, "Slot 3", (char) 134),
- getCharLine((char) 134, "Back", (char) 134),
- getCharLine((char) 137, (char) 136, (char) 138, (char) 136)
- };
-
- private static final char[][] OPTIONS = new char[][]
- {
- getCharLine((char) 131, (char) 136, (char) 133, (char) 136),
- getCharLine((char) 134, "Options", (char) 134),
- getCharLine((char) 130, (char) 136, (char) 132, (char) 136),
- getCharLine((char) 134, "Sound", (char) 134),
- getCharLine((char) 134, "K: Up", (char) 134),
- getCharLine((char) 134, "K: Down", (char) 134),
- getCharLine((char) 134, "K: Left", (char) 134),
- getCharLine((char) 134, "K: Rright", (char) 134),
- getCharLine((char) 134, "K: Jump", (char) 134),
- getCharLine((char) 134, "K: Run", (char) 134),
- getCharLine((char) 134, "K: Back", (char) 134),
- getCharLine((char) 134, "K: Enter", (char) 134),
- getCharLine((char) 134, "K: Combat", (char) 134),
- getCharLine((char) 134, "K: Switch Face", (char) 134),
- getCharLine((char) 134, "K: Dash/Dodge", (char) 134),
- getCharLine((char) 134, "K: Dash/Dodge", (char) 134),
- getCharLine((char) 134, "K: Block", (char) 134),
- getCharLine((char) 134, "K: Attack", (char) 134),
- getCharLine((char) 134, "", (char) 134), // save
- getCharLine((char) 134, "Back", (char) 134),
- getCharLine((char) 137, (char) 136, (char) 138, (char) 136)
- };
-
- private static final char[] SAVE_OVERLAY = getCharLine(' ', "Save", ' ');
-
- private static final int OPTION_OFFSET = 10;
-
- static
- {
- int pos = OPTIONS[0].length - OPTION_OFFSET;
- OPTIONS[2][pos] = (char) 129;
- for(int i = 0; i < 17; i++)
- {
- OPTIONS[3 + i][pos] = (char) 134;
- }
- OPTIONS[20][pos] = (char) 135;
- }
-
- private void menuMove(Runnable esc, Runnable enter, Runnable down, Runnable up, Runnable end)
- {
- if(KeyHandler.ESCAPE.wasJustReleased())
- {
- esc.run();
- return;
- }
- if(KeyHandler.ENTER.wasJustReleased())
- {
- enter.run();
- return;
- }
- if(KeyHandler.DOWN.getDownTime() > 16)
- {
- KeyHandler.DOWN.resetTime();
- down.run();
- }
- else if(KeyHandler.UP.getDownTime() > 16)
- {
- KeyHandler.UP.resetTime();
- up.run();
- }
- else if(KeyHandler.DOWN.wasJustReleased())
- {
- down.run();
- }
- else if(KeyHandler.UP.wasJustReleased())
- {
- up.run();
- }
- end.run();
- }
-
- public void update()
- {
- if(currentLevel != null)
- {
- SoundUtils.playSound(SoundUtils.Sound.SONG_1);
- SoundUtils.stopSound(SoundUtils.Sound.MENU_MUSIC);
-
- currentLevel.update();
-
- // doing that here to prevent concurent modification
- if(currentLevel.shouldFinish())
- {
- String base = "level." + currentLevel.getName();
- SimpleConfig sp = SAVE_SLOTS[slotScreenIndex];
-
- // save success
- sp.set(base, true);
-
- // update time, if a new highscore was scored
- double time = sp.getDouble(base + ".time", Integer.MAX_VALUE);
- if(currentLevel.getTime() < time)
- {
- sp.set(base + ".time", currentLevel.getTime());
- }
-
- // update bottles, if a new highscore was scored
- int bottles = sp.getInt(base + ".bottles", 0);
- if(currentLevel.getCurrentBottles() > bottles)
- {
- sp.set(base + ".bottles", currentLevel.getCurrentBottles());
- }
-
- // final save
- sp.save();
-
- currentLevel.resetLevel();
- currentLevel = null;
- return;
- }
-
- if(currentLevel.shouldReset())
- {
- if(currentLevel.resetLevel())
- {
- currentLevel = null;
- }
- }
-
- if(KeyHandler.ESCAPE.wasJustReleased())
- {
- currentLevel = null;
- }
- }
- else
- {
- SoundUtils.playSound(SoundUtils.Sound.MENU_MUSIC);
- SoundUtils.stopSound(SoundUtils.Sound.SONG_1);
- switch(screen)
- {
- case 0: // start screen
- {
- menuMove(() ->
- {
- // do nothing on escape in start screen
- }, () ->
- {
- switch(startScreenIndex)
- {
- case 0:
- screen = 1;
- break;
- case 1:
- screen = 2;
- break;
- case 2:
- System.exit(0);
- break;
- }
- }, () -> startScreenIndex++, () -> startScreenIndex--, () ->
- {
- if(startScreenIndex < 0)
- {
- startScreenIndex = 0;
- }
- else if(startScreenIndex >= 3)
- {
- startScreenIndex = 2;
- }
- });
- break;
- }
- case 1: // slot screen
- {
- menuMove(() ->
- {
- screen = 0;
- }, () ->
- {
- if(slotScreenIndex == 3)
- {
- screen = 0;
- return;
- }
- screen = 3;
- }, () -> slotScreenIndex++, () -> slotScreenIndex--, () ->
- {
- if(slotScreenIndex < 0)
- {
- slotScreenIndex = 0;
- }
- else if(slotScreenIndex >= 4)
- {
- slotScreenIndex = 3;
- }
- });
- break;
- }
- case 2: // option screen
- {
- menuMove(() ->
- {
- screen = 0;
- }, () ->
- {
- switch(optionScreenIndex)
- {
- case 0: // toggle sound
- sound = !sound;
- if(!sound)
- {
- SoundUtils.turnSoundOff();
- }
- optionsDirty = true;
- break;
- case 15: // save options
- for(IKeyBinding binding : KeyHandler.ARRAY)
- {
- CONFIG.set(binding.getName(), binding.getKeyName());
- }
- CONFIG.set("sound", sound);
- CONFIG.save();
- optionsDirty = false;
- break;
- case 16: // go back
- screen = 0;
- break;
- default: // rebind keys
- KeyHandler.rebindKey(KeyHandler.ARRAY[optionScreenIndex - 1]);
- optionsDirty = true;
- break;
- }
- }, () -> optionScreenIndex++, () -> optionScreenIndex--, () ->
- {
- if(optionScreenIndex < 0)
- {
- optionScreenIndex = 0;
- }
- else if(optionScreenIndex >= OPTIONS.length - 4)
- {
- optionScreenIndex = OPTIONS.length - 5;
- }
- });
- break;
- }
- case 3: // level choose screen
- {
- menuMove(() ->
- {
- screen = 1;
- }, () -> currentLevel = levels[levelIndex], () -> levelIndex++, () -> levelIndex--, () ->
- {
- if(levelIndex < 0)
- {
- levelIndex = 0;
- }
- else if(levelIndex >= levels.length)
- {
- levelIndex = levels.length - 1;
- }
- });
- break;
- }
- }
- }
- }
-
- public void render()
- {
- if(currentLevel != null)
- {
- currentLevel.render();
- return;
- }
- switch(screen)
- {
- case 0:
- {
- renderer.prepareTextDrawing(255, 255, 255, 1.0, MENU_WIDTH * 5 / 4);
- double x = (renderer.getWidth() - renderer.getTextWidth(MENU_WIDTH)) * 0.5;
- double y = (renderer.getHeight() - renderer.getTextHeight(7)) * 0.5;
- double line = renderer.getTextHeight(1);
-
- renderer.save();
- renderer.setFillColor(128, 128, 128, 1.0);
- renderer.fillRectangle(
- x + renderer.getTextWidth(1),
- y + renderer.getTextHeight(startScreenIndex + 3) - 1,
- renderer.getTextWidth(MENU_WIDTH - 2),
- line);
- renderer.restore();
-
- for(char[] c : START_UP)
- {
- renderer.drawText(x, y, c);
- y += line;
- }
- break;
- }
- case 1:
- {
- renderer.prepareTextDrawing(255, 255, 255, 1.0, MENU_WIDTH * 5 / 4);
- double x = (renderer.getWidth() - renderer.getTextWidth(MENU_WIDTH)) * 0.5;
- double y = (renderer.getHeight() - renderer.getTextHeight(7)) * 0.5;
- double line = renderer.getTextHeight(1);
-
- renderer.save();
- renderer.setFillColor(128, 128, 128, 1.0);
- renderer.fillRectangle(
- x + renderer.getTextWidth(1),
- y + renderer.getTextHeight(slotScreenIndex + 3) - 1,
- renderer.getTextWidth(MENU_WIDTH - 2),
- line);
- renderer.restore();
-
- for(char[] c : SLOTS)
- {
- renderer.drawText(x, y, c);
- y += line;
- }
- break;
- }
- case 2:
- {
- renderer.prepareTextDrawing(255, 255, 255, 1.0, MENU_WIDTH * 5 / 4);
- double x = (renderer.getWidth() - renderer.getTextWidth(MENU_WIDTH)) * 0.5;
- double y = (renderer.getHeight() - renderer.getTextHeight(OPTIONS.length)) * 0.5;
- double line = renderer.getTextHeight(1);
-
- renderer.save();
- renderer.setFillColor(128, 128, 128, 1.0);
- renderer.fillRectangle(
- x + renderer.getTextWidth(1),
- y + renderer.getTextHeight(optionScreenIndex + 3) - 1,
- renderer.getTextWidth(MENU_WIDTH - (OPTION_OFFSET + 1)),
- line);
- renderer.fillRectangle(
- x + renderer.getTextWidth(MENU_WIDTH - (OPTION_OFFSET - 1)),
- y + renderer.getTextHeight(optionScreenIndex + 3) - 1,
- renderer.getTextWidth(OPTION_OFFSET - 2),
- line);
- renderer.restore();
-
- // option top
- for(int i = 0; i < 3; i++)
- {
- renderer.drawText(x, y, OPTIONS[i]);
- y += line;
- }
-
- // sound option
- if(sound)
- {
- int pos = OPTIONS[3].length - OPTION_OFFSET + 1;
- OPTIONS[3][pos] = 'y';
- OPTIONS[3][pos + 1] = 'e';
- OPTIONS[3][pos + 2] = 's';
- }
- else
- {
- int pos = OPTIONS[3].length - OPTION_OFFSET + 1;
- OPTIONS[3][pos] = 'n';
- OPTIONS[3][pos + 1] = 'o';
- OPTIONS[3][pos + 2] = ' ';
- }
- renderer.drawText(x, y, OPTIONS[3]);
- y += line;
-
- // key binding options
- int end = 4 + KeyHandler.ARRAY.length;
- for(int i = 4; i < end; i++)
- {
- String name = KeyHandler.ARRAY[i - 4].toString();
- System.arraycopy(name.toCharArray(), 0, OPTIONS[i],
- OPTIONS[i].length - OPTION_OFFSET + 1, Math.min(OPTION_OFFSET - 2, name.length()));
- renderer.drawText(x, y, OPTIONS[i]);
- y += line;
- }
-
- // save
- renderer.drawText(x, y, OPTIONS[end]);
- if(optionsDirty)
- {
- renderer.save();
- renderer.setFillColor(180, 0, 0, 1);
- renderer.setStrokeColor(180, 0, 0, 1);
- renderer.drawText(x, y, SAVE_OVERLAY);
- renderer.restore();
- }
- else
- {
- renderer.drawText(x, y, SAVE_OVERLAY);
- }
- y += line;
-
- // left over option table
- for(int i = end + 1; i < OPTIONS.length; i++)
- {
- renderer.drawText(x, y, OPTIONS[i]);
- y += line;
- }
-
- break;
- }
- case 3:
- {
- // level screen rendering
- renderer.prepareTextDrawing(255, 255, 255, 1.0, MENU_WIDTH * 5 / 4);
- int listLength = Math.min(levels.length, MENU_MAX);
- double x = (renderer.getWidth() - renderer.getTextWidth(MENU_WIDTH)) * 0.5;
- double y = (renderer.getHeight() - renderer.getTextHeight(listLength + 4)) * 0.5;
- double line = renderer.getTextHeight(1);
- renderer.drawText(x, y, TABLE_TOP);
- y += line;
- renderer.drawText(x, y, TABLE_HEADING);
- y += line;
- renderer.drawText(x, y, TABLE_MID);
- y += line;
- if(levels.length > MENU_MAX)
- {
- int upperHalf = MENU_MAX / 2;
- int downHalf = levels.length - upperHalf;
- if(levelIndex < upperHalf)
- {
- paintStringMarking(x, y, line, levelIndex);
- y = paintLevelName(x, y, line, 0, MENU_MAX - 1);
- renderer.drawText(x, y, TABLE_MORE);
- y += line;
- }
- else if(levelIndex >= downHalf)
- {
- paintStringMarking(x, y, line, levelIndex - downHalf + upperHalf + ((MENU_MAX & 1) != 0 ? 1 : 0));
- renderer.drawText(x, y, TABLE_MORE);
- y += line;
- y = paintLevelName(x, y, line, levels.length - MENU_MAX + 1, MENU_MAX - 1);
- }
- else
- {
- paintStringMarking(x, y, line, upperHalf);
- renderer.drawText(x, y, TABLE_MORE);
- y += line;
- y = paintLevelName(x, y, line, levelIndex - upperHalf + 1, MENU_MAX - 2);
- renderer.drawText(x, y, TABLE_MORE);
- y += line;
- }
- }
- else
- {
- paintStringMarking(x, y, line, levelIndex);
- y = paintLevelName(x, y, line, 0, levels.length);
- }
- renderer.drawText(x, y, TABLE_BOTTOM);
- renderer.stopTextDrawing();
- break;
- }
- }
- }
-
- private double paintLevelName(double x, double y, double line, int from, int length)
- {
- SimpleConfig sp = SAVE_SLOTS[slotScreenIndex];
-
- char[] chars = new char[MENU_WIDTH];
- chars[0] = 134;
- chars[MENU_WIDTH - 1] = 134;
- length += from;
- for(int j = from; j < length; j++)
- {
- String s = levels[j].getName();
- int border = Math.min(MENU_WIDTH - 14, s.length());
- for(int i = 0; i < border; i++)
- {
- chars[i + 1] = s.charAt(i);
- }
- Arrays.fill(chars, border + 1, MENU_WIDTH - 1, (char) 0);
- chars[chars.length - 13] = 134;
- chars[chars.length - 7] = 134;
-
- // bottles
- char[] tmp = levels[j].formatBottles(sp.getInt("level." + s + ".bottles", 0));
- int l = Math.min(5, tmp.length);
- System.arraycopy(tmp, 0, chars, chars.length - 7 - l, l);
- // time
- tmp = levels[j].formatTime(sp.getDouble("level." + s + ".time", -1.0));
- l = Math.min(5, tmp.length);
- System.arraycopy(tmp, 0, chars, chars.length - 1 - l, l);
-
- renderer.drawText(x, y, chars);
- y += line;
- }
- return y;
- }
-
- private void paintStringMarking(double x, double y, double line, int pos)
- {
- renderer.save();
- renderer.setFillColor(128, 128, 128, 1.0);
- renderer.fillRectangle(
- x + renderer.getTextWidth(1),
- y + renderer.getTextHeight(pos) - 1,
- renderer.getTextWidth(MENU_WIDTH - 14),
- line);
-
- renderer.fillRectangle(
- x + renderer.getTextWidth(MENU_WIDTH - 12),
- y + renderer.getTextHeight(pos) - 1,
- renderer.getTextWidth(5),
- line);
-
- renderer.fillRectangle(
- x + renderer.getTextWidth(MENU_WIDTH - 6),
- y + renderer.getTextHeight(pos) - 1,
- renderer.getTextWidth(5),
- line);
- renderer.restore();
- }
-
- public void tickTiles()
- {
- registeredTiles.values().forEach(tile -> tile.tick());
- }
- }
|