package sample.game.manager;
import java.util.ArrayList;
import library.core.model.CoreModel;
import sample.game.controller.GameController;
import sample.game.model.AiChara;
import sample.game.model.BoatModel;
import sample.game.model.CharaModel;
import sample.game.model.CharaModel.TARGET_TYPE;
import sample.game.model.NumBox;
public class LayoutManager{
//左右にあるキャラの配置予定場所
private CharaModel[] rightMinisters;
private CharaModel[] rightCabbages;
private CharaModel[] rightCattels;
private CharaModel[] rightWolfs;
private CharaModel[] leftMinisters;
private CharaModel[] leftCabbages;
private CharaModel[] leftCattels;
private CharaModel[] leftWolfs;
//縦の順番変換に使用 (真ん中のIDを0にしたいため(配列のIndex的な意味で))
private int[] indexBox=new int[]{1,0,2};
private static final int RIGHT_CHARA_X_TOP=705;
private static final int CHARA_Y_TOP=110;
private static final int CHARA_X_MARGIN=145;
private static final int CHARA_Y_MARGIN=190;
private static final int LEFT_CHARA_X_TOP=144;
private int boatRideMenberNum=0;
private int heightBase=0;
private int heightDist=100;
private int widthLeftBase=300;
private int widthRightBase=1000;
private int widthDist=150;
//キャラの移動関連
private ArrayList<Float> lenXs;
private ArrayList<Float> lenYs;
private ArrayList<Float> charaDefoCenterXs;
private ArrayList<Float> charaDefoCenterYs;
private float time;
private float moveSpeed=1f;
private int boatSize=1;
public LayoutManager(boolean isNowTurnRight,int boatSize){
rightMinisters=new CharaModel[3];
rightCabbages=new CharaModel[3];
rightCattels=new CharaModel[3];
rightWolfs=new CharaModel[3];
leftMinisters=new CharaModel[3];
leftCabbages=new CharaModel[3];
leftCattels=new CharaModel[3];
leftWolfs=new CharaModel[3];
this.boatSize=boatSize;
indexBox=new int[]{1,0,2};
}
/**
* 右にキャラを追加
* @param type
* @param model
* @param setMove //座標の移動までやってしまうかどうか
*/
public void addRight(CharaModel model,boolean setMove){
int mId=0;
switch (model.getType()) {
case MINISTART:
mId=0;
for(int i=0;i<3;i++){
if(rightMinisters[i]==null){
rightMinisters[i]=model;
model.setLayoutId(mId, indexBox[i]);
if(!setMove) break;
model.setXY(RIGHT_CHARA_X_TOP+CHARA_X_MARGIN*mId, CHARA_Y_TOP+CHARA_Y_MARGIN*indexBox[i]);
break;
}
}
break;
case WOLF:
mId=3;
for(int i=0;i<3;i++){
if(rightWolfs[i]==null){
rightWolfs[i]=model;
model.setLayoutId(mId, indexBox[i]);
if(!setMove) break;
model.setXY(RIGHT_CHARA_X_TOP+CHARA_X_MARGIN*mId, CHARA_Y_TOP+CHARA_Y_MARGIN*indexBox[i]);
break;
}
}
break;
case CABBAGE:
mId=1;
for(int i=0;i<3;i++){
if(rightCabbages[i]==null){
rightCabbages[i]=model;
model.setLayoutId(mId, indexBox[i]);
if(!setMove) break;
model.setXY(RIGHT_CHARA_X_TOP+CHARA_X_MARGIN*mId, CHARA_Y_TOP+CHARA_Y_MARGIN*indexBox[i]);
break;
}
}
break;
case CATTLE:
mId=2;
for(int i=0;i<3;i++){
if(rightCattels[i]==null){
rightCattels[i]=model;
model.setLayoutId(mId, indexBox[i]);
if(!setMove) break;
model.setXY(RIGHT_CHARA_X_TOP+CHARA_X_MARGIN*mId, CHARA_Y_TOP+CHARA_Y_MARGIN*indexBox[i]);
break;
}
}
break;
}
}
/**
* 右のキャラの削除
* @param model
*/
public void removeRight(CharaModel model){
switch (model.getType()) {
case MINISTART:
for(int i=0;i<3;i++){
if(rightMinisters[i]==null) continue;
if(rightMinisters[i].equals(model)){
rightMinisters[i]=null;
}
}
break;
case WOLF:
for(int i=0;i<3;i++){
if(rightWolfs[i]==null) continue;
if(rightWolfs[i].equals(model)){
rightWolfs[i]=null;
}
}
break;
case CABBAGE:
for(int i=0;i<3;i++){
if(rightCabbages[i]==null) continue;
if(rightCabbages[i].equals(model)){
rightCabbages[i]=null;
}
}
break;
case CATTLE:
for(int i=0;i<3;i++){
if(rightCattels[i]==null) continue;
if(rightCattels[i].equals(model)){
rightCattels[i]=null;
}
}
break;
}
}
/**
*
* @param model
* @param setMove
*/
public void addLeft(CharaModel model,boolean setMove){
int mId=0;
switch (model.getType()) {
case MINISTART:
mId=0;
for(int i=0;i<3;i++){
if(leftMinisters[i]==null){
leftMinisters[i]=model;
model.setLayoutId(mId, indexBox[i]);
if(!setMove) break;
model.setXY(LEFT_CHARA_X_TOP+CHARA_X_MARGIN*mId, CHARA_Y_TOP+CHARA_Y_MARGIN*indexBox[i]);
break;
}
}
break;
case WOLF:
mId=3;
for(int i=0;i<3;i++){
if(leftWolfs[i]==null){
leftWolfs[i]=model;
model.setLayoutId(mId, indexBox[i]);
if(!setMove) break;
model.setXY(LEFT_CHARA_X_TOP+CHARA_X_MARGIN*mId, CHARA_Y_TOP+CHARA_Y_MARGIN*indexBox[i]);
break;
}
}
break;
case CABBAGE:
mId=1;
for(int i=0;i<3;i++){
if(leftCabbages[i]==null){
leftCabbages[i]=model;
model.setLayoutId(mId, indexBox[i]);
if(!setMove) break;
model.setXY(LEFT_CHARA_X_TOP+CHARA_X_MARGIN*mId, CHARA_Y_TOP+CHARA_Y_MARGIN*indexBox[i]);
break;
}
}
break;
case CATTLE:
mId=2;
for(int i=0;i<3;i++){
if(leftCattels[i]==null){
leftCattels[i]=model;
model.setLayoutId(mId, indexBox[i]);
if(!setMove) break;
model.setXY(LEFT_CHARA_X_TOP+CHARA_X_MARGIN*mId, CHARA_Y_TOP+CHARA_Y_MARGIN*indexBox[i]);
break;
}
}
break;
}
}
public void removeLeft(CharaModel model){
switch (model.getType()) {
case MINISTART:
for(int i=0;i<3;i++){
if(leftMinisters[i]==null) continue;
if(leftMinisters[i].equals(model)){
leftMinisters[i]=null;
}
}
break;
case WOLF:
for(int i=0;i<3;i++){
if(leftWolfs[i]==null) continue;
if(leftWolfs[i].equals(model)){
leftWolfs[i]=null;
}
}
break;
case CABBAGE:
for(int i=0;i<3;i++){
if(leftCabbages[i]==null) continue;
if(leftCabbages[i].equals(model)){
leftCabbages[i]=null;
}
}
break;
case CATTLE:
for(int i=0;i<3;i++){
if(leftCattels[i]==null) continue;
if(leftCattels[i].equals(model)){
leftCattels[i]=null;
}
}
break;
}
}
/**
* キャラがボートに移動するための初期情報の作成
* @param boat
* @param charas
*/
public void charaMove2BoatInit(BoatModel boat,ArrayList<CharaModel> charas){
if(lenXs==null){
lenXs=new ArrayList<Float>(); //キャラとボートの距離
}else{
lenXs.clear();
}
if(lenYs==null){
lenYs=new ArrayList<Float>(); //キャラとボートの距離
}else{
lenYs.clear();
}
//キャラの初期位置確保用リスト
if(charaDefoCenterXs==null){
charaDefoCenterXs=new ArrayList<Float>();
}else{
charaDefoCenterXs.clear();
}
if(charaDefoCenterYs==null){
charaDefoCenterYs=new ArrayList<Float>();
}else{
charaDefoCenterYs.clear();
}
//距離を計算する
for(int i=0;i<charas.size();i++){
float cx=charas.get(i).getCenterX();
float cy=charas.get(i).getCenterY();
charaDefoCenterXs.add(cx);
charaDefoCenterYs.add(cy);
float distX=boat.getCenterX()-90+(i*60)-cx; //複数に乗ることによるずれも考慮
float distY=boat.getCenterY()-100-cy; //少し座標をずらして顔が見えるようにする
lenXs.add(distX);
lenYs.add(distY);
}
time=0;
}
/**
* キャラのボートへの移動 移動が終わるとtrue
* @param charas
* @return
*/
public boolean charaMove2Boat(ArrayList<CharaModel> charas,float deltaTime,float moveTime){
time+=deltaTime*moveSpeed;
float rate=time/moveTime;
if(rate>=1) rate=1;
for(int i=0;i<charas.size();i++){
charas.get(i).setXY(charaDefoCenterXs.get(i)+lenXs.get(i)*rate, charaDefoCenterYs.get(i)+lenYs.get(i)*rate);
}
if(rate>=1){
for(int i=0;i<charas.size();i++){
//設定ついでにアニメーションを変更
if(charas.get(i).getType()!=TARGET_TYPE.CABBAGE){ //りんごにはアニメーションがないため
charas.get(i).changeAnimation(0);
}
}
return true;
}
return false;
}
private static final int BOAT_MOVE_LEN=430; //ボートが動いているように見せるために動かす距離
private boolean nowBackScreenRightPoint; //画面が右を対象に映っているかどうか
private boolean checkFlag=false; //ゲームオーバー判定を行ったかどうか
private float boatDefoX;
private float boatDefoY;
private float backScreenDefoX;
private float backScreenDefoY;
private float aiDefoX;
public void moveBackScreenInit(CoreModel backScreen,BoatModel boat,ArrayList<CharaModel> charas,AiChara ai,boolean isStartIsland){
time=0;
boatDefoX=boat.getCenterX();
boatDefoY=boat.getCenterY();
backScreenDefoX=backScreen.getCenterX();
backScreenDefoY=backScreen.getCenterY();
if(charaDefoCenterXs==null){
charaDefoCenterXs=new ArrayList<Float>();
}else{
charaDefoCenterXs.clear();
}
if(charaDefoCenterYs==null){
charaDefoCenterYs=new ArrayList<Float>();
}else{
charaDefoCenterYs.clear();
}
for(int i=0;i<charas.size();i++){
float cx=charas.get(i).getCenterX();
float cy=charas.get(i).getCenterY();
charaDefoCenterXs.add(cx);
charaDefoCenterYs.add(cy);
}
if(ai!=null){
aiDefoX=ai.getCenterX();
}
nowBackScreenRightPoint=isStartIsland;
checkFlag=false;
}
//x座標 0〜1280を移動 0が右 ボートは左がX870ぐらい 右420
/**
* 背景場面の移動
* @param backScreen
* @param deltaTime
* @param 巻き戻しかどうか
* @return
*/
public boolean moveBackScreen(GameController controller,CoreModel backScreen,BoatModel boat,ArrayList<CharaModel> rideCharas,
AiChara ai,NumBox numbox,float deltaTime,float moveTime,boolean isReturn){
//たぶんmoveでやった方ら上の初期設定でこんなに値を確保しなくてすむ・・・
if(isReturn) {
deltaTime=-deltaTime;
}
time+=deltaTime*moveSpeed;
float rate=time/moveTime;
if(rate>1) rate=1;
else if(rate<0) rate=0;
if(nowBackScreenRightPoint){
backScreen.setXY(backScreenDefoX+1280*rate, backScreenDefoY);
for(int i=0;i<rideCharas.size();i++){
rideCharas.get(i).setXY(charaDefoCenterXs.get(i)+BOAT_MOVE_LEN*rate, charaDefoCenterYs.get(i));
}
for(CharaModel c :rightMinisters){
if(c!=null){
c.setXY(RIGHT_CHARA_X_TOP+CHARA_X_MARGIN*c.getLayoutXId()+1280*rate,
CHARA_Y_TOP+CHARA_Y_MARGIN*c.getLayoutYId());
}
}
for(CharaModel c :rightWolfs){
if(c!=null){
c.setXY(RIGHT_CHARA_X_TOP+CHARA_X_MARGIN*c.getLayoutXId()+1280*rate,
CHARA_Y_TOP+CHARA_Y_MARGIN*c.getLayoutYId());
}
}
for(CharaModel c :rightCabbages){
if(c!=null){
c.setXY(RIGHT_CHARA_X_TOP+CHARA_X_MARGIN*c.getLayoutXId()+1280*rate,
CHARA_Y_TOP+CHARA_Y_MARGIN*c.getLayoutYId());
}
}
for(CharaModel c :rightCattels){
if(c!=null){
c.setXY(RIGHT_CHARA_X_TOP+CHARA_X_MARGIN*c.getLayoutXId()+1280*rate,
CHARA_Y_TOP+CHARA_Y_MARGIN*c.getLayoutYId());
}
}
for(CharaModel c :leftMinisters){
if(c!=null){
c.setXY(LEFT_CHARA_X_TOP+CHARA_X_MARGIN*c.getLayoutXId()+1280*rate-1280,
CHARA_Y_TOP+CHARA_Y_MARGIN*c.getLayoutYId());
}
}
for(CharaModel c :leftWolfs){
if(c!=null){
c.setXY(LEFT_CHARA_X_TOP+CHARA_X_MARGIN*c.getLayoutXId()+1280*rate-1280,
CHARA_Y_TOP+CHARA_Y_MARGIN*c.getLayoutYId());
}
}
for(CharaModel c :leftCabbages){
if(c!=null){
c.setXY(LEFT_CHARA_X_TOP+CHARA_X_MARGIN*c.getLayoutXId()+1280*rate-1280,
CHARA_Y_TOP+CHARA_Y_MARGIN*c.getLayoutYId());
}
}
for(CharaModel c :leftCattels){
if(c!=null){
c.setXY(LEFT_CHARA_X_TOP+CHARA_X_MARGIN*c.getLayoutXId()+1280*rate-1280,
CHARA_Y_TOP+CHARA_Y_MARGIN*c.getLayoutYId());
}
}
boat.setXY(boatDefoX+BOAT_MOVE_LEN*rate,boatDefoY);
numbox.setXY(170+(940)*rate, numbox.getCenterY());
if(ai!=null){
ai.setXY(aiDefoX+(BOAT_MOVE_LEN-250)*rate, ai.getCenterY());
}
}else{
backScreen.setXY(backScreenDefoX-1280*rate, backScreenDefoY);
for(int i=0;i<rideCharas.size();i++){
rideCharas.get(i).setXY(charaDefoCenterXs.get(i)-BOAT_MOVE_LEN*rate, charaDefoCenterYs.get(i));
}
for(CharaModel c :leftMinisters){
if(c!=null){
c.setXY(LEFT_CHARA_X_TOP+CHARA_X_MARGIN*c.getLayoutXId()-1280*rate,
CHARA_Y_TOP+CHARA_Y_MARGIN*c.getLayoutYId());
}
}
for(CharaModel c :leftWolfs){
if(c!=null){
c.setXY(LEFT_CHARA_X_TOP+CHARA_X_MARGIN*c.getLayoutXId()-1280*rate,
CHARA_Y_TOP+CHARA_Y_MARGIN*c.getLayoutYId());
}
}
for(CharaModel c :leftCabbages){
if(c!=null){
c.setXY(LEFT_CHARA_X_TOP+CHARA_X_MARGIN*c.getLayoutXId()-1280*rate,
CHARA_Y_TOP+CHARA_Y_MARGIN*c.getLayoutYId());
}
}
for(CharaModel c :leftCattels){
if(c!=null){
c.setXY(LEFT_CHARA_X_TOP+CHARA_X_MARGIN*c.getLayoutXId()-1280*rate,
CHARA_Y_TOP+CHARA_Y_MARGIN*c.getLayoutYId());
}
}
for(CharaModel c :rightMinisters){
if(c!=null){
c.setXY(1280+RIGHT_CHARA_X_TOP+CHARA_X_MARGIN*c.getLayoutXId()-1280*rate,
CHARA_Y_TOP+CHARA_Y_MARGIN*c.getLayoutYId());
}
}
for(CharaModel c :rightWolfs){
if(c!=null){
c.setXY(1280+RIGHT_CHARA_X_TOP+CHARA_X_MARGIN*c.getLayoutXId()-1280*rate,
CHARA_Y_TOP+CHARA_Y_MARGIN*c.getLayoutYId());
}
}
for(CharaModel c :rightCabbages){
if(c!=null){
c.setXY(1280+RIGHT_CHARA_X_TOP+CHARA_X_MARGIN*c.getLayoutXId()-1280*rate,
CHARA_Y_TOP+CHARA_Y_MARGIN*c.getLayoutYId());
}
}
for(CharaModel c :rightCattels){
if(c!=null){
c.setXY(1280+RIGHT_CHARA_X_TOP+CHARA_X_MARGIN*c.getLayoutXId()-1280*rate,
CHARA_Y_TOP+CHARA_Y_MARGIN*c.getLayoutYId());
}
}
numbox.setXY(1280-170-(940)*rate, numbox.getCenterY());
boat.setXY(boatDefoX-BOAT_MOVE_LEN*rate,boatDefoY);
if(ai!=null){
ai.setXY(aiDefoX-(BOAT_MOVE_LEN-250)*rate, ai.getCenterY());
}
}
//巻き戻すかどうかによって抜ける処理が異なる
if(!isReturn){
if(rate>=1){
return true;
}
}else{
if(rate<=0){
return true;
}
}
if(!checkFlag&&rate>=0.5f){
checkFlag=true;
controller.checkGameState();
}
return false;
}
/**
* キャラを船から下ろす処理の初期処理
*/
public void charaGetOffInit(ArrayList<CharaModel> rideChara,boolean isStartIsland){
nowBackScreenRightPoint=isStartIsland;
if(charaDefoCenterXs==null){
charaDefoCenterXs=new ArrayList<Float>();
}else{
charaDefoCenterXs.clear();
}
if(charaDefoCenterYs==null){
charaDefoCenterYs=new ArrayList<Float>();
}else{
charaDefoCenterYs.clear();
}
if(lenXs==null){
lenXs=new ArrayList<Float>(); //キャラとボートの距離
}else{
lenXs.clear();
}
if(lenYs==null){
lenYs=new ArrayList<Float>(); //キャラとボートの距離
}else{
lenYs.clear();
}
for(int i=0;i<rideChara.size();i++){
CharaModel c=rideChara.get(i);
float cx=c.getCenterX();
float cy=c.getCenterY();
charaDefoCenterXs.add(cx);
charaDefoCenterYs.add(cy);
if(nowBackScreenRightPoint){
lenXs.add(LEFT_CHARA_X_TOP+CHARA_X_MARGIN*c.getLayoutXId()-cx);
lenYs.add(CHARA_Y_TOP+CHARA_Y_MARGIN*c.getLayoutYId()-cy);
}else{
lenXs.add(RIGHT_CHARA_X_TOP+CHARA_X_MARGIN*c.getLayoutXId()-cx);
lenYs.add(CHARA_Y_TOP+CHARA_Y_MARGIN*c.getLayoutYId()-cy);
}
}
time=0;
}
/**
* キャラを船から下ろす処理 //addRight/addLeftはすでに行っていて、どこに配置されるかは確定している
* @param rideChara
*/
public boolean charaGetOff(ArrayList<CharaModel> rideChara,float deltaTime,float moveTime){
time+=deltaTime*moveSpeed;
float rate=time/moveTime;
if(rate>1) rate=1;
for(int i=0;i<rideChara.size();i++){
CharaModel c=rideChara.get(i);
c.setXY(charaDefoCenterXs.get(i)+lenXs.get(i)*rate, charaDefoCenterYs.get(i)+lenYs.get(i)*rate);
}
if(rate>=1){
//キャラを止まった状態のアニメーションに変更
for(int i=0;i<rideChara.size();i++){
if(rideChara.get(i).getType()!=TARGET_TYPE.CABBAGE){
rideChara.get(i).changeAnimation(0);
}
}
return true;
}
return false;
}
//二人乗りボートを想定
public void moveRightBoat(CharaModel c){
boatRideMenberNum++;
/* //c.getView().setXY(800+(boatRideMenberNum%2==0?1:-1)*50,360);
c.setXY(750+(boatRideMenberNum/(float)boatSize)*100f, 360);
if(rightPositionFlags.size()>0){
for(int i=0;i<rightPositionFlags.size();i++){
CharaModel c2=rightPositionFlags.get(i);
if(c2!=null){
if(c2.equals(c)){
rightPositionFlags.set(i, null);
}
}
}
}*/
}
public void moveLeftBoat(CharaModel c){
boatRideMenberNum++;
/* c.setXY(450+(boatRideMenberNum/(float)boatSize)*100f,360);
if(leftPositionFlags.size()>0){
for(int i=0;i<leftPositionFlags.size();i++){
CharaModel c2=leftPositionFlags.get(i);
if(c2!=null){
if(c2.equals(c)){
leftPositionFlags.set(i, null);
}
}
}
}*/
}
public void resetRideBoatMenbers(){
boatRideMenberNum=0;
}
/* *//**
* レイアウトを整理する
*//*
public void layoutArrange(){
ArrayList<CharaModel> c=new ArrayList<CharaModel>();
for(int i=0;i<4;i++){
for(int j=0;j<rightPositionFlags.size();j++){
CharaModel tmp=rightPositionFlags.get(j);
if(tmp!=null){
switch (i) {
case 0:
if(tmp.getType()==TARGET_TYPE.MINISTART){
c.add(tmp);
}
break;
case 1:
if(tmp.getType()==TARGET_TYPE.WOLF){
c.add(tmp);
}
break;
case 2:
if(tmp.getType()==TARGET_TYPE.CABBAGE){
c.add(tmp);
}
break;
case 3:
if(tmp.getType()==TARGET_TYPE.CATTLE){
c.add(tmp);
}
break;
}
}
}
}
rightPositionFlags.clear();
for(int i=0;i<c.size();i++){
this.setRight(c.get(i));
}
c=new ArrayList<CharaModel>();
for(int i=0;i<4;i++){
for(int j=0;j<leftPositionFlags.size();j++){
CharaModel tmp=leftPositionFlags.get(j);
if(tmp!=null){
switch (i) {
case 0:
if(tmp.getType()==TARGET_TYPE.MINISTART){
c.add(tmp);
}
break;
case 1:
if(tmp.getType()==TARGET_TYPE.WOLF){
c.add(tmp);
}
break;
case 2:
if(tmp.getType()==TARGET_TYPE.CABBAGE){
c.add(tmp);
}
break;
case 3:
if(tmp.getType()==TARGET_TYPE.CATTLE){
c.add(tmp);
}
break;
}
}
}
}
leftPositionFlags.clear();
for(int i=0;i<c.size();i++){
this.setLeft(c.get(i));
}
}
*/
}