1cfd74d65d832137e20e193c960802afba73b5d38sm/* 23c1e67e433728684b5f228c5d4f3e5b1457bb271sm * Copyright (C) 2010 The Android Open Source Project 3cfd74d65d832137e20e193c960802afba73b5d38sm * 4cfd74d65d832137e20e193c960802afba73b5d38sm * Licensed under the Apache License, Version 2.0 (the "License"); 5cfd74d65d832137e20e193c960802afba73b5d38sm * you may not use this file except in compliance with the License. 6cfd74d65d832137e20e193c960802afba73b5d38sm * You may obtain a copy of the License at 7cfd74d65d832137e20e193c960802afba73b5d38sm * 8cfd74d65d832137e20e193c960802afba73b5d38sm * http://www.apache.org/licenses/LICENSE-2.0 9cfd74d65d832137e20e193c960802afba73b5d38sm * 10cfd74d65d832137e20e193c960802afba73b5d38sm * Unless required by applicable law or agreed to in writing, software 11cfd74d65d832137e20e193c960802afba73b5d38sm * distributed under the License is distributed on an "AS IS" BASIS, 12cfd74d65d832137e20e193c960802afba73b5d38sm * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cfd74d65d832137e20e193c960802afba73b5d38sm * See the License for the specific language governing permissions and 14cfd74d65d832137e20e193c960802afba73b5d38sm * limitations under the License. 15cfd74d65d832137e20e193c960802afba73b5d38sm */ 16cfd74d65d832137e20e193c960802afba73b5d38sm 17cfd74d65d832137e20e193c960802afba73b5d38smpackage com.replica.replicaisland; 18cfd74d65d832137e20e193c960802afba73b5d38sm 19cfd74d65d832137e20e193c960802afba73b5d38smimport java.util.ArrayList; 20cfd74d65d832137e20e193c960802afba73b5d38sm 21cfd74d65d832137e20e193c960802afba73b5d38smimport org.xmlpull.v1.XmlPullParser; 22cfd74d65d832137e20e193c960802afba73b5d38sm 23cfd74d65d832137e20e193c960802afba73b5d38smimport android.content.Context; 24cfd74d65d832137e20e193c960802afba73b5d38smimport android.content.res.XmlResourceParser; 25cfd74d65d832137e20e193c960802afba73b5d38sm 26cfd74d65d832137e20e193c960802afba73b5d38smpublic final class LevelTree { 27cfd74d65d832137e20e193c960802afba73b5d38sm public static class LevelGroup { 28cfd74d65d832137e20e193c960802afba73b5d38sm public ArrayList<Level> levels = new ArrayList<Level>(); 29cfd74d65d832137e20e193c960802afba73b5d38sm } 30cfd74d65d832137e20e193c960802afba73b5d38sm 31cfd74d65d832137e20e193c960802afba73b5d38sm public static class Level { 32cfd74d65d832137e20e193c960802afba73b5d38sm public int resource; 33cfd74d65d832137e20e193c960802afba73b5d38sm public DialogEntry dialogResources; 34cfd74d65d832137e20e193c960802afba73b5d38sm public String name; 35cfd74d65d832137e20e193c960802afba73b5d38sm public String timeStamp; 36cfd74d65d832137e20e193c960802afba73b5d38sm public boolean completed; 37cfd74d65d832137e20e193c960802afba73b5d38sm public boolean inThePast; 38cfd74d65d832137e20e193c960802afba73b5d38sm public boolean diaryCollected; 39cfd74d65d832137e20e193c960802afba73b5d38sm public boolean restartable; 40cfd74d65d832137e20e193c960802afba73b5d38sm public boolean showWaitMessage; 41cfd74d65d832137e20e193c960802afba73b5d38sm 42cfd74d65d832137e20e193c960802afba73b5d38sm public Level(int level, DialogEntry dialogs, String title, String time, 43cfd74d65d832137e20e193c960802afba73b5d38sm boolean pastEvent, boolean restartOnDeath, boolean waitMessage) { 44cfd74d65d832137e20e193c960802afba73b5d38sm resource = level; 45cfd74d65d832137e20e193c960802afba73b5d38sm dialogResources = dialogs; 46cfd74d65d832137e20e193c960802afba73b5d38sm name = title; 47cfd74d65d832137e20e193c960802afba73b5d38sm timeStamp = time; 48cfd74d65d832137e20e193c960802afba73b5d38sm completed = false; 49cfd74d65d832137e20e193c960802afba73b5d38sm inThePast = pastEvent; 50cfd74d65d832137e20e193c960802afba73b5d38sm diaryCollected = false; 51cfd74d65d832137e20e193c960802afba73b5d38sm restartable = restartOnDeath; 52cfd74d65d832137e20e193c960802afba73b5d38sm showWaitMessage = waitMessage; 53cfd74d65d832137e20e193c960802afba73b5d38sm } 54cfd74d65d832137e20e193c960802afba73b5d38sm 55cfd74d65d832137e20e193c960802afba73b5d38sm } 56cfd74d65d832137e20e193c960802afba73b5d38sm 57cfd74d65d832137e20e193c960802afba73b5d38sm public static class DialogEntry { 58cfd74d65d832137e20e193c960802afba73b5d38sm public int diaryEntry = 0; 59cfd74d65d832137e20e193c960802afba73b5d38sm public int character1Entry = 0; 60cfd74d65d832137e20e193c960802afba73b5d38sm public int character2Entry = 0; 61cfd74d65d832137e20e193c960802afba73b5d38sm public ArrayList<ConversationUtils.Conversation> character1Conversations; 62cfd74d65d832137e20e193c960802afba73b5d38sm public ArrayList<ConversationUtils.Conversation> character2Conversations; 63cfd74d65d832137e20e193c960802afba73b5d38sm } 64cfd74d65d832137e20e193c960802afba73b5d38sm public final static ArrayList<LevelGroup> levels = new ArrayList<LevelGroup>(); 65cfd74d65d832137e20e193c960802afba73b5d38sm private static boolean mLoaded = false; 662b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm private static int mLoadedResource = 0; 67cfd74d65d832137e20e193c960802afba73b5d38sm 68cfd74d65d832137e20e193c960802afba73b5d38sm public static final Level get(int row, int index) { 69cfd74d65d832137e20e193c960802afba73b5d38sm return levels.get(row).levels.get(index); 70cfd74d65d832137e20e193c960802afba73b5d38sm } 71cfd74d65d832137e20e193c960802afba73b5d38sm 722b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm public static final boolean isLoaded(int resource) { 732b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm return mLoaded && mLoadedResource == resource; 74cfd74d65d832137e20e193c960802afba73b5d38sm } 75cfd74d65d832137e20e193c960802afba73b5d38sm 76cfd74d65d832137e20e193c960802afba73b5d38sm public static final void loadLevelTree(int resource, Context context) { 772b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm if (levels.size() > 0 && mLoadedResource == resource) { 78cfd74d65d832137e20e193c960802afba73b5d38sm // already loaded 79cfd74d65d832137e20e193c960802afba73b5d38sm return; 80cfd74d65d832137e20e193c960802afba73b5d38sm } 81cfd74d65d832137e20e193c960802afba73b5d38sm 82cfd74d65d832137e20e193c960802afba73b5d38sm XmlResourceParser parser = context.getResources().getXml(resource); 83cfd74d65d832137e20e193c960802afba73b5d38sm 84cfd74d65d832137e20e193c960802afba73b5d38sm levels.clear(); 85cfd74d65d832137e20e193c960802afba73b5d38sm 86cfd74d65d832137e20e193c960802afba73b5d38sm LevelGroup currentGroup = null; 87cfd74d65d832137e20e193c960802afba73b5d38sm Level currentLevel = null; 88cfd74d65d832137e20e193c960802afba73b5d38sm DialogEntry currentDialog = null; 89cfd74d65d832137e20e193c960802afba73b5d38sm 90cfd74d65d832137e20e193c960802afba73b5d38sm try { 91cfd74d65d832137e20e193c960802afba73b5d38sm int eventType = parser.getEventType(); 92cfd74d65d832137e20e193c960802afba73b5d38sm while (eventType != XmlPullParser.END_DOCUMENT) { 93cfd74d65d832137e20e193c960802afba73b5d38sm if(eventType == XmlPullParser.START_TAG) { 94cfd74d65d832137e20e193c960802afba73b5d38sm if (parser.getName().equals("group")) { 95cfd74d65d832137e20e193c960802afba73b5d38sm currentGroup = new LevelGroup(); 96cfd74d65d832137e20e193c960802afba73b5d38sm levels.add(currentGroup); 97cfd74d65d832137e20e193c960802afba73b5d38sm currentLevel = null; 98cfd74d65d832137e20e193c960802afba73b5d38sm currentDialog = null; 99cfd74d65d832137e20e193c960802afba73b5d38sm } 100cfd74d65d832137e20e193c960802afba73b5d38sm 101cfd74d65d832137e20e193c960802afba73b5d38sm if (parser.getName().equals("level") && currentGroup != null) { 102cfd74d65d832137e20e193c960802afba73b5d38sm int levelResource = 0; 103cfd74d65d832137e20e193c960802afba73b5d38sm String titleString = null; 104cfd74d65d832137e20e193c960802afba73b5d38sm String timeStamp = null; 105cfd74d65d832137e20e193c960802afba73b5d38sm boolean inThePast = false; 106cfd74d65d832137e20e193c960802afba73b5d38sm boolean restartable = true; 107cfd74d65d832137e20e193c960802afba73b5d38sm boolean showWaitMessage = false; 108cfd74d65d832137e20e193c960802afba73b5d38sm for(int i=0; i < parser.getAttributeCount(); i++) { 109cfd74d65d832137e20e193c960802afba73b5d38sm if (parser.getAttributeName(i).equals("past")) { 110cfd74d65d832137e20e193c960802afba73b5d38sm if (parser.getAttributeValue(i).equals("true")) { 111cfd74d65d832137e20e193c960802afba73b5d38sm inThePast = true; 112cfd74d65d832137e20e193c960802afba73b5d38sm } 113cfd74d65d832137e20e193c960802afba73b5d38sm } else if (parser.getAttributeName(i).equals("restartable")) { 114cfd74d65d832137e20e193c960802afba73b5d38sm if (parser.getAttributeValue(i).equals("false")) { 115cfd74d65d832137e20e193c960802afba73b5d38sm restartable = false; 116cfd74d65d832137e20e193c960802afba73b5d38sm } 117cfd74d65d832137e20e193c960802afba73b5d38sm } else if (parser.getAttributeName(i).equals("waitmessage")) { 118cfd74d65d832137e20e193c960802afba73b5d38sm if (parser.getAttributeValue(i).equals("true")) { 119cfd74d65d832137e20e193c960802afba73b5d38sm showWaitMessage = true; 120cfd74d65d832137e20e193c960802afba73b5d38sm } 121cfd74d65d832137e20e193c960802afba73b5d38sm } else { 122cfd74d65d832137e20e193c960802afba73b5d38sm final int value = parser.getAttributeResourceValue(i, -1); 123cfd74d65d832137e20e193c960802afba73b5d38sm if (value != -1) { 124cfd74d65d832137e20e193c960802afba73b5d38sm if (parser.getAttributeName(i).equals("resource")) { 125cfd74d65d832137e20e193c960802afba73b5d38sm levelResource = value; 126cfd74d65d832137e20e193c960802afba73b5d38sm } 127cfd74d65d832137e20e193c960802afba73b5d38sm if (parser.getAttributeName(i).equals("title")) { 128cfd74d65d832137e20e193c960802afba73b5d38sm titleString = context.getString(value); 129cfd74d65d832137e20e193c960802afba73b5d38sm } else if (parser.getAttributeName(i).equals("time")) { 130cfd74d65d832137e20e193c960802afba73b5d38sm timeStamp = context.getString(value); 131cfd74d65d832137e20e193c960802afba73b5d38sm } 132cfd74d65d832137e20e193c960802afba73b5d38sm } 133cfd74d65d832137e20e193c960802afba73b5d38sm } 134cfd74d65d832137e20e193c960802afba73b5d38sm 135cfd74d65d832137e20e193c960802afba73b5d38sm } 136cfd74d65d832137e20e193c960802afba73b5d38sm currentDialog = null; 137cfd74d65d832137e20e193c960802afba73b5d38sm currentLevel = new Level(levelResource, null, titleString, timeStamp, inThePast, restartable, showWaitMessage); 138cfd74d65d832137e20e193c960802afba73b5d38sm currentGroup.levels.add(currentLevel); 139cfd74d65d832137e20e193c960802afba73b5d38sm } 140cfd74d65d832137e20e193c960802afba73b5d38sm 141cfd74d65d832137e20e193c960802afba73b5d38sm if (parser.getName().equals("dialog") && currentLevel != null) { 142cfd74d65d832137e20e193c960802afba73b5d38sm currentDialog = new DialogEntry(); 143cfd74d65d832137e20e193c960802afba73b5d38sm currentLevel.dialogResources = currentDialog; 144cfd74d65d832137e20e193c960802afba73b5d38sm } 145cfd74d65d832137e20e193c960802afba73b5d38sm 146cfd74d65d832137e20e193c960802afba73b5d38sm if (parser.getName().equals("diary") && currentDialog != null) { 147cfd74d65d832137e20e193c960802afba73b5d38sm 148cfd74d65d832137e20e193c960802afba73b5d38sm for(int i=0; i < parser.getAttributeCount(); i++) { 149cfd74d65d832137e20e193c960802afba73b5d38sm final int value = parser.getAttributeResourceValue(i, -1); 150cfd74d65d832137e20e193c960802afba73b5d38sm if (value != -1) { 151cfd74d65d832137e20e193c960802afba73b5d38sm if (parser.getAttributeName(i).equals("resource")) { 152cfd74d65d832137e20e193c960802afba73b5d38sm currentDialog.diaryEntry = value; 153cfd74d65d832137e20e193c960802afba73b5d38sm } 154cfd74d65d832137e20e193c960802afba73b5d38sm 155cfd74d65d832137e20e193c960802afba73b5d38sm } 156cfd74d65d832137e20e193c960802afba73b5d38sm } 157cfd74d65d832137e20e193c960802afba73b5d38sm } 158cfd74d65d832137e20e193c960802afba73b5d38sm 159cfd74d65d832137e20e193c960802afba73b5d38sm if (parser.getName().equals("character1") && currentDialog != null) { 160cfd74d65d832137e20e193c960802afba73b5d38sm for(int i=0; i < parser.getAttributeCount(); i++) { 161cfd74d65d832137e20e193c960802afba73b5d38sm final int value = parser.getAttributeResourceValue(i, -1); 162cfd74d65d832137e20e193c960802afba73b5d38sm if (value != -1) { 163cfd74d65d832137e20e193c960802afba73b5d38sm if (parser.getAttributeName(i).equals("resource")) { 164cfd74d65d832137e20e193c960802afba73b5d38sm currentDialog.character1Entry = value; 165cfd74d65d832137e20e193c960802afba73b5d38sm } 166cfd74d65d832137e20e193c960802afba73b5d38sm 167cfd74d65d832137e20e193c960802afba73b5d38sm } 168cfd74d65d832137e20e193c960802afba73b5d38sm } 169cfd74d65d832137e20e193c960802afba73b5d38sm } 170cfd74d65d832137e20e193c960802afba73b5d38sm 171cfd74d65d832137e20e193c960802afba73b5d38sm if (parser.getName().equals("character2") && currentDialog != null) { 172cfd74d65d832137e20e193c960802afba73b5d38sm 173cfd74d65d832137e20e193c960802afba73b5d38sm for(int i=0; i < parser.getAttributeCount(); i++) { 174cfd74d65d832137e20e193c960802afba73b5d38sm final int value = parser.getAttributeResourceValue(i, -1); 175cfd74d65d832137e20e193c960802afba73b5d38sm if (value != -1) { 176cfd74d65d832137e20e193c960802afba73b5d38sm if (parser.getAttributeName(i).equals("resource")) { 177cfd74d65d832137e20e193c960802afba73b5d38sm currentDialog.character2Entry = value; 178cfd74d65d832137e20e193c960802afba73b5d38sm } 179cfd74d65d832137e20e193c960802afba73b5d38sm 180cfd74d65d832137e20e193c960802afba73b5d38sm } 181cfd74d65d832137e20e193c960802afba73b5d38sm } 182cfd74d65d832137e20e193c960802afba73b5d38sm } 183cfd74d65d832137e20e193c960802afba73b5d38sm 184cfd74d65d832137e20e193c960802afba73b5d38sm } 185cfd74d65d832137e20e193c960802afba73b5d38sm eventType = parser.next(); 186cfd74d65d832137e20e193c960802afba73b5d38sm } 187cfd74d65d832137e20e193c960802afba73b5d38sm } catch(Exception e) { 188cfd74d65d832137e20e193c960802afba73b5d38sm DebugLog.e("LevelTree", e.getStackTrace().toString()); 189cfd74d65d832137e20e193c960802afba73b5d38sm } finally { 190cfd74d65d832137e20e193c960802afba73b5d38sm parser.close(); 191cfd74d65d832137e20e193c960802afba73b5d38sm } 192cfd74d65d832137e20e193c960802afba73b5d38sm mLoaded = true; 1932b1168acefb6a4104bb7f008df6ac51fcd1de7ecsm mLoadedResource = resource; 194cfd74d65d832137e20e193c960802afba73b5d38sm } 195cfd74d65d832137e20e193c960802afba73b5d38sm 196cfd74d65d832137e20e193c960802afba73b5d38sm public final static void loadAllDialog(Context context) { 197cfd74d65d832137e20e193c960802afba73b5d38sm final int levelGroupCount = levels.size(); 198cfd74d65d832137e20e193c960802afba73b5d38sm for (int x = 0; x < levelGroupCount; x++) { 199cfd74d65d832137e20e193c960802afba73b5d38sm final ArrayList<Level> row = levels.get(x).levels; 200cfd74d65d832137e20e193c960802afba73b5d38sm final int levelCount = row.size(); 201cfd74d65d832137e20e193c960802afba73b5d38sm for (int y = 0; y < levelCount; y++) { 202cfd74d65d832137e20e193c960802afba73b5d38sm final Level level = row.get(y); 203cfd74d65d832137e20e193c960802afba73b5d38sm if (level != null && level.dialogResources != null) { 204cfd74d65d832137e20e193c960802afba73b5d38sm DialogEntry dialog = level.dialogResources; 205cfd74d65d832137e20e193c960802afba73b5d38sm if (dialog.character1Entry != 0) { 206cfd74d65d832137e20e193c960802afba73b5d38sm dialog.character1Conversations = ConversationUtils.loadDialog(dialog.character1Entry, context); 207cfd74d65d832137e20e193c960802afba73b5d38sm } 208cfd74d65d832137e20e193c960802afba73b5d38sm 209cfd74d65d832137e20e193c960802afba73b5d38sm if (dialog.character2Entry != 0) { 210cfd74d65d832137e20e193c960802afba73b5d38sm dialog.character2Conversations = ConversationUtils.loadDialog(dialog.character2Entry, context); 211cfd74d65d832137e20e193c960802afba73b5d38sm } 212cfd74d65d832137e20e193c960802afba73b5d38sm } 213cfd74d65d832137e20e193c960802afba73b5d38sm } 214cfd74d65d832137e20e193c960802afba73b5d38sm 215cfd74d65d832137e20e193c960802afba73b5d38sm } 216cfd74d65d832137e20e193c960802afba73b5d38sm } 217cfd74d65d832137e20e193c960802afba73b5d38sm 218cfd74d65d832137e20e193c960802afba73b5d38sm public final static void updateCompletedState(int levelRow, int completedLevels) { 219cfd74d65d832137e20e193c960802afba73b5d38sm final int rowCount = levels.size(); 220cfd74d65d832137e20e193c960802afba73b5d38sm for (int x = 0; x < rowCount; x++) { 221cfd74d65d832137e20e193c960802afba73b5d38sm final LevelGroup group = levels.get(x); 222cfd74d65d832137e20e193c960802afba73b5d38sm final int levelCount = group.levels.size(); 223cfd74d65d832137e20e193c960802afba73b5d38sm for (int y = 0; y < levelCount; y++) { 224cfd74d65d832137e20e193c960802afba73b5d38sm final Level level = group.levels.get(y); 225cfd74d65d832137e20e193c960802afba73b5d38sm if (x < levelRow) { 226cfd74d65d832137e20e193c960802afba73b5d38sm level.completed = true; 227cfd74d65d832137e20e193c960802afba73b5d38sm } else if (x == levelRow) { 228cfd74d65d832137e20e193c960802afba73b5d38sm if ((completedLevels & (1 << y)) != 0) { 229cfd74d65d832137e20e193c960802afba73b5d38sm level.completed = true; 230cfd74d65d832137e20e193c960802afba73b5d38sm } 231cfd74d65d832137e20e193c960802afba73b5d38sm } else { 232cfd74d65d832137e20e193c960802afba73b5d38sm level.completed = false; 233cfd74d65d832137e20e193c960802afba73b5d38sm } 234cfd74d65d832137e20e193c960802afba73b5d38sm } 235cfd74d65d832137e20e193c960802afba73b5d38sm } 236cfd74d65d832137e20e193c960802afba73b5d38sm 237cfd74d65d832137e20e193c960802afba73b5d38sm } 238cfd74d65d832137e20e193c960802afba73b5d38sm 239cfd74d65d832137e20e193c960802afba73b5d38sm public final static int packCompletedLevels(int levelRow) { 240cfd74d65d832137e20e193c960802afba73b5d38sm int completed = 0; 241cfd74d65d832137e20e193c960802afba73b5d38sm final LevelGroup group = levels.get(levelRow); 242cfd74d65d832137e20e193c960802afba73b5d38sm final int levelCount = group.levels.size(); 243cfd74d65d832137e20e193c960802afba73b5d38sm for (int y = 0; y < levelCount; y++) { 244cfd74d65d832137e20e193c960802afba73b5d38sm final Level level = group.levels.get(y); 245cfd74d65d832137e20e193c960802afba73b5d38sm if (level.completed) { 246cfd74d65d832137e20e193c960802afba73b5d38sm completed |= 1 << y; 247cfd74d65d832137e20e193c960802afba73b5d38sm } 248cfd74d65d832137e20e193c960802afba73b5d38sm } 249cfd74d65d832137e20e193c960802afba73b5d38sm return completed; 250cfd74d65d832137e20e193c960802afba73b5d38sm } 251cfd74d65d832137e20e193c960802afba73b5d38sm 252cfd74d65d832137e20e193c960802afba73b5d38sm public static boolean levelIsValid(int row, int index) { 253cfd74d65d832137e20e193c960802afba73b5d38sm boolean valid = false; 254cfd74d65d832137e20e193c960802afba73b5d38sm if (row >= 0 && row < levels.size()) { 255cfd74d65d832137e20e193c960802afba73b5d38sm final LevelGroup group = levels.get(row); 256cfd74d65d832137e20e193c960802afba73b5d38sm if (index >=0 && index < group.levels.size()) { 257cfd74d65d832137e20e193c960802afba73b5d38sm valid = true; 258cfd74d65d832137e20e193c960802afba73b5d38sm } 259cfd74d65d832137e20e193c960802afba73b5d38sm } 260cfd74d65d832137e20e193c960802afba73b5d38sm 261cfd74d65d832137e20e193c960802afba73b5d38sm return valid; 262cfd74d65d832137e20e193c960802afba73b5d38sm } 263cfd74d65d832137e20e193c960802afba73b5d38sm 264cfd74d65d832137e20e193c960802afba73b5d38sm public static boolean rowIsValid(int row) { 265cfd74d65d832137e20e193c960802afba73b5d38sm boolean valid = false; 266cfd74d65d832137e20e193c960802afba73b5d38sm if (row >= 0 && row < levels.size()) { 267cfd74d65d832137e20e193c960802afba73b5d38sm valid = true; 268cfd74d65d832137e20e193c960802afba73b5d38sm } 269cfd74d65d832137e20e193c960802afba73b5d38sm 270cfd74d65d832137e20e193c960802afba73b5d38sm return valid; 271cfd74d65d832137e20e193c960802afba73b5d38sm } 272cfd74d65d832137e20e193c960802afba73b5d38sm 273cfd74d65d832137e20e193c960802afba73b5d38sm} 274