void Run(INT MPI_RNG_SEED){
        
        ///////////
        // SETUP //
        ///////////
    
        //SET SEED //
        MY_MPI_RNG_SEED=MPI_RNG_SEED;
        
        //INITIALIZE RANDOM NUMBER GENERATOR //
        RandomNumberGenerator::Init(MY_MPI_RNG_SEED);
    
        //INITIALIZE DYNAMICS //
        Dynamics::Reset();
        
        //////////////////////
        // CREATE INFO FILE //
        //////////////////////

        CreateInfoFile();
        
        ////////////////////////////
        // SET INITIAL CONDITIONS //
        ////////////////////////////
        #if IC_FLAG==QP_FLAG
        InitialConditions::SetQuasiParticles();
        #endif
        
        #if IC_FLAG==LOAD_FLAG
        IO::LoadConfiguration(GLinks::U,EFields::E);
        #endif
        
        #if IC_FLAG==THERMAL_FLAG
        InitialConditions::SetZero();
        // THERMALIZE
        ThermalDynamics::Thermalize(30,50.0);
        #endif
        
        ////////////////////
        // TIME EVOLUTION //
        ////////////////////
        
        Evolve(20.0);
        
    
    }
 void Run(INT MPI_RNG_SEED){
     
     ///////////
     // SETUP //
     ///////////
     
     //SET SEED //
     MY_MPI_RNG_SEED=1443154311;//MPI_RNG_SEED;//1443037688;//1442551674;//1443037688;//
     
     //INITIALIZE RANDOM NUMBER GENERATOR //
     RandomNumberGenerator::Init(MY_MPI_RNG_SEED);
     
     //INITIALIZE DYNAMICS //
     Dynamics::Reset();
     
     ////////////////////////////
     // SET INITIAL CONDITIONS //
     ////////////////////////////
     #if IC_FLAG==QP_FLAG
     InitialConditions::SetQuasiParticles();
     //RestartInitialConditions::SetQuasiParticles();
     
     //IO::LoadConfiguration(GLinks::U,EFields::E);
     //IO::LoadLinks(GLinks::U);
     #endif
     
     #if IC_FLAG==THERMAL_FLAG
     InitialConditions::SetZero();
     // THERMALIZE
     ThermalDynamics::Thermalize(20,50.0);
     #endif
     
     ////////////////////
     // TIME EVOLUTION //
     ////////////////////
     
     std::cerr << "### STARTING TIME EVOLUTION ###" << std::endl;
     Evolve(1000.0);
      
 }
Exemple #3
0
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    World world;
    for (int i = 0; i < 500; i++)
    {
        int x = qrand() % ((2500 + 1) - 0) + 0;
        int y = qrand() % ((2500 + 1) - 0) + 0;
        if(!world.ContainsCellAt(x, y))
            world.AddCell(x,y);
    }

    QtQuick2ApplicationViewer viewer;
    viewer.rootContext()->setContextProperty("world", &world);
    viewer.setMainQmlFile(QStringLiteral("qml/UI/main.qml"));
    viewer.showExpanded();

    auto rootobject = viewer.rootObject();
    QObject::connect(rootobject, SIGNAL(evolve()), &world, SLOT(Evolve()));

    return app.exec();
}
void CGameClient::OnNewSnapshot()
{
	m_NewTick = true;

	// clear out the invalid pointers
	mem_zero(&g_GameClient.m_Snap, sizeof(g_GameClient.m_Snap));
	m_Snap.m_LocalClientID = -1;

	// secure snapshot
	{
		int Num = Client()->SnapNumItems(IClient::SNAP_CURRENT);
		for(int Index = 0; Index < Num; Index++)
		{
			IClient::CSnapItem Item;
			void *pData = Client()->SnapGetItem(IClient::SNAP_CURRENT, Index, &Item);
			if(m_NetObjHandler.ValidateObj(Item.m_Type, pData, Item.m_DataSize) != 0)
			{
				if(g_Config.m_Debug)
				{
					char aBuf[256];
					str_format(aBuf, sizeof(aBuf), "invalidated index=%d type=%d (%s) size=%d id=%d", Index, Item.m_Type, m_NetObjHandler.GetObjName(Item.m_Type), Item.m_DataSize, Item.m_ID);
					Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf);
				}
				Client()->SnapInvalidateItem(IClient::SNAP_CURRENT, Index);
			}
		}
	}

	ProcessEvents();

	if(g_Config.m_DbgStress)
	{
		if((Client()->GameTick()%100) == 0)
		{
			char aMessage[64];
			int MsgLen = rand()%(sizeof(aMessage)-1);
			for(int i = 0; i < MsgLen; i++)
				aMessage[i] = 'a'+(rand()%('z'-'a'));
			aMessage[MsgLen] = 0;

			CNetMsg_Cl_Say Msg;
			Msg.m_Team = rand()&1;
			Msg.m_pMessage = aMessage;
			Client()->SendPackMsg(&Msg, MSGFLAG_VITAL);
		}
	}

	// go trough all the items in the snapshot and gather the info we want
	{
		m_Snap.m_aTeamSize[TEAM_RED] = m_Snap.m_aTeamSize[TEAM_BLUE] = 0;

		int Num = Client()->SnapNumItems(IClient::SNAP_CURRENT);
		for(int i = 0; i < Num; i++)
		{
			IClient::CSnapItem Item;
			const void *pData = Client()->SnapGetItem(IClient::SNAP_CURRENT, i, &Item);

			if(Item.m_Type == NETOBJTYPE_CLIENTINFO)
			{
				const CNetObj_ClientInfo *pInfo = (const CNetObj_ClientInfo *)pData;
				int ClientID = Item.m_ID;
				IntsToStr(&pInfo->m_Name0, 4, m_aClients[ClientID].m_aName);
				IntsToStr(&pInfo->m_Clan0, 3, m_aClients[ClientID].m_aClan);
				m_aClients[ClientID].m_Country = pInfo->m_Country;
				IntsToStr(&pInfo->m_Skin0, 6, m_aClients[ClientID].m_aSkinName);

				m_aClients[ClientID].m_UseCustomColor = pInfo->m_UseCustomColor;
				m_aClients[ClientID].m_ColorBody = pInfo->m_ColorBody;
				m_aClients[ClientID].m_ColorFeet = pInfo->m_ColorFeet;

				// prepare the info
				if(m_aClients[ClientID].m_aSkinName[0] == 'x' || m_aClients[ClientID].m_aSkinName[1] == '_')
					str_copy(m_aClients[ClientID].m_aSkinName, "default", 64);

				m_aClients[ClientID].m_SkinInfo.m_ColorBody = m_pSkins->GetColorV4(m_aClients[ClientID].m_ColorBody);
				m_aClients[ClientID].m_SkinInfo.m_ColorFeet = m_pSkins->GetColorV4(m_aClients[ClientID].m_ColorFeet);
				m_aClients[ClientID].m_SkinInfo.m_Size = 64;

				// find new skin
				m_aClients[ClientID].m_SkinID = g_GameClient.m_pSkins->Find(m_aClients[ClientID].m_aSkinName);
				if(m_aClients[ClientID].m_SkinID < 0)
				{
					m_aClients[ClientID].m_SkinID = g_GameClient.m_pSkins->Find("default");
					if(m_aClients[ClientID].m_SkinID < 0)
						m_aClients[ClientID].m_SkinID = 0;
				}

				if(m_aClients[ClientID].m_UseCustomColor)
					m_aClients[ClientID].m_SkinInfo.m_Texture = g_GameClient.m_pSkins->Get(m_aClients[ClientID].m_SkinID)->m_ColorTexture;
				else
				{
					m_aClients[ClientID].m_SkinInfo.m_Texture = g_GameClient.m_pSkins->Get(m_aClients[ClientID].m_SkinID)->m_OrgTexture;
					m_aClients[ClientID].m_SkinInfo.m_ColorBody = vec4(1,1,1,1);
					m_aClients[ClientID].m_SkinInfo.m_ColorFeet = vec4(1,1,1,1);
				}

				m_aClients[ClientID].UpdateRenderInfo();

			}
			else if(Item.m_Type == NETOBJTYPE_PLAYERINFO)
			{
				const CNetObj_PlayerInfo *pInfo = (const CNetObj_PlayerInfo *)pData;

				m_aClients[pInfo->m_ClientID].m_Team = pInfo->m_Team;
				m_aClients[pInfo->m_ClientID].m_Active = true;
				m_Snap.m_paPlayerInfos[pInfo->m_ClientID] = pInfo;
				m_Snap.m_NumPlayers++;

				if(pInfo->m_Local)
				{
					m_Snap.m_LocalClientID = Item.m_ID;
					m_Snap.m_pLocalInfo = pInfo;

					if(pInfo->m_Team == TEAM_SPECTATORS)
					{
						m_Snap.m_SpecInfo.m_Active = true;
						m_Snap.m_SpecInfo.m_SpectatorID = SPEC_FREEVIEW;
					}
				}

				// calculate team-balance
				if(pInfo->m_Team != TEAM_SPECTATORS)
					m_Snap.m_aTeamSize[pInfo->m_Team]++;

			}
			else if(Item.m_Type == NETOBJTYPE_CHARACTER)
			{
				const void *pOld = Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_CHARACTER, Item.m_ID);
				m_Snap.m_aCharacters[Item.m_ID].m_Cur = *((const CNetObj_Character *)pData);
				if(pOld)
				{
					m_Snap.m_aCharacters[Item.m_ID].m_Active = true;
					m_Snap.m_aCharacters[Item.m_ID].m_Prev = *((const CNetObj_Character *)pOld);

					if(m_Snap.m_aCharacters[Item.m_ID].m_Prev.m_Tick)
						Evolve(&m_Snap.m_aCharacters[Item.m_ID].m_Prev, Client()->PrevGameTick());
					if(m_Snap.m_aCharacters[Item.m_ID].m_Cur.m_Tick)
						Evolve(&m_Snap.m_aCharacters[Item.m_ID].m_Cur, Client()->GameTick());
				}
			}
			else if(Item.m_Type == NETOBJTYPE_SPECTATORINFO)
			{
				m_Snap.m_pSpectatorInfo = (const CNetObj_SpectatorInfo *)pData;
				m_Snap.m_pPrevSpectatorInfo = (const CNetObj_SpectatorInfo *)Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_SPECTATORINFO, Item.m_ID);

				m_Snap.m_SpecInfo.m_SpectatorID = m_Snap.m_pSpectatorInfo->m_SpectatorID;
			}
			else if(Item.m_Type == NETOBJTYPE_GAMEINFO)
			{
				static bool s_GameOver = 0;
				m_Snap.m_pGameInfoObj = (const CNetObj_GameInfo *)pData;
				if(!s_GameOver && m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER)
					OnGameOver();
				else if(s_GameOver && !(m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER))
					OnStartGame();
				s_GameOver = m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER;
			}
			else if(Item.m_Type == NETOBJTYPE_GAMEDATA)
			{
				m_Snap.m_pGameDataObj = (const CNetObj_GameData *)pData;
				m_Snap.m_GameDataSnapID = Item.m_ID;
				if(m_Snap.m_pGameDataObj->m_FlagCarrierRed == FLAG_TAKEN)
				{
					if(m_FlagDropTick[TEAM_RED] == 0)
						m_FlagDropTick[TEAM_RED] = Client()->GameTick();
				}
				else if(m_FlagDropTick[TEAM_RED] != 0)
						m_FlagDropTick[TEAM_RED] = 0;
				if(m_Snap.m_pGameDataObj->m_FlagCarrierBlue == FLAG_TAKEN)
				{
					if(m_FlagDropTick[TEAM_BLUE] == 0)
						m_FlagDropTick[TEAM_BLUE] = Client()->GameTick();
				}
				else if(m_FlagDropTick[TEAM_BLUE] != 0)
						m_FlagDropTick[TEAM_BLUE] = 0;
			}
			else if(Item.m_Type == NETOBJTYPE_FLAG)
				m_Snap.m_paFlags[Item.m_ID%2] = (const CNetObj_Flag *)pData;
		}
	}

	// setup local pointers
	if(m_Snap.m_LocalClientID >= 0)
	{
		CSnapState::CCharacterInfo *c = &m_Snap.m_aCharacters[m_Snap.m_LocalClientID];
		if(c->m_Active)
		{
			m_Snap.m_pLocalCharacter = &c->m_Cur;
			m_Snap.m_pLocalPrevCharacter = &c->m_Prev;
			m_LocalCharacterPos = vec2(m_Snap.m_pLocalCharacter->m_X, m_Snap.m_pLocalCharacter->m_Y);
		}
		else if(Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_CHARACTER, m_Snap.m_LocalClientID))
		{
			// player died
			m_pControls->OnPlayerDeath();
		}
	}
	else
	{
		m_Snap.m_SpecInfo.m_Active = true;
		if(Client()->State() == IClient::STATE_DEMOPLAYBACK && DemoPlayer()->GetDemoType() == IDemoPlayer::DEMOTYPE_SERVER &&
			m_DemoSpecID != SPEC_FREEVIEW && m_Snap.m_aCharacters[m_DemoSpecID].m_Active)
			m_Snap.m_SpecInfo.m_SpectatorID = m_DemoSpecID;
		else
			m_Snap.m_SpecInfo.m_SpectatorID = SPEC_FREEVIEW;
	}

	// clear out unneeded client data
	for(int i = 0; i < MAX_CLIENTS; ++i)
	{
		if(!m_Snap.m_paPlayerInfos[i] && m_aClients[i].m_Active)
			m_aClients[i].Reset();
	}

	// update friend state
	for(int i = 0; i < MAX_CLIENTS; ++i)
	{
		if(i == m_Snap.m_LocalClientID || !m_Snap.m_paPlayerInfos[i] || !Friends()->IsFriend(m_aClients[i].m_aName, m_aClients[i].m_aClan, true))
			m_aClients[i].m_Friend = false;
		else
			m_aClients[i].m_Friend = true;
	}

	// sort player infos by score
	mem_copy(m_Snap.m_paInfoByScore, m_Snap.m_paPlayerInfos, sizeof(m_Snap.m_paInfoByScore));
	for(int k = 0; k < MAX_CLIENTS-1; k++) // ffs, bubblesort
	{
		for(int i = 0; i < MAX_CLIENTS-k-1; i++)
		{
			if(m_Snap.m_paInfoByScore[i+1] && (!m_Snap.m_paInfoByScore[i] || m_Snap.m_paInfoByScore[i]->m_Score < m_Snap.m_paInfoByScore[i+1]->m_Score))
			{
				const CNetObj_PlayerInfo *pTmp = m_Snap.m_paInfoByScore[i];
				m_Snap.m_paInfoByScore[i] = m_Snap.m_paInfoByScore[i+1];
				m_Snap.m_paInfoByScore[i+1] = pTmp;
			}
		}
	}
	// sort player infos by team
	int Teams[3] = { TEAM_RED, TEAM_BLUE, TEAM_SPECTATORS };
	int Index = 0;
	for(int Team = 0; Team < 3; ++Team)
	{
		for(int i = 0; i < MAX_CLIENTS && Index < MAX_CLIENTS; ++i)
		{
			if(m_Snap.m_paPlayerInfos[i] && m_Snap.m_paPlayerInfos[i]->m_Team == Teams[Team])
				m_Snap.m_paInfoByTeam[Index++] = m_Snap.m_paPlayerInfos[i];
		}
	}

	CTuningParams StandardTuning;
	CServerInfo CurrentServerInfo;
	Client()->GetServerInfo(&CurrentServerInfo);
	if(CurrentServerInfo.m_aGameType[0] != '0')
	{
		if(str_comp(CurrentServerInfo.m_aGameType, "DM") != 0 && str_comp(CurrentServerInfo.m_aGameType, "TDM") != 0 && str_comp(CurrentServerInfo.m_aGameType, "CTF") != 0)
			m_ServerMode = SERVERMODE_MOD;
		else if(mem_comp(&StandardTuning, &m_Tuning, sizeof(CTuningParams)) == 0)
			m_ServerMode = SERVERMODE_PURE;
		else
			m_ServerMode = SERVERMODE_PUREMOD;
	}

	// add tuning to demo
	if(DemoRecorder()->IsRecording() && mem_comp(&StandardTuning, &m_Tuning, sizeof(CTuningParams)) != 0)
	{
		CMsgPacker Msg(NETMSGTYPE_SV_TUNEPARAMS);
		int *pParams = (int *)&m_Tuning;
		for(unsigned i = 0; i < sizeof(m_Tuning)/sizeof(int); i++)
			Msg.AddInt(pParams[i]);
		Client()->SendMsg(&Msg, MSGFLAG_RECORD|MSGFLAG_NOSEND);
	}

	if(!m_DDRaceMsgSent && m_Snap.m_pLocalInfo)
	{
		CNetMsg_Cl_IsDDRace Msg;
		Client()->SendPackMsg(&Msg, MSGFLAG_VITAL);
		m_DDRaceMsgSent = true;
	}

	if(m_ShowOthers == -1 || (m_ShowOthers != -1 && m_ShowOthers != g_Config.m_ClShowOthers))
	{
		// no need to send, default settings
		//if(!(m_ShowOthers == -1 && g_Config.m_ClShowOthers))
		{
			CNetMsg_Cl_ShowOthers Msg;
			Msg.m_Show = g_Config.m_ClShowOthers;
			Client()->SendPackMsg(&Msg, MSGFLAG_VITAL);
		}

		// update state
		m_ShowOthers = g_Config.m_ClShowOthers;
	}
}
Exemple #5
0
void CGameClient::OnNewSnapshot()
{
    m_NewTick = true;

    // clear out the invalid pointers
    mem_zero(&g_GameClient.m_Snap, sizeof(g_GameClient.m_Snap));
    m_Snap.m_LocalCid = -1;

    // secure snapshot
    {
        int Num = Client()->SnapNumItems(IClient::SNAP_CURRENT);
        for(int Index = 0; Index < Num; Index++)
        {
            IClient::CSnapItem Item;
            void *pData = Client()->SnapGetItem(IClient::SNAP_CURRENT, Index, &Item);
            if(m_NetObjHandler.ValidateObj(Item.m_Type, pData, Item.m_DataSize) != 0)
            {
                if(g_Config.m_Debug)
                    dbg_msg("game", "invalidated index=%d type=%d (%s) size=%d id=%d", Index, Item.m_Type, m_NetObjHandler.GetObjName(Item.m_Type), Item.m_DataSize, Item.m_Id);
                Client()->SnapInvalidateItem(IClient::SNAP_CURRENT, Index);
            }
        }
    }

    ProcessEvents();

    if(g_Config.m_DbgStress)
    {
        if((Client()->GameTick()%100) == 0)
        {
            char aMessage[64];
            int MsgLen = rand()%(sizeof(aMessage)-1);
            for(int i = 0; i < MsgLen; i++)
                aMessage[i] = 'a'+(rand()%('z'-'a'));
            aMessage[MsgLen] = 0;

            CNetMsg_Cl_Say Msg;
            Msg.m_Team = rand()&1;
            Msg.m_pMessage = aMessage;
            Client()->SendPackMsg(&Msg, MSGFLAG_VITAL);
        }
    }

    // go trough all the items in the snapshot and gather the info we want
    {
        m_Snap.m_aTeamSize[0] = m_Snap.m_aTeamSize[1] = 0;

        int Num = Client()->SnapNumItems(IClient::SNAP_CURRENT);
        for(int i = 0; i < Num; i++)
        {
            IClient::CSnapItem Item;
            const void *pData = Client()->SnapGetItem(IClient::SNAP_CURRENT, i, &Item);

            if(Item.m_Type == NETOBJTYPE_CLIENTINFO)
            {
                const CNetObj_ClientInfo *pInfo = (const CNetObj_ClientInfo *)pData;
                int Cid = Item.m_Id;
                IntsToStr(&pInfo->m_Name0, 6, m_aClients[Cid].m_aName);
                IntsToStr(&pInfo->m_Skin0, 6, m_aClients[Cid].m_aSkinName);

                m_aClients[Cid].m_UseCustomColor = pInfo->m_UseCustomColor;
                m_aClients[Cid].m_ColorBody = pInfo->m_ColorBody;
                m_aClients[Cid].m_ColorFeet = pInfo->m_ColorFeet;

                // prepare the info
                if(m_aClients[Cid].m_aSkinName[0] == 'x' || m_aClients[Cid].m_aSkinName[1] == '_')
                    str_copy(m_aClients[Cid].m_aSkinName, "default", 64);

                m_aClients[Cid].m_SkinInfo.m_ColorBody = m_pSkins->GetColor(m_aClients[Cid].m_ColorBody);
                m_aClients[Cid].m_SkinInfo.m_ColorFeet = m_pSkins->GetColor(m_aClients[Cid].m_ColorFeet);
                m_aClients[Cid].m_SkinInfo.m_Size = 64;

                // find new skin
                m_aClients[Cid].m_SkinId = g_GameClient.m_pSkins->Find(m_aClients[Cid].m_aSkinName);
                if(m_aClients[Cid].m_SkinId < 0)
                {
                    m_aClients[Cid].m_SkinId = g_GameClient.m_pSkins->Find("default");
                    if(m_aClients[Cid].m_SkinId < 0)
                        m_aClients[Cid].m_SkinId = 0;
                }

                if(m_aClients[Cid].m_UseCustomColor)
                    m_aClients[Cid].m_SkinInfo.m_Texture = g_GameClient.m_pSkins->Get(m_aClients[Cid].m_SkinId)->m_ColorTexture;
                else
                {
                    m_aClients[Cid].m_SkinInfo.m_Texture = g_GameClient.m_pSkins->Get(m_aClients[Cid].m_SkinId)->m_OrgTexture;
                    m_aClients[Cid].m_SkinInfo.m_ColorBody = vec4(1,1,1,1);
                    m_aClients[Cid].m_SkinInfo.m_ColorFeet = vec4(1,1,1,1);
                }

                m_aClients[Cid].UpdateRenderInfo();
                g_GameClient.m_Snap.m_NumPlayers++;

            }
            else if(Item.m_Type == NETOBJTYPE_PLAYERINFO)
            {
                const CNetObj_PlayerInfo *pInfo = (const CNetObj_PlayerInfo *)pData;

                m_aClients[pInfo->m_ClientId].m_Team = pInfo->m_Team;
                m_Snap.m_paPlayerInfos[pInfo->m_ClientId] = pInfo;

                if(pInfo->m_Local)
                {
                    m_Snap.m_LocalCid = Item.m_Id;
                    m_Snap.m_pLocalInfo = pInfo;

                    if (pInfo->m_Team == -1)
                        m_Snap.m_Spectate = true;
                }

                // calculate team-balance
                if(pInfo->m_Team != -1)
                    m_Snap.m_aTeamSize[pInfo->m_Team]++;

            }
            else if(Item.m_Type == NETOBJTYPE_CHARACTER)
            {
                const void *pOld = Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_CHARACTER, Item.m_Id);
                if(pOld)
                {
                    m_Snap.m_aCharacters[Item.m_Id].m_Active = true;
                    m_Snap.m_aCharacters[Item.m_Id].m_Prev = *((const CNetObj_Character *)pOld);
                    m_Snap.m_aCharacters[Item.m_Id].m_Cur = *((const CNetObj_Character *)pData);

                    if(m_Snap.m_aCharacters[Item.m_Id].m_Prev.m_Tick)
                        Evolve(&m_Snap.m_aCharacters[Item.m_Id].m_Prev, Client()->PrevGameTick());
                    if(m_Snap.m_aCharacters[Item.m_Id].m_Cur.m_Tick)
                        Evolve(&m_Snap.m_aCharacters[Item.m_Id].m_Cur, Client()->GameTick());
                }
            }
            else if(Item.m_Type == NETOBJTYPE_GAME)
                m_Snap.m_pGameobj = (CNetObj_Game *)pData;
            else if(Item.m_Type == NETOBJTYPE_FLAG)
                m_Snap.m_paFlags[Item.m_Id%2] = (const CNetObj_Flag *)pData;
        }
    }

    // setup local pointers
    if(m_Snap.m_LocalCid >= 0)
    {
        CSnapState::CCharacterInfo *c = &m_Snap.m_aCharacters[m_Snap.m_LocalCid];
        if(c->m_Active)
        {
            m_Snap.m_pLocalCharacter = &c->m_Cur;
            m_Snap.m_pLocalPrevCharacter = &c->m_Prev;
            m_LocalCharacterPos = vec2(m_Snap.m_pLocalCharacter->m_X, m_Snap.m_pLocalCharacter->m_Y);
        }
    }
    else
        m_Snap.m_Spectate = true;

    CTuningParams StandardTuning;
    CServerInfo CurrentServerInfo;
    Client()->GetServerInfo(&CurrentServerInfo);
    if(CurrentServerInfo.m_aGameType[0] != '0')
    {
        if(str_comp(CurrentServerInfo.m_aGameType, "DM") != 0 && str_comp(CurrentServerInfo.m_aGameType, "TDM") != 0 && str_comp(CurrentServerInfo.m_aGameType, "CTF") != 0)
            m_ServerMode = SERVERMODE_MOD;
        else if(mem_comp(&StandardTuning, &m_Tuning, sizeof(CTuningParams)) == 0)
            m_ServerMode = SERVERMODE_PURE;
        else
            m_ServerMode = SERVERMODE_PUREMOD;
    }


    // update render info
    for(int i = 0; i < MAX_CLIENTS; i++)
        m_aClients[i].UpdateRenderInfo();
}
Exemple #6
0
int main (int argc, char *argv[])
{
    MPI_Request reqSR[4], reqRR[4], reqSF[4], reqRF[4];
    MPI_Status statRR[4], statRF[4], statSR[4], statSF[4];
    MPI_Comm cartcomm;
    
    
    int n_proc, nbrs[4], dims[2], periods[2]={1,1}, reorder=1;
    int landNS, landWE, err,i;
    float sumFox, sumRabb, nbrab, nbfox, model[2][3];
    double time;
    
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &n_proc);
    
    if(rank==0){
        time= MPI_Wtime();
        printf("N_proc:%d",n_proc);
    }
    
    
    /****************************************************
     **********    CASO DE 1 PROCESSO  ******************
     ***************************************************/
    if (n_proc==1) {
        echoSingle();
    }else{
        
        /****************************************************
         **********+++    MULTI PROCESSOS  ******************
         ***************************************************/
    
        int lado = sqrt(n_proc);
        dims[0] = lado;
        dims[1] = lado;
        
        if((lado * lado) != n_proc){
            if(rank==0)
                printf("ERRO: Numero incorreto de processos\n");
            MPI_Finalize();
            exit(0);
        }
        
        MPI_Cart_create(MPI_COMM_WORLD, 2, dims, periods, reorder, &cartcomm);
        MPI_Comm_rank(cartcomm, &rank);
        MPI_Cart_coords(cartcomm, rank, 2, coords);
        MPI_Cart_shift(cartcomm, 0, 1, &nbrs[UP], &nbrs[DOWN]);
        MPI_Cart_shift(cartcomm, 1, 1, &nbrs[LEFT], &nbrs[RIGHT]);
        
        
        //Actualizar offsets de cada processo
        landNS = offsetNS = NS_Size / lado;
        landWE = offsetWE = WE_Size / lado;
        
        if(coords[0] == (lado-1)){
            offsetNS += NS_Size % lado;
        }
        if(coords[1] == (lado-1)){
            offsetWE += WE_Size % lado;
        }
        
        //Buffers para envio e receção de dados
        float buf_sendFoxN[offsetWE],buf_sendFoxS[offsetWE],buf_sendFoxW[offsetNS],buf_sendFoxE[offsetNS];
        float buf_recvFoxN[offsetWE],buf_recvFoxS[offsetWE],buf_recvFoxW[offsetNS],buf_recvFoxE[offsetNS];
        float buf_sendRabbitN[offsetWE],buf_sendRabbitS[offsetWE],buf_sendRabbitW[offsetNS],buf_sendRabbitE[offsetNS];
        float buf_recvRabbitN[offsetWE],buf_recvRabbitS[offsetWE],buf_recvRabbitW[offsetNS],buf_recvRabbitE[offsetNS];
        
        float Rabbit[offsetNS+2][offsetWE+2];
        float Fox[offsetNS+2][offsetWE+2];
        
        /* The next two arrays are used in function Evolve() to compute
         * the next generation of rabbits and foxes.
         */
        float TRabbit[offsetNS+2][offsetWE+2];
        float TFox[offsetNS+2][offsetWE+2];
        
        //Inicialização das comunicações
        
        //*********  Raposas   **************
        //Enviar
        //Cima e baixo
        MPI_Send_init(&buf_sendFoxN[0], offsetWE, MPI_FLOAT, nbrs[UP], 0, cartcomm, &reqSF[UP]);
        MPI_Send_init(&buf_sendFoxS[0], offsetWE, MPI_FLOAT, nbrs[DOWN], 0, cartcomm, &reqSF[DOWN]);
        
        //Esquerda e direita
        MPI_Send_init(&buf_sendFoxW[0], offsetNS, MPI_FLOAT, nbrs[LEFT], 0, cartcomm, &reqSF[LEFT]);
        MPI_Send_init(&buf_sendFoxE[0], offsetNS, MPI_FLOAT, nbrs[RIGHT], 0, cartcomm, &reqSF[RIGHT]);
        
        //Receber
        //Cima e Baixo
        MPI_Recv_init(&buf_recvFoxS[0], offsetWE, MPI_FLOAT, nbrs[DOWN], 0, cartcomm, &reqRF[DOWN]);
        MPI_Recv_init(&buf_recvFoxN[0], offsetWE, MPI_FLOAT, nbrs[UP], 0, cartcomm, &reqRF[UP]);
        
        //Esquerda e direita
        MPI_Recv_init(&buf_recvFoxE[0], offsetNS, MPI_FLOAT, nbrs[RIGHT], 0, cartcomm, &reqRF[RIGHT]);
        MPI_Recv_init(&buf_recvFoxW[0], offsetNS, MPI_FLOAT, nbrs[LEFT], 0, cartcomm, &reqRF[LEFT]);
        
        //*********  Coelhos   ***************
        //Enviar
        //Cima e baixo
        MPI_Send_init(&buf_sendRabbitN[0], offsetWE, MPI_FLOAT, nbrs[UP], 0, cartcomm, &reqSR[UP]);
        MPI_Send_init(&buf_sendRabbitS[0], offsetWE, MPI_FLOAT, nbrs[DOWN], 0, cartcomm, &reqSR[DOWN]);
        
        //Esquerda e direita
        MPI_Send_init(&buf_sendRabbitW[0], offsetNS, MPI_FLOAT, nbrs[LEFT], 0, cartcomm, &reqSR[LEFT]);
        MPI_Send_init(&buf_sendRabbitE[0], offsetNS, MPI_FLOAT, nbrs[RIGHT], 0, cartcomm, &reqSR[RIGHT]);
        
        //Receber
        //Cima e Baixo
        MPI_Recv_init(&buf_recvRabbitS[0], offsetWE, MPI_FLOAT, nbrs[DOWN], 0, cartcomm, &reqRR[DOWN]);
        MPI_Recv_init(&buf_recvRabbitN[0], offsetWE, MPI_FLOAT, nbrs[UP], 0, cartcomm, &reqRR[UP]);
        
        //Esquerda e direita
        MPI_Recv_init(&buf_recvRabbitE[0], offsetNS, MPI_FLOAT, nbrs[RIGHT], 0, cartcomm, &reqRR[RIGHT]);
        MPI_Recv_init(&buf_recvRabbitW[0], offsetNS, MPI_FLOAT, nbrs[LEFT], 0, cartcomm, &reqRR [LEFT]);
        
        
        /* Initialise the problem. */
        err = SetLand(Rabbit,Fox,model,landNS, landWE);
        
        // Iterate.
        for( k=1; k<=NITER; k++) {
            
            /******************************************************
             ****    Começa comunicação de actualização    ********
             ******************************************************/
            
            
            //**************  Envios ***************/
            //Raposas
            //Cima e baixo
            for(i=1; i <= offsetWE; i++)
                buf_sendFoxN[i-1] = Fox[1][i];
            MPI_Start(&reqSF[UP]);
            
            for(i=1; i <= offsetWE; i++)
                buf_sendFoxS[i-1] = Fox[offsetNS][i];
            MPI_Start(&reqSF[DOWN]);
            
            //Esquerda e direita
            for(i=1; i <= offsetNS; i++)
                buf_sendFoxW[i-1] = Fox[i][1];
            MPI_Start(&reqSF[LEFT]);
            
            for(i=1; i <= offsetNS; i++)
                buf_sendFoxE[i-1] = Fox[i][offsetWE];
            MPI_Start(&reqSF[RIGHT]);
            
            //Coelhos
            //Cima e baixo
            for(i=1; i <= offsetWE; i++)
                buf_sendRabbitN[i-1] = Rabbit[1][i];
            MPI_Start(&reqSR[UP]);
            
            for(i=1; i <= offsetWE; i++)
                buf_sendRabbitS[i-1] = Rabbit[offsetNS][i];
            MPI_Start(&reqSR[DOWN]);
            
            //Esquerda e direita
            for(i=1; i <= offsetNS; i++)
                buf_sendRabbitW[i-1] = Rabbit[i][1];
            MPI_Start(&reqSR[LEFT]);
            
            for(i=1; i <= offsetNS; i++)
                buf_sendRabbitE[i-1] = Rabbit[i][offsetWE];
            MPI_Start(&reqSR[RIGHT]);
            
            
            //**************  Recepção ***************/
            //Raposas
            //Cima e baixo
            MPI_Start(&reqRF[DOWN]);
            MPI_Start(&reqRF[UP]);
            
            //Esquerda e direita
            MPI_Start(&reqRF[RIGHT]);
            MPI_Start(&reqRF[LEFT]);
            
            //Coelhos
            //Cima e baixo
            MPI_Start(&reqRR[DOWN]);
            MPI_Start(&reqRR[UP]);
            
            //Esquerda e direita
            MPI_Start(&reqRR[RIGHT]);
            MPI_Start(&reqRR[LEFT]);
            
            
            //Esperar pelos Receives e aplicar alterações nos quadros
            //Raposas
            MPI_Waitall(4, reqRR , statRR);
            for(i=1; i <= offsetWE; i++)
                Fox[offsetNS+1][i] = buf_recvFoxS[i-1];
            for(i=1; i <= offsetWE; i++)
                Fox[0][i] = buf_recvFoxN[i-1];
            for(i=1; i <= offsetNS; i++)
                Fox[i][offsetWE+1] = buf_recvFoxE[i-1];
            for(i=1; i <= offsetNS; i++)
                Fox[i][0] = buf_recvFoxW[i-1];
            
            //Coelhos
            MPI_Waitall(4, reqRF, statRF);
            for(i=1; i <= offsetWE; i++)
                Rabbit[offsetNS+1][i] = buf_recvRabbitS[i-1];
            for(i=1; i <= offsetWE; i++)
                Rabbit[0][i] = buf_recvRabbitN[i-1];
            for(i=1; i <= offsetNS; i++)
                Rabbit[i][offsetWE+1] = buf_recvRabbitE[i-1];
            for(i=1; i <= offsetNS; i++)
                Rabbit[i][0] = buf_recvRabbitW[i-1];
            
            
            /******************************************************
             ****    Termina comunicação de actualização    ********
             ******************************************************/
            
            err = Evolve(Rabbit,Fox,TRabbit,TFox,model);
            if( !(k%PERIOD) ) {
                err = GetPopulation(Rabbit,&nbrab);
                err = GetPopulation(Fox,&nbfox);
                
                MPI_Reduce(&nbrab, &sumRabb, 1, MPI_FLOAT, MPI_SUM, 0, cartcomm);
                MPI_Reduce(&nbfox, &sumFox, 1, MPI_FLOAT, MPI_SUM, 0, cartcomm);
                
                //if(rank==0)
                  //  printf("Year %d: %.0f rabbits and %.0f foxes\n", k, sumRabb, sumFox);
            }
            
            
            //Esperar que os Sends estejam concluidos para ter a certeza que que já podemos mexer nos buffers
            //(Não creio de que 100% obrigatório)
            MPI_Waitall(4, reqSR , statSR);
            MPI_Waitall(4, reqSF , statSF);
        }
        if(rank==0)
            printf("Year %d: %.0f rabbits and %.0f foxes\n", k, sumRabb, sumFox);

    }
    
    if(rank==0)
            printf("Time: %f\n",MPI_Wtime()-time);
    
    MPI_Finalize();
    return 0;
}
Exemple #7
0
int main () 
{

printf("x = 0, y = 0, rule = B3/S23\n");
	
#pragma omp parallel
{
	New();
   
   LifeState* blck =  NewState("2o$o$b3o$3bo!");
   LifeState* gldL =  NewState("3o$2bo$bo!");
   LifeState* gldR =  NewState("bo$o$3o!");
   
   LifeIterator *iterL = NewIterator(gldL, -10, 5, 10, 1);
   
   LifeIterator *iterR1 = NewIterator(gldR, 0, -15, 10, 10, 4);
   LifeIterator *iterR2 = NewIterator(gldR, 0, -15, 10, 10, 4);
   
   int initPop = GetPop(blck);
   

   do{
    #pragma omp single nowait
	{
	
		if(Validate(iterR1, iterR2) != FAIL)
		{
			
			New();
			PutState(blck);
			PutState(iterL);
			PutState(iterR1);
			PutState(iterR2);

			int collide = NO;

			for(int i = 0; i < 4; i++)
			{
				if(GetPop() != 5 * 3 + initPop)
				{
				collide = YES;
				break;
				}
				
				Run(1);
			}

			if(collide != YES)
			{ 
				
				for(int i = 0; i < 300; i++)
				{
					Run(1);
					
					uint64_t gld = LocateAtX(GlobalState, _glidersTarget[0], 2);
					int found = NO;
					
					if(strlen(GlobalState->emittedGliders->value) != 0)
					break;
					
					int gen = GlobalState->gen;
					
					if(gld != 0 && GetPop() == 5)
					{
						found = YES;
						
						for(int j = 0; j < 4; j++)
						{
								 if(GlobalState->gen%4 == 0)
									break;
									
								 Run(1);
						}
						
						Capture(0);
						Move(Captures[0], (GlobalState->gen) / 4 + 4, (GlobalState->gen) / 4 + 4);
						Evolve(Captures[0], 2);
						
						New();
						PutState(blck);
						PutState(iterL);
						PutState(iterR1);
						PutState(iterR2);
						PutState(Captures[0]);
						
						Run(gen);
						
						uint64_t gld = LocateAtX(GlobalState, _glidersTarget[0], 2);
						
						if(gld != 0 && GetPop() == 10)
					{
							 New();
							 PutState(blck);
							 PutState(iterL);
							 PutState(iterR1);
							 PutState(iterR2);
							 PutState(Captures[0]);
							 
							#pragma omp critical
							{
								printf(GetRLE(GlobalState));
								printf("100$");
							}
						}
					}

					if(found == YES)
					break;

				}
			}
		}
	}
   }while(Next(iterL, iterR1, iterR2, NO));

}
	printf("!");
	printf("\n\nFINISH");
	getchar();
}