package sample.game.controller;
import java.util.ArrayList;
import library.core.debug.CoreLog;
import library.core.mainAI.RiverCrossingAI;
import library.core.model.CoreModel;
import library.core.object.CoreTextObjectFactory;
import sample.game.ai.AiSystem;
import sample.game.ai.AiSystemType1;
import sample.game.ai.Memory;
import sample.game.main.MainActivity;
import sample.game.main.MainActivity.gameSeType;
import sample.game.manager.EndIsland;
import sample.game.manager.Island;
import sample.game.manager.LayoutManager;
import sample.game.manager.StartIsland;
import sample.game.model.AiChara;
import sample.game.model.BackToTitleButton;
import sample.game.model.BoatModel;
import sample.game.model.ButtonNextTurn;
import sample.game.model.CharaModel;
import sample.game.model.CharaModel.TARGET_TYPE;
import sample.game.model.CrossButton;
import sample.game.model.ExampleBox;
import sample.game.model.NumBox;
import sample.game.model.OnemorePlayButton;
import sample.game.model.OppositeIcon;
import android.view.MotionEvent;
public class GameController {
private CoreTextObjectFactory textFactory;
private ArrayList<CharaModel> targets;
private ArrayList<CharaModel> allCharacter;
private BoatModel boat;
private StartIsland startIsland;
private EndIsland endIsland;
private LayoutManager layoutManager;
private ButtonNextTurn turnChangeButton;
private MainActivity palent;
private ArrayList<OppositeIcon> oppositeRightIcons;
private ArrayList<OppositeIcon> oppositeLeftIcons;
private ArrayList<CoreModel> selectIcons;
private AiChara aiChara;
private CrossButton crossButton;
private ExampleBox exampleBox;
private OnemorePlayButton onemorePlayButton;
private BackToTitleButton backToTitleButton;
private CoreModel fadeMask;
private CoreModel perfectLogo;
private CoreModel clearLogo;
private NumBox numbox;
private NumBox numboxS;
private CoreModel backScreen;
private CoreModel gameoverScreenTypeWolf;
private CoreModel gameoverScreenTypeCabbage;
private CoreModel gameoverScreenTypeAi;
private CoreModel returnBackScreen;
private CoreModel returnIcon;
private int moveNum; //移動したキャラの数
private int moveNumMax;
private float time=0;
private float bifTouchX;
private float bifTouchY;
//ターゲットの移動前座標
private float targetBifX;
private float targetBifY;
private boolean isEndGame=false;
private boolean nowTurnChangePhase=false; //ターン変更中の演出用
private boolean nowCharaMovePhase=false; //キャラの移動演出フラグ
private boolean nowBackScreenMovePhase=false;
private boolean nowCharaGetOffPhase=false; //キャラが船から降りるフェーズ
private boolean isUseAi=true;
private boolean isStopUpdate=false;
private boolean isStopUpdate2=false;
private boolean isRestarGamePhase=false;
private boolean isGameEndPhase=false;
private boolean initProduction;
//AIに使用するもの
private AiSystem ai;
private Memory moveData; //移動情報の保存
private boolean isNowReturnPhase=false;
private boolean isNowReturnPhaseIfBoatMode=false;
private boolean isNowReturnPhaseIfNormal=false;
private boolean isNowboatBackMove=false; //ボートを急に後ろ向きに動かすフラグ
private int bifMoveMinisterNum=0;
private int bifMoveWolfNum=0;
private int bifMoveCabbageNum=0;
private int bifMoveCattleMoveNum=0;
private int count=0;
private float returnTime=0;
/**
* 初期演出をするかどうか
* @param isInitProduction
*/
public GameController(boolean isInitProduction){
oppositeRightIcons=new ArrayList<OppositeIcon>();
oppositeLeftIcons=new ArrayList<OppositeIcon>();
selectIcons=new ArrayList<CoreModel>();
targets=new ArrayList<CharaModel>();
allCharacter=new ArrayList<CharaModel>();
this.initProduction=isInitProduction;
this.isNowReturnPhase=false;
this.isNowReturnPhaseIfBoatMode=false;
this.isNowboatBackMove=false;
RiverCrossingAI.getBgmPlayer().play("bgm/game.ogg", 0);
}
/**
* 初期化
* @param palent
* @param textFactory
* @param startIsland
* @param endIsland
* @param nextButton
* @param boat
* @param layoutManager
*/
public void init(MainActivity palent,StartIsland startIsland,EndIsland endIsland,
ButtonNextTurn nextButton,
BoatModel boat,LayoutManager layoutManager){
this.startIsland=startIsland;
this.endIsland=endIsland;
this.palent=palent;
this.boat=boat;
this.turnChangeButton=nextButton;
this.layoutManager=layoutManager;
this.targets.clear();
this.moveNum=0;
moveNumMax=boat.getRideMaxMenberNum();
//moveNumMax=4;
}
/**
* 初期演出を行うかどうかの判定
*/
public void checkInitProduction(){
//初期演出をする場合、入力を一定時間だけ切る
if(initProduction){
//initの呼ばれるタイミングでは、すべてのフィールドの準備が完了していることを想定
for(int i=0;i<allCharacter.size();i++){
allCharacter.get(i).setCanTouch(false);
}
fadeMask.setAlpha(255);
fadeMask.setShowView(true);
time=0;
}
}
public void update(float deltaTime){
if(isStopUpdate || isStopUpdate2){
CoreLog.debug("stop update");
return;
}
//最初の演出
if(initProduction){
if(deltaTime>0.5f){
deltaTime=0.5f;
}
time+=deltaTime;
float rate=time/1.5f;
if(rate>1) rate=1f;
RiverCrossingAI.getBgmPlayer().setVolume(rate);
fadeMask.setAlpha((int)((1-rate)*255));
if(time>1.5f){
RiverCrossingAI.getBgmPlayer().setVolume(1f);
CoreLog.debug("end :"+time);
time=0;
fadeMask.setShowView(false);
for(int i=0;i<allCharacter.size();i++){
allCharacter.get(i).setCanTouch(true);
}
//this.saveMemory();
initProduction=false;
}
return;
}
if(isEndGame){
if(isRestarGamePhase || isGameEndPhase){
time+=deltaTime;
float rate=time/1f;
if(rate>1) rate=1f;
RiverCrossingAI.getBgmPlayer().setVolume(1f-rate);
fadeMask.setAlpha((int)(rate*255));
if(time>1f){
RiverCrossingAI.getBgmPlayer().stop();
if(isRestarGamePhase){
this.reStartGame();
}else{
this.endGame();
}
}
}
/*time+=deltaTime;
CoreLog.debug("end");
if(time>2){
//これでタイトル行くとバグる
if(startIsland.checkGaemClear()){ //クリアーした場合はタイトル画面に戻す
palent.moveTitle();
}
//ゲームオーバーの場合はリスタートでも良いが、今回はタイトルに戻す
this.endGame();
}*/
return;
}
/**
* ゲームの巻き戻し処理
*/
if(isNowReturnPhase && !isNowReturnPhaseIfBoatMode){
CoreLog.debug("--");
time+=deltaTime;
returnTime+=deltaTime;
if(returnTime>=0.5f){
returnTime=0;
//矢印の反転
returnIcon.setShowView(!returnIcon.isShowView());
}
if(time>=0.01f && !nowTurnChangePhase){
time=0;
if(count==0){
count++;
bifMoveMinisterNum=moveData.getMinisterMoveNum();
bifMoveWolfNum=moveData.getWolfMoveNum();
bifMoveCabbageNum=moveData.getCabbageMoveNum();
bifMoveCattleMoveNum=moveData.getCattleMoveNum();
CoreLog.debug("--2"+bifMoveMinisterNum+"/"+bifMoveWolfNum+"/"+bifMoveCabbageNum+"/"+bifMoveCattleMoveNum);
//戻る情報をセットしてから、後ろのメモリーに置き換える
moveData=moveData.getBifMemory();
moveData.removeNextmemorys(0);
}else{
Island island=null;
if(startIsland.getNowTurn()){
island=startIsland;
}else{
island=endIsland;
}
if(bifMoveMinisterNum>0){
bifMoveMinisterNum--;
CoreLog.debug(""+island.getMinisters().size());
//island.getMinisters().get(island.getMinisters().size()-1).onTouchDown();
ArrayList<CharaModel> c=island.getMinisters();
for(int i=c.size()-1;i>=0;i--){
if(!c.get(i).isNowTarget()){
c.get(i).onTouchDown();
break;
}
}
}else if(bifMoveWolfNum>0){
bifMoveWolfNum--;
//island.getWolfs().get(island.getWolfs().size()-1).onTouchDown();
ArrayList<CharaModel> c=island.getWolfs();
for(int i=c.size()-1;i>=0;i--){
if(!c.get(i).isNowTarget()){
c.get(i).onTouchDown();
break;
}
}
}else if(bifMoveCabbageNum>0){
bifMoveCabbageNum--;
//island.getCabbages().get(island.getCabbages().size()-1).onTouchDown();
ArrayList<CharaModel> c=island.getCabbages();
for(int i=c.size()-1;i>=0;i--){
if(!c.get(i).isNowTarget()){
c.get(i).onTouchDown();
break;
}
}
}else if(bifMoveCattleMoveNum>0){
bifMoveCattleMoveNum--;
//island.getCattles().get(island.getCattles().size()-1).onTouchDown();
ArrayList<CharaModel> c=island.getCattles();
for(int i=c.size()-1;i>=0;i--){
if(!c.get(i).isNowTarget()){
c.get(i).onTouchDown();
break;
}
}
}else{
//flag=true;
//ボートの方向変更
if(!startIsland.getNowTurn()){
boat.changeAnimation(0);
}else{
boat.changeAnimation(1);
}
this.changeTurn(true);
}
/*if(bifMoveMinisterNum>0){
bifMoveMinisterNum--;
island.getMinisters().get(island.getMinisters().size()-1).onTouchDown();
}else if(bifMoveWolfNum>0){
bifMoveWolfNum--;
island.getWolfs().get(island.getWolfs().size()-1).onTouchDown();
}else if(bifMoveCabbageNum>0){
bifMoveCabbageNum--;
island.getCabbages().get(island.getCabbages().size()-1).onTouchDown();
}else if(bifMoveCattleMoveNum>0){
bifMoveCattleMoveNum--;
island.getCattles().get(island.getCattles().size()-1).onTouchDown();
}else{
this.changeTurn(true);
}*/
}
return;
}
if(nowTurnChangePhase){
CoreLog.debug("/");
if(nowCharaMovePhase){ //キャラを船に乗せる移動処理
//////////////////////////////////////////////////////////////
//キャラを船に乗せるフェーズ
/////////////////////////////////////////////////////////////
if(layoutManager.charaMove2Boat(targets, deltaTime, 1f)){
nowCharaMovePhase=false;
nowBackScreenMovePhase=true;
layoutManager.moveBackScreenInit(backScreen, boat, targets,aiChara, !startIsland.getNowTurn());//怪しいかも
}
}else if(nowBackScreenMovePhase){
//////////////////////////////////////////////////////////////
//背景移動フェーズ(船の移動)
/////////////////////////////////////////////////////////////
if(layoutManager.moveBackScreen(this,backScreen, boat, targets,aiChara,numbox, deltaTime, 1.5f,false)){
nowBackScreenMovePhase=false;
nowCharaGetOffPhase=true;
if(!startIsland.getNowTurn()){
for(int i=0;i<targets.size();i++){
layoutManager.addLeft(targets.get(i),false);
}
}else{
for(int i=0;i<targets.size();i++){
layoutManager.addRight(targets.get(i),false);
}
}
//上のlayoutManagerへの配置処理の後に呼ぶ
layoutManager.charaGetOffInit(targets,!startIsland.getNowTurn());
//アニメーションの変更
for(int i=0;i<targets.size();i++){
if(targets.get(i).getType()!=TARGET_TYPE.CABBAGE){
if(!startIsland.getNowTurn()){
targets.get(i).changeAnimation(2);
}else{
targets.get(i).changeAnimation(1);
}
}
}
}
}else if(nowCharaGetOffPhase){
//////////////////////////////////////////////////////////////
//キャラを船から下ろすフェーズ
/////////////////////////////////////////////////////////////
if(layoutManager.charaGetOff(targets, deltaTime,1f )){
//移動数のカウント
/* boat.addMoveNum();
numbox.setNmber(boat.getMoveNum());
if(!startIsland.getNowTurn()){
numbox.setCenterX(1280-170);
}else{
numbox.setCenterX(170);
}
numbox.setShowView(true);*/
/*//ボートの方向変更
if(!startIsland.getNowTurn()){
boat.changeAnimation(0);
}else{
boat.changeAnimation(1);
}*/
//向こう岸アイコンを表示にする //islandの更新の後に行う必要がある
ArrayList<OppositeIcon> icons=null;
Island land=null;
if(!startIsland.getNowTurn()){
icons=oppositeLeftIcons;
land=startIsland;
}else{
icons=oppositeRightIcons;
land=endIsland;
}
for(int i=0;i<icons.size();i++){
OppositeIcon icon=icons.get(i);
icon.setIcon(land.getCharaNum(icon.getType()));
icons.get(i).setShowView(true);
}
//特に何もなければ続行
startNextTurn();
this.turnBack();
}
}
}
return;
}
/**
* 通常の巻き戻し演出用
*/
if(isNowReturnPhaseIfNormal){
}
/**
* 船の途中巻き戻し処理
*/
if(isNowReturnPhaseIfBoatMode){
CoreLog.debug("?");
returnTime+=deltaTime;
if(returnTime>=0.5f){
returnTime=0;
//矢印の反転
returnIcon.setShowView(!returnIcon.isShowView());
}
if(nowBackScreenMovePhase){
//////////////////////////////////////////////////////////////
//背景移動フェーズ(船の移動)
/////////////////////////////////////////////////////////////
if(layoutManager.moveBackScreen(this,backScreen, boat, targets,aiChara,numbox, deltaTime, 1.5f,isNowboatBackMove)){
nowBackScreenMovePhase=false;
nowCharaGetOffPhase=true;
isNowboatBackMove=false; //巻き戻しの一部で使用するため(使ったらfalse)
if(!startIsland.getNowTurn()){
for(int i=0;i<targets.size();i++){
layoutManager.addLeft(targets.get(i),false);
}
}else{
for(int i=0;i<targets.size();i++){
layoutManager.addRight(targets.get(i),false);
}
}
//上のlayoutManagerへの配置処理の後に呼ぶ
layoutManager.charaGetOffInit(targets,!startIsland.getNowTurn());
//アニメーションの変更
for(int i=0;i<targets.size();i++){
if(targets.get(i).getType()!=TARGET_TYPE.CABBAGE){
if(!startIsland.getNowTurn()){
targets.get(i).changeAnimation(2);
}else{
targets.get(i).changeAnimation(1);
}
}
}
}
}else if(nowCharaGetOffPhase){
//////////////////////////////////////////////////////////////
//キャラを船から下ろすフェーズ
/////////////////////////////////////////////////////////////
if(layoutManager.charaGetOff(targets, deltaTime,1f )){
//向こう岸アイコンを表示にする //islandの更新の後に行う必要がある
ArrayList<OppositeIcon> icons=null;
Island land=null;
if(!startIsland.getNowTurn()){
icons=oppositeLeftIcons;
land=startIsland;
}else{
icons=oppositeRightIcons;
land=endIsland;
}
for(int i=0;i<icons.size();i++){
OppositeIcon icon=icons.get(i);
icon.setIcon(land.getCharaNum(icon.getType()));
icons.get(i).setShowView(true);
}
isNowReturnPhaseIfBoatMode=false;
//特に何もなければ続行
//this.startNextTurn();
count=0;
startNextTurn();
this.turnBack();
}
}
return;
}
if(nowTurnChangePhase){
//CoreLog.debug("now turn change");
if(nowCharaMovePhase){ //キャラを船に乗せる移動処理
//////////////////////////////////////////////////////////////
//キャラを船に乗せるフェーズ
/////////////////////////////////////////////////////////////
if(layoutManager.charaMove2Boat(targets, deltaTime, 1f)){
RiverCrossingAI.getSePlayer().play(gameSeType.CROSS.ordinal());
nowCharaMovePhase=false;
nowBackScreenMovePhase=true;
layoutManager.moveBackScreenInit(backScreen, boat, targets,aiChara, !startIsland.getNowTurn());//怪しいかも
}
}else if(nowBackScreenMovePhase){
//////////////////////////////////////////////////////////////
//背景移動フェーズ(船の移動)
/////////////////////////////////////////////////////////////
if(layoutManager.moveBackScreen(this,backScreen, boat, targets,aiChara,numbox, deltaTime, 1.5f,false)){
RiverCrossingAI.getSePlayer().stop(gameSeType.CROSS.ordinal());
nowBackScreenMovePhase=false;
nowCharaGetOffPhase=true;
if(!startIsland.getNowTurn()){
for(int i=0;i<targets.size();i++){
layoutManager.addLeft(targets.get(i),false);
}
}else{
for(int i=0;i<targets.size();i++){
layoutManager.addRight(targets.get(i),false);
}
}
//上のlayoutManagerへの配置処理の後に呼ぶ
layoutManager.charaGetOffInit(targets,!startIsland.getNowTurn());
//アニメーションの変更
for(int i=0;i<targets.size();i++){
if(targets.get(i).getType()!=TARGET_TYPE.CABBAGE){
if(!startIsland.getNowTurn()){
targets.get(i).changeAnimation(1);
}else{
targets.get(i).changeAnimation(2);
}
}
}
}
}else if(nowCharaGetOffPhase){
//////////////////////////////////////////////////////////////
//キャラを船から下ろすフェーズ
/////////////////////////////////////////////////////////////
if(layoutManager.charaGetOff(targets, deltaTime,1f )){
//ボートの方向変更
if(!startIsland.getNowTurn()){
boat.changeAnimation(1);
}else{
boat.changeAnimation(0);
}
//クリア判定
if(checkGameClear()){
this.gameClear();
return;
}
//向こう岸アイコンを表示にする //islandの更新の後に行う必要がある
ArrayList<OppositeIcon> icons=null;
Island land=null;
if(!startIsland.getNowTurn()){
icons=oppositeLeftIcons;
land=startIsland;
}else{
icons=oppositeRightIcons;
land=endIsland;
}
for(int i=0;i<icons.size();i++){
OppositeIcon icon=icons.get(i);
icon.setIcon(land.getCharaNum(icon.getType()));
icons.get(i).setShowView(true);
}
//特に何もなければ続行
this.startNextTurn();
}
}
/* if(boat.move(deltaTime)){
this.startNextTurn();
}*/
}else{
//AIを使用する場合
if(isUseAi){
this.ai.update(deltaTime);
}
}
}
/**
* ゲーム状態の判定 ゲームオーバー判定のいろいろしているバージョン
*/
public void checkGameState(){
if(isNowReturnPhase){
boat.difMoveNum();
numbox.setNmber(boat.getMoveNum());
return; //巻き戻し中には無効にする
}
//ゲームの状態判定
if(checkGameOver()){
if(isUseAi){
// isStopUpdate=true;
ai.callGameOver();
return;
}else{
gameOver();
}
}
if(!isUseAi){
//ゲーム続行の場合、座標を記録
this.saveCharacterPosition();
this.saveMemory();
}
boat.addMoveNum();
numbox.setNmber(boat.getMoveNum());
}
public void onTouch(MotionEvent event,int touchX,int touchY){
int tX=touchX;
int tY=touchY;
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
if(isUseAi){
//AI使用時はキャラの移動速度を変化
this.ai.changeAiMoveCharaSpeed();
this.boat.changeAiMoveCharaSpeed();
//ボートの速度とAIの速度は同しであることが前提である
//rightText.setText("速度×"+this.ai.getMoveSpeed());
}
break;
case MotionEvent.ACTION_UP:
/* if(target!=null && !isUseAi){
this.target.setXY(tX,tY);
if(checkMoveCharacter()){
CoreLog.debug("1");
moveCharacter(target);
if(checkNextTurn()){
changeTurn();
}
}else{
this.target.setXY(targetBifX, targetBifY);
}
this.changeTouchTarget(null);
}*/
break;
case MotionEvent.ACTION_MOVE:
float mX=tX-bifTouchX;
float mY=tY-bifTouchY;
//
bifTouchX=tX;
bifTouchY=tY;
break;
default:
break;
}
}
/**
* ターンの交代
*/
public void changeTurn(boolean isReturn){
if(!isUseAi){
RiverCrossingAI.getSePlayer().play(gameSeType.RIDE.ordinal());
}
this.isStopUpdate=true;
this.count=0; //巻き戻しの処理に利用
crossButton.setShowView(false);
turnChangeButton.setShowView(false);
time=0;
if(!isReturn){
nowTurnChangePhase=true;
nowCharaMovePhase=true;
}else{
nowTurnChangePhase=true;
nowCharaMovePhase=true;
}
if(startIsland.getNowTurn()){
startIsland.setNowTurn(false);
endIsland.setNowTurn(true);
}else{
startIsland.setNowTurn(true);
endIsland.setNowTurn(false);
}
startIsland.setMove(false);
endIsland.setMove(false);
///////////////////////////////////////////////////////
layoutManager.charaMove2BoatInit(boat, targets);
//アニメーションの変更
for(int i=0;i<targets.size();i++){
if(targets.get(i).getType()!=TARGET_TYPE.CABBAGE){
if(!startIsland.getNowTurn()){
if(!isReturn){
targets.get(i).changeAnimation(1);
}else{
targets.get(i).changeAnimation(2);
}
}else{
if(!isReturn){
targets.get(i).changeAnimation(2);
}else{
targets.get(i).changeAnimation(1);
}
}
}
}
//移動が確定したので、移動するものを登録から外す
for(int i=0;i<targets.size();i++){
if(!startIsland.getNowTurn()){ //上でislandのターン交代をしてしまっているのでここでは逆で考える
layoutManager.removeRight(targets.get(i));
}else{
layoutManager.removeLeft(targets.get(i));
}
}
//すべてのキャラのタッチを封印する
for(int i=0;i<allCharacter.size();i++){
allCharacter.get(i).setCanTouch(false);
}
//向こう岸アイコンを非表示にする
ArrayList<OppositeIcon> icons=null;
if(!startIsland.getNowTurn()){
icons=oppositeRightIcons;
}else{
icons=oppositeLeftIcons;
}
for(int i=0;i<icons.size();i++){
icons.get(i).setShowView(false);
}
//セレクトアイコンを遠くに飛ばす
for(int i=0;i<selectIcons.size();i++){
selectIcons.get(i).setXY(-100, -100);
}
//ターゲットになったキャラ専用の設定を戻す
for(int i=0;i<targets.size();i++){
targets.get(i).setNowTarget(false);
}
//説明欄を削除
exampleBox.setShowView(false);
//isLandの情報更新
for(int i=0;i<targets.size();i++){
//管理情報の更新
if(!startIsland.getNowTurn()){
startIsland.removeCharacter(targets.get(i));
endIsland.addCharacter(targets.get(i));
}else{
endIsland.removeCharacter(targets.get(i));
startIsland.addCharacter(targets.get(i));
}
}
///////////////////////////////////////////////////////
moveNum=0;
CoreLog.debug("start chenging turn");
this.isStopUpdate=false;
}
/**
* ターンの交代判定
*/
public boolean checkNextTurn(){
if(moveNum>=moveNumMax){
return true;
}
return false;
}
/**
* 渡るボタンが押せるかどうか
* @return
*/
public void checkCrossButton(){
boolean selectMinister=false;
for(int i=0;i<targets.size();i++){
if(targets.get(i).getType()==TARGET_TYPE.MINISTART){
selectMinister=true;
}
}
//一人以上を選択していて、牧師を選んでいる場合
if(selectMinister&&(moveNum>0)){
crossButton.setCanMove(true);
if(startIsland.getNowTurn()){
crossButton.setXY(boat.getCenterX(), boat.getCenterY());
}else{
crossButton.setXY(boat.getCenterX()-30, boat.getCenterY());
}
}else{
crossButton.setCanMove(false);
crossButton.setXY(-100,-100);
}
}
public void startNextTurn(){
//すべてのキャラのタッチを封印解除
for(int i=0;i<allCharacter.size();i++){
allCharacter.get(i).setCanTouch(true);
}
//ターゲットキャラを解放
targets.clear();
//渡るボタンを非表示にする
turnChangeButton.setShowView(false);
//説明欄の表示
if(!startIsland.getNowTurn()){
exampleBox.setCenterX(1280-920);
}else{
exampleBox.setCenterX(920);
}
exampleBox.setExample(moveNumMax-moveNum);
exampleBox.setShowView(true);
boat.clearRideMenber();
if(startIsland.getNowTurn()){
startIsland.setMove(true);
}else{
endIsland.setMove(true);
}
// this.saveMemory();
nowTurnChangePhase=false;
CoreLog.debug("startNextTurn end");
}
/**
* 移動したかどうかの判定
* @return
*/
public boolean checkMoveCharacter(){
/**
* 船の乗船ゾーンに存在すれば移動と見なす
*/
if(this.boat.isMountTarget()){
return true;
}
return false;
}
/**
* ゲームオーバー判定
* @return
*/
public boolean checkGameOver(){
if(startIsland.cheakGameOver() || endIsland.cheakGameOver()){
return true;
}
return false;
}
public boolean checkGameClear(){
if(startIsland.checkGaemClear()){
return true;
}
return false;
}
/**
* 未実装(いらないかも)
*/
public void saveCharacterPosition(){
}
/**
* 移動情報の保存用のデータを作成
*/
public void memoryInit(){
moveData =new Memory(null, startIsland.clone(),
endIsland.clone(), boat.clone(), 0, 0,0, 0);
}
public void memoryInit(Memory m){
moveData=m;
}
/**
* AIの生成 (初期生成時に情報を作成する場合があるため、IsLandの情報が確定した後に呼ぶ)
*/
public void aiInit(){
if(!isUseAi) return;
this.ai=new AiSystemType1(this, boat, startIsland, endIsland);
/*rightText=new ViewText("速度×"+this.ai.getMoveSpeed(), TEXT_TYPE.CENTER, gameScreen.getWidth()*0.8f, gameScreen.getHeight()*0.06f);
rightText.setSize(gameScreen.getWidth()*0.03f);
gameScreen.addViewText(rightText);*/
}
public void aiInit(Memory memory){
if(!isUseAi) return;
this.ai=new AiSystemType1(memory,this, boat, startIsland, endIsland);
/* rightText=new ViewText("速度×"+this.ai.getMoveSpeed(), TEXT_TYPE.CENTER, gameScreen.getWidth()*0.8f, gameScreen.getHeight()*0.06f);
rightText.setSize(gameScreen.getWidth()*0.03f);
gameScreen.addViewText(rightText);*/
}
/**
* 途中からゲームを再開する
*/
public void reStart(StartIsland sIsland,EndIsland eIsland ,BoatModel boat){
palent.resumeStartGame(sIsland, eIsland, boat);
}
/**
* ターゲットの変更
* @param cView
*/
/* public void changeTouchTarget(CharaModel chara){
if(chara!=null){
this.target=chara;
this.target.setNowTarget(true);
}else{
this.target.setNowTarget(false);
this.target=null;
}
}*/
/**
* ターゲットを増やす
* @param chara
*/
public boolean addTarget(CharaModel chara){
if(moveNum<moveNumMax){
moveNum++;
exampleBox.setExample(moveNumMax-moveNum);
//現在の最大のIDを取得
int maxIndex=-1; //targetsへの登録順に使用 用途は、selectbuttonなどのindexに使用
for(int i=0;i<targets.size();i++){
int tmp=targets.get(i).getTargetId();
if(tmp>maxIndex) maxIndex=tmp;
}
if(maxIndex==-1){ //ターゲットのIDが登録されていなかった場合
maxIndex=0;
}else{ //登録されている場合は次のIDを振る
maxIndex+=1;
}
this.selectIcons.get(maxIndex).setXY(chara.getCenterX(), chara.getCenterY());
chara.setTargetId(maxIndex);
this.targets.add(chara);
//渡るボタンの判定
checkCrossButton();
CoreLog.debug("a1");
return true;
}
CoreLog.debug("b1");
return false;
}
public void removeTarget(CharaModel chara){
//this.selectIcons.get(chara.getTargetId()).setXY(500+100*moveNum,100);
int targetId=chara.getTargetId();
//ターゲットIDの途中の数字が消える場合、整列のためにそれ以上上の数字の数を減らす
for(int i=0;i<targets.size();i++){
int tmpId=targets.get(i).getTargetId();
if(tmpId>targetId){
targets.get(i).setTargetId(tmpId-1);
}
}
//targetIDの整理後、登録を削除
this.targets.remove(chara);
//残りのtargetsでselectButtonを整理
//表示の問題でselectButtonも整列し直す
for(int i=0;i<4;i++){
if(i<targets.size()){
this.selectIcons.get(i).setXY(targets.get(i).getCenterX(), targets.get(i).getCenterY());
}else{
this.selectIcons.get(i).setXY(-100,-100);
}
}
moveNum--;
exampleBox.setExample(moveNumMax-moveNum);
//渡るボタンの判定
checkCrossButton();
}
/**
* キャラの移動
* @param character
*/
public void moveCharacter(CharaModel character){
//target.getModel().setCanMove(false);
//layoutManager.move2Boat(character);
///////////////////////////////////////////////////////
if(startIsland.getNowTurn()){
layoutManager.moveRightBoat(character);
}else{
layoutManager.moveLeftBoat(character);
}
///////////////////////////////////////////////////////
boat.addCharacter(character);
moveNum++;
character.setCanMove(false);
if(moveNumMax-1==moveNum){ //あと1キャラしか移動できない場合
//牧師を一人も船に乗せていない場合
if(boat.getRideMenberNum(TARGET_TYPE.MINISTART)==0){
if(startIsland.getNowTurn()){
startIsland.setMoveType2(false);
}else{
endIsland.setMoveType2(false);
}
//centerText.setText("牧師が@"+(moveNumMax-moveNum)+"回動かせるよ");
}else{
//centerText.setText("@"+(moveNumMax-moveNum)+"回動かせるよ");
}
}else{
//centerText.setText("@"+(moveNumMax-moveNum)+"回動かせるよ");
}
if(boat.getRideMenberNum(TARGET_TYPE.MINISTART)>0){
turnChangeButton.setShowView(true);
}
}
public void gameOver(){
RiverCrossingAI.getBgmPlayer().setVolume(0.5f);
//すべてのキャラのタッチを封印解除
for(int i=0;i<allCharacter.size();i++){
allCharacter.get(i).setCanTouch(false);
}
if(isUseAi){
RiverCrossingAI.setCanTouch(true); //タッチの有効化
}
RiverCrossingAI.getSePlayer().play(gameSeType.FAILUER.ordinal());
backToTitleButton.setShowView(true);
onemorePlayButton.setShowView(true);
//centerText.setText("ゲームオーバー");
int id=0;
if(!startIsland.getNowTurn()){
id=startIsland.getGameOverTypeId();
}else{
id=endIsland.getGameOverTypeId();
}
//ゲームオーバー画面の表示
if(isUseAi){
gameoverScreenTypeAi.setShowView(true);
}else{
if(id==1){
gameoverScreenTypeWolf.setShowView(true);
}else if(id==2){
gameoverScreenTypeCabbage.setShowView(true);
}
}
time=0;
isEndGame=true;
}
public void gameClear(){
RiverCrossingAI.getBgmPlayer().setVolume(0.5f);
//すべてのキャラのタッチを封印解除
for(int i=0;i<allCharacter.size();i++){
allCharacter.get(i).setCanTouch(false);
}
if(isUseAi){
RiverCrossingAI.setCanTouch(true); //タッチの有効化
}
backToTitleButton.setShowView(true);
//クリアアニメーションに変更
for(int i=0;i<allCharacter.size();i++){
if(allCharacter.get(i).getType()!=TARGET_TYPE.CABBAGE){
allCharacter.get(i).changeAnimation(3);
}
}
//AIのアニメーション変更
if(isUseAi){
aiChara.changeAnimation(2);
}
if(!isUseAi){
//最短ルートの表示 (AIの場合はなし)
numboxS.setNmber(palent.getShortest());
numboxS.setShowView(true);
if(boat.getMoveNum()==palent.getShortest()){
RiverCrossingAI.getSePlayer().play(gameSeType.PARFECT.ordinal());
perfectLogo.setShowView(true);
}else{
RiverCrossingAI.getSePlayer().play(gameSeType.CLEAR.ordinal());
clearLogo.setShowView(true);
}
}else{
RiverCrossingAI.getSePlayer().play(gameSeType.CLEAR.ordinal());
clearLogo.setShowView(true);
}
//centerText.setText("クリア!");
time=0;
isEndGame=true;
}
public void endGameProduction(){
fadeMask.setAlpha(0);
fadeMask.setShowView(true);
time=0;
isGameEndPhase=true;
backToTitleButton.setTouch(false);
onemorePlayButton.setTouch(false);
}
public void reStartGameProduction(){
fadeMask.setAlpha(0);
fadeMask.setShowView(true);
time=0;
isRestarGamePhase=true;
backToTitleButton.setTouch(false);
onemorePlayButton.setTouch(false);
}
/**
* ゲームの再スタート
*/
private void reStartGame(){
palent.restartGame();
}
/**
* ゲームの終了
*/
private void endGame(){
palent.moveTitle();
}
public EndIsland getEndIsland() {
return endIsland;
}
public void setEndIsland(EndIsland endIsland) {
this.endIsland = endIsland;
}
public void setStartIsland(StartIsland startIsland) {
this.startIsland = startIsland;
}
public void setNowTurnChangePhase(boolean b){
this.nowTurnChangePhase=b;
}
public boolean isNowTurnChangePhase() {
return nowTurnChangePhase;
}
public AiSystem getAi(){
return this.ai;
}
public boolean isUseAi() {
return isUseAi;
}
public void setUseAi(boolean isUseAi) {
this.isUseAi = isUseAi;
}
public Memory getMoveData() {
return moveData;
}
public void saveMemory(){
//メモリーにデーターを保存
this.moveData.addNextMemorys(new Memory(moveData,startIsland.clone(),
endIsland.clone(), boat.clone(),
0, 0, 0, 0));
this.moveData=moveData.getNextMemorys().get(0);
CoreLog.debug("deep:"+moveData.getDeepNumber());
}
/**
* AIで主に使用
* @return
*/
public Memory changeMemoryAndRemoveBifNextRoot(){
CoreLog.debug("ok1");
this.moveData=moveData.getNextMemorys().get(0);
CoreLog.debug("ok1");
return this.moveData;
}
private int turnBackCountMax=0;
private int turnBackCount=0;
public void returnGameTurn(int turn,boolean nowTrunChange){
isStopUpdate2=true; //処理の衝突対策
RiverCrossingAI.getBgmPlayer().pause();
aiChara.changeAnimation(1);
returnIcon.setShowView(true);
returnBackScreen.setShowView(true);
turnBackCountMax=turn;
turnBackCount=1;
if(nowTrunChange){ //ターン交代中に呼ばれた場合
RiverCrossingAI.getSePlayer().stop(gameSeType.CROSS.ordinal());
CoreLog.debug("boat patern");
if(startIsland.getNowTurn()){
startIsland.setNowTurn(false);
endIsland.setNowTurn(true);
}else{
startIsland.setNowTurn(true);
endIsland.setNowTurn(false);
}
//isLandの情報更新
for(int i=0;i<targets.size();i++){
//管理情報の更新
if(!startIsland.getNowTurn()){
startIsland.removeCharacter(targets.get(i));
endIsland.addCharacter(targets.get(i));
}else{
endIsland.removeCharacter(targets.get(i));
startIsland.addCharacter(targets.get(i));
}
}
isNowReturnPhaseIfBoatMode=true; //反対方向へ動かす
isNowboatBackMove=true;
}else{ //それ以外で呼ばれた場合
CoreLog.debug("else patern");
isNowReturnPhaseIfNormal=true;
bifMoveMinisterNum=moveData.getMinisterMoveNum();
bifMoveWolfNum=moveData.getWolfMoveNum();
bifMoveCabbageNum=moveData.getCabbageMoveNum();
bifMoveCattleMoveNum=moveData.getCattleMoveNum();
Island island=null;
if(startIsland.getNowTurn()){
island=startIsland;
}else{
island=endIsland;
}
boolean flag=false;
CoreLog.debug("--"+bifMoveMinisterNum+"/"+bifMoveWolfNum+"/"+bifMoveCabbageNum+"/"+bifMoveCattleMoveNum);
while(!flag){
//CoreLog.debug("--"+island.getMinisters().size()+"/"+island.getWolfs().size()+"/"+island.getCabbages().size()+"/"+island.getCattles().size());
CoreLog.debug("while");
if(bifMoveMinisterNum>0){
bifMoveMinisterNum--;
CoreLog.debug(""+island.getMinisters().size());
//island.getMinisters().get(island.getMinisters().size()-1).onTouchDown();
ArrayList<CharaModel> c=island.getMinisters();
for(int i=c.size()-1;i>=0;i--){
if(!c.get(i).isNowTarget()){
c.get(i).onTouchDown();
break;
}
}
}else if(bifMoveWolfNum>0){
bifMoveWolfNum--;
//island.getWolfs().get(island.getWolfs().size()-1).onTouchDown();
ArrayList<CharaModel> c=island.getWolfs();
for(int i=c.size()-1;i>=0;i--){
if(!c.get(i).isNowTarget()){
c.get(i).onTouchDown();
break;
}
}
}else if(bifMoveCabbageNum>0){
bifMoveCabbageNum--;
//island.getCabbages().get(island.getCabbages().size()-1).onTouchDown();
ArrayList<CharaModel> c=island.getCabbages();
for(int i=c.size()-1;i>=0;i--){
if(!c.get(i).isNowTarget()){
c.get(i).onTouchDown();
break;
}
}
}else if(bifMoveCattleMoveNum>0){
bifMoveCattleMoveNum--;
//island.getCattles().get(island.getCattles().size()-1).onTouchDown();
ArrayList<CharaModel> c=island.getCattles();
for(int i=c.size()-1;i>=0;i--){
if(!c.get(i).isNowTarget()){
c.get(i).onTouchDown();
break;
}
}
}else{
flag=true;
}
}
CoreLog.debug("-2 "+targets.size());
this.changeTurn(true);
CoreLog.debug("-3");
//ボートの方向変更
if(!startIsland.getNowTurn()){
boat.changeAnimation(1);
}else{
boat.changeAnimation(0);
}
}
RiverCrossingAI.getSePlayer().play(gameSeType.RETURN.ordinal());
//セレクトボタンの表示を消す
for(int i=0;i<selectIcons.size();i++){
selectIcons.get(i).setShowView(false);
}
moveData=moveData.getBifMemory();
moveData.removeNextmemorys(0);
isNowReturnPhase=true;
CoreLog.debug("back trun1");
isStopUpdate2=false;
}
/**
* 巻き戻り処理
*/
public void turnBack(){
CoreLog.debug("back trun /"+turnBackCount+"/"+turnBackCountMax);
if(turnBackCountMax<=turnBackCount){
isNowReturnPhase=false;
//セレクトボタンの表示解放
for(int i=0;i<selectIcons.size();i++){
selectIcons.get(i).setShowView(true);
}
CoreLog.debugSimple("///////////////////////////////////////////////////////");
CoreLog.debug("createNewAI");
Island island=startIsland;
CoreLog.debug("--"+island.getMinisters().size()+"/"+island.getWolfs().size()+"/"+island.getCabbages().size()+"/"+island.getCattles().size());
island=endIsland;
CoreLog.debug("--"+island.getMinisters().size()+"/"+island.getWolfs().size()+"/"+island.getCabbages().size()+"/"+island.getCattles().size());
island=moveData.getStartIsland();
CoreLog.debug("--"+island.getMinisters().size()+"/"+island.getWolfs().size()+"/"+island.getCabbages().size()+"/"+island.getCattles().size());
island=moveData.getEndIsland();
CoreLog.debug("--"+island.getMinisters().size()+"/"+island.getWolfs().size()+"/"+island.getCabbages().size()+"/"+island.getCattles().size());
ai=new AiSystemType1(moveData, this, boat, startIsland, endIsland);
aiChara.changeAnimation(0);
returnIcon.setShowView(false);
returnBackScreen.setShowView(false);
RiverCrossingAI.getBgmPlayer().play();
RiverCrossingAI.getSePlayer().stop(gameSeType.RETURN.ordinal());
return ;
}
turnBackCount++;
isNowReturnPhaseIfBoatMode=false;
/*if(nowTurnChangePhase){ //ターン交代中に呼ばれた場合
isNowReturnPhaseIfBoatMode=true; //反対方向へ動かす
isNowboatBackMove=true;
}
isNowReturnPhase=true;*/
CoreLog.debug("back trun");
}
public void setStopUpdate(boolean isStopUpdate) {
this.isStopUpdate = isStopUpdate;
}
public void addoppositeRightIcon(OppositeIcon model,boolean isShow){
model.setShowView(isShow);
this.oppositeRightIcons.add(model);
}
public void addoppositeLeftIcon(OppositeIcon model,boolean isShow){
model.setShowView(isShow);
this.oppositeLeftIcons.add(model);
}
public void addSelectIcons(CoreModel selectIcon){
this.selectIcons.add(selectIcon);
}
public void addCrossButton(CrossButton button){
this.crossButton=button;
}
public void setBackScreen(CoreModel model){
this.backScreen=model;
}
public void addAllCharacter(CharaModel model){
this.allCharacter.add(model);
}
public void setNumBox(NumBox box){
this.numbox=box;
}
public void setNumboxS(NumBox numboxS) {
this.numboxS = numboxS;
}
public void setGameoverScreenTypeWolf(CoreModel gameoverScreenTypeWolf) {
this.gameoverScreenTypeWolf = gameoverScreenTypeWolf;
}
public void setGameoverScreenTypeCabbage(CoreModel gameoverScreenTypeCabbage) {
this.gameoverScreenTypeCabbage = gameoverScreenTypeCabbage;
}
public void setGameoverScreenTypeAi(CoreModel gameoverScreenTypeAi) {
this.gameoverScreenTypeAi = gameoverScreenTypeAi;
}
public void setExampleBox(ExampleBox exampleBox) {
this.exampleBox = exampleBox;
}
public void setOnemorePlayButton(OnemorePlayButton onemorePlayButton) {
this.onemorePlayButton = onemorePlayButton;
}
public void setBackToTitleButton(BackToTitleButton backToTitleButton) {
this.backToTitleButton = backToTitleButton;
}
public void setFadeMask(CoreModel fadeMask) {
this.fadeMask = fadeMask;
}
public void setPerfectLogo(CoreModel perfectLogo) {
this.perfectLogo = perfectLogo;
}
public void setClearLogo(CoreModel clearLogo) {
this.clearLogo = clearLogo;
}
public int getMoveNum() {
return moveNum;
}
public void setAiChara(AiChara aiChara) {
this.aiChara = aiChara;
}
public void setReturnBackScreen(CoreModel returnBackScreen) {
this.returnBackScreen = returnBackScreen;
}
public void setReturnIcon(CoreModel returnIcon) {
this.returnIcon = returnIcon;
}
}