package com.znv.linkup.core.config;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.content.res.XmlResourceParser;
/**
* 游戏配置类,根据xml文件解析游戏关卡配置
*
* @author yzb
*
*/
public class GameCfg {
private XmlResourceParser xrp;
public GameCfg(XmlPullParser xpp) {
this.xrp = (XmlResourceParser) xpp;
LoadConfig();
}
/**
* 加载配置
*/
public void LoadConfig() {
if (xrp == null) {
return;
}
ModeCfg modeInfo = null;
RankCfg rankInfo = null;
LevelCfg levelInfo = null;
try {
while (xrp.getEventType() != XmlResourceParser.END_DOCUMENT) {
if (xrp.getEventType() == XmlResourceParser.START_TAG) {
String tagName = xrp.getName();
if (tagName.equals("game")) {
LoadGlobalCfg(xrp);
} else if (tagName.equals("mode")) {
if (modeInfo != null) {
if (rankInfo != null) {
if (levelInfo != null) {
setlevelByMode(levelInfo, modeInfo);
setlevelByRank(levelInfo, rankInfo);
levelInfo.initStarScores();
rankInfo.getLevelInfos().add(levelInfo);
levelInfo = null;
}
modeInfo.getRankInfos().add(rankInfo);
rankInfo = null;
}
modeInfos.add(modeInfo);
modeInfo = null;
}
modeInfo = LoadModeCfg(xrp);
} else if (tagName.equals("rank")) {
if (rankInfo != null) {
if (levelInfo != null) {
setlevelByMode(levelInfo, modeInfo);
setlevelByRank(levelInfo, rankInfo);
levelInfo.initStarScores();
rankInfo.getLevelInfos().add(levelInfo);
levelInfo = null;
}
modeInfo.getRankInfos().add(rankInfo);
rankInfo = null;
}
rankInfo = LoadRankCfg(xrp);
} else if (tagName.equals("level")) {
if (rankInfo != null && levelInfo != null) {
setlevelByMode(levelInfo, modeInfo);
setlevelByRank(levelInfo, rankInfo);
levelInfo.initStarScores();
rankInfo.getLevelInfos().add(levelInfo);
levelInfo = null;
}
levelInfo = LoadLevelCfg(xrp);
}
} else if (xrp.getEventType() == XmlResourceParser.END_TAG) {
String tagName = xrp.getName();
if (tagName.equals("mode")) {
if (modeInfo != null) {
if (rankInfo != null) {
if (levelInfo != null) {
setlevelByMode(levelInfo, modeInfo);
setlevelByRank(levelInfo, rankInfo);
levelInfo.initStarScores();
rankInfo.getLevelInfos().add(levelInfo);
levelInfo = null;
}
modeInfo.getRankInfos().add(rankInfo);
rankInfo = null;
}
modeInfos.add(modeInfo);
modeInfo = null;
}
} else if (tagName.equals("rank")) {
if (rankInfo != null) {
if (levelInfo != null) {
setlevelByMode(levelInfo, modeInfo);
setlevelByRank(levelInfo, rankInfo);
levelInfo.initStarScores();
rankInfo.getLevelInfos().add(levelInfo);
levelInfo = null;
}
modeInfo.getRankInfos().add(rankInfo);
rankInfo = null;
}
} else if (tagName.equals("level")) {
if (rankInfo != null && levelInfo != null) {
setlevelByMode(levelInfo, modeInfo);
setlevelByRank(levelInfo, rankInfo);
levelInfo.initStarScores();
rankInfo.getLevelInfos().add(levelInfo);
levelInfo = null;
}
}
}
xrp.next();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
private void setlevelByMode(LevelCfg levelInfo, ModeCfg modeInfo) {
levelInfo.setLevelMode(GameMode.valueOf(Integer.parseInt(modeInfo.getModeId())));
}
private void setlevelByRank(LevelCfg levelInfo, RankCfg rankInfo) {
levelInfo.setLevelBackground(rankInfo.getRankBackground());
levelInfo.setRankName(rankInfo.getRankName());
levelInfo.setGameSkin(rankInfo.getGameSkin());
}
/**
* 加载全局配置
*
* @param xrp
* xml节点
*/
private void LoadGlobalCfg(XmlResourceParser xrp) {
GlobalCfg gamecfg = new GlobalCfg();
gamecfg.setGameSound(xrp.getAttributeValue(null, "gsound").equals("1"));
gamecfg.setGameBgMusic(xrp.getAttributeValue(null, "bgmusic").equals("1"));
gamecfg.setPromptNum(Integer.parseInt(xrp.getAttributeValue(null, "prompt")));
gamecfg.setRefreshNum(Integer.parseInt(xrp.getAttributeValue(null, "refresh")));
gamecfg.setAddTimeNum(Integer.parseInt(xrp.getAttributeValue(null, "addtime")));
// 设置所有关卡的全局配置
LevelCfg.globalCfg = gamecfg;
}
/**
* 加载模式配置
*
* @param xrp
* xml节点
* @return 模式配置信息
*/
private ModeCfg LoadModeCfg(XmlResourceParser xrp) {
String name = xrp.getAttributeValue(null, "name");
ModeCfg gMode = new ModeCfg(name);
gMode.setModeId(String.valueOf(modeCount++));
return gMode;
}
/**
* 加载等级配置
*
* @param xrp
* xml节点
* @return 等级配置信息
*/
private RankCfg LoadRankCfg(XmlResourceParser xrp) {
String name = xrp.getAttributeValue(null, "name");
RankCfg gRank = new RankCfg(name);
gRank.setRankId(String.valueOf(rankCount++));
gRank.setGameSkin(xrp.getAttributeValue(null, "gskin"));
gRank.setRankBackground(Integer.parseInt(xrp.getAttributeValue(null, "bg")));
return gRank;
}
/**
* 加载关卡配置
*
* @param xrp
* xml节点
* @return 关卡配置信息
*/
private LevelCfg LoadLevelCfg(XmlResourceParser xrp) {
String name = xrp.getAttributeValue(null, "name");
LevelCfg levelCfg = new LevelCfg(name);
levelCfg.setLevelId(levelCount++);
levelCfg.setYSize(Integer.parseInt(xrp.getAttributeValue(null, "ysize")));
levelCfg.setXSize(Integer.parseInt(xrp.getAttributeValue(null, "xsize")));
levelCfg.setLevelTime(Integer.parseInt(xrp.getAttributeValue(null, "gtime")));
levelCfg.setLevelAlign(GameAlign.valueOf(Integer.parseInt(xrp.getAttributeValue(null, "galign"))));
levelCfg.setEmptyNum(Integer.parseInt(xrp.getAttributeValue(null, "empty")));
levelCfg.setObstacleNum(Integer.parseInt(xrp.getAttributeValue(null, "obstacle")));
String starStr = xrp.getAttributeValue(null, "star");
if (starStr != null) {
levelCfg.setStars(Integer.parseInt(starStr));
}
levelCfg.setMaptplStr(xrp.getAttributeValue(null, "maptpl"));
return levelCfg;
}
/**
* 获取游戏等级信息列表
*
* @return 游戏等级信息列表
*/
public List<ModeCfg> getModeInfos() {
return modeInfos;
}
private int levelCount = 0;
private int rankCount = 0;
private int modeCount = 0;
private List<ModeCfg> modeInfos = new ArrayList<ModeCfg>();
}