#include "Stdafx.h"
#include "AndroidUserItemSink.h"
#include "Config.h"
#include <fstream>
#include <sstream>
#include <time.h>
#include <stdio.h> 
#include <memory>
#include <thread>
#include "Tools.h"
#define _CRTDBG_MAP_ALLOC   
#include <crtdbg.h>  
#ifdef _DEBUG  
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)   
#endif  
//////////////////////////////////////////////////////////////////////////

//辅助时间
#define TIME_LESS                    1                                    //最少时间
#define TIME_LESS_CHANGE_BULLET        60                                    //交换子弹的最少时间

//游戏时间
#define TIME_BUY_BULLET                3                                    //买子弹时间
#define TIME_FIRE                    3                                    //发射子弹时间
#define TIME_CHANGE_BULLET            120                                    //交换子弹时间
#define TIME_LOCKTAGET            150


#define TIME_RANDOM_POINT       10      //每10秒随机一个触摸点
#define TIME_SCHEDULE_UPDATE    0.0166667    //0.01667秒是一帧
#define TIME_CEATE_BULLET       5       //每5秒创建一次子弹,子弹数量随机
#define TIME_HALF_SECOND        0.5     //半秒钟

////游戏时间
#define IDI_BUY_BULLET                1001//(IDI_ANDROID_ITEM_SINK+0)            //买子弹定时器
#define IDI_FIRE                    1002//(IDI_ANDROID_ITEM_SINK+1)            //发射子弹定时器
#define IDI_CHANGE_BULLET            1003//(IDI_ANDROID_ITEM_SINK+2)            //交换子弹定时器
#define IDI_CHANGE_BULLET_ONCE        1004//(IDI_ANDROID_ITEM_SINK+3)            //交换子弹定时器
#define IDI_LOCKTARGET                    1000
#define IDI_LOG_SIZE                1005

#define IDI_RANDOM_POINT            100                 //随机一个点定时器
#define IDI_COLLISION_JUDGE         101                 //碰撞检测定时器
#define IDI_CREATE_BULLET           102                 //创建一次子弹定时器
#define IDI_SCHEDULE_CREATE         103                 //鱼、子弹每一帧的运动,碰撞 
#define IDI_HALF_SECOND             104                 //半秒钟

#define MAX_CANNON_COST        1000        //修改版:10分一个炮,10分一次累加,到100分一个炮,100分累加一次,最高难1000分
#define MAX_CANNON_TYPEVALUE    19            //19种分值不同的炮

#define CC_DEGREES_TO_RADIANS(__ANGLE__) ((__ANGLE__) * 0.01745329252f) // PI / 180
#define CC_RADIANS_TO_DEGREES(__ANGLE__) ((__ANGLE__) * 57.29577951f) // PI * 180
#define  SUB_IDI_FIRE          10000
//////////////////////////////////////////////////////////////////////////

// !! AI没有完全搞定
//构造函数

//当关闭服务器的时候,存在多个线程,应该先释放子线程里边的资源,再关闭主线程,用静态变量来保存主线程状态和子线程状态,即m_nMainState和m_nSubState,
//如果不用静态变量而用成员变量的话,如果关闭服务器调用destory()只会关闭一个机器人,其余机器人中的子线程还是没有释放,导致崩溃在子线程里边,所以必须要用静态变量。
int CAndroidUserItemSink::m_nMainState = 0;
int CAndroidUserItemSink::m_nSubState = 0;
int CAndroidUserItemSink::pause_count = 0;
int CAndroidUserItemSink::tacticID = 0;
int CAndroidUserItemSink::m_state=0;
CAndroidUserItemSink::CAndroidUserItemSink()
{
    //接口变量
    m_pIAndroidUserItem=NULL;

    srand((UINT)time(NULL));

    //m_bType = rand()%3;

    m_nFishGold = 0;
    m_cbScene = 0;
    m_lCellScore = 0;
    m_CannonType = 0;
    m_fLastFireRote = 0.0f;
    
    for (int i=0; i<GAME_PLAYER; i++)
    {
        m_RoleObjects[i].wChairID = -1;
        //m_RoleObjects[i].dwFishGold = 0;
        m_RoleObjects[i].wCannonType = 0;
    }

    m_nWeaponCost = 10;//默认是10

    m_nToChangeRote = 0;
    m_nLastRoteFireCount = 0;
    m_fNowFireRote = M_PI_2;
    m_onceUpScore = 0;
    m_nNumberToFire = 0;
    int currentChairID = -1;
    int currentCannonID = -1;
    isUpside = false;
    isUpsideEx = false;
    x = 0;
    y = 0;
    fish_num = 0;
    pause_n = 300;
    fishCount=0;
    bulletCount=0;
    cannon = new Cannon();
    control = false;
    GameObject::instance = this;
    CTableFrameSink::m_pAndroid = this;
    m_bFirstBuy=false;
    RepositionState = false;
    RepositionSubState = false;
    allBullets.clear();
    allFishes.clear();
    ZeroMemory(fishPlayer, sizeof(FishPlayer));
    fishGold = 0;
    m_listRemoveFishMessage.clear();
    //ZeroMemory(Vec2, sizeof(Vec2));
    ZeroMemory(nCannonCount, sizeof(nCannonCount));
   // m_listRemoveFishMessage= new std::list<ReceiveMsg*>();
    buyFishGold = 0;
    IsContinue = true;
}

//析构函数
CAndroidUserItemSink::~CAndroidUserItemSink()
{
    LOGD("机器人的析构");
    //for (auto msg : m_listRemoveFishMessage)
    //{
    //    delete msg;
    //    msg = nullptr;
    //}
    RemoveFiMsg.clear();
    allBullets.clear();
    allFishes.clear();
    //if (cannon)
    //{
    //    delete cannon;
    //    cannon = NULL;
    //}
    //delete m_listRemoveFishMessage;
    //t1.~thread();
}

//接口查询
void * CAndroidUserItemSink::QueryInterface(REFGUID Guid, DWORD dwQueryVer)
{
    QUERYINTERFACE(IAndroidUserItemSink,Guid,dwQueryVer);
    QUERYINTERFACE_IUNKNOWNEX(IAndroidUserItemSink,Guid,dwQueryVer);
    return NULL;
}

//初始接口
bool CAndroidUserItemSink::Initialization(IUnknownEx * pIUnknownEx)
{
    //查询接口
   // m_pIAndroidUserItem=GET_OBJECTPTR_INTERFACE(pIUnknownEx,IAndroidUserItem);
    m_pIAndroidUserItem=QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx,IAndroidUserItem);
    if (m_pIAndroidUserItem==NULL) return false;
    srand((UINT)time(NULL));

    return true;
}

//重置接口,机器人离开的时候会调用这个接口,在这个里边关掉子线程
bool CAndroidUserItemSink::RepositionSink()
{
    LOGD("机器人离开调用RespositionSink");
    m_nFishGold = 0;
    m_fLastFireRote = 0.0f;
    RepositionState = true;
    //fishPlayer[m_RobotID].lFishGold = 0;
    
    while (1)
    {
        if (RepositionSubState)
        {
            break;
        }
    }
    RepositionState = false;

    //RemoveFiMsg.clear();
    //allBullets.clear();
    //allFishes.clear();
    LOGD("调用RespositionSink结束");
    return true;
}

//时间消息
bool CAndroidUserItemSink::OnEventTimer(UINT nTimerID)
{
    switch (nTimerID)
    {
    case IDI_BUY_BULLET:            //买子弹
        {
            LOGI("CAndroidUserItemSink::OnEventTimer IDI_BUY_BULLET");
            BuyBullet();
            return true;
        }
    case IDI_CHANGE_BULLET:            //切换子弹
        {
            ChangeCannon();
            return true;
        }
    case IDI_CHANGE_BULLET_ONCE:    //切换子弹(一次)
        {
            ChangeCannon();
            return true;
        }
    case IDI_FIRE:                    //发射子弹
        {

            if (allBullets.size() <= 10)
            {
                Fire();
                //OnEventGameMessage(SUB_IDI_FIRE, 0, 0);
                //LOGD("allBullet.size():"<<allBullets.size());
            }
            else m_pIAndroidUserItem->SetGameTimer(IDI_FIRE, rand() % TIME_FIRE + 2);
            return true;
        }
    case IDI_LOCKTARGET:
        {
            cout<<"IDI_TEST"<<endl;
            LockTarget();
            return true;
        }
    case IDI_RANDOM_POINT:
       {
           RandomPoint();
           m_pIAndroidUserItem->SetGameTimer(IDI_RANDOM_POINT, 4);
           return true;
       }
    case IDI_LOG_SIZE:
      {
          m_pIAndroidUserItem->SetGameTimer(IDI_LOG_SIZE, 10);
          LogSize();
      }
    }

    return true;
}

//游戏消息
bool CAndroidUserItemSink::OnEventGameMessage(WORD wSubCmdID, void * pData, WORD wDataSize)
{
    //LOGD("CAndroidUserItemSink::OnEventGameMessage wSubCmdID = " << wSubCmdID)
    switch(wSubCmdID)
    {
    case SUB_S_BUY_BULLET_SUCCESS:                    //子弹购买成功消息
        {
            ASSERT(wDataSize == sizeof(CMD_S_Buy_Bullet_Success));
            if (wDataSize!=sizeof(CMD_S_Buy_Bullet_Success)) return false;

            CMD_S_Buy_Bullet_Success * pBuyBulletSuccess = (CMD_S_Buy_Bullet_Success *)pData;
            
            if (pBuyBulletSuccess->wChairID == m_RobotID)
            {
                //m_nFishGold += pBuyBulletSuccess->lNowScore;
                int cannonID = pBuyBulletSuccess->wChairID;
                fishPlayer[cannonID].lFishGold = pBuyBulletSuccess->lCount;
                //LOGD("购买子弹成功,FishGold: " << fishPlayer[cannonID].lFishGold);

                //fishGold[cannonID] = pBuyBulletSuccess->lCount;
                //fishPlayer[cannonID].lFishGold = pBuyBulletSuccess->lNowScore;


                /// 切换子弹
                if (rand()%100 < 50)
                    m_pIAndroidUserItem->SetGameTimer(IDI_CHANGE_BULLET, rand()%TIME_CHANGE_BULLET+TIME_LESS_CHANGE_BULLET);
                else
                    ChangeCannon();
 
                m_pIAndroidUserItem->SetGameTimer(IDI_FIRE, rand() % TIME_FIRE + TIME_LESS+5);

            //    m_pIAndroidUserItem->SetGameTimer(IDI_HALF_SECOND, 1);
            //    m_pIAndroidUserItem->SetGameTimer(IDI_SCHEDULE_UPDATE,1);
            }
            
            return true;
        }
    case SUB_S_BUY_BULLET_FAILED:                    //子弹购买失败消息
        {
            LOGD("子弹购买失败");
            m_pIAndroidUserItem->SetGameTimer(IDI_FIRE, rand() % TIME_FIRE + TIME_LESS);
            return true;
        }
    case SUB_S_CHANGE_CANNON:                        //子弹切换消息
    {
        ASSERT(wDataSize == sizeof(CMD_S_Change_Cannon));
        if (wDataSize != sizeof(CMD_S_Change_Cannon)) return false;

        CMD_S_Change_Cannon *pChangeCannon = (CMD_S_Change_Cannon *)pData;

        ASSERT(pChangeCannon->cbStyle < MAX_CANNON_STYLE);

        if (pChangeCannon->wChairID == m_RobotID)
        {
            pChangeCannon->cbType = 1;

            if (pChangeCannon->nCost<nCannonCount[2]) {
                pChangeCannon->cbType = 1;
            }
            else if (pChangeCannon->nCost<nCannonCount[3]) {
                pChangeCannon->cbType = 2;
            }
            else {
                pChangeCannon->cbType = 3;
            }

            int ID = pChangeCannon->wChairID;
            //if (isUpsideEx) {
            //    ID = getCannonID(ID);
            //}
            fishPlayer[ID].wCannonType = pChangeCannon->cbStyle;
            fishPlayer[ID].wCost = pChangeCannon->nCost;

            fishGold = pChangeCannon->nCost;
            //LOGD("ChairID:"<< ID <<" 改变炮筒:" << fishGold);

            int gunNum = cannon->cannon_gunNum;
            if (pChangeCannon->cbType > 0 && pChangeCannon->cbType <= 3) {
                gunNum = pChangeCannon->cbType;    
            }

            if (fishPlayer[ID].wCannonType == 0 && cannon->isSuper) {
                cannon->isSuper = false;
                cannon->cannon_gunNum = gunNum;

            }
            else {
                if (gunNum != cannon->cannon_gunNum) {
                    cannon->setGunNum(gunNum);
                }
            }


            //m_CannonType = pChangeCannon->cbStyle;
            m_pIAndroidUserItem->SetGameTimer(IDI_FIRE, rand()%3+1);//每隔5秒创建一次子弹
            return true;
        }
    }
    case SUB_S_FIRE_LOCK_SUCCESS:        //这条消息没有调用到,没有打印调试信息
        {
            //ASSERT(wDataSize==sizeof(CMD_S_Fire_Success_Lock));
            //if (wDataSize!=sizeof(CMD_S_Fire_Success_Lock)) return false;

            CMD_S_Fire_Success_Lock *pLockTarget = (CMD_S_Fire_Success_Lock *)pData;

            return true;
        }
    case SUB_S_FIRE_SUCCESS:                        //子弹发射成功
        {    
            ASSERT(wDataSize==sizeof(CMD_S_Fire_Success));
            if (wDataSize!=sizeof(CMD_S_Fire_Success)) return false;

            CMD_S_Fire_Success *pFireSuccess = (CMD_S_Fire_Success *)pData;
            int ID = pFireSuccess->wChairID;
            if (ID ==m_RobotID) //是机器人
            {
                //if (isUpsideEx) {
                //    ID = getCannonID(ID);
                //}
                //LOGD("子弹发射成功,m_nFishGold: " << fishPlayer[ID].lFishGold << " fishPlayer[ID].wCost: " << fishPlayer[ID].wCost);
                //fishPlayer[ID].lFishGold -= fishPlayer[ID].wCost;
                fishPlayer[ID].lFishGold -= fishGold;
                //LOGD("子弹发射成功机器人m_nFishGold: " << fishPlayer[ID].lFishGold);
                if (cannon->needFire_num<20) {
                    cannon->needFire_num++;
                }
                else {
                    return true;
                }
            }
            return true;
        }
    case SUB_S_SEND_GET_ENERGY_GUN:
       {
           CMD_S_Get_Energy_Gun * S_Get_Energy_Gun = (CMD_S_Get_Energy_Gun *)pData;
           if (S_Get_Energy_Gun->wChairID == m_RobotID)
           {
               int ID = S_Get_Energy_Gun->wChairID;
               //if (isUpsideEx) {
               //   ID = getCannonID(ID);
               // }

               cannon->setSuper(true);
           }
           return true;
       }
    //case SUB_S_CAST_NET_SUCCESS:
    //    {
    //        CMD_S_Cast_Net_Success_dte * S_Cast_Net_Success_dte = (CMD_S_Cast_Net_Success_dte *)pData;
    //        int a = wDataSize;
    //        int b = sizeof(CMD_S_Cast_Net_Success_dte) - (MAX_FISH_IN_CUCESS - S_Cast_Net_Success_dte->cbCount)*sizeof(CMD_C_Fish_Net_Object);
    //        
    //        int ID = S_Cast_Net_Success_dte->wChairID;
    //        if (ID != m_RobotID)
    //        {
    //            return true;
    //        }
    //        //LOGD("SUB_S_CAST_NET_SUCCESS :a=" << a << "   SUB_S_CAST_NET_SUCCESS :b=" << b << "  count:" << S_Cast_Net_Success_dte->cbCount);
    //        //if (isUpsideEx) {
    //        //    ID = getCannonID(ID);
    //        //}
    //        fishPlayer[ID].lFishGold = S_Cast_Net_Success_dte->lPlayerScore;


    //        bool needGoldPlate = false;
    //    
    //        for (int i = 0; i<S_Cast_Net_Success_dte->cbCount; i++) {
    //            mutexDestructFish.lock();
    //            if (!allFishes.empty())
    //            {
    //                FISHES::iterator it= allFishes.begin();
    //                for (; it!=allFishes.end(); it++)
    //                {
    //                    if (RepositionState) return true;
    //                    if ((*it).get()/**it)->hasFlag(fish::FLAG_UPDATE) && !(*it)->isState(fish::STATE_EXPLODE)*/) {
    //                        if ((*it).get()->server_ID == S_Cast_Net_Success_dte->FishNetIDs[i].wID) {//&& currentFish->fish_type==S_Cast_Net_Success_dte->FishNetIDs[i].cbType
    //                            (*it).get()->targetChairID = S_Cast_Net_Success_dte->wChairID;
    //                            //(*it)->onHurt(1);
    //                            onHurt((*it),1);
    //                            break;
    //                        }
    //                    }
    //                }
    //            }
    //            mutexDestructFish.unlock();
    //        }
    //        return true;
    //}
    //case SUB_S_HIT_TEAM_SUCCESS:
    //    {
    //        const CMD_S_HitTeam_Success_dte* S_HitTeam_Success_dte = (CMD_S_HitTeam_Success_dte*)pData;
    //        if (wDataSize != sizeof(CMD_S_HitTeam_Success_dte) - (MAX_FISH_IN_TEAM - S_HitTeam_Success_dte->cbCount)*sizeof(CMD_C_Fish_Net_Object))
    //        {
    //        //    printf("校验失败!\n");
    //        //    return false;
    //        }    
    //        int a = wDataSize;
    //        int b = sizeof(CMD_S_HitTeam_Success_dte) - (MAX_FISH_IN_TEAM - S_HitTeam_Success_dte->cbCount)*sizeof(CMD_C_Fish_Net_Object);

    //        int ID = S_HitTeam_Success_dte->wChairID;

    //        if (ID != m_RobotID)
    //        {
    //            return true;
    //        }

    //        //LOGD("SUB_S_HIT_TEAM_SUCCESS :a=" << a << "   SUB_S_HIT_TEAM_SUCCESS :b=" << b << "  count=" << S_HitTeam_Success_dte->cbCount);
    //        //if (isUpsideEx) {
    //        //    ID = getCannonID(ID);
    //        //}
    //        fishPlayer[ID].lFishGold += S_HitTeam_Success_dte->lPlayerAddScore;



    //        for (int i = 0; i<S_HitTeam_Success_dte->cbCount; i++) {
    //            mutexDestructFish.lock();
    //            if (!allFishes.empty())
    //            {
    //                if (RepositionState) return true;
    //                FISHES::iterator it = allFishes.begin();
    //                for (; it != allFishes.end(); it++)
    //                {
    //                    if ((*it).get()/*(*it)->hasFlag(fish::FLAG_UPDATE) && !(*it)->isState(fish::STATE_EXPLODE)*/) {
    //                        if ((*it).get()->server_ID == S_HitTeam_Success_dte->FishNetIDs[i].wID) {//&& currentFish->fish_type==S_Cast_Net_Success_dte->FishNetIDs[i].cbType
    //                            (*it).get()->targetChairID = S_HitTeam_Success_dte->wChairID;
    //                            //(*it)->onHurt(1);
    //                            onHurt((*it),1);
    //                            break;
    //                        }
    //                    }
    //                }
    //            }
    //            mutexDestructFish.unlock();

    //        }

    //        return true;
    //    }
    //case SUB_S_TYPE_BOMB_SUCCESS:
    //    {
    //        const CMD_S_TypeBomb_Success_dte* S_TypeBomb_Success_dte = (CMD_S_TypeBomb_Success_dte*)pData;
    //        if (wDataSize != sizeof(CMD_S_TypeBomb_Success_dte) - (MAX_FISH_BY_BOMB - S_TypeBomb_Success_dte->cbCount)*sizeof(CMD_C_Fish_Net_Object))
    //        {
    //        //    printf("校验失败!\n");
    //        //    return false;
    //        }    
    //        int a = wDataSize;
    //        int b = sizeof(CMD_S_TypeBomb_Success_dte) - (MAX_FISH_BY_BOMB - S_TypeBomb_Success_dte->cbCount)*sizeof(CMD_C_Fish_Net_Object);

    //        int ID = S_TypeBomb_Success_dte->wChairID;
    //        if (ID != m_RobotID) return true;

    //        //LOGD("SUB_S_TYPE_BOMB_SUCCESS :a=" << a << "   SUB_S_TYPE_BOMB_SUCCESS :b=" << b << "  count=" << S_TypeBomb_Success_dte->cbCount);
    //        //if (isUpsideEx) {
    //        //    ID = getCannonID(ID);
    //        //}
    //        fishPlayer[ID].lFishGold += S_TypeBomb_Success_dte->lPlayerAddScore;


    //        for (int i = 0; i<S_TypeBomb_Success_dte->cbCount; i++)
    //        {
    //            mutexDestructFish.lock();
    //            if (!allFishes.empty())
    //            {
    //                if (RepositionState) return true;
    //                FISHES::iterator it = allFishes.begin();
    //                for (; it != allFishes.end(); it++)
    //                {
    //                    if ((*it).get()/*(*it)->hasFlag(fish::FLAG_UPDATE) && !(*it)->isState(fish::STATE_EXPLODE)*/) {
    //                        if ((*it).get()->server_ID == S_TypeBomb_Success_dte->FishNetIDs[i].wID) {//&& currentFish->fish_type==S_Cast_Net_Success_dte->FishNetIDs[i].cbType
    //                            (*it).get()->targetChairID = S_TypeBomb_Success_dte->wChairID;
    //                            //(*it)->onHurt(1)
    //                            onHurt((*it),1);
    //                            break;
    //                        }
    //                    }
    //                }
    //                mutexDestructFish.unlock();
    //            }
    //        }
    //        return true;
    //    }

    //case  SUB_IDI_FIRE:
    //{
    //    LOGD("SUB_IDI_FIRE");
    //    std::shared_ptr<ReceiveMsg> pReceiveData = std::shared_ptr<ReceiveMsg>(new /*(std::nothrow)*/ ReceiveMsg());
    //    pReceiveData->wSubCmdID = wSubCmdID;
    //    pReceiveData->wDataSize = wDataSize;
    //    memcpy(pReceiveData->cbDataBuffer, pData, wDataSize);
    //    bool bRet = getMessage(pReceiveData);
    //    return true;
    //}

     case SUB_S_CAST_NET_SUCCESS://撒网成功
     case SUB_S_HIT_TEAM_SUCCESS://击中小组
     case SUB_S_TYPE_BOMB_SUCCESS://同类炸弹成功
     case SUB_S_CHANGE_SCENE://改变场景
     {
         std::shared_ptr<ReceiveMsg> pReceiveData = std::shared_ptr<ReceiveMsg>(new /*(std::nothrow)*/ ReceiveMsg());
         //ReceiveMsg* pReceiveData = new (std::nothrow) ReceiveMsg();
         pReceiveData->wSubCmdID = wSubCmdID;
         pReceiveData->wDataSize = wDataSize;
         memcpy(pReceiveData->cbDataBuffer, pData, wDataSize);
         bool bRet = getMessage(pReceiveData);
         return true;
     }
    case SUB_S_SEND_FISH_PATH:
      {
           CMD_S_Fish_Path * S_Fish_Path = (CMD_S_Fish_Path *)pData;

           fishCount=0;   //每次收到服务器创建鱼的消息,重置一下fishCount
           Tools::srand(S_Fish_Path->cbSeed);

           debug_("FISH_PATH:%d,%d,%d,%d,%d", S_Fish_Path->cbType, S_Fish_Path->cbCount, S_Fish_Path->wGroupID, S_Fish_Path->FishNetObject[0].wID, S_Fish_Path->FishNetObject[0].cbType);

           int num = S_Fish_Path->cbCount;//鱼的数量

          // int runMode = fish::RUN_MODE_LINE + Tools::rand() % 2;
           int runMode = Fishes::RUN_MODE_LINE + Tools::rand() % 2;
           debug_("S_Fish_Path->cbSeed:%d, Tools::rand()%2: %d", Tools::rand() % 2);
           if (S_Fish_Path->cbType == FISH_PATH_LINE) {
               for (int i = 0; i < num; i++) {

                   if (S_Fish_Path->FishNetObject[i].cbType>15) {
                      // runMode = fish::RUN_MODE_LINE;
                       runMode = Fishes::RUN_MODE_LINE;
                   }

                   int start_x = -300;
                   int start_y = -300;

                   if (Tools::rand() % (int)(winSize.width + winSize.height) < winSize.width) {
                       if (Tools::rand() % 2 == 0) {
                           start_y = -start_y + winSize.height;
                       }
                       start_x += Tools::rand() % (int)(winSize.width + 600);
                   }
                   else {
                       if (Tools::rand() % 2 == 0) {
                           start_x = -start_x + winSize.width;
                       }
                       start_y += Tools::rand() % (int)(winSize.height + 600);
                   }

                   int pass_x = winSize.width / 8 + Tools::rand() % (int)(winSize.width * 6 / 8);
                   int pass_y = winSize.height / 8 + Tools::rand() % (int)(winSize.height * 6 / 8);

                   Vec2 curvePos[3];
                   if (/*runMode == fish::RUN_MODE_CURVE*/runMode == Fishes::RUN_MODE_CURVE) {
                       for (int i = 0; i < 2; i++) {
                           curvePos[i].x = winSize.width / 8 + Tools::rand() % (int)(winSize.width * 6 / 8);
                           curvePos[i].y = winSize.height / 8 + Tools::rand() % (int)(winSize.height * 6 / 8);
                       }

                       curvePos[2].x = -300;
                       curvePos[2].y = -300;

                       if (Tools::rand() % (int)(winSize.width + winSize.height) < winSize.width) {
                           if (Tools::rand() % 2 == 0) {
                               curvePos[2].y = -curvePos[2].y + winSize.height;
                           }
                           curvePos[2].x += Tools::rand() % (int)(winSize.width + 600);
                       }
                       else {
                           if (Tools::rand() % 2 == 0) {
                               curvePos[2].x = -curvePos[2].x + winSize.width;
                           }
                           curvePos[2].y += Tools::rand() % (int)(winSize.height + 600);
                       }

                   }

                   int angle = Tools::getAngle(pass_x - start_x, pass_y - start_y);

                   if (isUpside) {
                       angle += 180;
                       angle %= 360;
                       start_x = winSize.width - start_x;
                       start_y = winSize.height - start_y;

                       if (/*runMode == fish::RUN_MODE_CURVE*/runMode == Fishes::RUN_MODE_CURVE) {
                           for (int i = 0; i < 3; i++) {
                               curvePos[i].x = winSize.width - curvePos[i].x;
                               curvePos[i].y = winSize.height - curvePos[i].y;
                           }
                       }

                   }
                   if (S_Fish_Path->FishNetObject[i].cbType <= 20) {
                      // fish* fish = fish::createFish(start_x, start_y, angle, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);
                      // Fishes* fish = Fishes::createFish(start_x, start_y, angle, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);

                       Fishes* fish = createFish(start_x, start_y, angle, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);
                       if (/*runMode == fish::RUN_MODE_CURVE*/runMode == Fishes::RUN_MODE_CURVE) {
                           fish->setRunCurve(curvePos);
                       }
                   }

               }
           }
           else if (S_Fish_Path->cbType == FISH_PATH_SP_HAS_ID) {
               for (int i = 0; i < num; i++) {

                   int start_x = -300;
                   int start_y = -300;

                   if (Tools::rand() % (int)(winSize.width + winSize.height) < winSize.width) {
                       if (Tools::rand() % 2 == 0) {
                           start_y = -start_y + winSize.height;
                       }
                       start_x += Tools::rand() % (int)(winSize.width + 600);
                   }
                   else {
                       if (Tools::rand() % 2 == 0) {
                           start_x = -start_x + winSize.width;
                       }
                       start_y += Tools::rand() % (int)(winSize.height + 600);
                   }

                   int pass_x = winSize.width / 8 + Tools::rand() % (int)(winSize.width * 6 / 8);
                   int pass_y = winSize.height / 8 + Tools::rand() % (int)(winSize.height * 6 / 8);

                   int angle = Tools::getAngle(pass_x - start_x, pass_y - start_y);

                   if (isUpside) {
                       angle += 180;
                       angle %= 360;
                       start_x = winSize.width - start_x;
                       start_y = winSize.height - start_y;
                   }

                   if (S_Fish_Path->FishNetObject[i].cbType == 21 || S_Fish_Path->FishNetObject[i].cbType == 22) {
                      //fish::createFish(start_x, start_y, angle, fish::TYPE_NIL, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);
                      //Fishes::createFish(start_x, start_y, angle, Fishes::TYPE_NIL, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);

                       createFish(start_x, start_y, angle, Fishes::TYPE_NIL, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);
                   }
                   else if (S_Fish_Path->FishNetObject[i].cbType == 23) {
                      // fish::createFish(start_x, start_y, angle, fish::STYLE_PAUSE, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);
                      // Fishes::createFish(start_x, start_y, angle, Fishes::STYLE_PAUSE, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);

                         createFish(start_x, start_y, angle, Fishes::STYLE_PAUSE, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);
                   }
                   else {

                   }
               }
           }
           else if (S_Fish_Path->cbType == FISH_PATH_SP_TEAM) {

               int start_x = -300;
               int start_y = -300;

               if (Tools::rand() % (int)(winSize.width + winSize.height) < winSize.width) {
                   if (Tools::rand() % 2 == 0) {
                       start_y = -start_y + winSize.height;
                   }
                   start_x += Tools::rand() % (int)(winSize.width + 600);
               }
               else {
                   if (Tools::rand() % 2 == 0) {
                       start_x = -start_x + winSize.width;
                   }
                   start_y += Tools::rand() % (int)(winSize.height + 600);
               }

               int pass_x = winSize.width / 8 + Tools::rand() % (int)(winSize.width * 6 / 8);
               int pass_y = winSize.height / 8 + Tools::rand() % (int)(winSize.height * 6 / 8);

               int angle = Tools::getAngle(pass_x - start_x, pass_y - start_y);

               int w = 70;

               for (int i = 0; i < num; i++) {
                   if (S_Fish_Path->FishNetObject[i].cbType >8) {
                       w = 150;
                   }
                   else if (S_Fish_Path->FishNetObject[i].cbType > 7) {
                       w = 140;
                   }
                   else if (S_Fish_Path->FishNetObject[i].cbType > 4) {
                       w = 130;
                   }
                   else if (S_Fish_Path->FishNetObject[i].cbType > 3) {
                       w = 100;
                   }
                   else if (S_Fish_Path->FishNetObject[i].cbType > 2) {
                       w = 90;
                   }

                   int appear_x = start_x + Tools::getAngleX((angle + 180) % 360, w*i);
                   int appear_y = start_y + Tools::getAngleY((angle + 180) % 360, w*i);

                   int angle2 = angle;

                   if (isUpside) {
                       angle2 += 180;
                       angle2 %= 360;
                       appear_x = winSize.width - appear_x;
                       appear_y = winSize.height - appear_y;
                   }
                  // fish::createFish(appear_x, appear_y, angle2, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);
                  // Fishes::createFish(appear_x, appear_y, angle2, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);

                    createFish(appear_x, appear_y, angle2, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);

               }
           }
           else if (S_Fish_Path->cbType == FISH_PATH_SP_SPTTEAM) {
               if (num > 4) {
                   int start_x = -300;
                   int start_y = -300;

                   if (Tools::rand() % (int)(winSize.width + winSize.height) < winSize.width) {
                       if (Tools::rand() % 2 == 0) {
                           start_y = -start_y + winSize.height;
                       }
                       start_x += Tools::rand() % (int)(winSize.width + 600);
                   }
                   else {
                       if (Tools::rand() % 2 == 0) {
                           start_x = -start_x + winSize.width;
                       }
                       start_y += Tools::rand() % (int)(winSize.height + 600);
                   }

                   int pass_x = winSize.width / 8 + Tools::rand() % (int)(winSize.width * 6 / 8);
                   int pass_y = winSize.height / 8 + Tools::rand() % (int)(winSize.height * 6 / 8);

                   int angle = Tools::getAngle(pass_x - start_x, pass_y - start_y);

                   int w = 70;

                   for (int i = 0; i < num; i++) {
                       if (S_Fish_Path->FishNetObject[i].cbType >8) {
                           w = 150;
                       }
                       else if (S_Fish_Path->FishNetObject[i].cbType > 7) {
                           w = 140;
                       }
                       else if (S_Fish_Path->FishNetObject[i].cbType > 4) {
                           w = 130;
                       }
                       else if (S_Fish_Path->FishNetObject[i].cbType > 3) {
                           w = 100;
                       }
                       else if (S_Fish_Path->FishNetObject[i].cbType > 2) {
                           w = 90;
                       }

                       int appear_x = start_x + Tools::getAngleX((angle + 180) % 360, w*i);
                       int appear_y = start_y + Tools::getAngleY((angle + 180) % 360, w*i);

                       int angle2 = angle;

                       if (isUpside) {
                           angle2 += 180;
                           angle2 %= 360;
                           appear_x = winSize.width - appear_x;
                           appear_y = winSize.height - appear_y;
                       }
                      // fish::createFish(appear_x, appear_y, angle2, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);
                      // Fishes::createFish(appear_x, appear_y, angle2, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);

                         createFish(appear_x, appear_y, angle2, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);

                   }
               }
               else {
                   int start_x = -500;
                   int start_y = -500;

                   if (Tools::rand() % (int)(winSize.width + winSize.height) < winSize.width) {
                       if (Tools::rand() % 2 == 0) {
                           start_y = -start_y + winSize.height;
                       }
                       start_x += Tools::rand() % (int)(winSize.width + 1000);
                   }
                   else {
                       if (Tools::rand() % 2 == 0) {
                           start_x = -start_x + winSize.width;
                       }
                       start_y += Tools::rand() % (int)(winSize.height + 1000);
                   }

                   int pass_x = winSize.width / 8 + Tools::rand() % (int)(winSize.width * 6 / 8);
                   int pass_y = winSize.height / 8 + Tools::rand() % (int)(winSize.height * 6 / 8);

                   int angle = Tools::getAngle(pass_x - start_x, pass_y - start_y);

                   int mark_ID = S_Fish_Path->FishNetObject[0].wID;

                   if (num == 3) {
                       for (int i = 0; i < 3; i++) {
                           int appear_x = start_x + Tools::getAngleX((angle + 180) % 360, 80 * i);
                           int appear_y = start_y + Tools::getAngleY((angle + 180) % 360, 80 * i);

                           int angle2 = angle;

                           if (isUpside) {
                               angle2 += 180;
                               angle2 %= 360;
                               appear_x = winSize.width - appear_x;
                               appear_y = winSize.height - appear_y;
                           }

                         //  fish* fish = fish::createFish(appear_x, appear_y, angle2, fish::STYLE_TEAM, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);
                         //  fish->mark_ID = mark_ID;
                         // Fishes* fish = Fishes::createFish(appear_x, appear_y, angle2, Fishes::STYLE_TEAM, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);
                          
                           Fishes* fish = createFish(appear_x, appear_y, angle2, Fishes::STYLE_TEAM, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);
                           fish->mark_ID = mark_ID;
                       }
                   }
                   else {
                       if (isUpside) {
                           angle += 180;
                           angle %= 360;
                           start_x = winSize.width - start_x;
                           start_y = winSize.height - start_y;
                       }

                     // fish* fish = fish::createFish(start_x, start_y, angle, fish::STYLE_TEAM, S_Fish_Path->FishNetObject[0].cbType, S_Fish_Path->FishNetObject[0].wID);
                     // fish->mark_ID = mark_ID;
                     //  fish = fish::createFish(start_x - 40, start_y - 75, angle, fish::STYLE_TEAM, S_Fish_Path->FishNetObject[1].cbType, S_Fish_Path->FishNetObject[1].wID);
                     //  fish->mark_ID = mark_ID;
                     //  fish = fish::createFish(start_x + 40, start_y - 75, angle, fish::STYLE_TEAM, S_Fish_Path->FishNetObject[2].cbType, S_Fish_Path->FishNetObject[2].wID);
                     //  fish->mark_ID = mark_ID;
                     //  fish = fish::createFish(start_x, start_y - 150, angle, fish::STYLE_TEAM, S_Fish_Path->FishNetObject[3].cbType, S_Fish_Path->FishNetObject[3].wID);
                     //  fish->mark_ID = mark_ID;

                       //Fishes* fish = Fishes::createFish(start_x, start_y, angle, Fishes::STYLE_TEAM, S_Fish_Path->FishNetObject[0].cbType, S_Fish_Path->FishNetObject[0].wID);
                      
                       Fishes* fish = createFish(start_x, start_y, angle, Fishes::STYLE_TEAM, S_Fish_Path->FishNetObject[0].cbType, S_Fish_Path->FishNetObject[0].wID);
                       fish->mark_ID = mark_ID;

                       //fish = Fishes::createFish(start_x - 40, start_y - 75, angle, Fishes::STYLE_TEAM, S_Fish_Path->FishNetObject[1].cbType, S_Fish_Path->FishNetObject[1].wID);
                       fish = createFish(start_x - 40, start_y - 75, angle, Fishes::STYLE_TEAM, S_Fish_Path->FishNetObject[1].cbType, S_Fish_Path->FishNetObject[1].wID);
                       fish->mark_ID = mark_ID;


                       //fish = Fishes::createFish(start_x + 40, start_y - 75, angle, Fishes::STYLE_TEAM, S_Fish_Path->FishNetObject[2].cbType, S_Fish_Path->FishNetObject[2].wID);
                       fish = createFish(start_x + 40, start_y - 75, angle, Fishes::STYLE_TEAM, S_Fish_Path->FishNetObject[2].cbType, S_Fish_Path->FishNetObject[2].wID);
                       fish->mark_ID = mark_ID;

                       //fish = Fishes::createFish(start_x, start_y - 150, angle, Fishes::STYLE_TEAM, S_Fish_Path->FishNetObject[3].cbType, S_Fish_Path->FishNetObject[3].wID);
                       fish = createFish(start_x, start_y - 150, angle, Fishes::STYLE_TEAM, S_Fish_Path->FishNetObject[3].cbType, S_Fish_Path->FishNetObject[3].wID);
                       fish->mark_ID = mark_ID;

                   }
               }
           }
           else if (S_Fish_Path->cbType == FISH_PATH_SP_TYPE_BOMB) {
               for (int i = 0; i < num; i++) {
                   int start_x = -300;
                   int start_y = -300;

                   if (Tools::rand() % (int)(winSize.width + winSize.height) < winSize.width) {
                       if (Tools::rand() % 2 == 0) {
                           start_y = -start_y + winSize.height;
                       }
                       start_x += Tools::rand() % (int)(winSize.width + 600);
                   }
                   else {
                       if (Tools::rand() % 2 == 0) {
                           start_x = -start_x + winSize.width;
                       }
                       start_y += Tools::rand() % (int)(winSize.height + 600);
                   }

                   int pass_x = winSize.width / 8 + Tools::rand() % (int)(winSize.width * 6 / 8);
                   int pass_y = winSize.height / 8 + Tools::rand() % (int)(winSize.height * 6 / 8);

                   int angle = Tools::getAngle(pass_x - start_x, pass_y - start_y);

                   if (isUpside) {
                       angle += 180;
                       angle %= 360;
                       start_x = winSize.width - start_x;
                       start_y = winSize.height - start_y;
                   }
                   if (S_Fish_Path->FishNetObject[i].cbType <= 22) {
                      // fish::createFish(start_x, start_y, angle, fish::STYLE_SAME, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);
                      // Fishes::createFish(start_x, start_y, angle, Fishes::STYLE_SAME, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID

                        createFish(start_x, start_y, angle, Fishes::STYLE_SAME, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);

                   }
               }
           }
           else if (S_Fish_Path->cbType == FISH_PATH_WATER_PLANT) {
               for (int i = 0; i < num; i++) {
                   int start_x = -300;
                   int start_y = -300;

                   if (Tools::rand() % (int)(winSize.width + winSize.height) < winSize.width) {
                       if (Tools::rand() % 2 == 0) {
                           start_y = -start_y + winSize.height;
                       }
                       start_x += Tools::rand() % (int)(winSize.width + 600);
                   }
                   else {
                       if (Tools::rand() % 2 == 0) {
                           start_x = -start_x + winSize.width;
                       }
                       start_y += Tools::rand() % (int)(winSize.height + 600);
                   }

                   int pass_x = winSize.width / 8 + Tools::rand() % (int)(winSize.width * 6 / 8);
                   int pass_y = winSize.height / 8 + Tools::rand() % (int)(winSize.height * 6 / 8);

                   int angle = Tools::getAngle(pass_x - start_x, pass_y - start_y);

                   if (isUpside) {
                       angle += 180;
                       angle %= 360;
                       start_x = winSize.width - start_x;
                       start_y = winSize.height - start_y;
                   }
                   if (S_Fish_Path->FishNetObject[i].cbType <= 22) {
                       //fish::createFish(start_x, start_y, angle, fish::STYLE_ANY, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);
                      // Fishes::createFish(start_x, start_y, angle, Fishes::STYLE_ANY, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);

                         createFish(start_x, start_y, angle, Fishes::STYLE_ANY, S_Fish_Path->FishNetObject[i].cbType, S_Fish_Path->FishNetObject[i].wID);

                   }
               }
           }

           setState(STATE_NORMAL);
            return true;
       }
    case SUB_S_SEND_FISH_PATH_GROUP://阵形
           {
               CMD_S_Fish_Group * S_Fish_Group = (CMD_S_Fish_Group *)pData;

               //CCLOG("CMD_S_Fish_Group:%f,%d", S_Fish_Group->fPassTime, S_Fish_Group->cbType);

               Tools::srand(S_Fish_Group->cbSeed);

               tacticID = S_Fish_Group->cbType - 1;

               if (tacticID != 0)
                   tacticID %= 11;

               //tacticID = 3;

               //Fish::resetTacticID();

               if (tacticID == 0) {

                   for (int i = 0; i < 100; i++) {
                      // fish* fish = fish::createFish(Tools::rand() % ((int)winSize.width), winSize.height + 100, 270, 1, i);
                      // Fishes* fish = Fishes::createFish(Tools::rand() % ((int)winSize.width), winSize.height + 100, 270, 1, i);

                       Fishes* fish = createFish(Tools::rand() % ((int)winSize.width), winSize.height + 100, 270, 1, i);
                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 2 + i*0.2f;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 10;

                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;


                      // fish = fish::createFish(Tools::rand() % ((int)winSize.width), -100, 90, 2, 100 + i);
                      // fish = Fishes::createFish(Tools::rand() % ((int)winSize.width), -100, 90, 2, 100 + i);

                       fish = createFish(Tools::rand() % ((int)winSize.width), -100, 90, 2, 100 + i);
                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 2 + i*0.2f;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 10;

                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;
                   }

                   int fish_buffer[80][2];
                   for (int i = 0; i < 80; i++) {
                       fish_buffer[i][0] = 200 + i;
                       fish_buffer[i][1] = 14 + i / 20;
                   }

                   int buffer_ID, buffer_type;
                   int choose_1, choose_2;

                   for (int i = 0; i < 100; i++) {
                       choose_1 = Tools::rand() % 80;
                       choose_2 = Tools::rand() % 80;
                       while (choose_2 == choose_1) {
                           choose_2 = Tools::rand() % 80;
                       }

                       buffer_ID = fish_buffer[choose_1][0];
                       buffer_type = fish_buffer[choose_1][1];

                       fish_buffer[choose_1][0] = fish_buffer[choose_2][0];
                       fish_buffer[choose_1][1] = fish_buffer[choose_2][1];

                       fish_buffer[choose_2][0] = buffer_ID;
                       fish_buffer[choose_2][1] = buffer_type;
                   }

                   for (int i = 0; i < 27; i++) {
                       for (int k = 0; k < 3; k++) {
                           if (!(i == 26 && k == 2)) {
                             //  fish* fish = fish::createFish(winSize.width + 350, winSize.height / 2, 160 + k * 20 + Tools::rand() % 11 - 5, fish_buffer[i * 3 + k][1], fish_buffer[i * 3 + k][0]);
                             //  Fishes* fish = Fishes::createFish(winSize.width + 350, winSize.height / 2, 160 + k * 20 + Tools::rand() % 11 - 5, fish_buffer[i * 3 + k][1], fish_buffer[i * 3 + k][0]);

                               Fishes* fish = createFish(winSize.width + 350, winSize.height / 2, 160 + k * 20 + Tools::rand() % 11 - 5, fish_buffer[i * 3 + k][1], fish_buffer[i * 3 + k][0]);

                               fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                               fish->fishAction[0].time = i*0.75f + Tools::rand() % 10 / 10.0f;

                               fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                               fish->fishAction[1].time = 20;

                               fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;

                               if (isUpside) {
                                   fish->angle += 180;
                                   fish->angle = fmod(fish->angle, 360);
                                   fish->x = winSize.width - fish->x;
                                   fish->y = winSize.height - fish->y;

                                   fish->setAngle(fish->angle);
                                   fish->setV_xy();
                               }

                               fish->buffer_x = fish->x;
                               fish->buffer_y = fish->y;
                               fish->buffer_angle = fish->angle;
                           }
                       }
                   }
               }
               else if (tacticID == 1) {
                   int w = winSize.width;
                   int h = winSize.height;
                   int half_w = winSize.width / 2;
                   int half_h = winSize.height / 2;

                   float angle[4];
                   angle[0] = Tools::getAngle(winSize.width / 2, winSize.height / 2);
                   angle[1] = fmod(angle[0] + 180, 360);
                   angle[2] = 180 - angle[0];
                   angle[3] = fmod(angle[2] + 180, 360);

                   float distance = sqrt(half_w*half_w + half_h*half_h)*1.5f;

                   float x[8], y[8];
                   x[0] = w + Tools::getAngleX(angle[1], distance);
                   y[0] = half_h + Tools::getAngleY(angle[1], distance);

                   x[1] = half_w + Tools::getAngleX(angle[1], distance);
                   y[1] = h + Tools::getAngleY(angle[1], distance);

                   x[2] = half_w + Tools::getAngleX(angle[0], distance);
                   y[2] = 0 + Tools::getAngleY(angle[0], distance);

                   x[3] = 0 + Tools::getAngleX(angle[0], distance);
                   y[3] = half_h + Tools::getAngleY(angle[0], distance);

                   x[4] = 0 + Tools::getAngleX(angle[3], distance);
                   y[4] = half_h + Tools::getAngleY(angle[3], distance);

                   x[5] = half_w + Tools::getAngleX(angle[3], distance);
                   y[5] = h + Tools::getAngleY(angle[3], distance);

                   x[6] = half_w + Tools::getAngleX(angle[2], distance);
                   y[6] = 0 + Tools::getAngleY(angle[2], distance);

                   x[7] = w + Tools::getAngleX(angle[2], distance);
                   y[7] = half_h + Tools::getAngleY(angle[2], distance);

                   int type[4] = { 20, 18, 19, 17 };

                   int ID_offset[4] = { 30, 10, 20, 0 };

                   for (int i = 0; i < 5; i++) {
                       for (int j = 0; j < 4; j++) {
                           for (int k = 0; k < 2; k++) {
                            // fish* fish = fish::createFish(x[j * 2 + k], y[j * 2 + k], angle[j], type[j], ID_offset[j] + i * 2 + k);
                            // Fishes* fish = Fishes::createFish(x[j * 2 + k], y[j * 2 + k], angle[j], type[j], ID_offset[j] + i * 2 + k);

                               Fishes* fish = createFish(x[j * 2 + k], y[j * 2 + k], angle[j], type[j], ID_offset[j] + i * 2 + k);

                               fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                               fish->fishAction[0].time = i*5.0f;

                               fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                               fish->fishAction[1].time = 15;

                               fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;

                               fish->setSpeed(120, angle[j]);

                               if (isUpside) {
                                   fish->angle += 180;
                                   fish->angle = fmod(fish->angle, 360);
                                   fish->x = winSize.width - fish->x;
                                   fish->y = winSize.height - fish->y;

                                   fish->setAngle(fish->angle);
                                   fish->setV_xy();
                               }

                               fish->buffer_x = fish->x;
                               fish->buffer_y = fish->y;
                               fish->buffer_angle = fish->angle;
                           }
                       }
                   }
               }
               else if (tacticID == 2) {

                   float buffer_time = 20;

                   for (int i = 0; i < 120; i++)
                   {
                       buffer_time = 20;
                       //fish* fish = fish::createFish(Tools::rand() % ((int)winSize.width), winSize.height + 100, 270, 1, i);
                       //Fishes* fish = Fishes::createFish(Tools::rand() % ((int)winSize.width), winSize.height + 100, 270, 1, i);

                       Fishes* fish = createFish(Tools::rand() % ((int)winSize.width), winSize.height + 100, 270, 1, i);

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = Tools::rand() % 100 / 10.0f;
                       buffer_time -= fish->fishAction[0].time;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 1 + Tools::rand() % 20 / 10.0f;
                       buffer_time -= fish->fishAction[1].time;

                       fish->fishAction[2].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[2].time = buffer_time;

                       fish->fishAction[3].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[3].time = 2 + Tools::rand() % 40 / 10.0f;

                       fish->fishAction[4].actionID = Fishes::ACTION_CLEAR;

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;

                       buffer_time = 20;
                      // fish = fish::createFish(Tools::rand() % ((int)winSize.width), -100, 90, 2, 120 + i);
                      // fish = Fishes::createFish(Tools::rand() % ((int)winSize.width), -100, 90, 2, 120 + i);

                       fish = createFish(Tools::rand() % ((int)winSize.width), -100, 90, 2, 120 + i);

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = Tools::rand() % 100 / 10.0f;
                       buffer_time -= fish->fishAction[0].time;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 1 + Tools::rand() % 20 / 10.0f;
                       buffer_time -= fish->fishAction[1].time;

                       fish->fishAction[2].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[2].time = buffer_time;

                       fish->fishAction[3].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[3].time = 2 + Tools::rand() % 40 / 10.0f;

                       fish->fishAction[4].actionID = Fishes::ACTION_CLEAR;

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;

                   }

                   for (int i = 0; i < 3; i++) {

                     //  fish* fish = fish::createFish(-150, winSize.height * 7 / 20, 0, 17, 240 + i * 2);
                     //  Fishes* fish = Fishes::createFish(-150, winSize.height * 7 / 20, 0, 17, 240 + i * 2);

                       Fishes* fish = createFish(-150, winSize.height * 7 / 20, 0, 17, 240 + i * 2);
                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 0.5f + i*8.5f;
                       buffer_time -= fish->fishAction[0].time;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 20;
                       buffer_time -= fish->fishAction[1].time;

                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;

                     //  fish = fish::createFish(-162, winSize.height * 7 / 20, 0, 18, 250 + i * 2);
                     //  fish = Fishes::createFish(-162, winSize.height * 7 / 20, 0, 18, 250 + i * 2);

                       fish = createFish(-162, winSize.height * 7 / 20, 0, 18, 250 + i * 2);

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 2.5f + i*8.5f;
                       buffer_time -= fish->fishAction[0].time;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 20;
                       buffer_time -= fish->fishAction[1].time;

                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;


                      // fish = fish::createFish(-285, winSize.height * 7 / 20, 0, 19, 260 + i * 2);
                      // fish = Fishes::createFish(-285, winSize.height * 7 / 20, 0, 19, 260 + i * 2);
                       
                       fish = createFish(-285, winSize.height * 7 / 20, 0, 19, 260 + i * 2);

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 4.5f + i*8.5f;
                       buffer_time -= fish->fishAction[0].time;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 20;
                       buffer_time -= fish->fishAction[1].time;

                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;

                      // fish = fish::createFish(-350, winSize.height * 7 / 20, 0, 20, 270 + i * 2);
                      // fish = Fishes::createFish(-350, winSize.height * 7 / 20, 0, 20, 270 + i * 2);

                       fish = createFish(-350, winSize.height * 7 / 20, 0, 20, 270 + i * 2);

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 5.5f + i*8.5f;
                       buffer_time -= fish->fishAction[0].time;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 20;
                       buffer_time -= fish->fishAction[1].time;

                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;

                       ///////////////////////////////////////////////////
                      // fish = fish::createFish(winSize.width + 150, winSize.height * 13 / 20, 180, 17, 240 + i * 2 + 1);
                      // fish = Fishes::createFish(winSize.width + 150, winSize.height * 13 / 20, 180, 17, 240 + i * 2 + 1);

                       fish = createFish(winSize.width + 150, winSize.height * 13 / 20, 180, 17, 240 + i * 2 + 1);

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 0.5f + i*8.5f;
                       buffer_time -= fish->fishAction[0].time;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 20;
                       buffer_time -= fish->fishAction[1].time;

                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;

                      // fish = fish::createFish(winSize.width + 162, winSize.height * 13 / 20, 180, 18, 250 + i * 2 + 1);
                      // fish = Fishes::createFish(winSize.width + 162, winSize.height * 13 / 20, 180, 18, 250 + i * 2 + 1);

                       fish = createFish(winSize.width + 162, winSize.height * 13 / 20, 180, 18, 250 + i * 2 + 1);

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 2.5f + i*8.5f;
                       buffer_time -= fish->fishAction[0].time;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 20;
                       buffer_time -= fish->fishAction[1].time;

                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;

                      // fish = fish::createFish(winSize.width + 285, winSize.height * 13 / 20, 180, 19, 260 + i * 2 + 1);
                      // fish = Fishes::createFish(winSize.width + 285, winSize.height * 13 / 20, 180, 19, 260 + i * 2 + 1);
                         
                       fish = createFish(winSize.width + 285, winSize.height * 13 / 20, 180, 19, 260 + i * 2 + 1);

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 4.5f + i*8.5f;
                       buffer_time -= fish->fishAction[0].time;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 20;
                       buffer_time -= fish->fishAction[1].time;

                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;

                     //  fish = fish::createFish(winSize.width + 350, winSize.height * 13 / 20, 180, 20, 270 + i * 2 + 1);
                     //  fish = Fishes::createFish(winSize.width + 350, winSize.height * 13 / 20, 180, 20, 270 + i * 2 + 1);

                       fish = createFish(winSize.width + 350, winSize.height * 13 / 20, 180, 20, 270 + i * 2 + 1);

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 5.5f + i*8.5f;
                       buffer_time -= fish->fishAction[0].time;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 20;
                       buffer_time -= fish->fishAction[1].time;

                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;

                   }

               }
               else if (tacticID == 3) {
                   int buffer_ID = 900;

                   int n = Tools::rand() % 4;
                   for (int i = 0; i < 4; i++) {
                       int m = 2;
                       if (n == i) {
                           m = 1;
                       }
                       for (int j = 0; j < m; j++) {
                         //  fish* fish = fish::createFish(winSize.width / 2, winSize.height / 2, 30 + Tools::rand() % 6 * 60 + Tools::rand() % 31 - 15, 4, buffer_ID++);
                         //  Fishes* fish = Fishes::createFish(winSize.width / 2, winSize.height / 2, 30 + Tools::rand() % 6 * 60 + Tools::rand() % 31 - 15, 4, buffer_ID++);

                           Fishes* fish = createFish(winSize.width / 2, winSize.height / 2, 30 + Tools::rand() % 6 * 60 + Tools::rand() % 31 - 15, 4, buffer_ID++);

                           fish->fishAction[0].actionID = Fishes::ACTION_HIDE;
                           fish->fishAction[0].time = 0.2f*i;

                           fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                           fish->fishAction[1].time = 7;

                           fish->fishAction[4].actionID = Fishes::ACTION_CLEAR;

                           if (isUpside) {
                               fish->angle += 180;
                               fish->angle = fmod(fish->angle, 360);
                               fish->x = winSize.width - fish->x;
                               fish->y = winSize.height - fish->y;

                               fish->setAngle(fish->angle);
                               fish->setV_xy();
                           }

                           fish->buffer_x = fish->x;
                           fish->buffer_y = fish->y;
                           fish->buffer_angle = fish->angle;

                          // fish->setVisible(false);
                          // fish->shadow->setVisible(false);
                       }
                   }

                   for (int i = 0; i < 3; i++) {
                       for (int j = 0; j < 30; j++) {
                           for (int k = 0; k < 6; k++) {
                              // fish* fish = fish::createFish(winSize.width / 2, winSize.height / 2, 30 + k * 60 + Tools::rand() % 31 - 15, 1 + i, i * 300 + j * 6 + k);
                              // Fishes* fish = Fishes::createFish(winSize.width / 2, winSize.height / 2, 30 + k * 60 + Tools::rand() % 31 - 15, 1 + i, i * 300 + j * 6 + k);

                               Fishes* fish = createFish(winSize.width / 2, winSize.height / 2, 30 + k * 60 + Tools::rand() % 31 - 15, 1 + i, i * 300 + j * 6 + k);

                               fish->fishAction[0].actionID = Fishes::ACTION_HIDE;
                               fish->fishAction[0].time = j*0.1f + i * 4 + 2.5f;

                               fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                               fish->fishAction[1].time = 7;

                               fish->fishAction[4].actionID = Fishes::ACTION_CLEAR;

                               if (isUpside) {
                                   fish->angle += 180;
                                   fish->angle = fmod(fish->angle, 360);
                                   fish->x = winSize.width - fish->x;
                                   fish->y = winSize.height - fish->y;

                                   fish->setAngle(fish->angle);
                                   fish->setV_xy();
                               }

                               fish->buffer_x = fish->x;
                               fish->buffer_y = fish->y;
                               fish->buffer_angle = fish->angle;

                               //fish->setVisible(false);
                               //fish->shadow->setVisible(false);
                           }
                       }
                   }
               }
               else if (tacticID == 4) {

                   int x1 = winSize.width / 4;
                   int x2 = winSize.width * 3 / 4;

                   int x = 0;
                   int y = winSize.height / 2;

                   int n = 32;
                   float angle = 0;
                   float r = x1*0.95f;

                   float moveAngle = 0;

                   float r2 = r;

                   int type = 0;

                   int buffer_ID[7] = { 0, 40, 80, 110, 130, 160, 190 };
                   int index[7] = { 0, 0, 0, 0, 0, 0, 0 };


                   for (int i = 0; i < 8; i++) {
                       if (i % 2 == 0) {
                           x = x1;
                       }
                       else {
                           x = x2;
                       }

                       if (i == 3) {
                           type = 5;
                       }
                       else if (i == 4) {
                           type = 4;
                       }
                       else if (i < 6) {
                           type = i + 1;
                       }
                       else {
                           type = i;
                       }

                       if (i % 2 == 0) {
                           n -= 5;
                       }

                       angle = 360.0f / n;
                       r2 = r*(1 - 0.125f*(i / 2));

                       for (int j = 0; j < n; j++) {
                         //  fish* fish = fish::createFish(x + Tools::getAngleX(j*angle, r2), y + Tools::getAngleY(j*angle, r2), moveAngle = fmod(j*angle + 90, 360), type, buffer_ID[type - 1] + (index[type - 1]++));
                         //  Fishes* fish = Fishes::createFish(x + Tools::getAngleX(j*angle, r2), y + Tools::getAngleY(j*angle, r2), moveAngle = fmod(j*angle + 90, 360), type, buffer_ID[type - 1] + (index[type - 1]++));

                           Fishes* fish = createFish(x + Tools::getAngleX(j*angle, r2), y + Tools::getAngleY(j*angle, r2), moveAngle = fmod(j*angle + 90, 360), type, buffer_ID[type - 1] + (index[type - 1]++));

                           fish->fishAction[0].actionID = Fishes::ACTION_RUN_ROUND;
                           fish->fishAction[0].time = 15 + i*0.8f;

                           fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                           fish->fishAction[1].time = 10;

                           fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;

                           if (isUpside) {
                               fish->angle += 180;
                               fish->angle = fmod(fish->angle, 360);
                               fish->x = winSize.width - fish->x;
                               fish->y = winSize.height - fish->y;
                           }

                           fish->buffer_x = x;
                           fish->buffer_y = y;
                           fish->buffer_angle = j*angle;
                           fish->buffer_r = r2;
                           fish->angle_v = 40;

                       }
                   }

                 //  fish* fish = fish::createFish(x1, y, 90, 20, 203);
                 //  Fishes* fish = Fishes::createFish(x1, y, 90, 20, 203);

                    Fishes* fish = createFish(x1, y, 90, 20, 203);

                   fish->fishAction[0].actionID = Fishes::ACTION_ROTATE;
                   fish->fishAction[0].time = 15 + 7.2f;

                   fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                   fish->fishAction[1].time = 12;

                   fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;

                   if (isUpside) {
                       fish->angle += 180;
                       fish->angle = fmod(fish->angle, 360);
                       fish->x = winSize.width - fish->x;
                       fish->y = winSize.height - fish->y;
                   }

                   fish->buffer_x = fish->x;
                   fish->buffer_y = fish->y;
                   fish->buffer_angle = fish->angle;
                   fish->angle_v = 40;

                  // fish = Fishes::createFish(x2, y, 270, 19, 202);
                     fish = createFish(x2, y, 270, 19, 202);

                   fish->fishAction[0].actionID = Fishes::ACTION_ROTATE;
                   fish->fishAction[0].time = 15 + 7.2f;

                   fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                   fish->fishAction[1].time = 10;

                   fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;

                   if (isUpside) {
                       fish->angle += 180;
                       fish->angle = fmod(fish->angle, 360);
                       fish->x = winSize.width - fish->x;
                       fish->y = winSize.height - fish->y;
                   }

                   fish->buffer_x = fish->x;
                   fish->buffer_y = fish->y;
                   fish->buffer_angle = fish->angle;
                   fish->angle_v = 40;

               }
               else if (tacticID == 5) {
                   bool isLeft = Tools::rand() % 2;
                   float C = 1.41421f;
                   int n = 80;
                   float angle = 0;
                   float moveAngle = isLeft ? 0 : 180;
                   float r = (winSize.height - 50) / 2;
                   float r2 = r;
                   float w = r*C / 4;
                   int center_x = isLeft ? -winSize.height / 2 : winSize.width + winSize.height / 2;
                   int center_y = winSize.height / 2;

                   int center_x2 = center_x;
                   int center_y2 = center_y;

                   int buffer_ID[6] = { 0, 120, 150, 180, 210, 240 };
                   int index[6] = { 0, 0, 0, 0, 0, 0 };

                   for (int i = 0; i < 6; i++) {
                       if (i == 0) {
                           n = 80;
                           angle = 360.0f / n;
                       }
                       else {
                           n = 16;
                           angle = 360.0f / n;
                           if (i == 5) {
                               center_x2 = center_x;
                               center_y2 = center_y;
                               r2 = r / 2 * 0.6f;
                           }
                           else {
                               center_x2 = center_x + ((i - 1) / 2 == 0 ? w : -w);
                               center_y2 = center_y + (i / 2 % 2 == 0 ? -w : w);
                               r2 = r / 2 * 0.6f;
                           }
                       }
                       for (int j = 0; j < n; j++) {
                          // fish* fish = fish::createFish(center_x2 + Tools::getAngleX(j*angle, r2), center_y2 + Tools::getAngleY(j*angle, r2), moveAngle, i + 1, buffer_ID[i] + (index[i]++));
                          // Fishes* fish = Fishes::createFish(center_x2 + Tools::getAngleX(j*angle, r2), center_y2 + Tools::getAngleY(j*angle, r2), moveAngle, i + 1, buffer_ID[i] + (index[i]++));

                           Fishes* fish = createFish(center_x2 + Tools::getAngleX(j*angle, r2), center_y2 + Tools::getAngleY(j*angle, r2), moveAngle, i + 1, buffer_ID[i] + (index[i]++));

                           fish->fishAction[0].actionID = Fishes::ACTION_RUN_LINE;
                           fish->fishAction[0].time = 20;

                           fish->fishAction[1].actionID = Fishes::ACTION_CLEAR;
                           fish->setSpeed(100, moveAngle);

                           if (isUpside) {
                               fish->angle += 180;
                               fish->angle = fmod(fish->angle, 360);
                               fish->x = winSize.width - fish->x;
                               fish->y = winSize.height - fish->y;

                               fish->setAngle(fish->angle);
                               fish->setV_xy();
                           }

                           fish->buffer_x = fish->x;
                           fish->buffer_y = fish->y;
                           fish->buffer_angle = fish->angle;

                       }
                   }
               }
               else if (tacticID == 6) {
                   int buffer_ID[3] = { 0, 140, 226 };
                   int index[3] = { 0, 0, 0 };


                   float C = 1.41421f;
                   for (int k = 0; k < 2; k++) {
                       bool isLeft = k == 0;
                       int n = 70;
                       float angle = 0;
                       float moveAngle = isLeft ? 0 : 180;
                       float r = (winSize.height - 50) / 2;
                       float r2 = r;
                       int center_x = isLeft ? -winSize.height / 2 : winSize.width + winSize.height / 2;
                       int center_y = winSize.height / 2;
                       int type = 1;
                       for (int i = 0; i < 3; i++) {
                           n = 70 - i * 27;
                           angle = 360.0f / n;
                           if (i == 2) {
                               type = 6;
                           }
                           else {
                               type = i + 1;
                           }
                           r2 = r*(1 - 0.25f*i);
                           for (int j = 0; j < n; j++) {
                              // fish* fish = fish::createFish(center_x + Tools::getAngleX(j*angle, r2), center_y + Tools::getAngleY(j*angle, r2), moveAngle, type, buffer_ID[i] + (index[i]++));
                              // Fishes* fish = Fishes::createFish(center_x + Tools::getAngleX(j*angle, r2), center_y + Tools::getAngleY(j*angle, r2), moveAngle, type, buffer_ID[i] + (index[i]++));

                               Fishes* fish = createFish(center_x + Tools::getAngleX(j*angle, r2), center_y + Tools::getAngleY(j*angle, r2), moveAngle, type, buffer_ID[i] + (index[i]++));

                               fish->fishAction[0].actionID = Fishes::ACTION_RUN_LINE;
                               fish->fishAction[0].time = 25;

                               fish->fishAction[1].actionID = Fishes::ACTION_CLEAR;

                               fish->setSpeed(100, moveAngle);

                               if (isUpside) {
                                   fish->angle += 180;
                                   fish->angle = fmod(fish->angle, 360);
                                   fish->x = winSize.width - fish->x;
                                   fish->y = winSize.height - fish->y;

                                   fish->setAngle(fish->angle);
                                   fish->setV_xy();
                               }

                               fish->buffer_x = fish->x;
                               fish->buffer_y = fish->y;
                               fish->buffer_angle = fish->angle;

                           }
                       }

                      // fish* fish = fish::createFish(center_x, center_y, moveAngle, 20, 258 + k);
                      // Fishes* fish = Fishes::createFish(center_x, center_y, moveAngle, 20, 258 + k);

                       Fishes* fish =createFish(center_x, center_y, moveAngle, 20, 258 + k);

                       fish->fishAction[0].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[0].time = 20;

                       fish->fishAction[1].actionID = Fishes::ACTION_CLEAR;

                       fish->setSpeed(100, moveAngle);

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;

                   }
               }
               else if (tacticID == 7) {
                   int buffer_ID[3] = { 0, 100, 160 };
                   int index[3] = { 0, 0, 0 };


                   bool isLeft = Tools::rand() % 2;
                   float C = 1.41421f;
                   int n = 50;
                   float angle = 0;
                   float moveAngle = isLeft ? 0 : 180;
                   float r = (winSize.height - 100) / 2;
                   float r2 = r;
                   int center_x = isLeft ? -winSize.height : winSize.width + winSize.height;
                   int center_y = winSize.height / 2;

                   int center_x2 = center_x;
                   int center_y2 = center_y;

                   int type = 1;

                   int ii = 0;

                   for (int i = 0; i < 5; i++) {
                       if (i < 4) {
                           n = 50 - 20 * (i % 2);
                           r2 = r*(1 - 0.25f*(i % 2));
                           if (i < 2) {
                               center_x2 = center_x + r*0.8f;
                           }
                           else {
                               center_x2 = center_x - r*0.8f;
                           }
                           type = i % 2 + 1;
                           ii = i % 2;
                       }
                       else {
                           n = 40;
                           r2 = r;
                           center_x2 = center_x;
                           center_y2 = center_y;
                           type = 6;
                           ii = 2;
                       }

                       angle = 360.0f / n;

                       for (int j = 0; j < n; j++) {
                        //   fish* fish = fish::createFish(center_x2 + Tools::getAngleX(j*angle, r2), center_y2 + Tools::getAngleY(j*angle, r2), moveAngle, type, buffer_ID[ii] + (index[ii]++));
                        //   Fishes* fish = Fishes::createFish(center_x2 + Tools::getAngleX(j*angle, r2), center_y2 + Tools::getAngleY(j*angle, r2), moveAngle, type, buffer_ID[ii] + (index[ii]++));

                           Fishes* fish = createFish(center_x2 + Tools::getAngleX(j*angle, r2), center_y2 + Tools::getAngleY(j*angle, r2), moveAngle, type, buffer_ID[ii] + (index[ii]++));

                           fish->fishAction[0].actionID = Fishes::ACTION_RUN_LINE;
                           fish->fishAction[0].time = 28;

                           fish->fishAction[1].actionID = Fishes::ACTION_CLEAR;

                           fish->setSpeed(100, moveAngle);

                           if (isUpside) {
                               fish->angle += 180;
                               fish->angle = fmod(fish->angle, 360);
                               fish->x = winSize.width - fish->x;
                               fish->y = winSize.height - fish->y;

                               fish->setAngle(fish->angle);
                               fish->setV_xy();
                           }

                           fish->buffer_x = fish->x;
                           fish->buffer_y = fish->y;
                           fish->buffer_angle = fish->angle;

                       }
                   }

                   int w = r / 2;
                   int h = r / 4;

                   for (int i = 0; i < 4; i++) {
                     //  fish* fish = fish::createFish(center_x + (((isLeft && i < 2) || (!isLeft && i >= 2)) ? w : -w), center_y + ((i + 1) / 2 % 2 == 0 ? h : -h), moveAngle, 20, 200 + i);
                     //  Fishes* fish = Fishes::createFish(center_x + (((isLeft && i < 2) || (!isLeft && i >= 2)) ? w : -w), center_y + ((i + 1) / 2 % 2 == 0 ? h : -h), moveAngle, 20, 200 + i);

                       Fishes* fish =createFish(center_x + (((isLeft && i < 2) || (!isLeft && i >= 2)) ? w : -w), center_y + ((i + 1) / 2 % 2 == 0 ? h : -h), moveAngle, 20, 200 + i);

                       fish->fishAction[0].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[0].time = 28;

                       fish->fishAction[1].actionID = Fishes::ACTION_CLEAR;

                       fish->setSpeed(100, moveAngle);

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;

                   }
               }
               else if (tacticID == 8) {
                   bool isLeft = Tools::rand() % 2;
                   int n = 66;
                   float angle = 0;
                   float moveAngle = isLeft ? 0 : 180;
                   float r = winSize.height / 2 + 140;
                   int center_x = isLeft ? -winSize.height : winSize.width + winSize.height;
                   int center_y = winSize.height / 2;

                   int offset_x = 0;

                   int type = 1;

                   angle = 360.0f / n;

                   for (int i = 0; i < 3; i++) {
                       for (int j = 0; j < n; j++) {
                          // fish* fish = fish::createFish(center_x + Tools::getAngleX(j*angle, r) - 60 + i * 60, center_y + Tools::getAngleY(j*angle, r), moveAngle, type, i * 66 + j);
                          // Fishes* fish = Fishes::createFish(center_x + Tools::getAngleX(j*angle, r) - 60 + i * 60, center_y + Tools::getAngleY(j*angle, r), moveAngle, type, i * 66 + j);

                           Fishes* fish = createFish(center_x + Tools::getAngleX(j*angle, r) - 60 + i * 60, center_y + Tools::getAngleY(j*angle, r), moveAngle, type, i * 66 + j);

                           fish->fishAction[0].actionID = Fishes::ACTION_RUN_LINE;
                           fish->fishAction[0].time = 28;

                           fish->fishAction[1].actionID = Fishes::ACTION_CLEAR;

                           fish->setSpeed(100, moveAngle);

                           if (isUpside) {
                               fish->angle += 180;
                               fish->angle = fmod(fish->angle, 360);
                               fish->x = winSize.width - fish->x;
                               fish->y = winSize.height - fish->y;

                               fish->setAngle(fish->angle);
                               fish->setV_xy();
                           }

                           fish->buffer_x = fish->x;
                           fish->buffer_y = fish->y;
                           fish->buffer_angle = fish->angle;

                       }
                   }

                   int ID_buffer = 198;

                   for (int i = 0; i < 9; i++) {
                       offset_x = 0;
                       for (int j = 0; j < 7; j++) {
                           if (i == 0 || i == 8) {
                               if (j < 2 || j>4) {
                                   continue;
                               }
                           }
                           else if (i == 1 || i == 7) {
                               if (j == 0 || j == 6) {
                                   continue;
                               }
                           }
                           else if (i == 3 || i == 5) {
                               if (j == 3) {
                                   continue;
                               }
                           }
                           else if (i == 4) {
                               if (j < 2) {
                                   offset_x = -40;
                               }
                               else if (j>4) {
                                   offset_x = 40;
                               }
                               else {
                                   continue;
                               }
                           }

                         //  fish* fish = fish::createFish(center_x - 330 + j * 110 + offset_x, center_y - 320 + i * 80, moveAngle, 6, ID_buffer++);
                         //  Fishes* fish = Fishes::createFish(center_x - 330 + j * 110 + offset_x, center_y - 320 + i * 80, moveAngle, 6, ID_buffer++);

                           Fishes* fish = createFish(center_x - 330 + j * 110 + offset_x, center_y - 320 + i * 80, moveAngle, 6, ID_buffer++);

                           fish->fishAction[0].actionID = Fishes::ACTION_RUN_LINE;
                           fish->fishAction[0].time = 25;

                           fish->fishAction[1].actionID = Fishes::ACTION_CLEAR;

                           fish->setSpeed(100, moveAngle);

                           if (isUpside) {
                               fish->angle += 180;
                               fish->angle = fmod(fish->angle, 360);
                               fish->x = winSize.width - fish->x;
                               fish->y = winSize.height - fish->y;

                               fish->setAngle(fish->angle);
                               fish->setV_xy();
                           }

                           fish->buffer_x = fish->x;
                           fish->buffer_y = fish->y;
                           fish->buffer_angle = fish->angle;
                       }
                   }

                  // fish* fish = fish::createFish(center_x, center_y + 70, moveAngle, 19, 244);
                  // Fishes* fish = Fishes::createFish(center_x, center_y + 70, moveAngle, 19, 244);

                   Fishes* fish = createFish(center_x, center_y + 70, moveAngle, 19, 244);

                   fish->fishAction[0].actionID = Fishes::ACTION_RUN_LINE;
                   fish->fishAction[0].time = 28;

                   fish->fishAction[1].actionID = Fishes::ACTION_CLEAR;

                   fish->setSpeed(100, moveAngle);

                   if (isUpside) {
                       fish->angle += 180;
                       fish->angle = fmod(fish->angle, 360);
                       fish->x = winSize.width - fish->x;
                       fish->y = winSize.height - fish->y;

                       fish->setAngle(fish->angle);
                       fish->setV_xy();
                   }

                   fish->buffer_x = fish->x;
                   fish->buffer_y = fish->y;
                   fish->buffer_angle = fish->angle;

                  // fish = fish::createFish(center_x, center_y - 70, moveAngle, 19, 245);
                  // fish = Fishes::createFish(center_x, center_y - 70, moveAngle, 19, 245);

                   fish = createFish(center_x, center_y - 70, moveAngle, 19, 245);

                   fish->fishAction[0].actionID = Fishes::ACTION_RUN_LINE;
                   fish->fishAction[0].time = 28;

                   fish->fishAction[1].actionID = Fishes::ACTION_CLEAR;

                   fish->setSpeed(100, moveAngle);

                   if (isUpside) {
                       fish->angle += 180;
                       fish->angle = fmod(fish->angle, 360);
                       fish->x = winSize.width - fish->x;
                       fish->y = winSize.height - fish->y;

                       fish->setAngle(fish->angle);
                       fish->setV_xy();
                   }

                   fish->buffer_x = fish->x;
                   fish->buffer_y = fish->y;
                   fish->buffer_angle = fish->angle;

               }
               else if (tacticID == 9) {
                   int buffer_ID[7] = { 0, 60, 107, 112, 114, 117, 121 };
                   int index[7] = { 0, 0, 0, 0, 0, 0, 0 };

                   for (int i = 0; i < 47; i++) {
                       int MYx;
                       int MYy;
                       if (i <= 3) {
                           MYx = winSize.width + 300 + i * 50;
                           MYy = 500;
                       }
                       else if (i > 3 && i < 7) {
                           MYx = winSize.width + 450 + (i - 3) * 17;
                           MYy = 500 + (i - 3) * 30;
                       }
                       else if (i >= 7 && i < 15) {
                           MYx = winSize.width + 501 + (i - 6) * 50;
                           MYy = 590;
                       }
                       else if (i >= 15 && i <= 18) {
                           MYx = winSize.width + 930 + (i - 14) * 17;
                           MYy = 590 - (i - 15) * 30;
                       }
                       else if (i > 19 && i < 23) {
                           MYx = winSize.width + 1015 + (i - 19) * 50;
                           MYy = 500;
                       }
                       else if (i >= 23 && i <= 26) {
                           MYx = winSize.width + 1190;
                           MYy = 275 + (i - 23) * 60;
                       }
                       else if (i > 26 && i <= 42) {
                           MYx = winSize.width + 300 + (i - 27) * 57;
                           MYy = 230;
                       }
                       else {
                           MYx = winSize.width + 300;
                           MYy = 275 + (i - 43) * 60;
                       }
                     //  fish* fish = fish::createFish(MYx, MYy, 180, 2, buffer_ID[1] + (index[1]++));
                     //  Fishes* fish = Fishes::createFish(MYx, MYy, 180, 2, buffer_ID[1] + (index[1]++));

                       Fishes* fish = createFish(MYx, MYy, 180, 2, buffer_ID[1] + (index[1]++));

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 0.5f;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 30;

                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;
                       fish->setSpeed(100, 180);

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;

                   }
                   for (int i = 0; i < 5; i++) {
                      // fish* fish = fish::createFish(winSize.width + 1080, 530 + i * 38, 180, 3, buffer_ID[2] + (index[2]++));
                      // Fishes* fish = Fishes::createFish(winSize.width + 1080, 530 + i * 38, 180, 3, buffer_ID[2] + (index[2]++));

                       Fishes* fish = createFish(winSize.width + 1080, 530 + i * 38, 180, 3, buffer_ID[2] + (index[2]++));

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 0.5f;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 30;


                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;
                       fish->setSpeed(100, 180);

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;
                   }
                   for (int i = 0; i < 3; i++) {
                     //  fish* fish = fish::createFish(winSize.width + 580 + i * 140, 540, 180, 8, buffer_ID[4] + (index[4]++));
                     //  Fishes* fish = Fishes::createFish(winSize.width + 580 + i * 140, 540, 180, 8, buffer_ID[4] + (index[4]++));

                       Fishes* fish = createFish(winSize.width + 580 + i * 140, 540, 180, 8, buffer_ID[4] + (index[4]++));

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 0.5f;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 30;


                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;
                       fish->setSpeed(100, 180);

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;
                   }
                   for (int i = 0; i < 30; i++) {
                       for (int j = 0; j < 2; j++) {
                        //   fish* fish = fish::createFish(winSize.width + 500 + j * 480 + Tools::rand() % 50 - 25, 170 + Tools::rand() % 60 - 30, 180, 1, buffer_ID[0] + (index[0]++));
                        //   Fishes* fish = Fishes::createFish(winSize.width + 500 + j * 480 + Tools::rand() % 50 - 25, 170 + Tools::rand() % 60 - 30, 180, 1, buffer_ID[0] + (index[0]++));

                           Fishes* fish = createFish(winSize.width + 500 + j * 480 + Tools::rand() % 50 - 25, 170 + Tools::rand() % 60 - 30, 180, 1, buffer_ID[0] + (index[0]++));

                           fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                           fish->fishAction[0].time = 0.5f;

                           fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                           fish->fishAction[1].time = 30;


                           fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;
                           fish->setSpeed(100, 180);

                           if (isUpside) {
                               fish->angle += 180;
                               fish->angle = fmod(fish->angle, 360);
                               fish->x = winSize.width - fish->x;
                               fish->y = winSize.height - fish->y;

                               fish->setAngle(fish->angle);
                               fish->setV_xy();
                           }

                           fish->buffer_x = fish->x;
                           fish->buffer_y = fish->y;
                           fish->buffer_angle = fish->angle;
                       }
                   }
                   for (int i = 0; i < 2; i++) {

                     //  fish* fish = fish::createFish(winSize.width + 175, 275 + i * 180, 180, 6, buffer_ID[3] + (index[3]++));
                     //  Fishes* fish = Fishes::createFish(winSize.width + 175, 275 + i * 180, 180, 6, buffer_ID[3] + (index[3]++));

                       Fishes* fish = createFish(winSize.width + 175, 275 + i * 180, 180, 6, buffer_ID[3] + (index[3]++));

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 0.5f;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 20;


                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;

                       fish->setSpeed(100, 180);

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;


                     //  fish = fish::createFish(winSize.width + 450 + i * 650, winSize.height / 2, 180, 20, buffer_ID[6] + (index[6]++));
                     //  fish = Fishes::createFish(winSize.width + 450 + i * 650, winSize.height / 2, 180, 20, buffer_ID[6] + (index[6]++));

                       fish = createFish(winSize.width + 450 + i * 650, winSize.height / 2, 180, 20, buffer_ID[6] + (index[6]++));

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 0.5f;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 30;

                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;
                       fish->setSpeed(100, 180);

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;


                       //fish = fish::createFish(winSize.width + 1200 + i * 100, winSize.height / 2 - 100, 180, 19, buffer_ID[5] + (index[5]++));
                       //fish = Fishes::createFish(winSize.width + 1200 + i * 100, winSize.height / 2 - 100, 180, 19, buffer_ID[5] + (index[5]++));

                       fish = createFish(winSize.width + 1200 + i * 100, winSize.height / 2 - 100, 180, 19, buffer_ID[5] + (index[5]++));

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 0.5f;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 30;


                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;
                       fish->setSpeed(100, 180);

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;
                   }
               }
               else if (tacticID == 10) {
                   int buffer_ID[7] = { 0, 60, 107, 112, 114, 117, 121 };
                   int index[7] = { 0, 0, 0, 0, 0, 0, 0 };


                   for (int i = 0; i < 47; i++) {
                       int MYx;
                       int MYy;
                       if (i <= 3) {
                           MYx = -350 - i * 50;
                           MYy = 500;
                       }
                       else if (i > 3 && i < 7) {
                           MYx = -500 - (i - 3) * 17;
                           MYy = 500 + (i - 3) * 30;
                       }
                       else if (i >= 7 && i < 15) {
                           MYx = -551 - (i - 6) * 50;
                           MYy = 590;
                       }
                       else if (i >= 15 && i <= 18) {
                           MYx = -980 - (i - 14) * 17;
                           MYy = 590 - (i - 15) * 30;
                       }
                       else if (i > 19 && i < 23) {
                           MYx = -1050 - (i - 19) * 50;
                           MYy = 500;
                       }
                       else if (i >= 23 && i <= 26) {
                           MYx = -1230;
                           MYy = 275 + (i - 23) * 60;
                       }
                       else if (i > 26 && i <= 42) {
                           MYx = -300 - (i - 26) * 57;
                           MYy = 230;
                       }
                       else {
                           MYx = -350;
                           MYy = 275 + (i - 43) * 60;
                       }
                      // fish* fish = fish::createFish(MYx, MYy, 0, 2, buffer_ID[1] + (index[1]++));
                      // Fishes* fish = Fishes::createFish(MYx, MYy, 0, 2, buffer_ID[1] + (index[1]++));

                       Fishes* fish = createFish(MYx, MYy, 0, 2, buffer_ID[1] + (index[1]++));

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 0.5f;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 30;


                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;
                       fish->setSpeed(100, 0);

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;
                   }
                   for (int i = 0; i < 5; i++) {
                     //  fish* fish = fish::createFish(-1130, 530 + i * 38, 0, 3, buffer_ID[2] + (index[2]++));
                     //  Fishes* fish = Fishes::createFish(-1130, 530 + i * 38, 0, 3, buffer_ID[2] + (index[2]++));

                       Fishes* fish = createFish(-1130, 530 + i * 38, 0, 3, buffer_ID[2] + (index[2]++));

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 0.5f;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 30;


                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;
                       fish->setSpeed(100, 0);

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;
                   }
                   for (int i = 0; i < 3; i++) {
                      // fish* fish = fish::createFish(-640 - i * 140, 540, 0, 8, buffer_ID[4] + (index[4]++));
                      // Fishes* fish = Fishes::createFish(-640 - i * 140, 540, 0, 8, buffer_ID[4] + (index[4]++));

                       Fishes* fish = createFish(-640 - i * 140, 540, 0, 8, buffer_ID[4] + (index[4]++));

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 0.5f;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 30;


                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;
                       fish->setSpeed(100, 0);

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;
                   }
                   for (int i = 0; i < 30; i++) {
                       for (int j = 0; j < 2; j++) {
                         //  fish* fish = fish::createFish(-550 - j * 480 - (Tools::rand() % 50 - 25), 170 + Tools::rand() % 60 - 30, 0, 1, buffer_ID[0] + (index[0]++));
                         //  Fishes* fish = Fishes::createFish(-550 - j * 480 - (Tools::rand() % 50 - 25), 170 + Tools::rand() % 60 - 30, 0, 1, buffer_ID[0] + (index[0]++));

                           Fishes* fish = createFish(-550 - j * 480 - (Tools::rand() % 50 - 25), 170 + Tools::rand() % 60 - 30, 0, 1, buffer_ID[0] + (index[0]++));

                           fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                           fish->fishAction[0].time = 0.5f;

                           fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                           fish->fishAction[1].time = 30;


                           fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;
                           fish->setSpeed(100, 0);

                           if (isUpside) {
                               fish->angle += 180;
                               fish->angle = fmod(fish->angle, 360);
                               fish->x = winSize.width - fish->x;
                               fish->y = winSize.height - fish->y;

                               fish->setAngle(fish->angle);
                               fish->setV_xy();
                           }

                           fish->buffer_x = fish->x;
                           fish->buffer_y = fish->y;
                           fish->buffer_angle = fish->angle;
                       }
                   }

                   for (int i = 0; i < 2; i++) {
                     //  fish* fish = fish::createFish(-500 - i * 650, winSize.height / 2, 0, 20, buffer_ID[6] + (index[6]++));
                     //  Fishes* fish = Fishes::createFish(-500 - i * 650, winSize.height / 2, 0, 20, buffer_ID[6] + (index[6]++));

                       Fishes* fish = createFish(-500 - i * 650, winSize.height / 2, 0, 20, buffer_ID[6] + (index[6]++));

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 0.5f;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 30;

                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;
                       fish->setSpeed(100, 0);

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;


                      // fish = fish::createFish(-1250 - i * 100, winSize.height / 2 - 100, 0, 19, buffer_ID[5] + (index[5]++));
                      // fish = Fishes::createFish(-1250 - i * 100, winSize.height / 2 - 100, 0, 19, buffer_ID[5] + (index[5]++));

                       fish = createFish(-1250 - i * 100, winSize.height / 2 - 100, 0, 19, buffer_ID[5] + (index[5]++));

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 0.5f;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 30;


                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;
                       fish->setSpeed(100, 0);

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();
                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;

                    //   fish = fish::createFish(-260, 275 + i * 180, 0, 19, buffer_ID[5] + (index[5]++));
                    //   fish = Fishes::createFish(-260, 275 + i * 180, 0, 19, buffer_ID[5] + (index[5]++));

                       fish = createFish(-260, 275 + i * 180, 0, 19, buffer_ID[5] + (index[5]++));

                       fish->fishAction[0].actionID = Fishes::ACTION_WAIT;
                       fish->fishAction[0].time = 0.5f;

                       fish->fishAction[1].actionID = Fishes::ACTION_RUN_LINE;
                       fish->fishAction[1].time = 20;


                       fish->fishAction[2].actionID = Fishes::ACTION_CLEAR;

                       fish->setSpeed(100, 0);

                       if (isUpside) {
                           fish->angle += 180;
                           fish->angle = fmod(fish->angle, 360);
                           fish->x = winSize.width - fish->x;
                           fish->y = winSize.height - fish->y;

                           fish->setAngle(fish->angle);
                           fish->setV_xy();

                       }

                       fish->buffer_x = fish->x;
                       fish->buffer_y = fish->y;
                       fish->buffer_angle = fish->angle;
                   }
               }

               for (int i = 0; i < S_Fish_Group->wCount; i++) {
                   bool s = false;
                   //debug_("SUB_S_SEND_FISH_PATH_GROUP:", S_Fish_Group->FishNetIDs[i].wID);
                   //fish* currentFish = fish::headDrawFish;
                   //while (currentFish != NULL) {
                      // GameObject* tem = currentFish->nextDrawGameObject;
                      // if (currentFish->hasFlag(fish::FLAG_UPDATE) && !currentFish->isState(fish::STATE_EXPLODE)) {
                         //  if (currentFish->server_ID == S_Fish_Group->FishNetIDs[i].wID) {//&& currentFish->fish_type==S_Cast_Net_Success_dte->FishNetIDs[i].cbType
                            //   currentFish->onClear();
                            //   s = true;
                            //   break;
                         //  }
                      // }
                      // currentFish = (Fish*)tem;
                   //}


                   //用stl
                   //mutexDestructFish.lock();
                   //if (!allFishes.empty())
                   //{
                      // std::list<shared_ptr<Fishes>>::iterator it = allFishes.begin();
                      // for ( ; it!=allFishes.end();it++)
                      // {
                         //  if (RepositionSubState) return true;
                         //  if ((*it).get()->server_ID == S_Fish_Group->FishNetIDs[i].wID)
                         //  {
                            //   (*it).get()->setSign(true);
                            //  // (*it)->onClear();
                            //  // it = allFishes.erase(it);
                            //  // s = true;
                            // //  break;
                         //  }
                         //  //else
                         //  //{
                         //  //   it++;
                         //  //}
                      // }
                   //}
                   //mutexDestructFish.unlock();

                   //if (!s) {
                      // debug_("error:", S_Fish_Group->FishNetIDs[i].wID);
                   //}
                   //else {
                      // debug_("done");
                   //}
               }

               setState(STATE_TACTIC);
               Fishes::tactic_duration = S_Fish_Group->fPassTime;
             return true;
           }   
    case SUB_S_END:
     {
         LOGD("游戏结束");
         return true;
     }
    case SUB_S_SEND_HIGHT_SCORE://全局分数通知
      {
          LOGD("全局分数通知");
          return true;
      }
    case SUB_S_SEND_CLEAR_PLAYER://清空玩家
     {
        LOGD("清空玩家");
        return true;
     }
    case SUB_S_SEND_King_FISH_SUCCESS://打中八爪鱼
        debug_("SUB_S_SEND_King_FISH_SUCCESS");
        {
            CMD_S_Hit_King_Success * S_Hit_King_Success = (CMD_S_Hit_King_Success *)pData;
        }
        return true;
    case SUB_S_SEND_TIME://时间
        debug_("SUB_S_SEND_TIME");
        {
            CMD_S_Time * S_Time = (CMD_S_Time *)pData;
        }
        return true;
    case SUB_S_KICK_PLAYER:
        debug_("SUB_S_KICK_PLAYER");
        {
        }
        return true;
    case SUB_S_GAME_SCENE:
        debug_("SUB_S_GAME_SCENE");
        {
            //CMD_S_StatusFree * S_StatusFree = (CMD_S_StatusFree *)pData;

            //for(int i=0;i<GAME_PLAYER;i++) {
            //    debug_("Role_Net_Object:wChairID=%d,lFishGold=%d,wCost=%d", S_StatusFree->RoleObjects[i].wChairID, S_StatusFree->RoleObjects[i].lFishGold, S_StatusFree->RoleObjects[i].wCost);
            //    if(S_StatusFree->RoleObjects[i].wChairID<GAME_PLAYER) {
            //        int cannonID = getCannonID(S_StatusFree->RoleObjects[i].wChairID);
            //        if(cannonID>=GAME_PLAYER)
            //            continue;
            //        fishPlayer[cannonID].lFishGold = S_StatusFree->RoleObjects[i].lFishGold;

            //        fishPlayer[cannonID].wCost = S_StatusFree->RoleObjects[i].wCost;

            //        if(hasInitCannon) {
            //            cannon[cannonID]->setMoney(fishPlayer[cannonID].lFishGold);

            //            cannon[cannonID]->times_frameLab->setString(StringUtils::format("%d", fishPlayer[cannonID].wCost));
            //        }
            //    }
            //}


            return true;
        }
        return true;
    case SUB_S_SPEED_FREQUENCY:
        debug_("SUB_S_SPEED_FREQUENCY");
        {
            CMD_S_SpeedFrequency * S_SpeedFrequency = (CMD_S_SpeedFrequency *)pData;
        }
        return true;
    case SUB_S_PAUSE:
      {
          CMD_C_PAUSE *pause = (CMD_C_PAUSE*)pData;
          if (pause->wChairID != m_RobotID) pause_count = 0;
           LOGD("有人打到暂停了,pause_count: "<<pause_count);
      }
    case SUB_S_ACCOUNT: //没用到
    {
        CMD_S_Account * S_Account = (CMD_S_Account *)pData;

        if (S_Account->wChairID == m_RobotID)
        {
            int ID = S_Account->wChairID;
            //if (isUpsideEx) {
            //    ID = getCannonID(ID);
            //}
            LOGD("lPlayerScore: " << S_Account->lPlayerScore << "  lCellScore: " << S_Account->lCellScore);
            m_nFishGold = S_Account->lPlayerScore;
        }
        
    }
    return true;
    case SUB_S_AI_ENTER:
    {
        CMD_S_AI_Enter * aiEnter = (CMD_S_AI_Enter*)pData;
        if (aiEnter->wChairID == m_RobotID)
        {
            IServerUserItem * pIServerUserItem = m_pIAndroidUserItem->GetMeUserItem();
            int userid = pIServerUserItem->GetUserID();
            SCORE score = aiEnter->lScore;
            //LOGD("有机器人进入,userID: " << userid << "分数:"<<score);
            //fishPlayer[m_RobotID].lFishGold = score;
        }
    }
    return true;
    default:
        LOGD("wSubCmdID: " << wSubCmdID);
        return true;
    }
    return true;
}

//游戏消息
bool CAndroidUserItemSink::OnEventFrameMessage(WORD wSubCmdID, void * pData, WORD wDataSize)
{
    return true;
}

//场景消息
bool CAndroidUserItemSink::OnEventSceneMessage(BYTE cbGameStatus, bool bLookonOther, void * pData, WORD wDataSize)
{
    //LOGD("CAndroidUserItemSink::OnEventSceneMessage cbGameStatus = " << cbGameStatus)
    srand(time(0));
    switch (cbGameStatus)
    {
    case GAME_STATUS_FREE:                //空闲状态
    case GAME_STATUS_PLAY:                //游戏状态    
    {
            ASSERT(wDataSize == sizeof(CMD_S_StatusFree));
            if (wDataSize!=sizeof(CMD_S_StatusFree)) return false;
            CMD_S_StatusFree * pStatusFree = (CMD_S_StatusFree *)pData;

            //LONGLONG score = m_pIAndroidUserItem->GetMeUserItem()->GetUserInfo()->lScore;
            //int   userid = m_pIAndroidUserItem->GetMeUserItem()->GetUserID();
            //int   gameid = m_pIAndroidUserItem->GetMeUserItem()->GetGameID();
            //LOGD("UserID: "<<userid<<" GameID: "<<gameid<<" 服务器发过来的分数: " << score);

            m_cbScene = pStatusFree->cbScene;
            m_lCellScore = pStatusFree->lCellScore;
            //m_maxWeaponCost = pStatusFree->wMaxFire;
            m_onceUpScore = pStatusFree->dwOnceUpScore;
            CopyMemory(m_RoleObjects, pStatusFree->RoleObjects, GAME_PLAYER*sizeof(Role_Net_Object));
            IServerUserItem * pIServerUserItem = m_pIAndroidUserItem->GetMeUserItem();
            pause_count = pause_n;
            RepositionSubState = false;
            m_RobotID = pIServerUserItem->GetChairID();//opposite对面的
            int type = m_RobotID / (GAME_PLAYER / 2) == 0 ? TYPE_NORMAL : TYPE_OPPOSITE;
            int gap = 210;
            int w = winSize.width - gap;
            setCannonPosition(type,gap,w);//设置炮台的坐标
            //LOGD( "炮台坐标x: " << m_positionX << "炮台坐标y: " << m_positionY);
            //LOGD("allbullets.size: " << allBullets.size());


            if (currentChairID < 0) {
                currentChairID = pIServerUserItem->GetChairID();
                currentCannonID = currentChairID % (GAME_PLAYER / 2);
                if (currentChairID >= GAME_PLAYER / 2)
                {
                    isUpside = true;    //在屏幕的上方
                    isUpsideEx = true;
                }
                else
                {
                    isUpside = false;
                    isUpsideEx = false;
                }

            }
            //做一个特殊处理,之后用isUpside做条件判断的都用isUpsideEx作条件,创建鱼中的判断还用isUpside做条件,这里存在一个坐标的问题,如果在创建鱼当中
            //炮台坐标在屏幕的上方,并且isUpside为true,存在一个这样的问题,客户端鱼的x坐标,机器人对应鱼的坐标是屏幕的长度-x,客户端y的坐标,机器人对应的
            //坐标是屏幕的高度-y
            if (isUpside)
            {
                isUpside = false;
            }
            for (int i = 0; i<4; i++)
            {
                nCannonCount[i] = pStatusFree->nCannonCount[i];
            }

            for (int i = 0; i<GAME_PLAYER; i++) {
                if (pStatusFree->RoleObjects[i].wChairID<GAME_PLAYER) {
                    //int cannonID = getCannonID(pStatusFree->RoleObjects[i].wChairID);
                    if (i >= GAME_PLAYER)
                        continue;
                    fishPlayer[i].lFishGold = pStatusFree->RoleObjects[i].lFishGold;
                    fishPlayer[i].wCost = pStatusFree->RoleObjects[i].wCost;
                        int gunNum = 1;

                        if (fishPlayer[i].wCost<nCannonCount[2]) {
                            gunNum = 1;
                        }
                        else if (fishPlayer[i].wCost<nCannonCount[3]) {
                            gunNum = 2;
                        }
                        else {
                            gunNum = 3;
                        }
                        if (cannon)
                        cannon->setGunNum(gunNum);
                }
            }

            buyFishGold = pIServerUserItem->GetUserScore();
            if (pIServerUserItem == NULL) return true;
            //玩家设置
            //LOGD("------------------------------------------------");
            //LONGLONG score =pIServerUserItem->GetUserInfo()->lScore;
            //int   userid = pIServerUserItem->GetUserID();
            //LOGD("UserID: " << userid <<"分数:" << score);
            //LOGD("------------------------------------------------");

            if (pIServerUserItem->GetUserStatus() == US_SIT || pIServerUserItem->GetUserStatus() == US_PLAYING)
            {
                LOGD("CAndroidUserItemSink::OnEventSceneMessage 3")
                UINT nElapse = rand() % TIME_BUY_BULLET + TIME_LESS * 3;
                m_pIAndroidUserItem->SetGameTimer(IDI_BUY_BULLET,nElapse);
            }
            //定时打印一下鱼和子弹的size大小
            m_pIAndroidUserItem->SetGameTimer(IDI_LOG_SIZE, 5);

            t1=std::thread(&CAndroidUserItemSink::threadUpdate, this);
            t1.detach();


            
            return true;
        }
//    case GAME_STATUS_PLAY:            //游戏状态
//        {
//            return true;
//        }
    }
    
    ASSERT(0);
    return false;
}

//用户进入
void CAndroidUserItemSink::OnEventUserEnter(IAndroidUserItem * pIAndroidUserItem, bool bLookonUser)
{
    LOGD("机器人进入了");
    ////char text[500] = { 0 };
    ////sprintf(text, "有机器人进入:%d\n", pIAndroidUserItem->GetChairID());
    ////OutputDebugString(text);
    ////LOGD("CAndroidUserItemSink::OnEventUserEnter bLookonUser = " << bLookonUser)
    ////    if (bLookonUser == false) {
    ////        //debug_("UserID= %d, NickName= %s, ChairID= %d", pIClientUserItem->GetUserID(), pIClientUserItem->GetNickName(), pIClientUserItem->GetChairID());

    ////        if (currentChairID < 0) {
    ////            currentChairID = pIAndroidUserItem->GetChairID();
    ////            currentCannonID = currentChairID % (GAME_PLAYER / 2);
    ////            if (currentChairID >= GAME_PLAYER / 2)
    ////                isUpside = true;
    ////            else
    ////                isUpside = false;
    ////        }
    ////    }
    //Fish::initFishs(600);//用户进来创建600条鱼的链
}

//用户离开
void CAndroidUserItemSink::OnEventUserLeave(IAndroidUserItem * pIAndroidUserItem, bool bLookonUser)
{
    LOGD("CAndroidUserItemSink::OnEventUserLeave bLookonUser = " << bLookonUser)
        LOGD("机器人离开了");

}

//用户积分
void CAndroidUserItemSink::OnEventUserScore(IAndroidUserItem * pIAndroidUserItem, bool bLookonUser)
{
    LOGD("CAndroidUserItemSink::OnEventUserScore bLookonUser = " << bLookonUser)

}

//用户状态
void CAndroidUserItemSink::OnEventUserStatus(IAndroidUserItem * pIAndroidUserItem, bool bLookonUser)
{
    LOGD("CAndroidUserItemSink::OnEventUserStatus bLookonUser = " << bLookonUser)
}

//用户段位
void CAndroidUserItemSink::OnEventUserSegment(IAndroidUserItem * pIAndroidUserItem, bool bLookonUser)
{
    LOGD("CAndroidUserItemSink::OnEventUserSegment bLookonUser = " << bLookonUser)

}

/// 购买子弹
void CAndroidUserItemSink::BuyBullet()
{
    
    CMD_C_Buy_Bullet buyBullet;
    //LONGLONG bulletArray[10] = {100000,150000,200000,250000,300000,350000,400000,450000,500000,600000};
    buyBullet.lCount = m_pIAndroidUserItem->GetMeUserItem()->GetUserScore();//从数据库中读取的范围在那两个字段之间的;
    //LOGD("不是第一次买子弹,买子弹数量:" << buyBullet.lCount << " UserID: " << m_pIAndroidUserItem->GetUserID());

    if (m_bFirstBuy)
    {
        buyBullet.lCount = buyFishGold;
    }
    //发送数据
    m_pIAndroidUserItem->SendSocketData(SUB_C_BUY_BULLET,&buyBullet,sizeof(buyBullet));
    m_bFirstBuy = true;
    
}

void CAndroidUserItemSink::LockTarget()
{
    //cout<<"ClearBullet()"<<endl;
    LOGI("CAndroidUserItemSink::LockTarget")

    CMD_C_Fire_Lock lockTarget;
    CMD_C_Fish_Net_Object fishtpye;
    fishtpye.cbType = 0;
    fishtpye.wID = 0;
    lockTarget.target = fishtpye;

    m_pIAndroidUserItem->SendSocketData(SUB_C_FIRE_LOCK, &lockTarget, sizeof(CMD_C_Fire_Lock));
    
}

/// 切换子弹
void CAndroidUserItemSink::ChangeCannon()
{
    //LOGI("CAndroidUserItemSink::ChangeCannon")

    //if ( m_nWeaponCost < 100 )
    //{
    //    m_nWeaponCost += 10;
    //    if (m_nWeaponCost>20 && m_nWeaponCost<=50)
    //    {
    //        m_nWeaponCost = 50;
    //    }
    //    if (m_nWeaponCost > 50 && m_nWeaponCost <80)
    //    {
    //        m_nWeaponCost = 80;
    //    }
    //    if (m_nWeaponCost>=80)
    //    {
    //        m_nWeaponCost = 100;
    //    }
    //}
    //else if ( m_nWeaponCost >= 100 && m_nWeaponCost < 1000 )
    //{
    //    m_nWeaponCost += 100;
    //    if (m_nWeaponCost>300 && m_nWeaponCost<500)
    //    {
    //        m_nWeaponCost = 500;
    //    }
    //    if (m_nWeaponCost > 500 && m_nWeaponCost < 800)
    //    {
    //        m_nWeaponCost = 800;
    //    }
    //    if (m_nWeaponCost > 800)
    //    {
    //        m_nWeaponCost = 1000;
    //    }
    //}
    //else if ( m_nWeaponCost >= 1000  )
    //{
    //    //m_nWeaponCost += 1000;
    //    m_nWeaponCost =10;
    //}
    //if (fishPlayer[m_RobotID].lFishGold>1000000)//如果机器人的钱大于1000000,默认为1000的炮
    //{
    //    m_nWeaponCost = 1000;
    //}
    //else if (fishPlayer[m_RobotID].lFishGold>50000)//如果机器人的钱大于500000小于5000000
    //{
    //    if (m_nWeaponCost < 100)
    //    {
    //        m_nWeaponCost = 300;
    //    }
    //    else if (m_nWeaponCost >= 100 && m_nWeaponCost < 1000)
    //    {
    //        m_nWeaponCost += 100;
    //        if (m_nWeaponCost>300 && m_nWeaponCost<500)
    //        {
    //            m_nWeaponCost = 500;
    //        }
    //        if (m_nWeaponCost > 500 && m_nWeaponCost < 800)
    //        {
    //            m_nWeaponCost = 800;
    //        }
    //        if (m_nWeaponCost > 800)
    //        {
    //            m_nWeaponCost = 1000;
    //        }
    //    }
    //    else if (m_nWeaponCost >= 1000)
    //    {
    //        m_nWeaponCost = 300;
    //    }
    //}
    //else                         //如果机器人的分小于500000
    //{
        if (m_nWeaponCost < 100)
        {
            m_nWeaponCost += 10;
            if (m_nWeaponCost>20 && m_nWeaponCost <= 50)
            {
                m_nWeaponCost = 50;
            }
            if (m_nWeaponCost > 50 && m_nWeaponCost <80)
            {
                m_nWeaponCost = 80;
            }
            if (m_nWeaponCost >= 80)
            {
                m_nWeaponCost = 100;
            }
        }
        else if (m_nWeaponCost >= 100 && m_nWeaponCost < 1000)
        {
            m_nWeaponCost += 100;
            if (m_nWeaponCost>300 && m_nWeaponCost<500)
            {
                m_nWeaponCost = 500;
            }
            if (m_nWeaponCost > 500 && m_nWeaponCost < 800)
            {
                m_nWeaponCost = 800;
            }
            if (m_nWeaponCost > 800)
            {
                m_nWeaponCost = 1000;
            }
        }
        else if (m_nWeaponCost >= 1000)
        {
            //m_nWeaponCost += 1000;
            m_nWeaponCost = 10;
        }
    //}

    //切换子弹
    CMD_C_Change_Cannon changeCannon;
    getCanAttri(m_RobotID);//获取一下炮台的属性
    if (m_isSuper)     changeCannon.cbStyle = 1;
    else changeCannon.cbStyle = 0;
    changeCannon.wCost = m_nWeaponCost;
    //发送数据
    m_pIAndroidUserItem->SendSocketData(SUB_C_CHANGE_CANNON,&changeCannon,sizeof(changeCannon));

    m_pIAndroidUserItem->SetGameTimer(IDI_CHANGE_BULLET, 70);
}

/// 发射子弹
void CAndroidUserItemSink::Fire()
{
    //LOGD("Fire里边,机器人lFishGold:" << fishPlayer[m_RobotID].lFishGold << "当前炮台分:" << fishPlayer[m_RobotID].wCost);
    //LOGI("Fire里边,机器人lFishGold:" << fishPlayer[m_RobotID].lFishGold << "当前炮台分:" << fishGold);
    //LI("Fire里边机器人lFishGold" << fishPlayer[m_RobotID].lFishGold << "当前炮台分" << m_nWeaponCost);
    if (fishPlayer[m_RobotID].lFishGold >  fishGold)
    {    
        m_nLastRoteFireCount++;
        CMD_C_Fire fire;

        WORD wChairID = m_pIAndroidUserItem->GetChairID();
        ////if (wChairID == 0 || wChairID == 1)
        ////    Fire.fRote += 180;
        //m_fLastFireRote = m_fNowFireRote;
        if (m_nLastRoteFireCount >= m_nToChangeRote)
        {
            m_nLastRoteFireCount = 0;
            //m_nToChangeRote =RandFun(2, 20);
            //m_fNowFireRote = (float)RandFun(0, (int)(M_PI * 100000)) / 100000.f;
            //m_fNowFireRote-=M_PI_2;
            m_nToChangeRote = RandFun(2, 40);
            if (m_positionY>0)//炮台在屏幕的上边
            {
                //x = rand() % 1000;
                x = rand()%800;
                y = 0;
                angle = getAngel(x - m_positionX, y - m_positionY);
            }
            else
            {
                //x = rand() % 1000 + 140;
                //y = 360;
                x = rand() % 1000;
                y = 500;
                angle = Tools::getAngle(x - m_positionX, y - m_positionY);
                if (angle > 180) {
                    if (angle < 270) {
                        angle = 180;
                    }
                    else {
                        angle = 0;
                    }
                }
            }
        }
         fire.fRote = angle;
        if (m_nNumberToFire == 0)
        {
            bulletCount = 0;
            //m_nNumberToFire = RandFun(1, 10);
            m_nNumberToFire = 8;
            m_pIAndroidUserItem->SetGameTimer(IDI_FIRE, rand()%TIME_FIRE+TIME_LESS);
        }
        else
        {
            //if (m_nFishGold > 1500&&allBullets.size()<10)
            {
                //if (!(pause_count <pause_n))
                //{
                    //LOGD("子弹角度: " << angle);
                if (fishPlayer[m_RobotID].lFishGold > 0)
                {
                    m_pIAndroidUserItem->SendSocketData(SUB_C_FIRE, &fire, sizeof(CMD_C_Fire));
                    CreateBullets(1);
                    fishPlayer[m_RobotID].lFishGold -= fishGold;
                }
            }
            m_pIAndroidUserItem->SetGameTimer(IDI_FIRE,1.5);
        }

        m_nNumberToFire--;
        
    }
    else if (fishPlayer[m_RobotID].lFishGold != 0 && (rand() % 10)>3)
    {
        ChangeCannon();
    }
    else
    {
        /// 购买子弹
        BuyBullet();
        //LOGD("钱不够的时候,购买子弹");
    }

}

//向服务器发送消息
void  CAndroidUserItemSink::sendMessage(WORD wSubCmdID, void* pData, WORD wDataSize) {
    //debug_("sendMessage");

    if (m_pIAndroidUserItem)
    {
        m_pIAndroidUserItem->SendSocketData(wSubCmdID, pData, wDataSize);
    }
    else
    {
        char text[500] = { 0 };
        sprintf(text, "机器人的ChairID:%d,m_onceUpScore:%d\n", m_pIAndroidUserItem->GetChairID(), m_onceUpScore);
        OutputDebugString(text);
    }

}

//随机一个点,像客户端触摸一样
void CAndroidUserItemSink::RandomPoint()//随机一个方向
{
    /*x = rand() % 1280;
    y = rand() % 720;
    if (m_positionY>0)
    {
        angle = getAngel(x - m_positionX, y - m_positionY);
    }
    else
    {
        angle = Tools::getAngle(x - m_positionX, y - m_positionY);
        if (angle > 180) {
            if (angle < 270) {
                angle = 180;
            }
            else {
                angle = 0;
            }
        }
    }*/
}

//创建子弹
void CAndroidUserItemSink::CreateBullets(int num)//每次向服务器发送Fire创建一个子弹
{
    int count = 0;
    if (allBullets.size()>50) return;
    while (count<num)
    {
        getCanAttri(m_RobotID);
        if (m_RobotID >1) {//cannonID=chairID 在屏幕的上方

            float a = Tools::getAngleX(180-angle, 70);
            float b = Tools::getAngleY(180-angle, 70);
            float c = Tools::getAngleX(angle, 70);
            float d = Tools::getAngleY(angle, 70);
            float e = angle;
            float f = 180 - angle;
            //LOGD("m_positionX: " << m_positionX <<  " m_positionY:   " << m_positionY <<" angle: " << angle << " Tools::getAngleX(180-angle, 70) : " << a << " Tools::getAngleY(180-angle, 70):  "<<b);
            
            //LOGD("angle: "<< e << " 180-angle "<<f);
            //LOGD("Tools::getAngleX(180-angle, 70) : "<< a << "Tools::getAngleY(180-angle, 70): " << b);
            //LOGD("Tools::getAngleX(angle, 70) : " << c << "Tools::getAngleY(angle, 70): " << d);
            //LOGD("---------------------------------------");
            //shared_ptr<Bullet>    bullet = createBullet(m_positionX +Tools::getAngleX(angle, 70), m_positionY- Tools::getAngleY(angle, 70), 180 - angle, 900, 0, (m_isSuper ? m_GunNum - 1 : 3 + (m_GunNum - 1)*GAME_PLAYER + m_RobotID));
            Bullet*    bullet = createBullet(m_positionX - Tools::getAngleX(angle, 70), 665 - Tools::getAngleY(angle, 70), 180 - angle, 850, 0, (m_isSuper ? m_GunNum - 1 : 3 + (m_GunNum - 1)*GAME_PLAYER + m_RobotID));
        }
        else {//在屏幕的下方
            //float a = Tools::getAngleX(angle, 70);
            //float b = Tools::getAngleY(angle, 70);
            //LOGD("m_positionX: " << m_positionX << "  angle: " << angle << "  m_positionY:   " << m_positionY << "  Tools::getAngleX(angle, 70) :" << a << "  Tools::getAngleY(angle, 70) :" << b);
            Bullet*  bullet = createBullet(m_positionX + Tools::getAngleX(angle, 70), 55 + Tools::getAngleY(angle, 70), angle, 850, 1, (m_isSuper ? m_GunNum - 1 : 3 + (m_GunNum - 1)*GAME_PLAYER + m_RobotID));
        }
         count++;
    }
}

//鱼每一帧要移动
void CAndroidUserItemSink::UpdateFish()
{
    if (allFishes.size()>0)
    {
        FISHES::iterator iter = allFishes.begin();
        for (; iter != allFishes.end();)
            {
                auto a = (*iter).get()->x;
                auto b = (*iter).get()->y;
                //if (!Tools::isGameObjectCollision((*it).get(), (*it).get()->x - 1400, (*it).get()->x + winSize.width + 1400, (*it).get()->y + winSize.height + 1400, (*it).get()->y - 1400))
                if (((*iter).get()->x<-300) || ((*iter).get()->x>1880) || ((*iter).get()->y<-300) || ((*iter).get()->y>1520))//鱼游出固定范围删除掉
                {
                    iter = allFishes.erase(iter);
                }
                else
                {
                    (*iter).get()->update();
                    //LOGD("UpdateFish,fish_ID: " << (*it).get()->fish_ID << " x: " << (*it).get()->x << " y: " << (*it).get()->y << " angle: " << (*it).get()->angle << " size: " << allFishes.size());
                    iter++;
                }    
            }
    }
    return;
}

//子弹每一帧要移动
void CAndroidUserItemSink::UpdateBullet()
{
    if (!allBullets.empty())
    {
        std::list<std::shared_ptr<Bullet>>::iterator it1 = allBullets.begin();
        for (; it1 != allBullets.end();)
        {
                 //step1: 首先更新子弹的位置:
                (*it1).get()->update();
                //LOGD("MoveBullet bullet_ID:" << (*it1).get()->bullet_ID <<  "   x:" << (*it1).get()->x << "  y:" << (*it1).get()->y);
                //step2: 判断子弹和鱼的碰撞
                //if (allFishes.empty()) return;
                FISHES::iterator it2 = allFishes.begin();
                FISHES::iterator it3 = allFishes.begin();
                bool isExplode = false;            //标记是否击中鱼
                bool isCollision = false;
                for (; it3 != allFishes.end(); it3++)
                {
                    if ((*it1).get()->isFishCollisionBullet((*it3).get())) //鱼碰子弹
                    {
                        isExplode = true;
                        (*it1).get()->setSign(true);
                        //LOGD("MoveBullet bullet_ID:" << (*it1).get()->bullet_ID << "   x:" << (*it1).get()->x << "  y:" << (*it1).get()->y);
                        //LOGD("MoveFish   fish_ID:" << (*it3).get()->fish_ID << "   x:" << (*it3).get()->x << "  y:" << (*it3).get()->y);
                        //LOGD("bullet_ID: " << (*it1).get()->bullet_ID << "和" << "fish_ID: " << (*it3).get()->fish_ID<<"碰撞了");
                        break;
                    }
                }
                if (isExplode)
                {
                    fish_num = 0;
                    for (; it2 != allFishes.end(); it2++)   //遍历鱼跟子弹碰撞
                    {
                        if ((*it1).get()->isFishCollisionNet((*it2).get())) //判断碰撞结果
                        {
                            isCollision = true;
                            target = (*it2).get();

                            if (fish_num < MAX_FISH_IN_NET) {
                                fish_buffer[fish_num][0] = (*it2).get()->server_ID;
                                fish_buffer[fish_num][1] = (*it2).get()->fish_type;
                                fish_buffer[fish_num][2] = (*it2).get()->fish_style;
                                fish_buffer[fish_num][3] = (*it2).get()->mark_ID;
                                fish_num++;
                            }

                            //(*it2)->onHurt(0);
                            onHurt((*it2), 0);
                            if (fish_num >= MAX_FISH_IN_NET) {
                                break;
                            }
                        }
                    }
                    if (fish_num > 0)                 //碰撞之后给服务器发消息
                    {
                        (*it1).get()->target_offset_w = (*it1).get()->x - target->x;
                        (*it1).get()->target_offset_h = (*it1).get()->y - target->y;
                        //(*it1).get()->onHurt(1);

                        if ((*it1).get()->from_ID == 1 || (*it1).get()->from_ID == 0)
                        {
                            int cmd_level = Fish_CMD_Priority::NORMAL_LEVEL;

                            fish_num = 1;

                            for (int i = 0; i<fish_num; i++) {
                                int current_cmd_level = Fish_CMD_Priority::NORMAL_LEVEL;

                                if (fish_buffer[i][1] == 22) {
                                    current_cmd_level = Fish_CMD_Priority::SCREEN_BOMB_LEVEL;
                                }
                                else if (fish_buffer[i][1] == 21) {
                                    current_cmd_level = Fish_CMD_Priority::BOAT_LEVEL;
                                }
                                else if (fish_buffer[i][1] == 24) {
                                    current_cmd_level = Fish_CMD_Priority::RANGE_BOMB_LEVEL;
                                }
                                else if (fish_buffer[i][2] == Fishes::STYLE_SAME) {
                                    current_cmd_level = Fish_CMD_Priority::TYPE_BOMB_LEVEL;
                                }
                                else if (fish_buffer[i][2] == Fishes::STYLE_TEAM) {
                                    current_cmd_level = Fish_CMD_Priority::TEAM_LEVEL;
                                }

                                if (current_cmd_level<cmd_level) {
                                    cmd_level = current_cmd_level;
                                }
                            }

                            switch (cmd_level)
                            {
                            case Fish_CMD_Priority::SCREEN_BOMB_LEVEL:
                                debug_("SCREEN_BOMB_LEVEL");
                                {
                                    CMD_C_Hit_Screen_Bomb C_Hit_Screen_Bom;

                                    C_Hit_Screen_Bom.wRatio = 100;

                                    for (int i = 0; i < fish_num; i++) {
                                        if (fish_buffer[i][1] == 22) {
                                            C_Hit_Screen_Bom.hitFish.wID = fish_buffer[i][0];
                                            C_Hit_Screen_Bom.hitFish.cbType = fish_buffer[i][1];
                                            break;
                                        }
                                    }
                                    m_pIAndroidUserItem->SendSocketData(SUB_C_SCREEN_BOBM, &C_Hit_Screen_Bom, sizeof(CMD_C_Hit_Screen_Bomb));
                                }
                                break;
                            case Fish_CMD_Priority::BOAT_LEVEL:
                                debug_("BOAT_LEVEL");
                                {
                                    CMD_C_HitBoat C_HitBoat;
                                    C_HitBoat.cbCount = 1;
                                    C_HitBoat.wRatio = 0;

                                    for (int i = 0; i < fish_num; i++) {
                                        if (fish_buffer[i][1] == 21) {
                                            C_HitBoat.hitFish.wID = fish_buffer[i][0];
                                            C_HitBoat.hitFish.cbType = fish_buffer[i][1];
                                            break;
                                        }
                                    }
                                    m_pIAndroidUserItem->SendSocketData(SUB_C_HIT_BOAT, &C_HitBoat, sizeof(CMD_C_HitBoat));
                                }
                                break;
                            case Fish_CMD_Priority::RANGE_BOMB_LEVEL:
                                debug_("RANGE_BOMB_LEVEL!!!!!!!!");
                                {

                                }
                                break;

                            case Fish_CMD_Priority::TYPE_BOMB_LEVEL:
                                debug_("TYPE_BOMB_LEVEL");
                                {
                                    CMD_C_TypeBomb_dte C_TpyeBomb_dte;

                                    for (int i = 0; i < fish_num; i++) {
                                        if (fish_buffer[i][2] == Fishes::STYLE_SAME) {
                                            C_TpyeBomb_dte.hitFish.wID = fish_buffer[i][0];
                                            C_TpyeBomb_dte.hitFish.cbType = fish_buffer[i][1];
                                            break;
                                        }
                                    }

                                    C_TpyeBomb_dte.cbCount = 0;

                                    //用stl重写
                                    if (!allFishes.empty())
                                    {

                                        FISHES::iterator it = allFishes.begin();
                                        for (; it != allFishes.end(); it++)
                                        {
                                            if ((*it)->fish_type == C_TpyeBomb_dte.hitFish.cbType) {
                                                C_TpyeBomb_dte.FishNetIDs[C_TpyeBomb_dte.cbCount].wID = (WORD)(*it)->server_ID;
                                                C_TpyeBomb_dte.FishNetIDs[C_TpyeBomb_dte.cbCount].cbType = (BYTE)(*it)->fish_type;
                                                C_TpyeBomb_dte.cbCount++;

                                                if (C_TpyeBomb_dte.cbCount >= MAX_FISH_BY_BOMB) {
                                                    break;
                                                }

                                            }
                                        }
                                    }


                                    m_pIAndroidUserItem->SendSocketData(SUB_C_TPYE_BOBM, &C_TpyeBomb_dte, sizeof(CMD_C_TypeBomb_dte) - (MAX_FISH_BY_BOMB - C_TpyeBomb_dte.cbCount)*sizeof(CMD_C_Fish_Net_Object));
                                }
                                break;
                            case Fish_CMD_Priority::TEAM_LEVEL:
                                debug_("TEAM_LEVEL");
                                {
                                    CMD_C_HitTeam_dte C_HitTeam_dte;

                                    int mark_ID = 0;

                                    for (int i = 0; i < fish_num; i++) {
                                        if (fish_buffer[i][2] == Fishes::STYLE_TEAM) {
                                            C_HitTeam_dte.hitFish.wID = fish_buffer[i][0];
                                            C_HitTeam_dte.hitFish.cbType = fish_buffer[i][1];
                                            mark_ID = fish_buffer[i][3];
                                            break;
                                        }
                                    }

                                    C_HitTeam_dte.cbCount = 0;

                                    //用STL实现
                                    if (!allFishes.empty())
                                    {

                                        FISHES::iterator it = allFishes.begin();
                                        for (; it != allFishes.end(); it++)
                                        {
                                            if ((*it)->mark_ID == mark_ID) {
                                                C_HitTeam_dte.FishNetIDs[C_HitTeam_dte.cbCount].wID = (WORD)(*it)->server_ID;
                                                C_HitTeam_dte.FishNetIDs[C_HitTeam_dte.cbCount].cbType = (BYTE)(*it)->fish_type;
                                                C_HitTeam_dte.cbCount++;

                                                if (C_HitTeam_dte.cbCount >= MAX_FISH_IN_TEAM) {
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                    m_pIAndroidUserItem->SendSocketData(SUB_C_HIT_TEAM, &C_HitTeam_dte, sizeof(CMD_C_HitTeam_dte) - (MAX_FISH_IN_TEAM - C_HitTeam_dte.cbCount)*sizeof(CMD_C_Fish_Net_Object));
                                }
                                break;

                            case Fish_CMD_Priority::NORMAL_LEVEL:
                                debug_("NORMAL_LEVEL");
                                {
                                    C_Cast_Net_dte.cbCount = fish_num;
                                    for (int i = 0; i<fish_num; i++) {
                                        C_Cast_Net_dte.FishNetIDs[i].wID = (WORD)fish_buffer[i][0];
                                        C_Cast_Net_dte.FishNetIDs[i].cbType = (BYTE)fish_buffer[i][1];
                                    }
                                    m_pIAndroidUserItem->SendSocketData(SUB_C_CAST_NET, &C_Cast_Net_dte, sizeof(CMD_C_Cast_Net_dte) - (MAX_FISH_IN_NET - C_Cast_Net_dte.cbCount)*sizeof(CMD_C_Fish_Net_Object));
                                }
                                break;
                            default:
                                break;
                            }

                        }
                    }
                } 
                if (isExplode)
                {
                    //step3:击中鱼移除出子弹iteras
                    it1 = allBullets.erase(it1);    
                    //LOGD("移除子弹");
                }
                else
                {
                    it1++; //迭代器++
                }
        }
    }
    return;
}

//随机
int CAndroidUserItemSink::RandFun(int min, int max)
{
    if (max < min)
    {
        int tmp = max;
        max = min;
        min = tmp;
    }
    CRandom random;
    return min + random.Random(max - min);
}
//状态
bool CAndroidUserItemSink::isState(int state)
{
    return (m_state == state);
}

void CAndroidUserItemSink::setState(int state)
{
    m_state = state;
    if (state == STATE_TACTIC) {
        Fishes::tactic_duration = 0;
    }
}
//另起一个线程,用于判断鱼和子弹之间的碰撞和鱼和子弹每一帧的位移
void CAndroidUserItemSink::threadUpdate()
{
    while (true)
    {
        if (m_nMainState == 1)//说明主线程收到退出消息
        {
            m_nSubState = 1;//子线程先退出
            LOGD("子线程退出了");
            m_pIAndroidUserItem->KillGameTimer(IDI_FIRE);//SetGameTimer(IDI_FIRE);
            t1.~thread();
            break;
        }
        else
        {
            if (RepositionState)//机器人中途离开
            {
                RepositionSubState = true;
                LOGD("机器人中途离开,子线程退出了");
                m_pIAndroidUserItem->KillGameTimer(IDI_FIRE);
                return;
            }
            GameObject::setFrameDuration(TIME_SCHEDULE_UPDATE); //设置鱼和子弹移动的间隔时间 0.01666667
            if (isState(STATE_TACTIC)) {                        //按顺序的
                Fishes::updateDurationTime();
            }
            getNewBulletList(allBullets);                       //得到现在最新的子弹
            getAllFishes(allFishes);                            //得到现在所生成的鱼

            if (pause_count < pause_n)
            {
                pause_count++;                                  //打到暂停了
            }
            else
            {
                UpdateFish();                                   //更新鱼的位置,同时移除跑出屏幕外边的鱼
            }

            UpdateBullet();                                        //更新子弹的位置,并检测和鱼的碰撞,并且移除碰到鱼的子弹,子弹打中鱼给服务器发消息
            //RemoveBullet();
            checkQueue();                                       //处理队列
            RemoveFish();                                       //从所有鱼中删除打死的鱼
            Sleep(TIME_SCHEDULE_UPDATE * 1000);                 //每隔0.016667s休眠一次线程
        }
    }
}
//获取角度
float  CAndroidUserItemSink::getAngel(float x, float y)
{
    //这种情况下是炮台在屏幕的上方
    if (x > 0)
    {
        if (y > 0)
        {
            //第一象限
            //return CC_RADIANS_TO_DEGREES(atan(x / y));
            //LOGD("第一象限");
            return CC_RADIANS_TO_DEGREES(atan(x / y));
        }
        else
        {
            //第四象限
            //LOGD("第四象限");
            return CC_RADIANS_TO_DEGREES(atan(x / y)) + 180;
            //return CC_RADIANS_TO_DEGREES(atan(x / y)) + 360;
        }
    }
    else if (x<0)
    {
        if (y > 0)
        {
            //第二象限
            //LOGD("第二象限");
            return CC_RADIANS_TO_DEGREES(atan(x / y)) + 180;
        }
        else
        {
            //第三象限
            //LOGD("第三象限");
            return CC_RADIANS_TO_DEGREES(atan(x / y));
            //return CC_RADIANS_TO_DEGREES(atan(x / y))+180;
        }
    }
    else
    {
        //x=0
           return y>0 ? 90 : 270;
    }
}

void  CAndroidUserItemSink::Collision(BULLET g1, FISH g2)//每个子弹和任何一个鱼先判断一遍
{
    
    return;
}
//获取炮台的位置,来判断该炮台在屏幕底下还是在屏幕上边
int  CAndroidUserItemSink::getCannonID(int chairID) {
    int ID = chairID;
    if (isUpsideEx) {
        if (ID >= GAME_PLAYER / 2)
            ID -= GAME_PLAYER / 2;
        else
            ID += GAME_PLAYER / 2;
    }
    return ID;
}

//获取从服务器返回的该删除的鱼放进waitRemoveFishEx链表中
void  CAndroidUserItemSink::onHurt(shared_ptr<Fishes> fi, int hurt)
{
    if (hurt == 1) {

        int targetCannonID = fi.get()->targetChairID;
        /*if (instance->isUpside) {
        targetCannonID = instance->getCannonID(targetCannonID);
        }*/

        int ex_ratio = 1;
        if (fi.get()->fish_style == STYLE_NIL) {
            if (fi.get()->fish_type > 15) {
                //fi.get()->setSign(true);
            }
            if (fi.get()->fish_type < 16) {
                //fi.get()->setSign(true);
            }
            if (fi.get()->fish_type > 20) {
                
                fi.get()->setSign(true);
                if (fi.get()->fish_type == 22) {

                }
            }
            else {
                fi.get()->setSign(true);
            }
        }
        else if (fi.get()->fish_style ==STYLE_PAUSE) {

            //当机器人和客户端打到暂停的鱼了,然后界面暂停了,这时候机器人不能再每一帧更新鱼的位置,所以机器人和客户端打到暂停的鱼时,
            //需要向服务器发送消息,让服务器通知其他机器人,当机器人收到消息之后再做操作。
            pause_count = 0;
            //waitRemoveFishEx.push_back(fi);
            //CMD_C_PAUSE  Pause;
            //Pause.wChairID = m_RobotID;
            //m_pIAndroidUserItem->SendSocketData(SUB_C_PAUSE, &Pause, sizeof(CMD_C_PAUSE));
        }
        else if (fi.get()->fish_style ==STYLE_TEAM) {
            fi.get()->setSign(true);
        }
        else if (fi.get()->fish_style == STYLE_SAME) {
            fi.get()->setSign(true);
            
        }
        else if (fi.get()->fish_style == STYLE_ANY) {
            if (fi.get()->fish_type > 20) {
                fi.get()->setSign(true);
            }
            else {
                fi.get()->setSign(true);
            }
        }
    }
    else {
        fi.get()->hurt_count = 12;
    }
}

//复制一份删除鱼的链表
void CAndroidUserItemSink::copyRemovefish(FISHES & f)
{
    mutexWaitRemoveFish.lock();
    f.splice(f.end(), waitRemoveFishEx, waitRemoveFishEx.begin(), waitRemoveFishEx.end());//保存一下从服务器发过来的要删除的鱼,加上锁
    mutexWaitRemoveFish.unlock();
}

//删除鱼
void CAndroidUserItemSink::RemoveFish()
{
    //if (!copyWaitRemoveFishEx.empty())
    //{
    //    std::list<shared_ptr<Fishes>>::iterator it1 = copyWaitRemoveFishEx.begin();
    //    for (; it1 != copyWaitRemoveFishEx.end(); it1++)
    //    {
    //        (*it1).get()->setSign(true);//标记一下该鱼要删除了
    //    }
    //}

    //mutexDestructFish.lock();
    int DeleteFishCount = 0;
    std::list<shared_ptr<Fishes>>::iterator it = allFishes.begin();
    for (; it != allFishes.end();)
    {
        if ((*it).get()->sign)
        {
            DeleteFishCount++;
            it=allFishes.erase(it);//删除标记的鱼
        }
        else
        {
            it++;
        }
    }
    //mutexDestructFish.unlock();
    //LOGD("要删除鱼的数量:" << DeleteFishCount);
    return;
}

//删除子弹
void CAndroidUserItemSink::RemoveBullet()
{
    if (!allBullets.empty())
    {
        std::list<std::shared_ptr<Bullet>>::iterator iter1 = allBullets.begin();
        for (; iter1 != allBullets.end();)
        {
            if (iter1->get()->deleteSign)
            {
                LOGD("删除子弹");
                iter1 = allBullets.erase(iter1);
            }
            else
            {
                iter1++;
            }
        }
    }
}

//是否暂停,暂停不更新鱼的位置
bool CAndroidUserItemSink::isOnPause()
{
    return pause_count<pause_n;
}

//创建鱼的一些操作
Fishes * CAndroidUserItemSink::createFish(float x, float y, float angle, int Fishes_style, int Fishes_type, int server_ID)
{
      //LOGD("创建鱼");
      std::shared_ptr<Fishes> fish = std::shared_ptr<Fishes>(new Fishes(fishCount++));
      mutexCreateFishes.lock();
      fish->setFish(x, y, angle, Fishes_style, Fishes_type, server_ID);
      createShareFishes.push_back(fish);
        if (!isOnPause())
        {
            if (!createShareFishes.empty())
            {
                std::list<shared_ptr<Fishes>>::iterator it = createShareFishes.begin();
                for (; it != createShareFishes.end(); it++)
                {
                    if ((*it).get())
                    {
                        (*it).get()->update();//创建鱼的同时赋予初始位置
                    }
                }
            }
        }
      mutexCreateFishes.unlock();
      //LOGD("创建鱼成功");
      return fish.get();
    
}

//创建鱼
Fishes * CAndroidUserItemSink::createFish(float x, float y, float angle, int Fishes_type, int server_ID)
{
    return createFish(x, y, angle, STYLE_NIL, Fishes_type, server_ID);
}

//获取最新的鱼的列表
void CAndroidUserItemSink::getAllFishes(std::list<shared_ptr<Fishes>> &fi)
{
    mutexCreateFishes.lock();
    //LOGD("allFish.size(): " << allFishes.size() << " createShareFishes.size():" << createShareFishes.size());
    if (fi.empty())
    {
        fi.splice(fi.begin(), createShareFishes, createShareFishes.begin(), createShareFishes.end());//得到现在创建的所有鱼
    }
    else
    {
        fi.splice(fi.end(), createShareFishes, createShareFishes.begin(), createShareFishes.end());
    }
    mutexCreateFishes.unlock();
}

//创建子弹的一些操作
Bullet* CAndroidUserItemSink::createBullet(float x, float y, float angle, float speed, float vx_ex, float vy_ex, int from_type, int bullet_type)
{
    std::shared_ptr<Bullet> bullet = std::shared_ptr<Bullet>(new Bullet(bulletCount++));
    mutexCreateBullet.lock();
    bullet->setBullet(x, y, angle, speed, vx_ex, vy_ex, from_type, bullet_type);
    createShareBullets.push_back(bullet);//刚创建的子弹放到链表createShareBullets中
    if (createShareBullets.size()>0)
    {
        std::list<std::shared_ptr<Bullet>>::iterator it = createShareBullets.begin();
        for (; it != createShareBullets.end(); it++)
        {
            if ((*it).get())
            {
                //LOGD("CreateBullet bullet_ID:" << (*it).get()->bullet_ID << "   x:" << (*it).get()->x << /*"  vx: " << (*it).get()->vx << "  vy: " << (*it).get()->vy<<*/ "  y:" << (*it).get()->y<<" angle: "<<(*it).get()->angle);
                (*it).get()->update();
                //LOGD("CreateBullet bullet_ID:" << (*it).get()->bullet_ID << "   x:" << (*it).get()->x << /*"  vx: " << (*it).get()->vx << "  vy: " << (*it).get()->vy<<*/ "  y:" << (*it).get()->y<<" angle: "<<(*it).get()->angle);
            }
        }
    }
    mutexCreateBullet.unlock();

    return bullet.get();
}

//创建子弹
Bullet* CAndroidUserItemSink::createBullet(float x, float y, float angle, float speed, int from_type, int bullet_type)
{
    return createBullet(x, y, angle, speed, 0, 0, from_type, bullet_type);
}

//获取最新的子弹的列表
void CAndroidUserItemSink::getNewBulletList(list<shared_ptr<Bullet>> & newBullet)
{
    mutexCreateBullet.lock();
    
    if (newBullet.size() == 0)
    {
        newBullet.splice(newBullet.begin(), createShareBullets, createShareBullets.begin(), createShareBullets.end());//复制创建的鱼的链表到最新的子弹链表中,然后清空创建鱼的链表

    }
    else
    {
        newBullet.splice(newBullet.end(), createShareBullets, createShareBullets.begin(), createShareBullets.end());
    }
    mutexCreateBullet.unlock();
}

//鱼的更新位置,没用到
void CAndroidUserItemSink::fishUpdate(Fishes *f)
{
    //if (isState(STATE_RUN))
    //{
    //instance->isState(CAndroidUserItemSink::STATE_TACTIC);
    if (isState(CAndroidUserItemSink::STATE_TACTIC)) {
        fishUpdateTactic(f);
        //LOGD("UpdateTacticMoveFish: fish_ID: " << fish_ID << " x: " << x << " y: " << y << " angle: " << angle);
    }
    else
    {
        if (!(pause_count<pause_n))//界面暂停
        {
            if (f->runMode == RUN_MODE_LINE) {
                f->moveT();
                //LOGD("MoveTMoveFish: fish_ID: " << fish_ID << " x: " << x << " y: " << y << " angle: " << angle);
            }
            else {
                /*if (Tools::isLineExceedValue(f->x, f->y, curvePos[curveIndex].x, curvePos[curveIndex].y, f->speed)) {
                    float x_distance =f->x - curvePos[curveIndex].x;
                    float y_distance =f->y - curvePos[curveIndex].y;
                    float step = sqrt(x_distance*x_distance + y_distance*y_distance) / f->speed;

                    float ter_angle = Tools::getAngle(curvePos[curveIndex].x - f->x, curvePos[curveIndex].y -f->y);

                    float offset_angle = ter_angle - f->angle;

                    if (offset_angle > 180) {
                        offset_angle = -(360 - offset_angle);
                    }
                    else if (offset_angle < -180) {
                        offset_angle = 360 + offset_angle;
                    }

                    f->angle_v = offset_angle / step * 2;

                }
                else {
                    f->angle_v = 0;
                    curveIndex++;
                    if (curveIndex > 2) {
                        f->setRunMode(RUN_MODE_LINE);
                    }
                }
                f->moveAngleT();*/
            }
        }
        else { /*LOGD("!!!!!更新时暂停了*/ }

    }

    if (f->fish_style == STYLE_TEAM || f->fish_style == STYLE_SAME) {
        f->angle += 2;
    }

    if (!Tools::isGameObjectCollision(f, f->x - 1400, f->x + winSize.width + 1400, f->y + winSize.height + 1400, f->y - 1400)) {

    }
    else {
        if (f->hurt_count > 0) {
            if (f->hurt_count > 1) {

            }
            else {
            }
            f->hurt_count--;
        }
    }
    //}
    //else if (isState(STATE_EXPLODE))
    //{
    //if (getAnima()->isOver()){
    //    onClear();
    //}
    //else if (target != NULL){
    //    //x = target->x+target_offset_w; 
    //    //y = target->y+target_offset_h; 
    //}
    //}

    //count++;
}
//更新鱼的位置,没用到
void CAndroidUserItemSink::fishUpdateTactic(Fishes *f)
{
    f->tactic_duration_buffer = f->tactic_duration;
    f->phase = 0;

    f->x = f->buffer_x;
    f->y = f->buffer_y;
    f->angle = f->buffer_angle;

    while (f->phase < 6) {

        if (f->fishAction[f->phase].actionID == ACTION_HIDE) {
            if (f->tactic_duration_buffer >= f->fishAction[f->phase].time) {
                //setVisible(true);
                //shadow->setVisible(true);
                f->tactic_duration_buffer -=f-> fishAction[f->phase].time;
            }
            else {
                break;
            }
        }
        else if (f->fishAction[f->phase].actionID == ACTION_RUN_LINE) {
            if (f->tactic_duration_buffer >= f->fishAction[f->phase].time) {
                f->moveT(f->fishAction[f->phase].time);
                f->tactic_duration_buffer -= f->fishAction[f->phase].time;
            }
            else {
                f->moveT(f->tactic_duration_buffer);
                break;
            }
        }
        else if (f->fishAction[f->phase].actionID == ACTION_RUN_ROUND) {
            if (f->tactic_duration_buffer >= f->fishAction[f->phase].time) {
                f->angle += f->angle_v*f->fishAction[f->phase].time;
                f->angle = fmod(f->angle + 360, 360);

                f->tactic_duration_buffer -= f->fishAction[f->phase].time;

                f->x += Tools::getAngleX(f->angle, f->buffer_r);
                f->y += Tools::getAngleY(f->angle, f->buffer_r);
                f->angle = fmod(f->angle + 90, 360);

                //if (instance->isUpside) {
                if (isUpside)
                {
                    f->angle += 180;
                    f->angle = fmod(f->angle, 360);
                    f->x = winSize.width - f->x;
                    f->y = winSize.height- f->y;
                }

                f->setSpeed(2 * f->buffer_r*3.14159f*f->angle_v / 360 * 1.3f, f->angle, true);

                //setSpeed(200, angle, true);

            }
            else {
                f->angle += f->angle_v*f->tactic_duration_buffer;
                f->angle = fmod(f->angle + 360, 360);

                f->x += Tools::getAngleX(f->angle, f->buffer_r);
                f->y += Tools::getAngleY(f->angle, f->buffer_r);
                f->angle = fmod(f->angle + 90, 360);

                //if (instance->isUpside) {
                if (isUpside)
                {
                    f->angle += 180;
                    f->angle = fmod(f->angle, 360);
                    f->x = winSize.width - f->x;
                    f->y = winSize.height -f->y;
                }

                break;
            }
        }
        else if (f->fishAction[f->phase].actionID == ACTION_ROTATE) {
            if (f->tactic_duration_buffer >= f->fishAction[f->phase].time) {
                f->angle += f->angle_v*f->fishAction[f->phase].time;
                f->angle = fmod(f->angle + 360, 360);

                f->tactic_duration_buffer -= f->fishAction[f->phase].time;

                f->setSpeed(180, f->angle, true);

            }
            else {
                f->angle += f->angle_v*f->tactic_duration_buffer;
                f->angle = fmod(f->angle + 360, 360);

                break;
            }
        }
        else if (f->fishAction[f->phase].actionID == ACTION_WAIT) {
            if (f->tactic_duration_buffer >= f->fishAction[f->phase].time) {
                f->tactic_duration_buffer -= f->fishAction[f->phase].time;
                if (tacticID == 2) {
                    if (f->phase == 0) {
                        int vy = (winSize.height / 5 + 100) / f->fishAction[f->phase + 1].time;
                        //if (instance->isUpside) {
                        if (isUpside)
                        {
                            f->vy = -vy;
                        }
                        if (f->fish_type == 1) {
                            f->setV_xy(0, -vy);
                        }
                        else if (f->fish_type == 2) {
                            f->setV_xy(0, vy);
                        }
                    }
                    else {
                        int vy = (winSize.height * 4 / 5 + 100) / f->fishAction[f->phase + 1].time;
                        //if (instance->isUpside) {
                        if (isUpside)
                        {
                            f->vy = -vy;
                        }
                        if (f->fish_type == 1) {
                            f->setV_xy(0, -vy);
                        }
                        else if (f->fish_type == 2) {
                            f->setV_xy(0, vy);
                        }
                    }
                }
            }
            else {
                break;
            }
        }
        else if (f->fishAction[f->phase].actionID == ACTION_CLEAR) {
            //onClear();
            break;
        }
        else {
            //onClear();
            break;
        }

        f->phase++;
    }

}
//获取炮台的坐标
void CAndroidUserItemSink::setCannonPosition(int type, int gap, int w)
{
    if (type == TYPE_NORMAL) {
        m_positionX = gap / 2 + w / GAME_PLAYER + (m_RobotID*(w / (GAME_PLAYER / 2)));
        m_positionY = 0;
    }
    else {
        m_positionX = gap / 2 + w / GAME_PLAYER + ((GAME_PLAYER - m_RobotID - 1)*(w / (GAME_PLAYER / 2)));
        m_positionY = winSize.height;
    }
}
//获取机器人所在炮台的属性
void CAndroidUserItemSink::getCanAttri(int chairID)
{
    m_isSuper = cannon->isSuper;
    m_GunNum = cannon->cannon_gunNum;
}

//设置主线程的状态
void CAndroidUserItemSink::setMainState(int main)
{
    m_nMainState = main;
}
//获取子线程的状态,等游戏结束的时候先保证关闭子线程,再退出主线程
int  CAndroidUserItemSink::getSubState()
{
    return m_nSubState;
}

//处理接收到的打中鱼的消息
bool CAndroidUserItemSink::getMessage(shared_ptr<ReceiveMsg> &msg)
{
    std::lock_guard<std::mutex> lk( m_mutexTSMsg);
    /*switch (msg->wSubCmdID)
    {
       case SUB_S_CAST_NET_SUCCESS:
       {
          CMD_S_Cast_Net_Success_dte * S_Cast_Net_Success_dte = (CMD_S_Cast_Net_Success_dte *)(msg->cbDataBuffer);
         // if (S_Cast_Net_Success_dte->wChairID != m_RobotID) return true;
       }
       break;
       case SUB_S_HIT_TEAM_SUCCESS:
      {
          CMD_S_HitTeam_Success_dte* S_HitTeam_Success_dte = (CMD_S_HitTeam_Success_dte*)(msg->cbDataBuffer);
          //if (S_HitTeam_Success_dte->wChairID != m_RobotID) return true;
      }
      break;
      case SUB_S_TYPE_BOMB_SUCCESS:
      {
          CMD_S_TypeBomb_Success_dte* S_TypeBomb_Success_dte = (CMD_S_TypeBomb_Success_dte*)(msg->cbDataBuffer);
         // if (S_TypeBomb_Success_dte->wChairID != m_RobotID) return true;
      }
        break;
    }*/

    if (msg->wSubCmdID == SUB_S_CHANGE_SCENE)
    {
        LOGD("服务器发过来_SUB_S_CHANGE_SCENE_改变场景");
        //allBullets.clear();
    }
    //m_listRemoveFishMessage.push_back(msg);
    //LOGD("allBullet.size():" << allBullets.size());
    RemoveFiMsg.push_back(msg);
    return true;
}

//网成功
bool CAndroidUserItemSink::OnNetSuccess(CMD_S_Cast_Net_Success_dte*pData)
{
    CMD_S_Cast_Net_Success_dte * S_Cast_Net_Success_dte = (CMD_S_Cast_Net_Success_dte *)pData;
    //int a = wDataSize;
    //int b = sizeof(CMD_S_Cast_Net_Success_dte) - (MAX_FISH_IN_CUCESS - S_Cast_Net_Success_dte->cbCount)*sizeof(CMD_C_Fish_Net_Object);

    int ID = S_Cast_Net_Success_dte->wChairID;
    if (ID != m_RobotID)
    {
        return true;
    }
    fishPlayer[ID].lFishGold = S_Cast_Net_Success_dte->lPlayerScore;

    //if (currentFish->hasFlag(Fish::FLAG_UPDATE) && !currentFish->isState(Fish::STATE_EXPLODE)) {
    //    if (currentFish->server_ID == S_Cast_Net_Success_dte->FishNetIDs[i].wID) {//&& currentFish->fish_type==S_Cast_Net_Success_dte->FishNetIDs[i].cbType
    //        currentFish->targetChairID = S_Cast_Net_Success_dte->wChairID;
    //        currentFish->getPauseChairID(ID);
    //        currentFish->onHurt(1);
    //        if (currentFish->fish_type>15) {
    //            needGoldPlate = true;
    //        }
    //        break;
    //    }
    //}

    bool needGoldPlate = false;

    for (int i = 0; i<S_Cast_Net_Success_dte->cbCount; i++) {
        if (!allFishes.empty())
        {
            FISHES::iterator it = allFishes.begin();
            for (; it != allFishes.end(); it++)
            {
                if ((*it).get() /*&& (*it).get()->hasFlag(Fishes::FLAG_UPDATE) && !(*it).get()->isState(Fishes::STATE_EXPLODE)*/) {
                    if ((*it).get()->server_ID == S_Cast_Net_Success_dte->FishNetIDs[i].wID) {//&& currentFish->fish_type==S_Cast_Net_Success_dte->FishNetIDs[i].cbType
                        (*it).get()->targetChairID = S_Cast_Net_Success_dte->wChairID;
                        onHurt((*it), 1);
                        break;
                    }
                }
                
            }
        }
    }
    return true;
}
//炸弹打中
bool CAndroidUserItemSink::OnBoomSuccess(CMD_S_TypeBomb_Success_dte* pData)
{
    //LOGD("炸弹成功OnBoomSuccess");
    const CMD_S_TypeBomb_Success_dte* S_TypeBomb_Success_dte = (CMD_S_TypeBomb_Success_dte*)pData;
    int ID = S_TypeBomb_Success_dte->wChairID;
    if (ID != m_RobotID) return true;

    fishPlayer[ID].lFishGold += S_TypeBomb_Success_dte->lPlayerAddScore;


    for (int i = 0; i<S_TypeBomb_Success_dte->cbCount; i++)
    {
        if (!allFishes.empty())
        {
            FISHES::iterator it = allFishes.begin();
            for (; it != allFishes.end(); it++)
            {
                if ((*it).get()/*&&(*it)->hasFlag(Fishes::FLAG_UPDATE) && !(*it)->isState(Fishes::STATE_EXPLODE)*/) {
                    if ((*it).get()->server_ID == S_TypeBomb_Success_dte->FishNetIDs[i].wID) {//&& currentFish->fish_type==S_Cast_Net_Success_dte->FishNetIDs[i].cbType
                        (*it).get()->targetChairID = S_TypeBomb_Success_dte->wChairID;
                        //(*it)->onHurt(1)
                        onHurt((*it), 1);
                        break;
                    }
                }
            }
        }
    }
    return true;
}
//击中小组
bool CAndroidUserItemSink::OnTeamSuccess(CMD_S_HitTeam_Success_dte* pData)
{
    //LOGD("小队成功OnTeamSuccess");
    const CMD_S_HitTeam_Success_dte* S_HitTeam_Success_dte = (CMD_S_HitTeam_Success_dte*)pData;
    // a = wDataSize;
    //int b = sizeof(CMD_S_HitTeam_Success_dte) - (MAX_FISH_IN_TEAM - S_HitTeam_Success_dte->cbCount)*sizeof(CMD_C_Fish_Net_Object);

    int ID = S_HitTeam_Success_dte->wChairID;

    if (ID != m_RobotID)
    {
        return true;
    }

    fishPlayer[ID].lFishGold += S_HitTeam_Success_dte->lPlayerAddScore;

    for (int i = 0; i<S_HitTeam_Success_dte->cbCount; i++) {
        if (!allFishes.empty())
        {
            FISHES::iterator it = allFishes.begin();
            for (; it != allFishes.end(); it++)
            {
                if ((*it).get()/*&&(*it)->hasFlag(Fishes::FLAG_UPDATE) && !(*it)->isState(Fishes::STATE_EXPLODE)*/) {
                    if ((*it).get()->server_ID == S_HitTeam_Success_dte->FishNetIDs[i].wID) {//&& currentFish->fish_type==S_Cast_Net_Success_dte->FishNetIDs[i].cbType
                        (*it).get()->targetChairID = S_HitTeam_Success_dte->wChairID;
                        //(*it)->onHurt(1);
                        onHurt((*it), 1);
                        break;
                    }
                }
            }
        }
    }

    return true;
}
//改变场景
void CAndroidUserItemSink::changeScene(short ID)
{
    /*Fish* currentFish = Fish::headDrawFish;
    while (currentFish != NULL) {
        GameObject* tem = currentFish->nextDrawGameObject;
        if (currentFish->hasFlag(Fish::FLAG_UPDATE) && !currentFish->isState(Fish::STATE_EXPLODE)) {

            currentFish->setRunMode(Fish::RUN_MODE_LINE);

            currentFish->setSpeed(currentFish->speed * 2, currentFish->angle);
        }
        currentFish = (Fish*)tem;
    }*/
    //LOGD("改变场景changeScene");
    if (!allFishes.empty())
    {
        std::list<shared_ptr<Fishes>>::iterator it = allFishes.begin();
        for (; it != allFishes.end(); it++)
        {
            if ((*it).get()->hasFlag(Fishes::FLAG_UPDATE) && (*it).get()->isState(Fishes::FLAG_UPDATE))
            {
                (*it).get()->setRunMode(Fishes::RUN_MODE_LINE);
                (*it).get()->setSpeed((*it).get()->speed * 2, (*it).get()->angle);
            }
        }

    }
}
//检测队列
void CAndroidUserItemSink::checkQueue()
{
    //检测队列

    m_mutexTSMsg.lock();
    if (0 == RemoveFiMsg.size())
    {
        m_mutexTSMsg.unlock();
        return;
    }

        std::list<shared_ptr<ReceiveMsg>> messages;
        while (!RemoveFiMsg.empty())
        {
            //LOGD("m_listRemoveFishMessage不为空");
            messages.push_back(RemoveFiMsg.front());
            RemoveFiMsg.pop_front();
        }
        m_mutexTSMsg.unlock();

        
        while (!messages.empty())
        {
            std::list<shared_ptr<ReceiveMsg>>::iterator it = messages.begin();

            switch ((*it).get()->wSubCmdID)
            {
            case SUB_S_CAST_NET_SUCCESS:
            {
                CMD_S_Cast_Net_Success_dte * netsuccess = (CMD_S_Cast_Net_Success_dte *)((*it)->cbDataBuffer);
                OnNetSuccess(netsuccess);
            }
            break;
            case SUB_S_HIT_TEAM_SUCCESS:
            {
                CMD_S_HitTeam_Success_dte* S_HitTeam_Success_dte = (CMD_S_HitTeam_Success_dte*)((*it)->cbDataBuffer);
                OnTeamSuccess(S_HitTeam_Success_dte);
            }
            break;
            case SUB_S_TYPE_BOMB_SUCCESS:
            {

                CMD_S_TypeBomb_Success_dte* S_TypeBomb_Success_dte = (CMD_S_TypeBomb_Success_dte*)((*it)->cbDataBuffer);
                OnBoomSuccess(S_TypeBomb_Success_dte);
            }
            break;
            case SUB_S_CHANGE_SCENE:
            {
                CMD_S_Change_Scene * S_Change_Scene = (CMD_S_Change_Scene *)((*it)->cbDataBuffer);
                changeScene(S_Change_Scene->cbScene);
            }
            break;
            /*case SUB_IDI_FIRE:
            {
                Fire();
            }
            break;*/
            default:
                break;
            }
            messages.erase(it);
        }
        //LOGD("checkQueue中messages.size()="<<messages.size());

        //for (auto msg : messages)
        //{
        //    //LOGD("循环messages");
        //    if (msg == nullptr) continue;
        //    switch (msg.get()->wSubCmdID)
        //    {
        //    case SUB_S_CAST_NET_SUCCESS:
        //    {
        //        CMD_S_Cast_Net_Success_dte * netsuccess = (CMD_S_Cast_Net_Success_dte *)(msg->cbDataBuffer);
        //        OnNetSuccess(netsuccess);
        //    }
        //    break;
        //    case SUB_S_HIT_TEAM_SUCCESS:
        //    {
        //        CMD_S_HitTeam_Success_dte* S_HitTeam_Success_dte = (CMD_S_HitTeam_Success_dte*)(msg->cbDataBuffer);
        //        OnTeamSuccess(S_HitTeam_Success_dte);
        //    }
        //    break;
        //    case SUB_S_TYPE_BOMB_SUCCESS:
        //    {
        //        CMD_S_TypeBomb_Success_dte* S_TypeBomb_Success_dte = (CMD_S_TypeBomb_Success_dte*)(msg->cbDataBuffer);
        //        OnBoomSuccess(S_TypeBomb_Success_dte);
        //    }
        //    break;
        //    case SUB_S_CHANGE_SCENE:
        //    {
        //        CMD_S_Change_Scene * S_Change_Scene = (CMD_S_Change_Scene *)(msg->cbDataBuffer);
        //        changeScene(S_Change_Scene->cbScene);
        //    }
        //    break;
        //    default:
        //        break;
        //    }
        //    //delete msg;
        //    // msg = nullptr;
        //}
}
//打印鱼和子弹size大小
void CAndroidUserItemSink::LogSize()
{
    //LOGD("fishList.size()=" << allFishes.size() << " BulletList.size()=" << allBullets.size() << " RemoveFiMsg.size()=" << RemoveFiMsg.size());
}

void CAndroidUserItemSink::fireBullet()
{
    if (cannon->needFire_num > 0)
    {
        if (cannon->needFire_count <= 0)
        {
            cannon->needFire_num--;
            cannon->needFire_count = 8;
            shoot();
        }
    }
    if (cannon->needFire_count>0)
    {
        cannon->needFire_count--;
    }
}

void CAndroidUserItemSink::shoot()
{
    if (fishPlayer[m_RobotID].lFishGold >  fishGold)
    {
        CMD_C_Fire fire;
        WORD wChairID = m_pIAndroidUserItem->GetChairID();
            if (m_positionY>0)//炮台在屏幕的上边
            {
                //x = rand() % 1000;
                x = rand() % 800;
                y = 0;
                angle = getAngel(x - m_positionX, y - m_positionY);
            }
            else
            {
                //x = rand() % 1000 + 140;
                //y = 360;
                x = rand() % 1000;
                y = 500;
                angle = Tools::getAngle(x - m_positionX, y - m_positionY);
                if (angle > 180) {
                    if (angle < 270) {
                        angle = 180;
                    }
                    else {
                        angle = 0;
                    }
                }
            }
        //}
        fire.fRote = angle;
        {
            {
                if (fishPlayer[m_RobotID].lFishGold > 0)
                {
                    m_pIAndroidUserItem->SendSocketData(SUB_C_FIRE, &fire, sizeof(CMD_C_Fire));
                    CreateBullets(1);
                    fishPlayer[m_RobotID].lFishGold -= fishGold;
                    if(cannon->needFire_num<20) {
                        cannon->needFire_num++;
                    }
                }
            }
        }
    }
    else if (fishPlayer[m_RobotID].lFishGold != 0 && (rand() % 10)>3)
    {
        ChangeCannon();
    }
    else
    {
        /// 购买子弹
        BuyBullet();
        LOGD("钱不够的时候,购买子弹");
    }
}
//////////////////////////////////////////////////////////////////////////

 

posted on 2018-08-02 17:44  薄荷味的笑  阅读(268)  评论(0编辑  收藏  举报