Add initial framework for FFA and CTF in network

This commit is contained in:
Benau 2018-08-12 10:57:37 +08:00
parent b755d4d00b
commit 6bdec3d01a
27 changed files with 206 additions and 73 deletions

View File

@ -56,11 +56,11 @@
</div>
<div width="100%" proportion="2" layout="horizontal-row">
<icon align="center" width="64" height="64" icon="gui/mode_3strikes.png"/>
<icon align="center" width="64" height="64" icon="gui/weapons.png"/>
<spacer width="25" height="25"/>
<bubble proportion="1" height="100%"
I18N="In the help menu"
text="3 Strikes Battle: Hit others with weapons until they lose all their lives."/>
text="There are 3 types of battle mode: In 3 Strikes Battle, you need to hit others with weapons until they lose all their lives. In Free For All, the player who hits others the most will win in a given hit or time limit. In Capture The Flag, your team needs to bring the flag of the other team to your own flag base, as long as your flag is not captured by the other team."/>
</div>
<div width="100%" proportion="2" layout="horizontal-row">

View File

@ -42,8 +42,8 @@
I18N="Multiplayer game mode" text="Normal Race"/>
<icon-button id="timetrial" width="128" height="128" icon="gui/mode_tt.png"
I18N="Multiplayer game mode" text="Time Trial"/>
<icon-button id="3strikes" width="128" height="128" icon="gui/mode_3strikes.png"
I18N="Multiplayer game mode" text="3 Strikes Battle"/>
<icon-button id="3strikes" width="128" height="128" icon="gui/weapons.png"
I18N="Multiplayer game mode" text="Battle"/>
<icon-button id="soccer" width="128" height="128" icon="gui/mode_soccer.png"
I18N="Multiplayer game mode" text="Soccer"/>
</ribbon>

View File

@ -739,7 +739,27 @@ namespace UserConfigParams
&m_network_group, "Only auto start kart selection when number of "
"connected player is larger than max player * this value, for "
"owner less or ranked server, after start-game-counter."));
PARAM_PREFIX FloatUserConfigParam m_flag_return_timemout
PARAM_DEFAULT(FloatUserConfigParam(20.0f, "flag-return-timemout",
&m_network_group, "Time in seconds when a flag is dropped a by player in CTF "
"returning to its own base."));
PARAM_PREFIX FloatUserConfigParam m_hit_limit_threshold
PARAM_DEFAULT(FloatUserConfigParam(5.0f, "hit-limit-threshold",
&m_network_group, "Value used to calculate hit limit in free for all, which "
"is min(number of players * hit-limit-threshold, 40), negative value to disable hit limit."));
PARAM_PREFIX FloatUserConfigParam m_time_limit_threshold_ffa
PARAM_DEFAULT(FloatUserConfigParam(0.7f, "time-limit-threshold-ffa",
&m_network_group, "Value used to calculate time limit in free for all, which "
"is max(number of players * time-limit-threshold-ffa, 2.0) * 60, negative value to disable time limit."));
PARAM_PREFIX FloatUserConfigParam m_capture_limit_threshold
PARAM_DEFAULT(FloatUserConfigParam(0.5f, "capture-limit-threshold",
&m_network_group, "Value used to calculate capture limit in CTF, which "
"is max(2.0, number of players * capture-limit-threshold), negative value to disable capture limit."));
PARAM_PREFIX FloatUserConfigParam m_time_limit_threshold_ctf
PARAM_DEFAULT(FloatUserConfigParam(0.9f, "time-limit-threshold-ctf",
&m_network_group, "Value used to calculate time limit in CTF, which "
"is max(2.0, number of players * (time-limit-threshold-ctf + flag-return-timemout / 60.0)) * 60.0,"
" negative value to disable time limit."));
PARAM_PREFIX StringToUIntUserConfigParam m_server_ban_list
PARAM_DEFAULT(StringToUIntUserConfigParam("server_ban_list",
"LHS: IP in x.x.x.x format, RHS: online id, if 0 than all players "

View File

@ -396,7 +396,7 @@ void InputManager::handleStaticAction(int key, int value)
{
AbstractKart* kart = world->getLocalPlayerKart(0);
if(control_is_pressed && race_manager->getMinorMode()!=
RaceManager::MINOR_MODE_3_STRIKES)
RaceManager::MINOR_MODE_BATTLE)
kart->setPowerup(PowerupManager::POWERUP_RUBBERBALL,
10000);
else

View File

@ -35,7 +35,6 @@
#include "karts/controller/controller.hpp"
#include "karts/explosion_animation.hpp"
#include "karts/kart_properties.hpp"
#include "modes/three_strikes_battle.hpp"
#include "modes/world.hpp"
#include "network/rewind_manager.hpp"
#include "physics/triangle_mesh.hpp"
@ -343,7 +342,7 @@ void Attachment::hitBanana(ItemState *item_state)
bool add_a_new_item = true;
if (dynamic_cast<ThreeStrikesBattle*>(World::getWorld()) != NULL)
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_BATTLE)
{
World::getWorld()->kartHit(m_kart->getWorldKartId());
ExplosionAnimation::create(m_kart);

View File

@ -25,7 +25,6 @@
#include "graphics/sp/sp_mesh_node.hpp"
#include "items/item_manager.hpp"
#include "karts/abstract_kart.hpp"
#include "modes/three_strikes_battle.hpp"
#include "modes/world.hpp"
#include "network/rewind_manager.hpp"
#include "tracks/arena_graph.hpp"
@ -95,7 +94,7 @@ void ItemState::collected(const AbstractKart *kart)
m_ticks_till_return = stk_config->time2Ticks(2.0f);
}
if (dynamic_cast<ThreeStrikesBattle*>(World::getWorld()) != NULL)
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_BATTLE)
{
m_ticks_till_return *= 3;
}

View File

@ -501,7 +501,7 @@ void PowerupManager::computeWeightsForRace(int num_karts)
case RaceManager::MINOR_MODE_TIME_TRIAL: /* fall through */
case RaceManager::MINOR_MODE_NORMAL_RACE: class_name="race"; break;
case RaceManager::MINOR_MODE_FOLLOW_LEADER: class_name="ftl"; break;
case RaceManager::MINOR_MODE_3_STRIKES: class_name="battle"; break;
case RaceManager::MINOR_MODE_BATTLE: class_name="battle"; break;
case RaceManager::MINOR_MODE_TUTORIAL: class_name="tutorial"; break;
case RaceManager::MINOR_MODE_EASTER_EGG: /* fall through */
case RaceManager::MINOR_MODE_OVERWORLD:

View File

@ -238,7 +238,7 @@ bool Swatter::updateAndTestFinished(int ticks)
m_animation_phase = SWATTER_FROM_TARGET;
const int end_ticks = ticks_start + 60;
if (race_manager
->getMinorMode()==RaceManager::MINOR_MODE_3_STRIKES ||
->getMinorMode()==RaceManager::MINOR_MODE_BATTLE ||
race_manager
->getMinorMode()==RaceManager::MINOR_MODE_SOCCER)
{

View File

@ -87,7 +87,7 @@ AIBaseLapController::AIBaseLapController(AbstractKart *kart)
: AIBaseController(kart)
{
if (race_manager->getMinorMode()!=RaceManager::MINOR_MODE_3_STRIKES &&
if (race_manager->getMinorMode()!=RaceManager::MINOR_MODE_BATTLE &&
race_manager->getMinorMode()!=RaceManager::MINOR_MODE_SOCCER)
{
m_world = dynamic_cast<LinearWorld*>(World::getWorld());

View File

@ -56,7 +56,7 @@ EndController::EndController(AbstractKart *kart,
: AIBaseLapController(kart)
{
m_previous_controller = prev_controller;
if(race_manager->getMinorMode()!=RaceManager::MINOR_MODE_3_STRIKES &&
if(race_manager->getMinorMode()!=RaceManager::MINOR_MODE_BATTLE &&
race_manager->getMinorMode()!=RaceManager::MINOR_MODE_SOCCER)
{
// Overwrite the random selected default path from AIBaseLapController
@ -131,7 +131,7 @@ void EndController::reset()
m_track_node = Graph::UNKNOWN_SECTOR;
// In battle mode there is no quad graph, so nothing to do in this case
if(race_manager->getMinorMode()!=RaceManager::MINOR_MODE_3_STRIKES &&
if(race_manager->getMinorMode()!=RaceManager::MINOR_MODE_BATTLE &&
race_manager->getMinorMode()!=RaceManager::MINOR_MODE_SOCCER)
{
DriveGraph::get()->findRoadSector(m_kart->getXYZ(), &m_track_node);
@ -184,7 +184,7 @@ void EndController::update(int ticks)
AIBaseLapController::update(ticks);
// In case of battle mode: don't do anything
if(race_manager->getMinorMode()==RaceManager::MINOR_MODE_3_STRIKES ||
if(race_manager->getMinorMode()==RaceManager::MINOR_MODE_BATTLE ||
race_manager->getMinorMode()==RaceManager::MINOR_MODE_SOCCER ||
race_manager->getMinorMode()==RaceManager::MINOR_MODE_EASTER_EGG)
{

View File

@ -971,7 +971,7 @@ void Kart::finishedRace(float time, bool from_server)
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_NORMAL_RACE ||
race_manager->getMinorMode() == RaceManager::MINOR_MODE_TIME_TRIAL ||
race_manager->getMinorMode() == RaceManager::MINOR_MODE_FOLLOW_LEADER ||
race_manager->getMinorMode() == RaceManager::MINOR_MODE_3_STRIKES ||
race_manager->getMinorMode() == RaceManager::MINOR_MODE_BATTLE ||
race_manager->getMinorMode() == RaceManager::MINOR_MODE_SOCCER ||
race_manager->getMinorMode() == RaceManager::MINOR_MODE_EASTER_EGG)
{
@ -1026,7 +1026,7 @@ void Kart::setRaceResult()
}
}
else if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_FOLLOW_LEADER ||
race_manager->getMinorMode() == RaceManager::MINOR_MODE_3_STRIKES)
race_manager->getMinorMode() == RaceManager::MINOR_MODE_BATTLE)
{
// the kart wins if it isn't eliminated
m_race_result = !this->isEliminated();

View File

@ -91,7 +91,7 @@ RescueAnimation::RescueAnimation(AbstractKart *kart, bool is_auto_rescue)
}
// Add a hit unless it was auto-rescue
if (race_manager->getMinorMode()==RaceManager::MINOR_MODE_3_STRIKES &&
if (race_manager->getMinorMode()==RaceManager::MINOR_MODE_BATTLE &&
!is_auto_rescue)
{
ThreeStrikesBattle *world=(ThreeStrikesBattle*)World::getWorld();

View File

@ -612,6 +612,8 @@ void cmdLineHelp()
" owner-less server.\n"
" --soccer-timed Use time limit mode in network soccer game.\n"
" --soccer-goals Use goals limit mode in network soccer game.\n"
" --battle-mode=n Specify battle mode in netowrk, 0 is Free For All and\n"
" 1 is Capture The Flag.\n"
" --network-gp=n Specify number of tracks used in network grand prix.\n"
" --no-validation Allow non validated and unencrypted connection in wan.\n"
" --ranked Server will submit ranking to stk addons server.\n"
@ -973,7 +975,7 @@ int handleCmdLine()
if (!CommandLine::has("--track", &track))
track = "temple";
UserConfigParams::m_arena_ai_stats=true;
race_manager->setMinorMode(RaceManager::MINOR_MODE_3_STRIKES);
race_manager->setMinorMode(RaceManager::MINOR_MODE_BATTLE);
std::vector<std::string> l;
for (int i = 0; i < 8; i++)
l.push_back("tux");
@ -1029,7 +1031,7 @@ int handleCmdLine()
break;
case 1: race_manager->setMinorMode(RaceManager::MINOR_MODE_TIME_TRIAL);
break;
case 2: race_manager->setMinorMode(RaceManager::MINOR_MODE_3_STRIKES);
case 2: race_manager->setMinorMode(RaceManager::MINOR_MODE_BATTLE);
break;
case 3: race_manager->setMinorMode(RaceManager::MINOR_MODE_SOCCER);
break;
@ -1263,6 +1265,8 @@ int handleCmdLine()
const bool is_soccer =
race_manager->getMinorMode() == RaceManager::MINOR_MODE_SOCCER;
const bool is_battle =
race_manager->getMinorMode() == RaceManager::MINOR_MODE_BATTLE;
if (CommandLine::has("--soccer-timed") && is_soccer)
{
LobbyProtocol::get<LobbyProtocol>()->getGameSetup()
@ -1284,6 +1288,31 @@ int handleCmdLine()
NetworkConfig::get()->setServerMode(race_manager->getMinorMode(),
RaceManager::MAJOR_MODE_GRAND_PRIX);
}
else if (CommandLine::has("--battle-mode", &n) && is_battle)
{
switch (n)
{
case 0:
NetworkConfig::get()->setServerMode(race_manager->getMinorMode(),
RaceManager::MAJOR_MODE_FREE_FOR_ALL);
race_manager->setMajorMode(RaceManager::MAJOR_MODE_FREE_FOR_ALL);
break;
case 1:
NetworkConfig::get()->setServerMode(race_manager->getMinorMode(),
RaceManager::MAJOR_MODE_CAPTURE_THE_FLAG);
race_manager->setMajorMode(RaceManager::MAJOR_MODE_CAPTURE_THE_FLAG);
break;
default:
break;
}
}
else if (is_battle)
{
Log::warn("main", "Set to ffa for battle server");
NetworkConfig::get()->setServerMode(race_manager->getMinorMode(),
RaceManager::MAJOR_MODE_FREE_FOR_ALL);
race_manager->setMajorMode(RaceManager::MAJOR_MODE_FREE_FOR_ALL);
}
else if (is_soccer)
{
Log::warn("main", "Set to goal target for soccer server");
@ -1298,6 +1327,24 @@ int handleCmdLine()
race_manager->getMinorMode(), RaceManager::MAJOR_MODE_SINGLE);
}
if (is_battle)
{
if (UserConfigParams::m_hit_limit_threshold < 0.0f &&
UserConfigParams::m_time_limit_threshold_ffa < 0.0f)
{
Log::warn("main", "Reset invalid hit and time limit settings");
UserConfigParams::m_hit_limit_threshold.revertToDefaults();
UserConfigParams::m_time_limit_threshold_ffa.revertToDefaults();
}
if (UserConfigParams::m_capture_limit_threshold < 0.0f &&
UserConfigParams::m_time_limit_threshold_ctf < 0.0f)
{
Log::warn("main", "Reset invalid Capture and time limit settings");
UserConfigParams::m_capture_limit_threshold.revertToDefaults();
UserConfigParams::m_time_limit_threshold_ctf.revertToDefaults();
}
}
// The extra server info has to be set before server lobby started
if (server_lobby)
server_lobby->requestStart();
@ -1394,7 +1441,7 @@ int handleCmdLine()
race_manager->setDefaultAIKartList(l);
// Add 1 for the player kart
race_manager->setNumKarts(1);
race_manager->setMinorMode(RaceManager::MINOR_MODE_3_STRIKES);
race_manager->setMinorMode(RaceManager::MINOR_MODE_BATTLE);
}
else if (t->isSoccer())
{

View File

@ -426,7 +426,7 @@ Controller* World::loadAIController(AbstractKart* kart)
Controller *controller;
int turn=0;
if(race_manager->getMinorMode()==RaceManager::MINOR_MODE_3_STRIKES)
if(race_manager->getMinorMode()==RaceManager::MINOR_MODE_BATTLE)
turn=1;
else if(race_manager->getMinorMode()==RaceManager::MINOR_MODE_SOCCER)
turn=2;

View File

@ -98,7 +98,7 @@ void GameSetup::loadWorld()
PlayerManager::getCurrentPlayer()->setCurrentChallenge("");
race_manager->setTimeTarget(0.0f);
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_SOCCER ||
race_manager->getMinorMode() == RaceManager::MINOR_MODE_3_STRIKES)
race_manager->getMinorMode() == RaceManager::MINOR_MODE_BATTLE)
{
bool prev_val = UserConfigParams::m_random_arena_item;
UserConfigParams::m_random_arena_item = m_reverse;

View File

@ -90,7 +90,7 @@ void NetworkConfig::setServerMode(RaceManager::MinorRaceModeType minor,
else if (minor == RaceManager::MINOR_MODE_FOLLOW_LEADER)
m_server_mode = 2;
}
else
else if (major == RaceManager::MAJOR_MODE_SINGLE)
{
if (minor == RaceManager::MINOR_MODE_NORMAL_RACE)
m_server_mode = 3;
@ -98,10 +98,16 @@ void NetworkConfig::setServerMode(RaceManager::MinorRaceModeType minor,
m_server_mode = 4;
else if (minor == RaceManager::MINOR_MODE_FOLLOW_LEADER)
m_server_mode = 5;
else if (minor == RaceManager::MINOR_MODE_3_STRIKES)
m_server_mode = 6;
else if (minor == RaceManager::MINOR_MODE_SOCCER)
m_server_mode = 7;
m_server_mode = 6;
}
else if (major == RaceManager::MAJOR_MODE_FREE_FOR_ALL)
{
m_server_mode = 7;
}
else
{
m_server_mode = 8;
}
} // setServerMode
@ -130,11 +136,14 @@ std::pair<RaceManager::MinorRaceModeType, RaceManager::MajorRaceModeType>
return { RaceManager::MINOR_MODE_FOLLOW_LEADER,
RaceManager::MAJOR_MODE_SINGLE };
case 6:
return { RaceManager::MINOR_MODE_3_STRIKES,
RaceManager::MAJOR_MODE_SINGLE };
case 7:
return { RaceManager::MINOR_MODE_SOCCER,
RaceManager::MAJOR_MODE_SINGLE };
case 7:
return { RaceManager::MINOR_MODE_BATTLE,
RaceManager::MAJOR_MODE_FREE_FOR_ALL };
case 8:
return { RaceManager::MINOR_MODE_BATTLE,
RaceManager::MAJOR_MODE_CAPTURE_THE_FLAG };
default:
break;
}
@ -177,9 +186,13 @@ core::stringw NetworkConfig::getModeName(unsigned id)
case 4:
return _("Time Trial");
case 6:
return _("3 Strikes Battle");
case 7:
return _("Soccer");
case 7:
// I18n: Free for all means a deathmatch game with battle mode in
// networking
return _("Free For All");
case 8:
return _("Capture The Flag");
default:
return L"";
}

View File

@ -407,12 +407,20 @@ void ClientLobby::displayPlayerVote(Event* event)
core::stringw yes = _("Yes");
core::stringw no = _("No");
core::stringw vote_msg;
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_3_STRIKES)
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_BATTLE &&
race_manager->getMajorMode() == RaceManager::MAJOR_MODE_FREE_FOR_ALL)
{
//I18N: Vote message in network game from a player
vote_msg = _("Track: %s,\nrandom item location: %s",
track_readable, rev == 1 ? yes : no);
}
else if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_BATTLE &&
race_manager->getMajorMode() ==
RaceManager::MAJOR_MODE_CAPTURE_THE_FLAG)
{
//I18N: Vote message in network game from a player
vote_msg = _("Track: %s", track_readable);
}
else if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_SOCCER)
{
if (m_game_setup->isSoccerGoalTarget())
@ -527,8 +535,13 @@ void ClientLobby::handleServerInfo(Event* event)
NetworkConfig::get()->setServerMode(u_data);
auto game_mode = NetworkConfig::get()->getLocalGameMode();
race_manager->setMinorMode(game_mode.first);
// We use single mode in network even it's grand prix
race_manager->setMajorMode(RaceManager::MAJOR_MODE_SINGLE);
if (game_mode.first == RaceManager::MINOR_MODE_BATTLE)
race_manager->setMajorMode(game_mode.second);
else
{
// We use single mode in network even it's grand prix
race_manager->setMajorMode(RaceManager::MAJOR_MODE_SINGLE);
}
//I18N: In the networking lobby
core::stringw mode_name = NetworkConfig::get()->getModeName(u_data);

View File

@ -158,7 +158,7 @@ void ServerLobby::setup()
}
break;
}
case RaceManager::MINOR_MODE_3_STRIKES:
case RaceManager::MINOR_MODE_BATTLE:
{
auto it = m_available_kts.second.begin();
while (it != m_available_kts.second.end())

View File

@ -76,6 +76,7 @@ RaceManager::RaceManager()
m_started_from_overworld = false;
m_have_kart_last_position_on_overworld = false;
m_num_local_players = 0;
m_hit_capture_limit = 0;
setMaxGoal(0);
setTimeTarget(0.0f);
setReverseTrack(false);
@ -521,7 +522,7 @@ void RaceManager::startNextRace()
World::setWorld(new StandardRace());
else if(m_minor_mode==MINOR_MODE_TUTORIAL)
World::setWorld(new TutorialWorld());
else if(m_minor_mode==MINOR_MODE_3_STRIKES)
else if(m_minor_mode==MINOR_MODE_BATTLE)
World::setWorld(new ThreeStrikesBattle());
else if(m_minor_mode==MINOR_MODE_SOCCER)
World::setWorld(new SoccerWorld());

View File

@ -89,7 +89,11 @@ public:
enum MajorRaceModeType
{
MAJOR_MODE_GRAND_PRIX,
MAJOR_MODE_SINGLE
MAJOR_MODE_SINGLE,
MAJOR_MODE_FREE_FOR_ALL,
MAJOR_MODE_CAPTURE_THE_FLAG,
MAJOR_MODE_3_STRIKES
};
// quick method to tell the difference between battle modes and race modes
@ -112,7 +116,7 @@ public:
MINOR_MODE_OVERWORLD = LINEAR_RACE(3, false),
MINOR_MODE_TUTORIAL = LINEAR_RACE(4, false),
MINOR_MODE_3_STRIKES = BATTLE_ARENA(0),
MINOR_MODE_BATTLE = BATTLE_ARENA(0),
MINOR_MODE_SOCCER = BATTLE_ARENA(1),
MINOR_MODE_CUTSCENE = BATTLE_ARENA(2),
MINOR_MODE_EASTER_EGG = EASTER_EGG(0)
@ -138,7 +142,7 @@ public:
case MINOR_MODE_NORMAL_RACE: return IDENT_STD;
case MINOR_MODE_TIME_TRIAL: return IDENT_TTRIAL;
case MINOR_MODE_FOLLOW_LEADER: return IDENT_FTL;
case MINOR_MODE_3_STRIKES: return IDENT_STRIKES;
case MINOR_MODE_BATTLE: return IDENT_STRIKES;
case MINOR_MODE_EASTER_EGG: return IDENT_EASTER;
case MINOR_MODE_SOCCER: return IDENT_SOCCER;
default: assert(false);
@ -157,7 +161,7 @@ public:
case MINOR_MODE_NORMAL_RACE: return "/gui/mode_normal.png";
case MINOR_MODE_TIME_TRIAL: return "/gui/mode_tt.png";
case MINOR_MODE_FOLLOW_LEADER: return "/gui/mode_ftl.png";
case MINOR_MODE_3_STRIKES: return "/gui/mode_3strikes.png";
case MINOR_MODE_BATTLE: return "/gui/mode_3strikes.png";
case MINOR_MODE_EASTER_EGG: return "/gui/mode_easter.png";
case MINOR_MODE_SOCCER: return "/gui/mode_soccer.png";
default: assert(false); return NULL;
@ -179,7 +183,7 @@ public:
//I18N: Game mode
case MINOR_MODE_FOLLOW_LEADER: return _("Follow the Leader");
//I18N: Game mode
case MINOR_MODE_3_STRIKES: return _("3 Strikes Battle");
case MINOR_MODE_BATTLE: return _("3 Strikes Battle");
//I18N: Game mode
case MINOR_MODE_EASTER_EGG: return _("Egg Hunt");
//I18N: Game mode
@ -197,7 +201,7 @@ public:
case MINOR_MODE_NORMAL_RACE: return true;
case MINOR_MODE_TIME_TRIAL: return true;
case MINOR_MODE_FOLLOW_LEADER: return true;
case MINOR_MODE_3_STRIKES: return true;
case MINOR_MODE_BATTLE: return true;
case MINOR_MODE_EASTER_EGG: return false;
case MINOR_MODE_SOCCER: return true;
default: assert(false); return false;
@ -216,7 +220,7 @@ public:
if (name==IDENT_STD ) return MINOR_MODE_NORMAL_RACE;
else if (name==IDENT_TTRIAL ) return MINOR_MODE_TIME_TRIAL;
else if (name==IDENT_FTL ) return MINOR_MODE_FOLLOW_LEADER;
else if (name==IDENT_STRIKES) return MINOR_MODE_3_STRIKES;
else if (name==IDENT_STRIKES) return MINOR_MODE_BATTLE;
else if (name==IDENT_EASTER ) return MINOR_MODE_EASTER_EGG;
else if (name==IDENT_SOCCER) return MINOR_MODE_SOCCER;
@ -336,7 +340,7 @@ private:
int m_coin_target;
float m_time_target;
int m_goal_target;
int m_hit_capture_limit;
void startNextRace(); // start a next race
friend bool operator< (const KartStatus& left, const KartStatus& right)
@ -518,7 +522,7 @@ public:
case MINOR_MODE_NORMAL_RACE: return "normal";
case MINOR_MODE_TIME_TRIAL: return "time-trial";
case MINOR_MODE_FOLLOW_LEADER: return "follow-the-leader";
case MINOR_MODE_3_STRIKES: return "battle";
case MINOR_MODE_BATTLE: return "battle";
case MINOR_MODE_EASTER_EGG: return "egg-hunt";
case MINOR_MODE_SOCCER: return "soccer";
default: assert(false); return "";
@ -538,7 +542,7 @@ public:
*/
int getNumLaps() const
{
if(m_minor_mode==MINOR_MODE_3_STRIKES ||
if(m_minor_mode==MINOR_MODE_BATTLE ||
m_minor_mode==MINOR_MODE_FOLLOW_LEADER ||
m_minor_mode==MINOR_MODE_SOCCER ||
m_minor_mode==MINOR_MODE_EASTER_EGG )
@ -737,7 +741,7 @@ public:
// and each World may set m_use_highscores to true or false.
// The reason for this duplication is that we might want to know
// whether to display highscores without creating a World.
return m_minor_mode != MINOR_MODE_3_STRIKES &&
return m_minor_mode != MINOR_MODE_BATTLE &&
m_minor_mode != MINOR_MODE_SOCCER &&
m_minor_mode != MINOR_MODE_FOLLOW_LEADER;
} // modeHasHighscore
@ -837,6 +841,14 @@ public:
void configGrandPrixResultFromNetwork(NetworkString& ns);
// ------------------------------------------------------------------------
void clearNetworkGrandPrixResult();
// ------------------------------------------------------------------------
void setHitCaptureTime(int hc, float time)
{
m_hit_capture_limit = hc;
m_time_target = time;
}
// ------------------------------------------------------------------------
int getHitCaptureLimit() const { return m_hit_capture_limit; }
}; // RaceManager

View File

@ -160,6 +160,22 @@ void CreateServerScreen::updateMoreOption(int game_mode)
m_more_options_spinner->setValue(0);
break;
}
case 2:
{
m_more_options_text->setVisible(true);
m_more_options_spinner->setVisible(true);
m_more_options_spinner->clearLabels();
//I18N: In the create server screen, show various battle mode available
m_more_options_text->setText(_("Battle mode"), false);
m_more_options_spinner->setVisible(true);
m_more_options_spinner->clearLabels();
//I18N: In the create server screen for battle server
m_more_options_spinner->addLabel(_("Free For All"));
//I18N: In the create server screen for battle server
m_more_options_spinner->addLabel(_("Capture The Flag"));
m_more_options_spinner->setValue(0);
break;
}
case 3:
{
m_more_options_text->setVisible(true);
@ -195,9 +211,6 @@ void CreateServerScreen::onUpdate(float delta)
if(!STKHost::existHost())
return;
//FIXME If we really want a gui, we need to decide what else to do here
// For now start the (wrong i.e. client) lobby, to prevent to create
// a server more than once.
NetworkingLobby::getInstance()->push();
} // onUpdate
@ -315,20 +328,25 @@ void CreateServerScreen::createServer()
if (m_more_options_spinner->isVisible())
{
int esi = m_more_options_spinner->getValue();
if (gamemode_widget->getSelection(PLAYER_ID_GAME_MASTER)
!= 3/*is soccer*/)
{
// Grand prix track count
if (esi > 0)
server_cfg << " --network-gp=" << esi;
}
else
if (gamemode_widget->getSelection(PLAYER_ID_GAME_MASTER) ==
3/*is soccer*/)
{
if (esi == 0)
server_cfg << " --soccer-timed";
else
server_cfg << " --soccer-goals";
}
else if (gamemode_widget->getSelection(PLAYER_ID_GAME_MASTER) ==
2/*is battle*/)
{
server_cfg << " --battle-mode=" << esi;
}
else
{
// Grand prix track count
if (esi > 0)
server_cfg << " --network-gp=" << esi;
}
}
SeparateProcess* sp =

View File

@ -85,7 +85,7 @@ RaceGUI::RaceGUI()
m_negative_timer_additional_width = area.Width;
if (race_manager->getMinorMode()==RaceManager::MINOR_MODE_FOLLOW_LEADER ||
race_manager->getMinorMode()==RaceManager::MINOR_MODE_3_STRIKES ||
race_manager->getMinorMode()==RaceManager::MINOR_MODE_BATTLE ||
race_manager->getNumLaps() > 9)
m_lap_width = font->getDimension(L"99/99").Width;
else

View File

@ -769,7 +769,7 @@ void RaceGUIBase::drawGlobalPlayerIcons(int bottom_margin)
if (kart->getPosition() == -1)//if position is not set
{
//we use karts ordered by id only
//(needed for beginning of MINOR_MODE_3_STRIKES)
//(needed for beginning of MINOR_MODE_BATTLE)
kart= world->getKart(position-1);
}
@ -781,7 +781,7 @@ void RaceGUIBase::drawGlobalPlayerIcons(int bottom_margin)
int lap = info.lap;
// In battle mode mode there is no distance along track etc.
if( minor_mode==RaceManager::MINOR_MODE_3_STRIKES ||
if( minor_mode==RaceManager::MINOR_MODE_BATTLE ||
minor_mode==RaceManager::MINOR_MODE_EASTER_EGG)
{
x = x_base;

View File

@ -65,6 +65,7 @@ void RaceSetupScreen::init()
RibbonWidget* w = getWidget<RibbonWidget>("difficulty");
assert( w != NULL );
race_manager->setMajorMode(RaceManager::MAJOR_MODE_SINGLE);
if (UserConfigParams::m_difficulty == RaceManager::DIFFICULTY_BEST &&
PlayerManager::getCurrentPlayer()->isLocked("difficulty_best"))
{
@ -108,10 +109,10 @@ void RaceSetupScreen::init()
}
irr::core::stringw name4 = irr::core::stringw(
RaceManager::getNameOf(RaceManager::MINOR_MODE_3_STRIKES)) + L"\n";
RaceManager::getNameOf(RaceManager::MINOR_MODE_BATTLE)) + L"\n";
//FIXME: avoid duplicating descriptions from the help menu!
name4 += _("Hit others with weapons until they lose all their lives.");
w2->addItem( name4, IDENT_STRIKES, RaceManager::getIconOf(RaceManager::MINOR_MODE_3_STRIKES));
w2->addItem( name4, IDENT_STRIKES, RaceManager::getIconOf(RaceManager::MINOR_MODE_BATTLE));
irr::core::stringw name5 = irr::core::stringw(
RaceManager::getNameOf(RaceManager::MINOR_MODE_SOCCER)) + L"\n";
@ -223,7 +224,8 @@ void RaceSetupScreen::eventCallback(Widget* widget, const std::string& name,
}
else if (selectedMode == IDENT_STRIKES)
{
race_manager->setMinorMode(RaceManager::MINOR_MODE_3_STRIKES);
race_manager->setMinorMode(RaceManager::MINOR_MODE_BATTLE);
race_manager->setMajorMode(RaceManager::MAJOR_MODE_3_STRIKES);
UserConfigParams::m_game_mode = CONFIG_CODE_3STRIKES;
ArenasScreen::getInstance()->push();
}

View File

@ -155,7 +155,7 @@ void TrackInfoScreen::init()
// -------------
const int local_players = race_manager->getNumLocalPlayers();
const bool has_AI =
(race_manager->getMinorMode() == RaceManager::MINOR_MODE_3_STRIKES ||
(race_manager->getMinorMode() == RaceManager::MINOR_MODE_BATTLE ||
race_manager->getMinorMode() == RaceManager::MINOR_MODE_SOCCER ?
m_track->hasNavMesh() && (max_arena_players - local_players) > 0 :
race_manager->hasAI());
@ -177,7 +177,7 @@ void TrackInfoScreen::init()
race_manager->setNumKarts(num_ai + local_players);
// Set the max karts supported based on the battle arena selected
if(race_manager->getMinorMode()==RaceManager::MINOR_MODE_3_STRIKES ||
if(race_manager->getMinorMode()==RaceManager::MINOR_MODE_BATTLE ||
race_manager->getMinorMode()==RaceManager::MINOR_MODE_SOCCER)
{
m_ai_kart_spinner->setMax(max_arena_players - local_players);
@ -190,7 +190,7 @@ void TrackInfoScreen::init()
m_ai_kart_spinner->setMin(std::max(0, 3 - local_players));
}
// Make sure in battle and soccer mode at least 1 ai for single player
else if((race_manager->getMinorMode()==RaceManager::MINOR_MODE_3_STRIKES ||
else if((race_manager->getMinorMode()==RaceManager::MINOR_MODE_BATTLE ||
race_manager->getMinorMode()==RaceManager::MINOR_MODE_SOCCER) &&
local_players == 1 &&
!UserConfigParams::m_artist_debug_mode)
@ -366,7 +366,7 @@ void TrackInfoScreen::onEnterPressedInternal()
const int max_arena_players = m_track->getMaxArenaPlayers();
const int local_players = race_manager->getNumLocalPlayers();
const bool has_AI =
(race_manager->getMinorMode() == RaceManager::MINOR_MODE_3_STRIKES ||
(race_manager->getMinorMode() == RaceManager::MINOR_MODE_BATTLE ||
race_manager->getMinorMode() == RaceManager::MINOR_MODE_SOCCER ?
m_track->hasNavMesh() && (max_arena_players - local_players) > 0 :
race_manager->hasAI());

View File

@ -256,7 +256,8 @@ void TracksScreen::init()
if (UserConfigParams::m_num_laps == 0 ||
UserConfigParams::m_num_laps > 20)
UserConfigParams::m_num_laps = 1;
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_3_STRIKES)
if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_BATTLE &&
race_manager->getMajorMode() == RaceManager::MAJOR_MODE_FREE_FOR_ALL)
{
getWidget("lap-text")->setVisible(false);
m_laps->setVisible(false);
@ -266,6 +267,14 @@ void TracksScreen::init()
m_reversed->setVisible(true);
m_reversed->setState(UserConfigParams::m_random_arena_item);
}
else if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_BATTLE &&
race_manager->getMajorMode() == RaceManager::MAJOR_MODE_CAPTURE_THE_FLAG)
{
getWidget("lap-text")->setVisible(false);
m_laps->setVisible(false);
getWidget("reverse-text")->setVisible(false);
m_reversed->setVisible(false);
}
else if (race_manager->getMinorMode() == RaceManager::MINOR_MODE_SOCCER)
{
m_laps->setVisible(true);
@ -422,7 +431,7 @@ void TracksScreen::voteForPlayer()
assert(m_laps);
assert(m_reversed);
// Remember reverse globally for each stk instance if not arena
if (race_manager->getMinorMode() != RaceManager::MINOR_MODE_3_STRIKES &&
if (race_manager->getMinorMode() != RaceManager::MINOR_MODE_BATTLE &&
race_manager->getMinorMode() != RaceManager::MINOR_MODE_SOCCER)
m_reverse_checked = m_reversed->getState();
else

View File

@ -2090,7 +2090,7 @@ void Track::loadTrackModel(bool reverse_track, unsigned int mode_id)
// Only print warning if not in battle mode, since battle tracks don't have
// any quads or check lines.
if (CheckManager::get()->getCheckStructureCount()==0 &&
race_manager->getMinorMode()!=RaceManager::MINOR_MODE_3_STRIKES && !m_is_cutscene)
race_manager->getMinorMode()!=RaceManager::MINOR_MODE_BATTLE && !m_is_cutscene)
{
Log::warn("track", "No check lines found in track '%s'.",
m_ident.c_str());