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 
Level(int level, DialogEntry dialogs, String title, String time, boolean pastEvent, boolean restartOnDeath, boolean waitMessage)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 
get(int row, int index)68     public static final Level get(int row, int index) {
69     	return levels.get(row).levels.get(index);
70     }
71 
isLoaded(int resource)72     public static final boolean isLoaded(int resource) {
73     	return mLoaded && mLoadedResource == resource;
74     }
75 
loadLevelTree(int resource, Context context)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 
loadAllDialog(Context context)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 
updateCompletedState(int levelRow, int completedLevels)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 
packCompletedLevels(int levelRow)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 
levelIsValid(int row, int index)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 
rowIsValid(int row)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