]> ruin.nu Git - hbs.git/blobdiff - bs/fleet.cpp
emp works now too..
[hbs.git] / bs / fleet.cpp
index 2daa5cf052920866b68d158819a42e7a23c554d9..95ae6d35789a4ca360c794e71d2670a2947e7f3f 100644 (file)
@@ -237,15 +237,17 @@ void Fleet::distributeLossesGains(std::vector<Fleet*> fleets, int tick = 0)
        {
                string unittype = i->first;
 
-               cerr << "Distributing type: " << unittype << endl;
 
                if (m_Fleet[unittype].size() < 1)
                        continue;
                if (m_Fleet[unittype][0] == 0)
                        continue;
 
-               int totallost = m_Fleet[unittype][1] - m_Fleet[unittype][0];
+                
+               int totallost = fleet(unittype,1) - fleet(unittype, 0);
 
+
+               cerr << "Distributing type: " << unittype << " with a total loss of " << totallost << " units" << endl;
                
                for (vector<Fleet*>::iterator j = fleets.begin(); j != fleets.end(); ++j)
                {
@@ -266,7 +268,7 @@ std::vector<Fleet*> Fleet::calculateSide(std::vector<Fleet*> fleets, int stays =
                if (( tick - (*i)->ETA()) >= 0 && (tick - (*i)->ETA()) < stays)
                {
                        fl.push_back((*i));
-                       cerr << "Using fleet " << (*i)->name() << " for tick " << tick;
+                       cerr << "Using fleet " << (*i)->name() << " for tick " << tick << endl;
                }
                else if ((*i)->name() == "Home Planet")
                        fl.push_back((*i));
@@ -298,18 +300,17 @@ int Fleet::freeFleet(std:: string unittype, int tick = 0)
 void Fleet::takeShoot(std::string unittype, int number, std::map<std::string, int>& hitunits)
 {
 
-       cerr << unittype << ":  " << number << " in number\n";
        int guns = s_Units[unittype].guns() * number;
        if (guns == 0)
                return;
 
-       cerr << unittype << " with " << guns << " guns\n";
+       cerr << unittype << ": with " << guns << " guns\n";
 
        int gunsleft = guns;
        for (int count = 0; count < 3; ++count)//vector<string>::iterator i = s_Units[unittype].target().begin(); i != s_Units[unittype].target().end(); ++i)
        {
                string ta = s_Units[unittype].target(count);
-    cerr << "Shooting at target class: " << ta << endl;
+       cerr << "Shooting at target class: " << ta << endl;
                while (gunsleft > 0)
                {
        
@@ -319,7 +320,7 @@ void Fleet::takeShoot(std::string unittype, int number, std::map<std::string, in
                        {
 
                                if (m_Fleet[j->first].size() == 0)
-                                       break;
+                                       continue;
 
                                if (m_Fleet[j->first].size() == 1)
                                        m_Fleet[j->first].push_back(m_Fleet[j->first][0]);
@@ -329,7 +330,7 @@ void Fleet::takeShoot(std::string unittype, int number, std::map<std::string, in
                                if (m_Fleet[j->first][1] > 0  && ( ta == j->second.unitClass() || ta == "All"))
                                {
 
-                                       cerr << "Looking at target: " << j->first << endl;
+                               //      cerr << "Looking at target: " << j->first << endl;
                                        targets[j->first] = &m_Fleet[j->first][1];
                                }
 
@@ -349,9 +350,8 @@ void Fleet::takeShoot(std::string unittype, int number, std::map<std::string, in
 
                                if (m_Armor[j->first] <= 0 || m_Armor[j->first] > s_Units[j->first].armor())
                                        m_Armor[j->first] = s_Units[j->first].armor();
-                               float k = maxguns;
+                               double k = maxguns;
 
-                               int blaha = 0;
                                cerr << "Targets agility: " << s_Units[j->first].agility() << endl;
                                cerr << "Weaponspeed: " << s_Units[unittype].weaponSpeed() << endl;
                                while (k > 0)   
@@ -359,7 +359,14 @@ void Fleet::takeShoot(std::string unittype, int number, std::map<std::string, in
 
                                        if (*(j->second) <= 0)
                                                break;
-                                       k -= 100/(25+s_Units[unittype].weaponSpeed() - s_Units[j->first].agility());
+
+                                       int wpsp = s_Units[unittype].weaponSpeed();
+                                       int agil = s_Units[j->first].agility();
+
+                                       k -= float(100)/(25 + wpsp - agil);
+                                       //cout << "Used " << blaha << " guns to hit with one shot.\n";
+                                       //cout << "WPSP: " << wpsp << "\nAgil: " << agil << endl;
+
                                        m_Armor[j->first] -= s_Units[unittype].power();
                                        if (m_Armor[j->first] <= 0)
                                        {
@@ -398,7 +405,81 @@ void Fleet::takeShoot(std::string unittype, int number, std::map<std::string, in
 //
 void Fleet::takeEMP(std::string unittype, int number)
 {
+       int guns = s_Units[unittype].guns() * number;
+       if (guns == 0)
+               return;
+
+       cerr << unittype << ": with " << guns << " guns\n";
+
+       int gunsleft = guns;
+       for (int count = 0; count < 3; ++count)//vector<string>::iterator i = s_Units[unittype].target().begin(); i != s_Units[unittype].target().end(); ++i)
+       {
+               string ta = s_Units[unittype].target(count);
+       cerr << "Shooting at target class: " << ta << endl;
+               while (gunsleft > 0)
+               {
+       
+                       map<string, int*> targets;
+
+                       for (UnitList::iterator j = s_Units.begin(); j != s_Units.end(); ++j)
+                       {
+                               if (j->second.type() == "PDS")
+                                       continue;
+
+                               if (m_Fleet[j->first].size() == 0)
+                                       continue;
+
+                               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;
+
+                               if (m_Fleet[j->first][1] > 0  && ( ta == j->second.unitClass() || ta == "All"))
+                               {
+
+                               //      cerr << "Looking at target: " << j->first << endl;
+                                       targets[j->first] = &m_Fleet[j->first][1];
+                               }
+
+                       }
+
+                       if (targets.size() == 0)
+                               break;
+
+                       int total = 0;
+                       for (map<string, int*>::iterator j = targets.begin(); j != targets.end(); ++j)
+                               total += (*j->second);
+
+                       for (map<string, int*>::iterator j = targets.begin(); j != targets.end(); ++j)
+                       {
+                               int maxguns = (*j->second)/total * guns;
+                               cerr << "Now shooting at target: " << j->first << endl;
+
+                               double k = maxguns;
+
+                               int hits = 0;
+
+                               while (k > 0)   
+                               {
+
+                                       if (*(j->second) <= 0)
+                                               break;
+
+                                       int eres = s_Units[j->first].EMP();
 
+                                       k -= float(100)/(100-eres);
+                                       hits++;
+                                       blockFleet(j->first, 1);
+                               }
+
+                               cerr << hits << " units of type: " << j->first << " blocked\n";
+                               if (k <= 0)
+                                       gunsleft -= maxguns;
+                               else
+                                       gunsleft -= maxguns - k;
+                       }
+               }
+       }
 }
 
 //////////////////////////////////////////////////////////////////////////
@@ -467,3 +548,22 @@ void Fleet::printFleet()
                }
        }
 }
+
+//////////////////////////////////////////////////////////////////////////
+//
+void Fleet::blockFleet(std::string unittype, int number, int tick = 0)
+{
+       if (m_BlockedFleet[unittype].size() >= 1)
+       {
+               m_BlockedFleet[unittype][0] += number;
+               if (m_BlockedFleet[unittype].size() > 1)
+                       m_BlockedFleet[unittype][1] += number;
+               else
+                       m_BlockedFleet[unittype].push_back(m_BlockedFleet[unittype][0]);
+       }
+       else
+       {
+               m_BlockedFleet[unittype].push_back(number);
+               m_BlockedFleet[unittype].push_back(number);
+       }
+}