diff --git a/res/values/strings.xml b/res/values/strings.xml index 3d77d33..62087d1 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -2,9 +2,13 @@ RpyPlayer. Everlasting Summer Действия + Предыдущая сцена + Следующая сцена Навигация + @string/to_prev_scene + @string/to_next_scene @string/navigate diff --git a/src/com/annimon/everlastingsummer/Parser.java b/src/com/annimon/everlastingsummer/Parser.java index bac15f8..b608a50 100644 --- a/src/com/annimon/everlastingsummer/Parser.java +++ b/src/com/annimon/everlastingsummer/Parser.java @@ -71,6 +71,39 @@ public final class Parser { } while (!terminal); } + public void prevScene() { + // Для перехода к предыдущей сцене, следует два раза найти токен SCENE, + // т.к. при первом поиске мы найдём лишь текущую. + final int currentScene = find(TokenType.SCENE, -1); + final int pos = findFrom(currentScene, TokenType.SCENE, -1); + // Если не нашли - перематываем на начало. + if (pos == position) position = 0; + else position = pos; + next(); + } + + public void nextScene() { + position = find(TokenType.SCENE, 1); + next(); + } + + private int find(TokenType which, int step) { + return findFrom(position, which, step); + } + + private int findFrom(int from, TokenType which, int step) { + int pos = from; + while (true) { + pos += step; + if (pos < 0 || pos >= tokensCount) break; + + final Token token = tokens.get(pos); + if (which == token.getType()) return pos; + } + // Возвращаем текущее значение во избежание лишних проверок. + return from; + } + private boolean statement() { // http://www.renpy.org/wiki/renpy/doc/reference/The_Ren%27Py_Language#Grammar_Rules final Token token = get(0); diff --git a/src/com/annimon/everlastingsummer/ViewActivity.java b/src/com/annimon/everlastingsummer/ViewActivity.java index d41351f..321d589 100644 --- a/src/com/annimon/everlastingsummer/ViewActivity.java +++ b/src/com/annimon/everlastingsummer/ViewActivity.java @@ -153,6 +153,12 @@ public final class ViewActivity extends Activity implements TouchGesture.OnTouch private void onMenuItemSelected(int item) { switch (item) { case 0: + Parser.getInstance().prevScene(); + break; + case 1: + Parser.getInstance().nextScene(); + break; + case 2: Dialogs.with(getInstance()).showNavigate(); break; }