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