예제 #1
0
void FinishedProxy::visit(Widget::WidgetActivateEvent *event) {
    std::string name = event->getWidget()->getName();
    
    if(name == "quit") {
        EMIT_EVENT(new Event::QuitEvent());
    }
    else if(name == "dismiss") {
        EMIT_EVENT(new Event::SwitchToScreen(""));
    }
}
예제 #2
0
void TPropertiesMenu::calculate()
{
    BaseMenu::calculate();
    if(currentEvent != MENU_BACK)  return;
    
    Render::t_screen_sizes_list::iterator it = ss->begin();
    for(int i = 0; i < screen_size_->getItem(); ++i)  ++it;
    
    Properties.window_width  = it->width;
    Properties.window_height = it->height;
    
    if(antialiasing_->getItem() == 0)
        Properties.antialiasing = 0;
    else
        Properties.antialiasing = 1 << (antialiasing_->getItem() - 1);
    
    Properties.fog_quality = fog_->getItem() * 2 + 1;
    Properties.lighting_quality = lighting_->getItem();
    Properties.texture_quality = texture_->getItem();
    Properties.view_distance = view_distance_->getValue();
    
    saveProperties();
    
    Render::texturesQuality = (u_int8_t)Properties.texture_quality;
    Render::setLightQuality((u_int8_t)Properties.lighting_quality);
    Render::setViewDistance(Properties.view_distance);
    
    EMIT_EVENT(PropertiesFinishedEvent);  // ==>
    return;
}
예제 #3
0
void SDLMainLoop::quitHandler(Event::QuitEvent *event) {
    if(!currentlyUsingMenuLoop()) {
        EMIT_EVENT(new Event::DoDisconnect());
        useMenuLoop();
    }
    else {
        setQuit();
    }
}
예제 #4
0
void AboutProxy::visit(Widget::WidgetActivateEvent *event) {
    std::string name = event->getWidget()->getName();
    
    if(name == "back") {
        EMIT_EVENT(new Event::SwitchToScreen(""));
    }
    else {
        LOG2(GUI, WARNING, "No action for clicking on \"" << name << "\"");
    }
}
예제 #5
0
PathingUpdater::PathingUpdater(
    boost::shared_ptr<Object::WorldManager> worldManager,
    boost::shared_ptr<RaceManager> raceManager,
    boost::shared_ptr<World::PlayerManager> playerManager) {
    
    this->worldManager = worldManager;
    this->raceManager = raceManager;
    this->playerManager = playerManager;

	EMIT_EVENT(new Event::PlayerProgressEvent(0, 0.0, raceManager->getNumLapsToWin()));
    
    warpDetector = new WarpDetector(raceManager.get());
}
예제 #6
0
void NetworkPortal::checkNetwork() {
    if(!portal) return;
    
    unsigned long now = Misc::Sleeper::getTimeMilliseconds();
    if(now >= lastPing + 1000) {
        //LOG(NETWORK, "client sending ping");
        
        Network::Packet *packet = new Network::PingPacket();
        portal->sendPacket(packet);
        delete packet;
        
        lastPing = now;
    }
    
    while(checking) {
        Network::Packet *packet = portal->nextPacket();
        if(!packet) break;
        
        //LOG2(NETWORK, PACKET, "Received packet " << typeid(*packet).name());
        
        if(dynamic_cast<Network::EventPacket *>(packet)) {
            EMIT_EVENT(dynamic_cast<Network::EventPacket *>(packet)
                ->getEvent());
        }
        else if(dynamic_cast<Network::PingPacket *>(packet)) {
            unsigned long sent = dynamic_cast<Network::PingPacket *>(packet)
                ->getMilliseconds();
            unsigned long now = Misc::Sleeper::getTimeMilliseconds();
            long offset = -long(now - sent);
            History::PingTimeMeasurer::getInstance()->setClockOffset(offset);
            LOG(NETWORK, "ClockOffset set to " << offset);
        }
        
        EMIT_EVENT(new Event::PacketReceived(packet));
        delete packet;
    }
}
예제 #7
0
void SDLMainLoop::gameStageChangedHandler(Event::GameStageChanged *event) {
    if(event->getStage() == World::WorldSetup::START_COUNTDOWN) {
        gameLoop->setGuiPointers(
            menuLoop->getGUI(),
            menuLoop->getGUIInput());
        menuLoop->getGUI()->popScreen();
        //menuLoop->getGUI()->pushScreen("running");
        EMIT_EVENT(new Event::SwitchToScreen("running"));
        
        // set up camera if necessary
        gameLoop->setProjection(Point2D(
            SDL_GetVideoSurface()->w,
            SDL_GetVideoSurface()->h));
        
        //Timing::AccelControl::getInstance()->setPauseSkipDirectly(SDL_GetTicks());
        useLoopBase(gameLoop);
    }
}
예제 #8
0
void SDLMainLoop::handleEvents() {
    SDL_Event event;
    while(SDL_PollEvent(&event)) {
        switch(event.type) {
        case SDL_QUIT:
            EMIT_EVENT(new Event::QuitEvent());
            break;
        case SDL_VIDEORESIZE:
            SDL_SetVideoMode(event.resize.w, event.resize.h,
                0, sdl_init_flags);
            resizeGL(event.resize.w, event.resize.h);
            /*projector.setCurrentDimensions(
                Point2D(event.resize.w, event.resize.h));*/
            break;
        }
        
        loop->handleEvent(&event);
		inputManager->getInputMapper()->handleEvent(&event);
    }
}
예제 #9
0
void TGameplayPhase::calculate()
{
    double d_ = _D_MAN_SPEED  * timer.elapsed_ms();
    double angle_ = camera->getAngle() * _DEG_TO_RAD;
    
    float dY = (float)(d_ *  cos(angle_));
    float dX = (float)(d_ * -sin(angle_));
    
    bool is_now_walk = false;
    Input::collectControlsStates();
    
    if(Input::getPushed(_KEY_QUIT))
    {
        EMIT_EVENT(GameplayQuitEvent);  // ==>
        return;
    }
    
    if(Input::getHolded(_KEY_FORWARD))
    {   camera->translate_position(dX, dY, .0f);  is_now_walk = true;   }
    
    if(Input::getHolded(_KEY_BACK))
    {   camera->translate_position(-dX, -dY, .0f);  is_now_walk = true;   }
    
    if(Input::getHolded(_KEY_LEFT))
    {   camera->translate_position(-dY, dX, .0f);  is_now_walk = true;   }
    
    if(Input::getHolded(_KEY_RIGHT))
    {   camera->translate_position(dY, -dX, .0f);  is_now_walk = true;   }
    
    camera->translate_rotation((float)(timer.elapsed_ms() * Input::getAxis(_AXIS_X)),
                               (float)(timer.elapsed_ms() * Input::getAxis(_AXIS_Y)));
    
    zero_light->set_position(camera->getX(), camera->getY(), _F_LIGHT_HEIGHT);
    
         if((! is_walk) && is_now_walk)  man->setAnimation("walk");
    else if(is_walk && (! is_now_walk))  man->setFrame("stand");
    
    is_walk = is_now_walk;
    timer.start();
    return;
}
예제 #10
0
void PathingUpdater::update() {
    if(!GET_SETTING("game.enablepathing", true)) {
        return;
    }
    
    Object::WorldManager::PlayerIteratorType iterator = worldManager->getPlayerIterator();
    while (iterator.hasNext()) {
        Object::Player* player = iterator.next();
        
        // Raycast downward to find the update point
        Math::Point origin_pos = player->getPosition();
        Math::Point dir_pos = origin_pos;
        dir_pos.setY(dir_pos.getY() - VEHICLE_PATH_RAY_MAX_HEIGHT);
        
        Math::Point update_pos;
        
        Physics::PhysicsWorld *physicsWorld
            = Physics::PhysicsWorld::getInstance();
        
        // Update if the player is above the track
        if(physicsWorld->raycastPoint(origin_pos, dir_pos, &update_pos)) {
            if(!player->getPathTracker()) continue;  // no path tracker
            if(!player->getPathTracker()->atLeastOneNode()) continue;
            
            player->getPathTracker()->update(update_pos);
            
            // Start a new lap for the player if they have crossed the finish plane
            if (player->getPathTracker()->readyforNewLap() &&
                raceManager->getBoundingPlane().pointInside(origin_pos)) {
                    player->getPathTracker()->startNewLap();
                    LOG(WORLD, "Player: " << player->getID()
                        << " has finished lap "
                        << player->getPathTracker()->getNumLaps());

				if (!player->getPathTracker()->getFinished()
					&& player->getPathTracker()->getNumLaps() >= raceManager->getNumLapsToWin()
					&& !GET_SETTING("internal.practicemode", false) ) {
                    
                    player->getPathTracker()->setFinished(true);
                    
                    Map::PlayerTimes::getInstance().setFinished(
                        player->getID(),
						World::TimeElapsed::getInstance().getGameTime());

					if (Bonus::GlobalBonusManager::getInstance())
						Bonus::GlobalBonusManager::getInstance()->getPlayerBonuses(player->getID()).playerFinish(player->getPathTracker()->getRanking());

				}
                
                if(playerManager->getPlayer() == player) {
                    EMIT_EVENT(new Event::PlayerProgressEvent(
                        player->getPathTracker()->getNumLaps(),
                        player->getPathTracker()->getLapProgress(),
						raceManager->getNumLapsToWin()
						)
						);
                }
            }
        }
        
        warpDetector->checkForWarping(player);
    }

	raceManager->updatePlayerRankings(worldManager.get());
}
예제 #11
0
void FinishedProxy::handleRaceFinished(Event::RaceFinished *event) {
    LOG(GLOBAL, "Race finished!");
    
    Widget::CompositeWidget *ranks = dynamic_cast<Widget::CompositeWidget *>(
        finished->getChild("ranks"));
    ranks->removeAllChildren();
    
    Widget::CompositeWidget *teams = dynamic_cast<Widget::CompositeWidget *>(
        finished->getChild("teams"));
    teams->removeAllChildren();
    
    Widget::WidgetRect scoreArea(0.1, 0.45, 0.8, 0.4);
    Widget::WidgetRect teamArea(0.1, 0.05, 0.8, 0.35);
    double scoreHeight = scoreArea.getHeight() / 11.0;
	double teamHeight = teamArea.getHeight() / 6.0;
    
    Map::RaceResults results = event->getResults();
    for(int r = 0; r <= results.getRanks() && r <= 10; r ++) {

        Widget::WidgetRect textRect(
            scoreArea.getCorner().getX(),
            scoreArea.getCorner().getY() + scoreHeight * r,
            scoreArea.getWidth() / 3.0 - 0.03,
            scoreHeight);
        Widget::WidgetRect textRect1 = textRect;
        Widget::WidgetRect textRect2 = textRect;
        Widget::WidgetRect textRect3 = textRect;
        
        textRect2.getCorner().addX(scoreArea.getWidth() / 3.0);
        textRect3.getCorner().addX(scoreArea.getWidth() / 3.0 * 2);

		if (r == 0) {

			ranks->addChild(
				new Widget::TextWidget("playerColTitle",
					"Player",
					Widget::NormalTextLayout::ALIGN_HCENTRE,
					textRect1));
			ranks->addChild(
				new Widget::TextWidget("timeColTitle",
					"Time - Bonus",
					Widget::NormalTextLayout::ALIGN_HCENTRE,
					textRect2));
			ranks->addChild(
				new Widget::TextWidget("bonusColTitle",
					"Final",
					Widget::NormalTextLayout::ALIGN_HCENTRE,
					textRect3));

		}
		else {

			int p = results.getPlayerByRank(r-1);
			int score = results.getPlayerPoints(p);
			int bonus = results.getPlayerBonus(p);
	        
			Object::Player *player = playerManager->getPlayer(p);
	        
			ranks->addChild(
				new Widget::TextWidget(Misc::StreamAsString() << "rank" << r-1,
					player->getPlayerName(),
					Widget::NormalTextLayout::ALIGN_LEFT,
					textRect1,
					Map::Teams::teamColor(player->getTeamID())));
			ranks->addChild(
				new Widget::TextWidget(Misc::StreamAsString() << "time" << r-1,
					Misc::StreamAsString() << formatTime((score+bonus) / 1000.0)
                        << " - " << formatTime(bonus / 1000.0) << " secs",
					Widget::NormalTextLayout::ALIGN_HCENTRE,
					textRect2));
			ranks->addChild(
				new Widget::TextWidget(Misc::StreamAsString() << "final" << r-1,
					Misc::StreamAsString() << "= " << formatTime(score / 1000.0) << " secs",
					Widget::NormalTextLayout::ALIGN_RIGHT,
					textRect3));

		}

    }
    
    for(int r = 0; r <= results.getTeams() && r <= 5; r ++) {
        Widget::WidgetRect textRect(
            teamArea.getCorner().getX(),
            teamArea.getCorner().getY() + teamHeight * r,
            teamArea.getWidth() / 2.0 - 0.03,
            teamHeight);
        Widget::WidgetRect textRect1 = textRect;
        Widget::WidgetRect textRect2 = textRect;
        
        textRect2.getCorner().addX(scoreArea.getWidth() / 2.0);
        
        if(r == 0) {
            ranks->addChild(
                new Widget::TextWidget("teamNamesTitle",
                    "Best Teams",
                    Widget::NormalTextLayout::ALIGN_LEFT,
                    textRect1));
            ranks->addChild(
                new Widget::TextWidget("teamScoresTitle",
                    "Average Score",
                    Widget::NormalTextLayout::ALIGN_RIGHT,
                    textRect2));
        }
        else {
            int team = results.getTeamByRank(r-1);
            int score = results.getTeamPoints(team);
            
            ranks->addChild(
                new Widget::TextWidget(Misc::StreamAsString() << "rank" << r-1,
                    Misc::StreamAsString() << "Team " << Map::Teams::teamName(team),
                    Widget::NormalTextLayout::ALIGN_LEFT,
                    textRect1,
                    Map::Teams::teamColor(team)));
            ranks->addChild(
                new Widget::TextWidget(Misc::StreamAsString() << "team" << r-1,
                    Misc::StreamAsString() << formatTime(score / 1000.0) << " secs",
                    Widget::NormalTextLayout::ALIGN_RIGHT,
                    textRect2));
        }
    }
    
    EMIT_EVENT(new Event::SwitchToScreen("finished"));
}