void nobBaseWarehouse::HandleCollectEvent()
{
    // Storing wares done?
    bool storing_done = false;
    // Is storing still wanted?
    bool storing_wanted = false;

    // Untersuchen, welche Waren und Figuren eingelagert werden sollen
    for(unsigned i = 0; i < WARE_TYPES_COUNT; ++i)
    {
        // Soll Ware eingeliefert werden?
        if(!GetInventorySetting(GoodType(i)).IsSet(EInventorySetting::COLLECT))
            continue;

        storing_wanted = true;

        // Lagerhaus suchen, das diese Ware enthält
        nobBaseWarehouse* wh = gwg->GetPlayer(player).FindWarehouse(*this, FW::HasWareButNoCollect(GoodType(i)), false, false);
        // Gefunden?
        if(wh)
        {
            // Dann bestellen
            Ware* ware = wh->OrderWare(GoodType(i), this);
            if(ware)
            {
                RTTR_Assert(IsWareDependent(ware));
                storing_done = true;
                break;
            }
        }
    }

    // Menschen "bestellen" wenn noch keine Ware bestellt wurde
    if(!storing_done)
    {
        for(unsigned i = 0; i < JOB_TYPES_COUNT; ++i)
        {
            // Soll dieser Typ von Mensch bestellt werden?
            if(!GetInventorySetting(Job(i)).IsSet(EInventorySetting::COLLECT))
                continue;

            storing_wanted = true;

            // Lagerhaus suchen, das diesen Job enthält
            nobBaseWarehouse* wh = gwg->GetPlayer(player).FindWarehouse(*this, FW::HasFigureButNoCollect(Job(i), false), false, false);
            // Gefunden?
            if(wh)
            {
                // Dann bestellen
                if(wh->OrderJob(Job(i), this, false))
                    break;
            }
        }
    }

    // Storing still wanted?
    // Then continue ordering new stuff
    if(storing_wanted)
        store_event = em->AddEvent(this, STORE_INTERVAL, 4);
}
Beispiel #2
0
void TDMTeam::checkPowerUps() {
    std::vector<Ship*> ships = ships::getShips();
    bool existAny(false);

    for (std::vector<Ship*>::const_iterator it = ships.begin(); it != ships.end(); ++it)
        if ((*it)->getOwner()->team() != this && (*it)->attackable()) {
            existAny = true;
            break;
        }

    powerUpLocations_.clear();
    std::list<PowerUp*> const& powerUps = items::getPowerUps();
    for (std::list<PowerUp*>::const_iterator it=powerUps.begin(); it!=powerUps.end(); ++it) {
        if (!(*it)->isCollected()) {
            powerUpLocations_.push_back((*it)->location());
            switch ((*it)->type()) {
                case items::puFuel:     addJob(Job(Job::jGetPUFuel,    70, &powerUpLocations_.back())); break;
                case items::puHealth:   addJob(Job(Job::jGetPUHealth,  70, &powerUpLocations_.back())); break;
                case items::puReverse:  if (existAny) addJob(Job(Job::jGetPUReverse, 70, &powerUpLocations_.back())); break;
                case items::puShield:   addJob(Job(Job::jGetPUShield,  70, &powerUpLocations_.back())); break;
                default:                if (existAny) addJob(Job(Job::jGetPUSleep,   70, &powerUpLocations_.back())); break;
            }
        }
    }
}
void nobBaseWarehouse::Clear()
{
    for(unsigned i = 0; i < WARE_TYPES_COUNT; ++i)
        gwg->GetPlayer(player).DecreaseInventoryWare(GoodType(i), inventory[GoodType(i)]);
    
    for(unsigned i = 0; i < JOB_TYPES_COUNT; ++i)
        gwg->GetPlayer(player).DecreaseInventoryJob(Job(i), inventory[Job(i)]);

    inventory.clear();
    
    for(std::list<Ware*>::iterator it = waiting_wares.begin(); it != waiting_wares.end(); ++it)
    {
        (*it)->WareLost(player);
        (*it)->Destroy();
        delete (*it);
    }

    waiting_wares.clear();

    for (unsigned i = 0; i < 5; ++i)
    {
        // TODO: inventory!?
        reserve_soldiers_available[i] = 0;
        reserve_soldiers_claimed_visual[i] = 0;
        reserve_soldiers_claimed_real[i] = 0;
    }
}
void nobBaseWarehouse::AddToInventory()
{
    for(unsigned int i = 0; i < WARE_TYPES_COUNT; ++i)
        gwg->GetPlayer(player).IncreaseInventoryWare(GoodType(i), inventory[GoodType(i)]);

    for(unsigned int i = 0; i < JOB_TYPES_COUNT; ++i)
        gwg->GetPlayer(player).IncreaseInventoryJob(Job(i), inventory[Job(i)]);
}
Beispiel #5
0
void TDMTeam::createJobs() {
    checkEnemies();
    checkPowerUps();

    for (int i=0; i<botControllers_.size(); ++i) {
        addJob(Job(Job::jLand, 4));
        addJob(Job(Job::jCharge, 4));
    }
}
Beispiel #6
0
/// increase rank
void nofActiveSoldier::IncreaseRank()
{   
	//max rank reached? -> dont increase!
	if(MAX_MILITARY_RANK - (GetRank() + GAMECLIENT.GetGGS().getSelection(ADDON_MAX_RANK)) < 1)
		return;
	// Einen Rang höher
    job = Job(unsigned(job) + 1);
	// Inventur entsprechend erhöhen und verringern
    gwg->GetPlayer(player)->IncreaseInventoryJob(job, 1);
    gwg->GetPlayer(player)->DecreaseInventoryJob(Job(unsigned(job) - 1), 1);
}
void nofPassiveSoldier::Upgrade()
{
    // Einen Rang höher
    job = Job(unsigned(job) + 1);

    // wieder heilen bzw. Hitpoints anpasen
    hitpoints = HITPOINTS[gwg->GetPlayer(player)->nation][job - JOB_PRIVATE];

    // Inventur entsprechend erhöhen und verringern
    gwg->GetPlayer(player)->IncreaseInventoryJob(job, 1);
    gwg->GetPlayer(player)->DecreaseInventoryJob(Job(unsigned(job) - 1), 1);
}
Beispiel #8
0
void nofPassiveSoldier::Upgrade()
{
    assert(!building || !helpers::contains(static_cast<nobMilitary*>(building)->troops, this)); // We must not be in the buildings list while upgrading. This would destroy the ordered list
    // Einen Rang höher
    job = Job(unsigned(job) + 1);

    // wieder heilen bzw. Hitpoints anpasen
    hitpoints = HITPOINTS[gwg->GetPlayer(player)->nation][job - JOB_PRIVATE];

    // Inventur entsprechend erhöhen und verringern
    gwg->GetPlayer(player)->IncreaseInventoryJob(job, 1);
    gwg->GetPlayer(player)->DecreaseInventoryJob(Job(unsigned(job) - 1), 1);
}
Beispiel #9
0
noFigure::noFigure(SerializedGameData& sgd, const unsigned obj_id) : noMovable(sgd, obj_id),
    fs(FigureState(sgd.PopUnsignedChar())),
    job_(Job(sgd.PopUnsignedChar())),
    player(sgd.PopUnsignedChar()),
    cur_rs(sgd.PopObject<RoadSegment>(GOT_ROADSEGMENT)),
    rs_pos(sgd.PopUnsignedShort()),
    rs_dir(sgd.PopBool()),
    on_ship(sgd.PopBool()),
    last_id(0xFFFFFFFF)
{
    if(fs == FS_GOTOGOAL || fs == FS_GOHOME)
        goal_ = sgd.PopObject<noRoadNode>(GOT_UNKNOWN);
    else
        goal_ = 0;

    waiting_for_free_node = sgd.PopBool();

    if(fs == FS_WANDER)
    {
        wander_way = sgd.PopUnsignedShort();
        wander_tryings = sgd.PopUnsignedShort();
        flagPos_ = sgd.PopMapPoint();
        flag_obj_id = sgd.PopUnsignedInt();
        burned_wh_id = sgd.PopUnsignedInt();
    }
}
Beispiel #10
0
// JobSubQueue:QueueJobs
//------------------------------------------------------------------------------
void JobSubQueue::QueueJobs( Array< Node * > & nodes )
{
    // Create wrapper Jobs around Nodes
    Array< Job * > jobs( nodes.GetSize() );
    for ( Node * node : nodes )
    {
    	Job * job = FNEW( Job( node ) );
        jobs.Append( job );
    }

    // Sort Jobs by cost
	JobCostSorter sorter;
	jobs.Sort( sorter );

	// lock to add job
	MutexHolder mh( m_Mutex );
    const bool wasEmpty = m_Jobs.IsEmpty();

	m_Jobs.Append( jobs );
    m_Count += (uint32_t)jobs.GetSize();

    if ( wasEmpty )
    {
        return; // skip re-sorting
    }

    // sort merged lists
	m_Jobs.Sort( sorter );
}
void StratumClient::stop() {
  QEventLoop waitLoop;
  QTimer disconnectTimer;
  disconnectTimer.setSingleShot(true);
  disconnectTimer.setInterval(RECONNECT_TIMER_INTERVAL);
  connect(m_socket, &QTcpSocket::disconnected, &waitLoop, &QEventLoop::quit);
  connect(&disconnectTimer, &QTimer::timeout, &waitLoop, &QEventLoop::quit);
  m_socket->disconnectFromHost();
  disconnectTimer.start();
  if (m_socket->state() != QTcpSocket::UnconnectedState) {
    waitLoop.exec();
  }

  if (!disconnectTimer.isActive()) {
    m_socket->abort();
    disconnectTimer.stop();
  }

  if (m_reconnectTimerId != -1) {
    killTimer(m_reconnectTimerId);
    m_reconnectTimerId = -1;
  }

  if (m_responseTimerId != -1) {
    killTimer(m_responseTimerId);
    m_responseTimerId = -1;
  }

  m_activeRequestMap.clear();
  m_currentSessionId.clear();
  QWriteLocker lock(&m_jobLock);
  m_currentJob = Job();
}
Beispiel #12
0
// QueueJob (Main Thread)
//------------------------------------------------------------------------------
void JobQueue::QueueJob( Node * node )
{
	ASSERT( node->GetState() == Node::DYNAMIC_DEPS_DONE );

	// mark as building
	node->SetState( Node::BUILDING );

	// trivial build tasks are processed immediately and returned
	if ( node->GetControlFlags() & Node::FLAG_TRIVIAL_BUILD )
	{
		Job localJob( node );
		Node::BuildResult result = DoBuild( &localJob );
		switch( result )
		{
			case Node::NODE_RESULT_FAILED:	node->SetState( Node::FAILED ); break;
			case Node::NODE_RESULT_OK:		node->SetState( Node::UP_TO_DATE ); break;
			default:						ASSERT( false ); break;
		}
		return;
	}

	Job * job = FNEW( Job( node ) );

	// stick in queue
	m_LocalAvailableJobs[ node->GetPriority() ].QueueJob( job );
}
Beispiel #13
0
void CaptureManager::Preload(int direct)
{
    if (!book[direct]->orig && !book[direct]->isLoading)
    {
        m_queue->AddJob(Job(Job::thread_load, direct, m_capture->getFilename(direct)), 1);
        book[direct]->isLoading = true;
    }
}
/// Fügt einige Güter hinzu
void nobBaseWarehouse::AddGoods(const Inventory& goods)
{
    for(unsigned int i = 0; i < WARE_TYPES_COUNT; ++i)
    {
        inventory.Add(GoodType(i), goods.goods[i]);

        if(goods.goods[i])
            CheckUsesForNewWare(GoodType(i));
    }

    for(unsigned int i = 0; i < JOB_TYPES_COUNT; ++i)
    {
        inventory.Add(Job(i), goods.people[i]);

        if(goods.people[i])
            CheckJobsForNewFigure(Job(i));
    }
}
Beispiel #15
0
			inline
			static
			Ptr
			create()
			{
				Ptr Job(new CountJob());

				return Job;
			}
Beispiel #16
0
void TDMTeam::checkEnemies() {
    std::vector<Ship*> ships = ships::getShips();
    bool existAny(false);

    for (std::vector<Ship*>::const_iterator it = ships.begin(); it != ships.end(); ++it)
        if ((*it)->getOwner()->team() != this && (*it)->attackable()) {
            existAny = true;
            break;
        }

    if (existAny) {
        for (int i=0; i<botControllers_.size(); ++i)
            addJob(Job(Job::jAttackAny, 60));
    }
    else {
        for (int i=0; i<botControllers_.size(); ++i)
            addJob(Job(Job::jEscape, 6));
    }
}
bool nobBaseWarehouse::AreWaresToEmpty() const
{
    // Prüfen, ob Warentyp ausgelagert werden soll und ob noch Waren davon vorhanden sind
    // Waren überprüfen
    for(unsigned i = 0; i < WARE_TYPES_COUNT; ++i)
    {
        if(GetInventorySetting(GoodType(i)).IsSet(EInventorySetting::SEND) && inventory[GoodType(i)])
            return true;
    }

    // Figuren überprüfen
    for(unsigned i = 0; i < JOB_TYPES_COUNT; ++i)
    {
        if(GetInventorySetting(Job(i)).IsSet(EInventorySetting::SEND) && inventory[Job(i)])
            return true;
    }

    return false;
}
void BotController::checkEnergy() {
    if(!ship()->collidable()) {
        for (std::map<Ship*, float>::iterator it = aggroTable_.begin(); it != aggroTable_.end(); ++it)
            it->second = 0.f;
        target_ = NULL;
    }
    else {
        if (!ship()->docked_ && std::max(100 - ship()->getLife(), 100 - ship()->getFuel()) > 30) {
            slave_->team()->addJob(Job(Job::jHeal, std::max(100 - ship()->getLife(), 100 - ship()->getFuel()), ship()));
            slave_->team()->addJob(Job(Job::jHeal, std::max(100 - ship()->getLife(), 100 - ship()->getFuel()), ship()));
        }

        if (ship()->frozen_ > 0) {
            slave_->team()->addJob(Job(Job::jUnfreeze, 90, ship()));
            slave_->team()->addJob(Job(Job::jUnfreeze, 90, ship()));
            slave_->team()->addJob(Job(Job::jUnfreeze, 90, ship()));
        }
    }
}
Beispiel #19
0
    void addJob (JobType type, std::string const& name,
        boost::function <void (Job&)> const& jobFunc)
    {
        assert (type != jtINVALID);

        JobDataMap::iterator iter (m_jobData.find (type));
        assert (iter != m_jobData.end ());

        if (iter == m_jobData.end ())
            return;

        JobTypeData& data (iter->second);

        // FIXME: Workaround incorrect client shutdown ordering
        // do not add jobs to a queue with no threads
        assert (type == jtCLIENT || m_workers.getNumberOfThreads () > 0);

        {
            // If this goes off it means that a child didn't follow
            // the Stoppable API rules. A job may only be added if:
            //
            //  - The JobQueue has NOT stopped
            //          AND
            //      * We are currently processing jobs
            //          OR
            //      * We have have pending jobs
            //          OR
            //      * Not all children are stopped
            //
            ScopedLock lock (m_mutex);
            assert (! isStopped() && (
                m_processCount>0 ||
                ! m_jobSet.empty () ||
                ! areChildrenStopped()));
        }

        // Don't even add it to the queue if we're stopping
        // and the job type is marked for skipOnStop.
        //
        if (isStopping() && skipOnStop (type))
        {
            m_journal.debug <<
                "Skipping addJob ('" << name << "')";
            return;
        }

        {
            ScopedLock lock (m_mutex);

            std::pair <std::set <Job>::iterator, bool> result (
                m_jobSet.insert (Job (type, name, ++m_lastJob,
                    data.load (), jobFunc, m_cancelCallback)));
            queueJob (*result.first, lock);
        }
    }
/**
* \details	Generate the new jobs that appears at the time t
*/
void Simulation::generateNewJobs(int t)
{
	for (unsigned int i = 0; i < _tasks.size(); ++i)
	{
		Task* task = &_tasks[i];
		if (t % task->getPeriod() == task->getOffset())
		{
			_jobs.push_back(Job(&_tasks[i], t));
		}
	}
}
Beispiel #21
0
 Job JobFactory::createModelToRadPreProcessJob(
     const openstudio::runmanager::Tools &t_tools,
     const openstudio::runmanager::JobParams &t_params,
     const openstudio::runmanager::Files &t_files,
     const std::vector<openstudio::URLSearchPath> &t_url_search_paths,
     bool t_loading,
     const boost::optional<openstudio::UUID> &t_uuid,
     const JobState &t_state
     )
 {
   return Job(boost::shared_ptr<detail::Job_Impl>(new detail::ModelToRadPreProcessJob(*t_uuid, t_tools, t_params, normalizeURLs(t_files, t_url_search_paths, t_loading, *t_uuid), t_state)));
 }
/// increase rank
void nofActiveSoldier::IncreaseRank()
{   
	//max rank reached? -> dont increase!
	if(GetRank() >= gwg->GetGGS().GetMaxMilitaryRank())
		return;

    // Einen Rang höher
    // Inventur entsprechend erhöhen und verringern
    gwg->GetPlayer(player).DecreaseInventoryJob(job_, 1);
    job_ = Job(unsigned(job_) + 1);
    gwg->GetPlayer(player).IncreaseInventoryJob(job_, 1);
}
Beispiel #23
0
  boost::optional<Job> Job::finishedJob() const
  {
    boost::shared_ptr<detail::Job_Impl> fj = 
      m_impl->finishedJob();

    if (fj)
    {
      return Job(fj);
    } else {
      return boost::optional<Job>();
    }
  }
Beispiel #24
0
  boost::optional<Job> Job::parent() const
  {
    boost::shared_ptr<detail::Job_Impl> p = 
      m_impl->parent();

    if (p)
    {
      return Job(p); 
    } else {
      return boost::optional<Job>();
    }
  }
Beispiel #25
0
// Process( MsgJob )
//------------------------------------------------------------------------------
void Server::Process( const ConnectionInfo * connection, const Protocol::MsgJob * msg, const void * payload, size_t payloadSize )
{
    ClientState * cs = (ClientState *)connection->GetUserData();
    MutexHolder mh( cs->m_Mutex );
    ASSERT( cs->m_NumJobsRequested > 0 );
    cs->m_NumJobsRequested--;
    cs->m_NumJobsActive++;

    // deserialize job
    ConstMemoryStream ms( payload, payloadSize );

    Job * job = FNEW( Job( ms ) );
    job->SetUserData( cs );

    //
    const uint64_t toolId = msg->GetToolId();
    ASSERT( toolId );

    MutexHolder manifestMH( m_ToolManifestsMutex ); // ensure we don't make redundant requests

    ToolManifest ** found = m_Tools.FindDeref( toolId );
    ToolManifest * manifest = found ? *found : nullptr;
    if ( manifest )
    {
        job->SetToolManifest( manifest );
        if ( manifest->IsSynchronized() )
        {
            // we have all the files - we can do the job
            JobQueueRemote::Get().QueueJob( job );
            return;
        }

        // missing some files - request them
        RequestMissingFiles( connection, manifest );
    }
    else
    {
        // first time seeing this tool

        // create manifest object
        manifest = FNEW( ToolManifest( toolId ) );
        job->SetToolManifest( manifest );
        m_Tools.Append( manifest );

        // request manifest of tool chain
        Protocol::MsgRequestManifest reqMsg( toolId );
        reqMsg.Send( connection );
    }

    // can't start job yet - put it on hold
    cs->m_WaitingJobs.Append( job );
}
int GameWorldBase::LUA_AddPeople(lua_State *L)
{
//	GameWorldBase *gw = static_cast<GameWorldBase*>(lua_touserdata(L,lua_upvalueindex(1)));
	int argc = lua_gettop(L) - 1;

	if ((argc < 0) || (argc % 2 == 1))
	{
		lua_pushstring(L, "wrong arguments: player, ware1, count1, ware2, count2, ...");
		lua_error(L);
		return(0);
	}

	// player
	unsigned pnr = luaL_checknumber(L, 1);

	if (pnr >= GAMECLIENT.GetPlayerCount())
	{
		lua_pushstring(L, "player number invalid!");
		lua_error(L);
		return(0);
	}

	GameClientPlayer *player = GAMECLIENT.GetPlayer(pnr);

	nobBaseWarehouse *warehouse = player->GetFirstWH();

	if (warehouse == NULL)
	{
		lua_pushstring(L, "player has no warehouses!");
		lua_error(L);
		return(0);
	}

	Goods goods;

	unsigned cnt = 2;
	for (argc >>= 1; argc > 0; --argc)
	{
		unsigned type = luaL_checknumber(L, cnt++);
		unsigned count = luaL_checknumber(L, cnt++);

		if (type < JOB_TYPES_COUNT)
		{
			goods.people[type] += count;
			player->IncreaseInventoryJob(Job(type), count);
		}
	}

	warehouse->AddGoods(goods);

	return(0);
}
Beispiel #27
0
/** the client thead
 @param  client
 @return null */
static void *thread(struct Client *client) {
	struct Job *job;

	if(!client || client->prints <= 0) return 0;
	for( ; ; ) {
		job = Job(client, random_int(client->pages_min, client->pages_max));
		if(!SpoolPushJob(job)) return (void *)-1;
		if(--client->prints <= 0) break;
		sleep(client->ms_idle);
	}
	printf("%s signing off.\n", client->name);
	return 0;
}
int main(int argc, char **argv) {
    // For the sake of simplicity we're starting only one thread here
    // but you can add as many workers as you want.
    boost::thread worker_thread(&::worker);

    // posting a first job
    cache.process(Job(1, 10));

    // waiting for the worker to start
    workerStarted.wait();

    // checking if some data is in the cache
    check(1005);
    check(1);
    check(9);

    // posting another job
    cache.process(Job(1000, 20));

    // checking some more data
    check(2);
    check(5);
    check(1000);

    // requesting termination
    printf("main : sending termination\n");
    cache.terminate();

    // waiting for the thread to finish
    worker_thread.join();

    // as a bonus we can see what was actually processed by the worker
    std::vector<id_type> keys;
    printf("main : worker processed %lu elements : ", cache.dumpKeys(keys));
    std::copy(keys.begin(), keys.end(), std::ostream_iterator<id_type>(std::cout, " "));
    std::cout << std::endl;

    return EXIT_SUCCESS;
}
CCMSDIntegrator::CCMSDIntegrator(void)
:
		resources((std::vector<IObjectPtr>&) Resource().objects()),
		cells((std::vector<IObjectPtr>&) Cell().objects()),
		parts((std::vector<IObjectPtr>&) Part().objects()),
		processplans((std::vector<IObjectPtr>&) ProcessPlan().objects()),
		jobs((std::vector<IObjectPtr>&) Job().objects()),
		distributions((std::vector<IObjectPtr>&) Distribution().objects()),
		calendars((std::vector<IObjectPtr>&) Calendar().objects()),
		layouts((std::vector<IObjectPtr>&) Layout().objects())

{
}
Beispiel #30
0
void CaptureManager::Release(int p, int z, bool fluorescence)
{
    // unload previous loaded image
    if (!IsInNeighborhood(p, z))
    {

        int direct = CalculateDirect(p, z, fluorescence);
        if (book[direct]->isLoading)
            book[direct]->isLoading = false;
        else
            m_queue->AddJob(Job(Job::thread_delete, direct, book[direct]->orig), 1);
        book[direct]->orig = NULL;
    }
}