예제 #1
0
channel *NewChannel(const char *Id) {

   channel *Channel;

   if (Id == NULL) {
      Error("NewChannel(): Id = NULL");
      return NULL;
   } else if (! IsId(Id)) {
      Error("NewChannel(): Id = \"%s\" is not an ID",Id);
      return NULL;
   } else if (SearchObject(Lists,Id,OBJECT) != NULL) {
      Error("NewChannel(): Id = \"%s\" is already used",Id);
      return NULL;
   } else if ((Channel = calloc(1,sizeof(channel))) == NULL) {
      Error("NewChannel(): not enough memory for channel \"%s\"",Id);
      return NULL;
   }

   Channel->Type = CHANNEL;
   Channel->Id   = NewString(Id);
   strcpy(Channel->Owner,DEFAULT_USER);
   strcpy(Channel->Group,DEFAULT_GROUP);
   Channel->Topic     = NewString("");
   Channel->UserNb    = 0;
   Channel->Closed    = FALSE;
   Channel->Hidden    = FALSE;
   Channel->Invite    = FALSE;
   Channel->Protected = FALSE;
   Channel->Resident  = FALSE;

   return Channel;
}
예제 #2
0
channel *SearchChannel(const char *Id) {

   if (Id == NULL) {
      Error("SearchChannel(): Id = NULL");
      return NULL;
   } else if (! IsId(Id)) {
      Error("SearchChannel(): Id = \"%s\" is not an ID",Id);
      return NULL;
   }

   return (channel *) SearchObject(ChannelList,Id,CHANNEL);
}
예제 #3
0
BOOL CtrfFolderColumn::RefreshData(CTreeCtrl* pTree, HTREEITEM hItem, CaRefreshTreeInfo* pInfo)
{
	BOOL bOk = FALSE;
	CTypedPtrList< CObList, CaDBObject* > lNew;
	//
	// Refresh only the branch has already been expanded:
	if (pInfo && pInfo->GetAction() == CaRefreshTreeInfo::ACTION_REFRESH && !GetTreeCtrlData().IsAlreadyExpanded())
		return TRUE;
	CaLLQueryInfo* pQueryInfo = GetQueryInfo(NULL);
	ASSERT (pQueryInfo);
	if (!pQueryInfo)
		return FALSE;

	if (GetPfnCOMQueryObject())
		bOk  = GetPfnCOMQueryObject()(GetAptAccess(), pQueryInfo, lNew);
	else
	{
		CmtSessionManager* pSessionManager = GetSessionManager();
		ASSERT (pSessionManager);
		if (!pSessionManager)
			return FALSE;

		if (GetPfnUserQueryObject())
			bOk = GetPfnUserQueryObject()(pQueryInfo, lNew, pSessionManager);
		else
			bOk = INGRESII_llQueryObject (pQueryInfo, lNew, pSessionManager);
	}
	if (!bOk)
		return FALSE;

	//
	// Mark all old object as being deleted:
	CtrfItemData* pObj = NULL;
	POSITION p = NULL, pos = m_listObject.GetHeadPosition();
	while (pos != NULL)
	{
		pObj = m_listObject.GetNext (pos);
		pObj->GetTreeCtrlData().SetState (CaTreeCtrlData::ITEM_DELETE);
	}

	//
	// Add new Objects:
	while (!lNew.IsEmpty())
	{
		CaColumn* pNew = (CaColumn*)lNew.RemoveHead();
		CtrfItemData* pExist = SearchObject(pNew);

		//
		// The new queried object already exists in the old list, we destroy it !
		if (pExist != NULL)
		{
			pExist->GetTreeCtrlData().SetState (CaTreeCtrlData::ITEM_EXIST);
			delete pNew;
			continue;
		}

		//
		// New object that is not in the old list, add it to the list:
		CtrfColumn* pNewObject = new CtrfColumn (pNew);
		pNewObject->SetBackParent (this);
		pNewObject->Initialize();
		m_listObject.AddTail (pNewObject);

		delete pNew;
	}

	//
	// Refresh Sub-Branches ?

	Display (pTree, hItem);
	return TRUE;
}
예제 #4
0
bool CLightning::EventFrame(const Event &event)
{
    if (m_engine->GetPause()) return true;
    if (m_engine->GetMovieLock()) return true;

    m_progress += event.rTime*m_speed;

    if (m_phase == LP_WAIT)
    {
        if (m_progress >= 1.0f)
        {

            m_pos.x = (Math::Rand()-0.5f)*(3200.0f-200.0f);
            m_pos.z = (Math::Rand()-0.5f)*(3200.0f-200.0f);
            m_pos.y = 0.0f;

            CObject* obj = SearchObject(m_pos);
            if (obj == nullptr)
            {
                m_terrain->AdjustToFloor(m_pos, true);
            }
            else
            {
                m_pos = obj->GetPosition(0);
                m_terrain->AdjustToFloor(m_pos, true);

                ObjectType type = obj->GetType();
                if (type == OBJECT_BASE)
                {
                    m_pos.y += 120.0f;  // top of the rocket
                }
                else if (type == OBJECT_PARA)
                {
                    CAutoPara* automat = static_cast<CAutoPara*>(obj->GetAuto());
                    if (automat != nullptr)
                        automat->StartLightning();

                    m_pos.y += 67.0f;  // top of lightning rod
                }
                else
                {
                    obj->ExploObject(EXPLO_BOUM, 1.0f);
                }
            }

            Math::Vector eye = m_engine->GetEyePt();
            float dist = Math::Distance(m_pos, eye);
            float deep = m_engine->GetDeepView();

            if (dist < deep)
            {
                Math::Vector pos = eye+((m_pos-eye)*0.2f);  // like so close!
                m_sound->Play(SOUND_BLITZ, pos);

                m_camera->StartOver(CAM_OVER_EFFECT_LIGHTNING, m_pos, 1.0f);

                m_phase    = LP_FLASH;
                m_progress = 0.0f;
                m_speed    = 1.0f;
            }
        }
    }

    if (m_phase == LP_FLASH)
    {
        if (m_progress < 1.0f)
        {
            float max = 5.0f;
            for (int i = 0; i < FLASH_SEGMENTS; i++)
            {
                max += 0.4f;

                m_shift[i].x += (Math::Rand()-0.5f)*max*2.0f;
                if ( m_shift[i].x < -max )  m_shift[i].x = -max;
                if ( m_shift[i].x >  max )  m_shift[i].x =  max;

                m_shift[i].y += (Math::Rand()-0.5f)*max*2.0f;
                if ( m_shift[i].y < -max )  m_shift[i].y = -max;
                if ( m_shift[i].y >  max )  m_shift[i].y =  max;

                m_width[i] += (Math::Rand()-0.5f)*2.0f;
                if ( m_width[i] < 1.0f )  m_width[i] = 1.0f;
                if ( m_width[i] > 6.0f )  m_width[i] = 6.0f;
            }
            m_shift[0].x = 0.0f;
            m_shift[0].y = 0.0f;
            m_width[0]   = 0.0f;
        }
        else
        {
            m_phase    = LP_WAIT;
            m_progress = 0.0f;
            m_speed    = 1.0f / (1.0f+Math::Rand()*m_delay);
        }
    }

    return true;
}
예제 #5
0
bool CLightning::EventFrame(const Event &event)
{
    if (m_terrain == nullptr)
        m_terrain = CRobotMain::GetInstancePointer()->GetTerrain();

    if (m_camera == nullptr)
        m_camera = CRobotMain::GetInstancePointer()->GetCamera();

    if (m_sound == nullptr)
        m_sound = CApplication::GetInstancePointer()->GetSound();

    if (m_engine->GetPause()) return true;
    if (CRobotMain::GetInstancePointer()->GetMovieLock()) return true;

    m_progress += event.rTime*m_speed;

    if (m_phase == LightningPhase::Wait && m_lightningExists)
    {
        if (m_progress >= 1.0f)
        {
            m_pos.x = (Math::Rand()-0.5f)*(3200.0f-200.0f);
            m_pos.z = (Math::Rand()-0.5f)*(3200.0f-200.0f);
            m_pos.y = 0.0f;

            CObject* obj = SearchObject(m_pos);
            if (obj == nullptr)
            {
                m_terrain->AdjustToFloor(m_pos, true);
            }
            else
            {
                m_pos = obj->GetPosition();
                m_terrain->AdjustToFloor(m_pos, true);

                // TODO: CLightningConductorObject
                ObjectType type = obj->GetType();
                if (type == OBJECT_BASE)
                {
                    m_pos.y += 120.0f;  // top of the rocket
                }
                else if (type == OBJECT_PARA)
                {
                    CAutoPowerCaptor* automat = static_cast<CAutoPowerCaptor*>(obj->GetAuto());
                    if (automat != nullptr)
                        automat->StartLightning();

                    m_pos.y += 67.0f;  // top of lightning rod
                }
                else
                {
                    assert(obj->Implements(ObjectInterfaceType::Destroyable));
                    dynamic_cast<CDestroyableObject*>(obj)->DamageObject(DamageType::Lightning);
                }
            }

            StrikeAtPos(m_pos);
        }
    }

    if (m_phase == LightningPhase::Flash)
    {
        if (m_progress < 1.0f)
        {
            float max = 5.0f;
            for (std::size_t i = 0; i < m_segments.size(); i++)
            {
                max += 0.4f;

                m_segments[i].shift.x += (Math::Rand()-0.5f)*max*2.0f;
                if ( m_segments[i].shift.x < -max )  m_segments[i].shift.x = -max;
                if ( m_segments[i].shift.x >  max )  m_segments[i].shift.x =  max;

                m_segments[i].shift.y += (Math::Rand()-0.5f)*max*2.0f;
                if ( m_segments[i].shift.y < -max )  m_segments[i].shift.y = -max;
                if ( m_segments[i].shift.y >  max )  m_segments[i].shift.y =  max;

                m_segments[i].width += (Math::Rand()-0.5f)*2.0f;
                if ( m_segments[i].width < 1.0f )  m_segments[i].width = 1.0f;
                if ( m_segments[i].width > 6.0f )  m_segments[i].width = 6.0f;
            }
            m_segments[0].shift.x = 0.0f;
            m_segments[0].shift.y = 0.0f;
            m_segments[0].width   = 0.0f;
        }
        else
        {
            m_phase    = LightningPhase::Wait;
            m_progress = 0.0f;
            m_speed    = 1.0f / (1.0f+Math::Rand()*m_delay);
        }
    }

    return true;
}
예제 #6
0
void Permonkey::Update(float dt, vector<unique_ptr<GameObject>> *objectArray){
	timer.Update(dt);
	if (timer.Get() > 6){
		hunger += 1;
		timer.Restart();
	}
	switch (actionCharacter) {
	case RESTING:
		rest.Update(dt);
		if (rest.Get() > 3){
			rest.Restart();
			if (arrived && found)
				actionCharacter = DECIDING_OBJECT;
			if (arrived && !found)
				actionCharacter = USING_OBJECT;
		}

		character.SetFrameTime(-1);
		character.Update(dt);
		if (arrived){

		}
		break;
	case MOVING:
		soundControl += dt;
		character.SetFrameTime(0.5);
		if (soundControl >= 0.5){
			step.Play(1);
			soundControl = 0;
		}
		character.Update(dt);
		Move(dt);
		break;
	case DECIDING_ROOM:
		if (choice == NO_CHOICE){
			MakeChoice();
		}
		break;
	case DECIDING_OBJECT:
		if (objectSelect == -1){
			SearchObject(objectArray);
		}
		break;
	case USING_OBJECT:
		rest.Update(dt);
		if (rest.Get() > 5){
			UseObject(objectArray, objectSelect);
			rest.Restart();
			actionCharacter = RESTING;
			found = true;
		}
		break;
	case EXITING:
		SearchObject(objectArray);
		cout << arrived << endl;
		if (arrived){
			gone = true;
		}
		cout << found << endl;
		break;
	}
	//tile = tileMap.GetTile(box.x+box.w/2, box.y+box.y);
}
예제 #7
0
bool CLightning::EventFrame(const Event &event)
{
    if (m_engine->GetPause()) return true;
    if (CRobotMain::GetInstancePointer()->GetMovieLock()) return true;

    m_progress += event.rTime*m_speed;

    if (m_phase == LightningPhase::Wait)
    {
        if (m_progress >= 1.0f)
        {

            m_pos.x = (Math::Rand()-0.5f)*(3200.0f-200.0f);
            m_pos.z = (Math::Rand()-0.5f)*(3200.0f-200.0f);
            m_pos.y = 0.0f;

            CObject* obj = SearchObject(m_pos);
            if (obj == nullptr)
            {
                m_terrain->AdjustToFloor(m_pos, true);
            }
            else
            {
                m_pos = obj->GetPosition();
                m_terrain->AdjustToFloor(m_pos, true);

                // TODO: CLightningConductorObject
                ObjectType type = obj->GetType();
                if (type == OBJECT_BASE)
                {
                    m_pos.y += 120.0f;  // top of the rocket
                }
                else if (type == OBJECT_PARA)
                {
                    CAutoPowerCaptor* automat = static_cast<CAutoPowerCaptor*>(obj->GetAuto());
                    if (automat != nullptr)
                        automat->StartLightning();

                    m_pos.y += 67.0f;  // top of lightning rod
                }
                else
                {
                    assert(obj->Implements(ObjectInterfaceType::Destroyable));
                    dynamic_cast<CDestroyableObject*>(obj)->DamageObject(DamageType::Lightning);
                }
            }

            Math::Vector eye = m_engine->GetEyePt();
            float dist = Math::Distance(m_pos, eye);
            float deep = m_engine->GetDeepView();

            if (dist < deep)
            {
                Math::Vector pos = eye+((m_pos-eye)*0.2f);  // like so close!
                m_sound->Play(SOUND_BLITZ, pos);

                m_camera->StartOver(CAM_OVER_EFFECT_LIGHTNING, m_pos, 1.0f);

                m_phase    = LightningPhase::Flash;
                m_progress = 0.0f;
                m_speed    = 1.0f;
            }
        }
    }

    if (m_phase == LightningPhase::Flash)
    {
        if (m_progress < 1.0f)
        {
            float max = 5.0f;
            for (std::size_t i = 0; i < m_segments.size(); i++)
            {
                max += 0.4f;

                m_segments[i].shift.x += (Math::Rand()-0.5f)*max*2.0f;
                if ( m_segments[i].shift.x < -max )  m_segments[i].shift.x = -max;
                if ( m_segments[i].shift.x >  max )  m_segments[i].shift.x =  max;

                m_segments[i].shift.y += (Math::Rand()-0.5f)*max*2.0f;
                if ( m_segments[i].shift.y < -max )  m_segments[i].shift.y = -max;
                if ( m_segments[i].shift.y >  max )  m_segments[i].shift.y =  max;

                m_segments[i].width += (Math::Rand()-0.5f)*2.0f;
                if ( m_segments[i].width < 1.0f )  m_segments[i].width = 1.0f;
                if ( m_segments[i].width > 6.0f )  m_segments[i].width = 6.0f;
            }
            m_segments[0].shift.x = 0.0f;
            m_segments[0].shift.y = 0.0f;
            m_segments[0].width   = 0.0f;
        }
        else
        {
            m_phase    = LightningPhase::Wait;
            m_progress = 0.0f;
            m_speed    = 1.0f / (1.0f+Math::Rand()*m_delay);
        }
    }

    return true;
}