From a05e26bf0529ccdf6d94e8b547c537a777cd23ef Mon Sep 17 00:00:00 2001
From: funto66 <funto66@178a84e3-b1eb-0310-8ba1-8eac791a3b58>
Date: Fri, 21 Dec 2012 21:04:10 +0000
Subject: [PATCH] Soccer mode - WIP

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/christmas@12296 178a84e3-b1eb-0310-8ba1-8eac791a3b58
---
 data/gui/mode_soccer.png                 | Bin 9328 -> 12497 bytes
 src/modes/soccer_world.cpp               | 276 ++---------------------
 src/modes/soccer_world.hpp               |  34 +--
 src/race/race_manager.hpp                |   7 +
 src/states_screens/race_setup_screen.cpp |  15 ++
 5 files changed, 44 insertions(+), 288 deletions(-)

diff --git a/data/gui/mode_soccer.png b/data/gui/mode_soccer.png
index 8441dcae5e9699a38fc73803871eb7a1ac822833..957338904c71ba03c5c3234e972a3cb21bd5c6ca 100644
GIT binary patch
literal 12497
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
Gg!~8DPuRBr

literal 9328
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

diff --git a/src/modes/soccer_world.cpp b/src/modes/soccer_world.cpp
index 036efa252..0041f054f 100644
--- a/src/modes/soccer_world.cpp
+++ b/src/modes/soccer_world.cpp
@@ -39,14 +39,10 @@ SoccerWorld::SoccerWorld() : WorldWithRank()
 {
     WorldStatus::setClockMode(CLOCK_CHRONO);
     m_use_highscores = false;
-    m_insert_tire = 0;
-    
-    m_tire = irr_driver->getMesh( file_manager->getModelFile("tire.b3d") );
-    irr_driver->grabAllTextures(m_tire);
 }   // SoccerWorld
 
 //-----------------------------------------------------------------------------
-/** Initialises the three strikes battle. It sets up the data structure
+/** Initializes the soccer world. It sets up the data structure
  *  to keep track of points etc. for each kart.
  */
 void SoccerWorld::init()
@@ -65,9 +61,9 @@ void SoccerWorld::init()
     
     for(unsigned int n=0; n<kart_amount; n++)
     {
-        // create the struct that ill hold each player's lives
+        // create the struct that ill hold each player's number of goals
         SoccerInfo info;
-        info.m_goals         = 3;
+        info.m_goals         = 0;
         m_kart_info.push_back(info);
         
         // no positions in this mode
@@ -75,155 +71,19 @@ void SoccerWorld::init()
     }// next kart
     
     
-    BattleEvent evt;
+    SoccerEvent evt;
     evt.m_time = 0.0f;
     evt.m_kart_info = m_kart_info;
-    m_battle_events.push_back(evt);    
+    m_soccer_events.push_back(evt);    
     
 }   // SoccerWorld
 
-//-----------------------------------------------------------------------------
-/** Destructor. Clears all internal data structures, and removes the tire mesh
- *  from the mesh cache.
- */
-SoccerWorld::~SoccerWorld()
-{
-    m_tires.clearWithoutDeleting();
-
-    irr_driver->grabAllTextures(m_tire);
-    // Remove the mesh from the cache so that the mesh is properly
-    // freed once all refernces to it (which will happen once all
-    // karts are being freed, which would have a pointer to this mesh)
-    irr_driver->removeMeshFromCache(m_tire);
-}   // ~SoccerWorld
-
-//-----------------------------------------------------------------------------
-/** Adds two tires to each of the kart. The tires are used to represent 
- *  lifes.
- *  \param kart The pointer to the kart (not used here).
- *  \param node The scene node of this kart.
- */
-void SoccerWorld::kartAdded(AbstractKart* kart, scene::ISceneNode* node)
-{
-    float coord = -kart->getKartLength()*0.5f;
-    
-    scene::IMeshSceneNode* tire_node = irr_driver->addMesh(m_tire, node);
-    tire_node->setPosition(core::vector3df(-0.16f, 0.3f, coord - 0.25f));
-    tire_node->setScale(core::vector3df(0.4f, 0.4f, 0.4f));
-    tire_node->setRotation(core::vector3df(90.0f, 0.0f, 0.0f));
-    tire_node->setName("tire1");
-
-    tire_node = irr_driver->addMesh(m_tire, node);
-    tire_node->setPosition(core::vector3df(0.16f, 0.3f, coord - 0.25f));
-    tire_node->setScale(core::vector3df(0.4f, 0.4f, 0.4f));
-    tire_node->setRotation(core::vector3df(90.0f, 0.0f, 0.0f));
-    tire_node->setName("tire2");
-}   // kartAdded
-
-//-----------------------------------------------------------------------------
-/** Called when a kart is hit. 
- *  \param kart_id The world kart id of the kart that was hit.
- */
-void SoccerWorld::kartHit(const int kart_id)
-{
-    assert(kart_id >= 0);
-    assert(kart_id < (int)m_karts.size());
-    
-    // make kart lose a life
-    m_kart_info[kart_id].m_goals--;
-    
-    // record event
-    BattleEvent evt;
-    evt.m_time = getTime();
-    evt.m_kart_info = m_kart_info;
-    m_battle_events.push_back(evt);   
-    
-    updateKartRanks();
-        
-    // check if kart is 'dead'
-    if (m_kart_info[kart_id].m_goals < 1)
-    {
-        m_karts[kart_id]->finishedRace(WorldStatus::getTime());
-        scene::ISceneNode** wheels = m_karts[kart_id]->getKartModel()
-                                                     ->getWheelNodes();
-        if(wheels[0]) wheels[0]->setVisible(false);
-        if(wheels[1]) wheels[1]->setVisible(false);
-        if(wheels[2]) wheels[2]->setVisible(false);
-        if(wheels[3]) wheels[3]->setVisible(false);
-        eliminateKart(kart_id, /*notify_of_elimination*/ true);
-        m_insert_tire = 4;
-    }
-    
-    const unsigned int NUM_KARTS = getNumKarts();
-    int num_karts_many_lives = 0;
- 
-    for (unsigned int n = 0; n < NUM_KARTS; ++n)
-    {
-        if (m_kart_info[n].m_goals > 1) num_karts_many_lives++;
-    }
-    
-    // when almost over, use fast music
-    if (num_karts_many_lives<=1 && !m_faster_music_active)
-    {
-        music_manager->switchToFastMusic();
-        m_faster_music_active = true;
-    }
-    
-    scene::ISceneNode* kart_node = m_karts[kart_id]->getNode();
-    
-    // FIXME: sorry for this ugly const_cast, irrlicht doesn't seem to allow 
-    // getting a writable list of children, wtf??
-    core::list<scene::ISceneNode*>& children = 
-        const_cast<core::list<scene::ISceneNode*>&>(kart_node->getChildren());
-    for (core::list<scene::ISceneNode*>::Iterator it = children.begin(); 
-                                                  it != children.end(); it++)
-    {
-        scene::ISceneNode* curr = *it;
-
-        if (core::stringc(curr->getName()) == "tire1")
-        {
-            curr->setVisible(m_kart_info[kart_id].m_goals >= 3);
-        }
-        else if (core::stringc(curr->getName()) == "tire2")
-        {
-            curr->setVisible(m_kart_info[kart_id].m_goals >= 2);
-        }
-    }
-    
-    // schedule a tire to be thrown away (but can't do it in this callback
-    // because the caller is currently iterating the list of track objects)
-    m_insert_tire++;
-    core::vector3df wheel_pos(m_karts[kart_id]->getKartWidth()*0.5f, 
-                              0.0f, 0.0f);
-    m_tire_position = kart_node->getPosition() + wheel_pos;
-    m_tire_rotation = 0;
-    if(m_insert_tire > 1)
-    {
-        m_tire_position = kart_node->getPosition();
-        m_tire_rotation = m_karts[kart_id]->getHeading();
-    }
-
-    for(unsigned int i=0; i<4; i++)
-    {
-        m_tire_offsets[i] = m_karts[kart_id]->getKartModel()
-                            ->getWheelGraphicsPosition(i).toIrrVector();
-        m_tire_offsets[i].rotateXZBy(-m_tire_rotation / M_PI * 180 + 180);
-        m_tire_radius[i] = m_karts[kart_id]->getKartModel()
-                                           ->getWheelGraphicsRadius(i);
-    }
- 
-    m_tire_dir = m_karts[kart_id]->getKartProperties()->getKartDir();
-    if(m_insert_tire == 5 && m_karts[kart_id]->isWheeless())
-        m_insert_tire = 0;
-
-}   // kartHit
-
 //-----------------------------------------------------------------------------
 /** Returns the internal identifier for this race.
  */
 const std::string& SoccerWorld::getIdent() const
 {
-    return IDENT_STRIKES;
+    return IDENT_SOCCER;
 }   // getIdent
 
 //-----------------------------------------------------------------------------
@@ -235,59 +95,7 @@ void SoccerWorld::update(float dt)
     WorldWithRank::update(dt);
     WorldWithRank::updateTrack(dt);
     
-    core::vector3df tire_offset;
-    std::string tire;
-    float scale = 0.5f;
-    float radius = 0.5f;
-    PhysicalObject::bodyTypes tire_model;
-
-    // insert blown away tire(s) now if was requested
-    while (m_insert_tire > 0)
-    {        
-        if(m_insert_tire == 1)
-        {
-            tire_offset = core::vector3df(0.0f, 0.0f, 0.0f);
-            tire = file_manager->getModelFile("tire.b3d");
-            scale = 0.5f;
-            radius = 0.5f;
-            tire_model = PhysicalObject::MP_CYLINDER_Y;
-        }
-        else
-        {
-            scale = 1.0f;
-            tire_model = PhysicalObject::MP_CYLINDER_X;
-            radius = m_tire_radius[m_insert_tire-2];
-            tire_offset = m_tire_offsets[m_insert_tire-2];
-            if     (m_insert_tire == 2)
-                tire = m_tire_dir+"/wheel-rear-left.b3d";
-            else if(m_insert_tire == 3)
-                tire = m_tire_dir+"/wheel-front-left.b3d";
-            else if(m_insert_tire == 4)
-                tire = m_tire_dir+"/wheel-front-right.b3d";
-            else if(m_insert_tire == 5)
-                tire = m_tire_dir+"/wheel-rear-right.b3d";
-        }
-
-        TrackObjectManager* tom = m_track->getTrackObjectManager();        
-        PhysicalObject* obj = 
-            tom->insertObject(tire,
-                              tire_model,
-                              15 /* mass */,
-                              radius /* radius */,
-                              core::vector3df(800.0f,0,m_tire_rotation 
-                                                      / M_PI * 180 + 180) ,
-                              m_tire_position + tire_offset,
-                              core::vector3df(scale,scale,scale) /* scale */);
-        
-        // FIXME: orient the force relative to kart orientation
-        obj->getBody()->applyCentralForce(btVector3(60.0f, 0.0f, 0.0f));
-
-        m_insert_tire--;
-        if(m_insert_tire == 1)
-            m_insert_tire = 0;
-        
-        m_tires.push_back(obj);
-    }
+    // TODO
 }   // update
 
 //-----------------------------------------------------------------------------
@@ -379,46 +187,20 @@ void SoccerWorld::restartRace()
     
     for(unsigned int n=0; n<kart_amount; n++)
     {
-        m_kart_info[n].m_goals         = 3;
+        m_kart_info[n].m_goals         = 0;
         
         // no positions in this mode
         m_karts[n]->setPosition(-1);
-        
-        scene::ISceneNode* kart_node = m_karts[n]->getNode();
-        
-        // FIXME: sorry for this ugly const_cast, irrlicht doesn't seem to allow getting a writable list of children, wtf??
-        core::list<scene::ISceneNode*>& children = const_cast<core::list<scene::ISceneNode*>&>(kart_node->getChildren());
-        for (core::list<scene::ISceneNode*>::Iterator it = children.begin(); it != children.end(); it++)
-        {
-            scene::ISceneNode* curr = *it;
-            
-            if (core::stringc(curr->getName()) == "tire1")
-            {
-                curr->setVisible(true);
-            }
-            else if (core::stringc(curr->getName()) == "tire2")
-            {
-                curr->setVisible(true);
-            }
-        }
-        
     }// next kart
     
-    // remove old battle events
-    m_battle_events.clear();
+    // remove old soccer events
+    m_soccer_events.clear();
 
-    // add initial battle event
-    BattleEvent evt;
+    // add initial occer event
+    SoccerEvent evt;
     evt.m_time = 0.0f;
     evt.m_kart_info = m_kart_info;
-    m_battle_events.push_back(evt);
-
-    PhysicalObject *obj;
-    for_in(obj, m_tires)
-    {
-        m_track->getTrackObjectManager()->removeObject(obj);
-    }
-    m_tires.clearWithoutDeleting();
+    m_soccer_events.push_back(evt);
 }   // restartRace
 
 //-----------------------------------------------------------------------------
@@ -435,34 +217,14 @@ void SoccerWorld::getKartsDisplayInfo(
         // reset color
         rank_info.lap = -1;
         
-        switch(m_kart_info[i].m_goals)
-        {
-            case 3:
-                rank_info.r = 0.0;
-                rank_info.g = 1.0;
-                rank_info.b = 0.0;
-                break;
-            case 2:
-                rank_info.r = 1.0;
-                rank_info.g = 0.9f;
-                rank_info.b = 0.0;
-                break;
-            case 1:
-                rank_info.r = 1.0;
-                rank_info.g = 0.0;
-                rank_info.b = 0.0;
-                break;
-            case 0:
-                rank_info.r = 0.5;
-                rank_info.g = 0.5;
-                rank_info.b = 0.5;
-                break;
-        }
+        rank_info.r = 0.5;
+        rank_info.g = 0.5;
+        rank_info.b = 0.5;
         
-        char lives[4];
-        sprintf(lives, "%i", m_kart_info[i].m_goals);
+        char goals[4];
+        sprintf(goals, "%i", m_kart_info[i].m_goals);
         
-        rank_info.m_text = lives;
+        rank_info.m_text = goals;
     }
 }   // getKartsDisplayInfo
 
diff --git a/src/modes/soccer_world.hpp b/src/modes/soccer_world.hpp
index 91daa5bd6..9108cf755 100644
--- a/src/modes/soccer_world.hpp
+++ b/src/modes/soccer_world.hpp
@@ -45,43 +45,19 @@ private:
     /** This vector contains an 'SoccerInfo' struct for every kart in the race.
     */
     std::vector<SoccerInfo> m_kart_info;
-
-    /** The mesh of the tire which is displayed when a kart loses a life. */
-    irr::scene::IMesh* m_tire;
-    
-    /** Indicates the number of tires that should be 
-     *  inserted into the track. */
-    int m_insert_tire;
-    
-    /** For tires that are blown away. */
-    core::vector3df m_tire_position;
-    
-    /** The original locations of the tires of a kart. */
-    core::vector3df m_tire_offsets[4];
-
-    /** The radius of the karts original tires. */
-    float m_tire_radius[4];
-
-    /** The directory of the original kart tires. */
-    std::string m_tire_dir;
-
-    /** A rotation to apply to the tires when inserting them. */
-    float m_tire_rotation;
-
-    PtrVector<PhysicalObject, REF> m_tires;
     
 public:
     
     /** Used to show a nice graph when battle is over */
-    struct BattleEvent
+    struct SoccerEvent
     {
         float m_time;
         std::vector<SoccerInfo> m_kart_info;
     };
-    std::vector<BattleEvent> m_battle_events;
+    std::vector<SoccerEvent> m_soccer_events;
     
     SoccerWorld();
-    virtual ~SoccerWorld();
+    virtual ~SoccerWorld() {}
     
     virtual void init();
     
@@ -92,7 +68,6 @@ public:
     // overriding World methods
     virtual void restartRace();
 
-    //virtual void getDefaultCollectibles(int& collectible_type, int& amount);
     virtual bool useFastMusicNearEnd() const { return false; }
     virtual void getKartsDisplayInfo(
                           std::vector<RaceGUIBase::KartIconDisplayInfo> *info);
@@ -101,10 +76,7 @@ public:
     
     virtual const std::string& getIdent() const;
     
-    virtual void kartHit(const int kart_id);
     virtual void update(float dt);
-    
-    virtual void kartAdded(AbstractKart* kart, scene::ISceneNode* node);
 
     
     void updateKartRanks();
diff --git a/src/race/race_manager.hpp b/src/race/race_manager.hpp
index f6bdea383..c5aa9a397 100644
--- a/src/race/race_manager.hpp
+++ b/src/race/race_manager.hpp
@@ -42,6 +42,7 @@ static const std::string IDENT_STD      ("STANDARD"        );
 static const std::string IDENT_TTRIAL   ("STD_TIMETRIAL"   );
 static const std::string IDENT_FTL      ("FOLLOW_LEADER"   );
 static const std::string IDENT_STRIKES  ("BATTLE_3_STRIKES");
+static const std::string IDENT_SOCCER   ("SOCCER"          );
 static const std::string IDENT_OVERWORLD("OVERWORLD"   );
 static const std::string IDENT_CUSTSCENE("CUTSCENE"   );
 
@@ -133,6 +134,7 @@ public:
             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_SOCCER:         return IDENT_SOCCER;
             default: assert(false); 
                      return IDENT_STD;  // stop compiler warning
         }
@@ -150,6 +152,7 @@ public:
             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_SOCCER:         return "/gui/mode_soccer.png";
             default: assert(false); return NULL;
         }
     }   // getIconOf
@@ -170,6 +173,8 @@ public:
             case MINOR_MODE_FOLLOW_LEADER:  return _("Follow the Leader");
             //I18N: Game mode
             case MINOR_MODE_3_STRIKES:      return _("3 Strikes Battle");
+            //I18N: Game mode
+            case MINOR_MODE_SOCCER:         return _("Soccer");
             default: assert(false); return NULL;
         }
     }
@@ -183,6 +188,7 @@ public:
             case MINOR_MODE_TIME_TRIAL:     return true;
             case MINOR_MODE_FOLLOW_LEADER:  return true;
             case MINOR_MODE_3_STRIKES:      return false;
+            case MINOR_MODE_SOCCER:         return false;
             default: assert(false); return NULL;
         }
     }
@@ -200,6 +206,7 @@ public:
         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_SOCCER)  return MINOR_MODE_SOCCER;
 
         assert(0);
         return MINOR_MODE_NONE;
diff --git a/src/states_screens/race_setup_screen.cpp b/src/states_screens/race_setup_screen.cpp
index 970dd4895..091cd41a8 100644
--- a/src/states_screens/race_setup_screen.cpp
+++ b/src/states_screens/race_setup_screen.cpp
@@ -33,6 +33,7 @@ const int CONFIG_CODE_NORMAL = 0;
 const int CONFIG_CODE_TIMETRIAL = 1;
 const int CONFIG_CODE_FTL = 2;
 const int CONFIG_CODE_3STRIKES = 3;
+const int CONFIG_CODE_SOCCER = 4;
 
 using namespace GUIEngine;
 DEFINE_SCREEN_SINGLETON( RaceSetupScreen );
@@ -127,6 +128,13 @@ void RaceSetupScreen::eventCallback(Widget* widget, const std::string& name, con
             race_manager->setNumKarts( race_manager->getNumLocalPlayers() ); // no AI karts;
             StateManager::get()->pushScreen( ArenasScreen::getInstance() );
         }
+        else if (selectedMode == IDENT_SOCCER)
+        {
+            race_manager->setMinorMode(RaceManager::MINOR_MODE_SOCCER);
+            UserConfigParams::m_game_mode = CONFIG_CODE_SOCCER;
+            race_manager->setNumKarts( race_manager->getNumLocalPlayers() ); // no AI karts;
+            StateManager::get()->pushScreen( ArenasScreen::getInstance() );
+        }
         else if (selectedMode == "locked")
         {
             unlock_manager->playLockSound();
@@ -229,6 +237,10 @@ void RaceSetupScreen::init()
         w2->addItem( name4, IDENT_STRIKES, RaceManager::getIconOf(RaceManager::MINOR_MODE_3_STRIKES));
     }
     
+    irr::core::stringw name5 = irr::core::stringw(
+        RaceManager::getNameOf(RaceManager::MINOR_MODE_SOCCER)) + L"\n";
+    name5 += _("Push the ball to the opposite cage to score goals. (Only in multiplayer games)");
+    w2->addItem( name5, IDENT_SOCCER, RaceManager::getIconOf(RaceManager::MINOR_MODE_SOCCER));
 
     w2->updateItemDisplay();
     
@@ -247,6 +259,9 @@ void RaceSetupScreen::init()
         case CONFIG_CODE_3STRIKES :
             w2->setSelection(IDENT_STRIKES, PLAYER_ID_GAME_MASTER, true);
             break;
+        case CONFIG_CODE_SOCCER :
+            w2->setSelection(IDENT_SOCCER, PLAYER_ID_GAME_MASTER, true);
+            break;
     }
     
     m_mode_listener = new GameModeRibbonListener(this);