]> ruin.nu Git - hbs.git/blobdiff - bs/fleet.cpp
added code so you lose ships if you steal..
[hbs.git] / bs / fleet.cpp
index 1cdc04fb9d1a3e49e022d2a8ca4fc68175f81090..3df0972e0584f0b3d4e541b0de0b9964237b0b19 100644 (file)
@@ -28,6 +28,7 @@ UnitList Fleet::s_Units;
 Fleet::Fleet()
 {
        m_iETA = 0;
+       m_iStays = 3;
        m_sRace = "Cathaar";
 }
 
@@ -201,6 +202,23 @@ void Fleet::setFleet(string unittype, int number, int tick = 0)
        m_Fleet[unittype][tick] = number;
 }
 
+//////////////////////////////////////////////////////////////////////////
+//
+void Fleet::addFleet(std::string unittype, int number, int tick = 0)
+{
+       int earlier = 0;
+       int ticks = m_Fleet[unittype].size();
+
+       if (ticks != 0)
+               earlier = m_Fleet[unittype][ticks - 1];
+
+       for (int i = ticks; i <= tick; ++i)
+       {
+               m_Fleet[unittype].push_back(earlier);
+       }
+       m_Fleet[unittype][tick] += number;
+}
+
 //////////////////////////////////////////////////////////////////////////
 //
 int     Fleet::fleet(string unittype, int tick = 0)
@@ -315,12 +333,12 @@ std::vector<Fleet*> Fleet::calculateSide(std::vector<Fleet*> fleets, int stays =
        vector<Fleet*> fl;
        for (vector<Fleet*>::iterator i = fleets.begin(); i != fleets.end(); ++i)
        {
-               if (( tick - (*i)->ETA()) >= 0 && (tick - (*i)->ETA()) < stays)
+               if (( tick - (*i)->ETA()) >= 0 && (tick - (*i)->ETA()) < (*i)->stays())
                {
                        fl.push_back((*i));
                        cerr << "Using fleet " << (*i)->name() << " for tick " << tick << endl;
                }
-               else if ((*i)->name() == "Home Planet")
+               else if ((*i)->stays() < 0)
                        fl.push_back((*i));
        }
        return fl;
@@ -374,7 +392,8 @@ void Fleet::takeShoot(std::string unittype, int number, std::map<std::string, in
                                if (m_Fleet[j->first].size() == 0)
                                        continue;
 
-                               if (m_Fleet[j->first].size() == 1)
+
+                               if (m_Fleet[j->first].size() == 1 )
                                        m_Fleet[j->first].push_back(m_Fleet[j->first][0]);
 
                                //cerr << "Target is class: " << j->second.type() << endl;
@@ -478,6 +497,9 @@ void Fleet::takeEMP(std::string unittype, int number)
                                if (j->second.type() == "PDS")
                                        continue;
 
+                               if (freeFleet(j->first, 1) <= 0)
+                                       continue;
+
                                if (m_Fleet[j->first].size() == 0)
                                        continue;
 
@@ -514,7 +536,7 @@ void Fleet::takeEMP(std::string unittype, int number)
                                while (k > 0)   
                                {
 
-                                       if (*(j->second) <= 0)
+                                       if (*(j->second) <= blockedFleet(j->first, 1))
                                                break;
 
                                        int eres = s_Units[j->first].EMP();
@@ -568,10 +590,7 @@ void Fleet::addResource(std::string type, int number, int tick = 0)
 {
 
        int ticks = m_Resources[type].size();
-       int latest = 0;
-
-       if (ticks > 0)
-               latest = m_Resources[type][ticks - 1];
+       int latest = resource(type, tick - 1);
 
        for (int i = ticks; i <= tick; ++i)
                m_Resources[type].push_back(latest);
@@ -582,6 +601,9 @@ void Fleet::addResource(std::string type, int number, int tick = 0)
 //
 int Fleet::resource(std::string type, int tick = 0) const
 {
+       if (tick < 0)
+               return 0;
+
        vector<int>const* resource = 0;
        for (ResourceList::const_iterator i = m_Resources.begin(); i != m_Resources.end(); ++i)
        {
@@ -606,6 +628,13 @@ int Fleet::resource(std::string type, int tick = 0) const
        return resource->at(tick);
 }
 
+//////////////////////////////////////////////////////////////////////////
+//
+void Fleet::resetResources()
+{
+       m_Resources.clear() ;   
+}
+
 //////////////////////////////////////////////////////////////////////////
 //
 void Fleet::printFleet()
@@ -650,6 +679,7 @@ void Fleet::distributeCappedRoids(std::vector<Fleet*> fleets, int tick = 0)
        {
                string res = i->first;
 
+
                cerr << "Distributing type: " << res << endl;
                for (vector<int>::iterator j = i->second.begin(); j != i->second.end(); ++j)
                        cout << (*j) << endl;
@@ -674,9 +704,47 @@ void Fleet::distributeCappedRoids(std::vector<Fleet*> fleets, int tick = 0)
                        int lost =  totcapped * part;
 
                        cerr << (*j)->name() << " gaining " << lost << " " << res  << " since it's " << part * 100 << "% of the whole score, and it had : " << fl1 << " score last tick.. compared to fleet total of: " << score(0) <<  endl;
-                       (*j)->setResource(res, (*j)->resource(res,tick-1) + lost, tick);
+
+                       //(*j)->setResource(res, (*j)->resource(res,tick-1) + lost, tick);
+                       (*j)->addResource(res,lost, tick);
                }
        }
 }
 
+//////////////////////////////////////////////////////////////////////////
+//
+void Fleet::addFleet(std::map<string, int> units, int tick = 0)
+{
+       for (map<string, int>::iterator i = units.begin(); i != units.end(); ++i)
+               addFleet(i->first, i->second, tick);
+}
+
+//////////////////////////////////////////////////////////////////////////
+//
+int Fleet::stays() const
+{
+       return m_iStays;
+}
+
+//////////////////////////////////////////////////////////////////////////
+//
+void Fleet::setStays(int ticks)
+{
+       m_iStays = ticks;
+}
 
+//////////////////////////////////////////////////////////////////////////
+//
+void Fleet::calculateLostStealships(string unittype, std::map<std::string, int> stolen, int tick = 1)
+{
+       int stealscore = 0;
+       for (map<string, int>::iterator i = stolen.begin(); i != stolen.end(); ++i)
+       {
+               stealscore += stolen[i->first] * (s_Units[i->first].totRes() / 10.0);   
+       }
+
+       int lost = stealscore / (s_Units[unittype].totRes() / 10.0);
+
+       cerr << "Lost " << lost << " " << unittype << " due to stealing ships worth: " << stealscore << endl; 
+       killFleet(unittype, lost, tick);
+}