package com.znv.linkup.core.status;
import com.znv.linkup.core.GameSettings;
import com.znv.linkup.core.card.PiecePair;
import com.znv.linkup.core.card.path.LinkInfo;
import com.znv.linkup.core.config.LevelCfg;
/**
* 游戏状态管理
*
* @author yzb
*
*/
public class GameStatus {
/**
* 游戏状态:空闲,游戏,提示,暂停
*
* @author yzb
*
*/
enum GameState {
None, Playing, Prompt, Pause
}
public GameStatus(LevelCfg levelCfg) {
this(levelCfg, null);
}
public GameStatus(LevelCfg levelCfg, IGameStatus listener) {
this.listener = listener;
gameTime = new GameTime(levelCfg.getLevelMode(), levelCfg.getLevelTime(), listener);
gameScore = new GameScore(listener);
gameCombo = new GameCombo(listener);
}
/**
* 游戏开始
*/
public void start() {
gameTime.stop();
gameState = GameState.Playing;
gameTime.start();
}
/**
* 游戏重排
*/
public void refresh() {
gameCombo.clearCombo();
if (listener != null) {
listener.onRefresh();
}
}
/**
* 游戏暂停
*/
public void pause() {
// 游戏结束时暂停和重启游戏无效
if (gameState != GameState.None) {
gameTime.stop();
gameState = GameState.Pause;
if (listener != null) {
listener.onGamePause();
}
}
}
/**
* 游戏重新开始
*/
public void resume() {
if (gameState == GameState.Pause) {
if (gameTime.getGameTime() >= 0) {
gameTime.start();
if (listener != null) {
listener.onGameResume();
}
}
}
}
/**
* 游戏停止
*/
public void stop() {
gameState = GameState.None;
gameTime.stop();
}
/**
* 游戏失败
*/
public void fail() {
stop();
if (listener != null) {
listener.onGameFail();
}
}
/**
* 游戏胜利
*/
public void win() {
stop();
if (listener != null) {
listener.onGameWin();
}
}
/**
* 游戏提示
*
* @param pair
* 提示的卡片对
*/
public void prompt(PiecePair pair) {
gameState = GameState.Prompt;
if (listener != null) {
listener.onPrompt(pair);
}
}
/**
* 取消提示
*
* @param pair
* 取消提示的卡片对
*/
public void unPrompt(PiecePair pair) {
if (gameState == GameState.Prompt) {
gameState = GameState.Playing;
if (listener != null) {
listener.onUnPrompt(pair);
}
}
}
/**
* 配对成功
*
* @param linkInfo
* 路径信息
*/
public void matchSuccess(LinkInfo linkInfo) {
gameTime.addTime(GameSettings.RewardTime);
gameScore.addScore(GameSettings.CardScore * 2 + gameScore.getCornerScore(linkInfo) + gameCombo.getComboScore()
+ (int) (Math.random() * GameSettings.RewardScoreMax));
}
public void addGameTime(int seconds) {
gameTime.addTime(seconds);
}
/**
* 获取游戏时间
*
* @return 游戏时间
*/
public int getGameTime() {
return gameTime.getGameTime();
}
/**
* 获取游戏积分
*
* @return 游戏积分
*/
public int getGameScore() {
return gameScore.getGameScore();
}
/**
* 获取游戏连击
*
* @return 连击数
*/
public int getGameCombo() {
return gameCombo.getGameCombo();
}
/**
* 获取奖励分数
*
* @return 奖励分数
*/
public int getRewardScore() {
return gameScore.getRewardScore(gameTime.getGameTime());
}
private GameTime gameTime;
private GameCombo gameCombo;
private GameScore gameScore;
private IGameStatus listener;
private GameState gameState;
}