]> ruin.nu Git - hbs.git/commitdiff
battle algorithms are getting more and more mature and stats.conf is updated.
authorMichael Andreen <harv@ruin.nu>
Thu, 11 Apr 2002 00:03:46 +0000 (00:03 +0000)
committerMichael Andreen <harv@ruin.nu>
Thu, 11 Apr 2002 00:03:46 +0000 (00:03 +0000)
13 files changed:
bs/bsconf.cpp
bs/bsdoc.cpp
bs/bsview.cpp
bs/fleet.cpp
bs/fleetview.cpp
bs/fleetview.h
bs/planet.cpp
bs/ui/bsappbase.ui.h
bs/ui/roidseditview.ui
bs/ui/roidseditview.ui.h
bs/ui/tickviewbase.ui
bs/ui/tickviewbase.ui.h
share/stats.conf

index 874d6b9e38d1f20ccf483af79696871797c77af4..478b8d456bb64621effb19fe78ae09fbd235bb91 100644 (file)
@@ -106,8 +106,13 @@ bool BSConf::loadStats()
                                units[race].setArmor(temp.toInt());
                                t1 >> temp;
                                units[race].setEMP(temp.toInt());
-                               t1 >> temp;
-                               units[race].setTotalResources(temp.toInt());
+                               QString metal;
+                               QString crystal;
+                               QString eonium;
+                               t1 >> metal;
+                               t1 >> crystal;
+                               t1 >> eonium;
+                               units[race].setTotalResources(metal.toInt() + crystal.toInt() + eonium.toInt());
                                t1 >> temp;
                                units[race].setFuel(temp.toInt());
                                t1 >> temp;
index 9d3c21ba8c10323052bdd8a28be1282dadbbc8ea..fcfbcb9604fb486eefe5df27bce17320cfd1d294 100644 (file)
@@ -64,7 +64,7 @@ int BSDoc::newBattle(QString name)
 {
        m_Battles[name]["Friendly"]["Home Planet"] = new Planet();;
        m_Battles[name]["Friendly"]["Home Fleet"] = new Fleet();
-       m_Battles[name]["Hostile"];
+       m_Battles[name]["Hostile"]["Evil guy"] = new Fleet();
 
        //Planet* pl = dynamic_cast<Planet*>(m_Battles[name]["Friendly"]["Home Planet"]);
        modified = true;
index 005c4438eaba1d03be40b5a56610ac460ddaa284..44ddfa43acdc832f7b82681ee4a886e9b431ed08 100644 (file)
@@ -100,6 +100,8 @@ BSView::BSView(QWidget *parent, BSDoc *doc) : QSplitter(parent)
        connect(m_NumberView, SIGNAL(selectionChanged(QListViewItem *)), SLOT(slotFleetSelection(QListViewItem *)));
        connect(m_FleetView, SIGNAL(fleetChanged(const Fleet*)), SLOT(slotFleetChanged(const Fleet*)));
        connect(m_GenericFleetView, SIGNAL(fleetChanged(const Fleet*)), SLOT(slotFleetChanged(const Fleet*)));
+       connect(m_TickView, SIGNAL(ticksChanged(int,int)), m_FleetView, SLOT(slotViewTickRange(int,int)));
+       connect(m_TickView, SIGNAL(ticksChanged(int,int)), m_GenericFleetView, SLOT(slotViewTickRange(int,int)));
 }
 
 BSView::~BSView()
@@ -400,6 +402,7 @@ void BSView::updateFleetView()
                        delete m_FleetView;
                        m_FleetView = new FleetView(fl, friendly);
                        connect(m_FleetView, SIGNAL(fleetChanged(const Fleet*)), SLOT(slotFleetChanged(const Fleet*)));
+                       connect(m_TickView, SIGNAL(ticksChanged(int,int)), m_FleetView, SLOT(slotViewTickRange(int,int)));
                        m_FleetViews->addWidget(m_FleetView, 1);
                }
                m_FleetViews->raiseWidget(1);
index 432f16595efadab7d1e8c479fa8cb03678ac7292..f0fb8e1dee9d07d45c42c8d0784d65d6f8b5c907 100644 (file)
@@ -117,7 +117,7 @@ void Fleet::setUnits(UnitList& units)
 {
        s_Units = units;
 
-       /*
+       
 
        for (UnitList::iterator i = s_Units.begin(); i != s_Units.end(); i++)
        {
@@ -139,7 +139,7 @@ void Fleet::setUnits(UnitList& units)
                        << s_Units[(*i).first].ETA() << "\t"
                        << s_Units[(*i).first].type() << endl;
        }
-       */
+       
 }
 
 //////////////////////////////////////////////////////////////////////////
@@ -183,10 +183,15 @@ unsigned Fleet::score(int tick = 0) const
 //
 void Fleet::setFleet(string unittype, int number, int tick = 0)
 {
-       if (m_Fleet[unittype].size() <= tick)
+       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(number);
-               return;
+               m_Fleet[unittype].push_back(earlier);
        }
        m_Fleet[unittype][tick] = number;
 }
@@ -202,7 +207,7 @@ int  Fleet::fleet(string unittype, int tick = 0)
        --ticks;
 
        if (ticks < tick)
-               m_Fleet[unittype][ticks];
+               return m_Fleet[unittype][ticks];
 
        return m_Fleet[unittype][tick];
 }
@@ -218,7 +223,7 @@ void Fleet::addToThis(std::vector<Fleet*> fleets, int tick = 0)
 
                for (vector<Fleet*>::iterator j = fleets.begin(); j != fleets.end(); ++j)
                {
-               // FIXTHIS!!    m_Fleet[i->first][0] += j->fleet(i->first, tick);
+                       m_Fleet[i->first][0] += (*j)->fleet(i->first, tick);
                }
        }
 }
@@ -227,6 +232,22 @@ void Fleet::addToThis(std::vector<Fleet*> fleets, int tick = 0)
 //
 void Fleet::distributeLossesGains(std::vector<Fleet*> fleets, int tick = 0)
 {
+       for (UnitList::iterator i = s_Units.begin(); i != s_Units.end(); ++i)
+       {
+               string unittype = i->first;
+               if (m_Fleet[unittype].size() < 1)
+                       break;
+    if (m_Fleet[unittype][0] == 0)
+                       break;
+
+               int totallost = m_Fleet[unittype][1] - m_Fleet[unittype][0];
+               
+               for (vector<Fleet*>::iterator j = fleets.begin(); j != fleets.end(); ++j)
+               {
+                       int lost =  totallost * ( (*j)->fleet(unittype, tick - 1) / m_Fleet[unittype][0] );
+                       (*j)->setFleet(unittype, (*j)->fleet(unittype, tick - 1) + lost, tick);
+               }
+       }
 }
 
 //////////////////////////////////////////////////////////////////////////
@@ -248,12 +269,18 @@ std::vector<Fleet*> Fleet::calculateSide(std::vector<Fleet*> fleets, int stays =
 //
 int Fleet::freeFleet(std:: string unittype, int tick = 0)
 {
-       if (m_Fleet[unittype].size() == 0)
-               return 0;
-       if (m_BlockedFleet[unittype].size() < tick)
-               return m_Fleet[unittype][tick];
+       int bticks = m_BlockedFleet[unittype].size();
+
+       --bticks;
+
+       if (bticks < tick)
+               return fleet(unittype, tick);
 
-       return m_Fleet[unittype][tick] - m_BlockedFleet[unittype][tick];
+
+       int free = fleet(unittype,tick) - m_BlockedFleet[unittype][tick];
+       if (free < 0)
+               return 0;
+       return free;
 }
 
 
@@ -261,13 +288,19 @@ 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;
-       int power = s_Units[unittype].power() * number;
+       if (guns == 0)
+               return;
+
+       cerr << unittype << " with " << guns << " guns\n";
 
        int gunsleft = guns;
-       for (vector<string>::iterator i = s_Units[unittype].target().begin(); i != s_Units[unittype].target().end(); ++i)
+       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)
                {
        
@@ -275,16 +308,27 @@ void Fleet::takeShoot(std::string unittype, int number, std::map<std::string, in
 
                        for (UnitList::iterator j = s_Units.begin(); j != s_Units.end(); ++j)
                        {
+
                                if (m_Fleet[j->first].size() == 0)
                                        break;
 
                                if (m_Fleet[j->first].size() == 1)
                                        m_Fleet[j->first].push_back(m_Fleet[j->first][0]);
 
-                               if (m_Fleet[j->first][1] > 0 && (*i) == j->second.type())
+                               //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);
@@ -292,11 +336,15 @@ void Fleet::takeShoot(std::string unittype, int number, std::map<std::string, in
                        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;
 
                                if (m_Armor[j->first] <= 0 || m_Armor[j->first] > s_Units[j->first].armor())
                                        m_Armor[j->first] = s_Units[j->first].armor();
-                               int k = maxguns;
+                               float k = maxguns;
+
+                               int blaha = 0;
+                               cerr << "Targets agility: " << s_Units[j->first].agility() << endl;
+                               cerr << "Weaponspeed: " << s_Units[unittype].weaponSpeed() << endl;
                                while (k > 0)   
                                {
 
@@ -308,6 +356,7 @@ void Fleet::takeShoot(std::string unittype, int number, std::map<std::string, in
                                        {
                                                m_Armor[j->first] = s_Units[j->first].armor();
                                                (*j->second)--;
+                                               hitunits[j->first]++;
                                                
                                                //There is a chance that we're hitting a blocked ship.
                                                if (m_BlockedFleet[j->first].size() >= 1)
@@ -323,7 +372,10 @@ void Fleet::takeShoot(std::string unittype, int number, std::map<std::string, in
                                                        }
                                                }
                                        }
+
                                }
+
+                               cerr << hitunits[j->first] << " units of type: " << j->first << "killed\n";
                                if (k <= 0)
                                        gunsleft -= maxguns;
                                else
index b16c70fc309d660243241983e78b63d157369739..3f2ff192957bdd842bb64e8209a52311e08f9ebb 100644 (file)
@@ -218,3 +218,19 @@ void FleetView::slotRoidsChanged(const QString& type, int value)
        }
 }
 
+/////////////////////////////////////////////////////////////////////
+//
+void FleetView::slotViewTickRange(int min = -1, int max = -1)
+{
+       if (min > -1)
+               m_iMinTick = min;
+       if (max > -1)
+               m_iMaxTick = max;
+       
+       for(vector<QString>::iterator i = m_Names.begin(); i != m_Names.end(); ++i)
+       {
+               int before = m_Fleet->fleet(i->latin1(), m_iMinTick);
+               int after = m_Fleet->fleet(i->latin1(), m_iMaxTick);
+               m_UnitsLostSurvivedView[(*i)]->setText(QString("%1").arg(after - before));
+       }
+}
index adf543337ca9f1c7643ac17d5e1f46744964729a..e0f81e0f0f2b65257f044e56ae04ad4b5472dff1 100644 (file)
@@ -49,6 +49,9 @@ public:
        bool isFriendly();
 
        bool isModified();
+
+public slots:
+       void slotViewTickRange(int min = -1 , int max = -1);
        
 signals:
        void fleetChanged(const Fleet*);
@@ -75,6 +78,9 @@ protected:
 
        bool m_Modified;
 
+       int m_iMinTick;
+       int m_iMaxTick;
+
        std::vector<QString>      m_Names;
        std::map<QString, QLabel*>    m_UnitsLabel;
        std::map<QString, QLineEdit*> m_UnitsEdit;
index 4ae9c59e4d517e87b9047c7eb9b00dee837e3dad..41d92ac51eb2ed6004bab3b01c8009a46b8fdefb 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "planet.h"
 
+#include <iostream>
 using namespace std;
 
 Planet::Planet()
@@ -82,7 +83,11 @@ void Planet::setRoids(std::string type, int number)
 //
 void Planet::runBattle(std::vector<Fleet*> friendly, std::vector<Fleet*> hostile)
 {
-       for(int tick = 1; ; ++tick)
+       if (hostile.size() == 0)
+                       return;
+
+       int skipped = 0;
+       for(int tick = 1; skipped < 20; ++tick)
        {
                //See who's in the battle at the current tick
                vector<Fleet*> friends = calculateSide(friendly, 6, tick);
@@ -90,7 +95,12 @@ void Planet::runBattle(std::vector<Fleet*> friendly, std::vector<Fleet*> hostile
 
                // No idea to calculate anything if noone is there.. ;)
                if (hostiles.size() == 0)
-                       break;
+               {
+                       skipped++;
+                       continue;
+               }
+               else
+                       skipped = 0;
 
                Planet allFriends;
                allFriends.addToThis(friends);
@@ -104,7 +114,7 @@ void Planet::runBattle(std::vector<Fleet*> friendly, std::vector<Fleet*> hostile
                calcOneTick(&allFriends, &allHostiles, stealfriendly, stealhostile );
 
                allFriends.distributeLossesGains(friends, tick);
-               allHostiles.distributeLossesGains(friends, tick);
+               allHostiles.distributeLossesGains(hostiles, tick);
        }
 }
 
@@ -114,7 +124,7 @@ void Planet::calcOneTick(Planet* friendly, Fleet* hostile, std::map<std::string,
 {
        map<int, string> unitsinit; // order units after their ininitiative
        for (UnitList::iterator i = s_Units.begin(); i != s_Units.end(); ++i)
-               unitsinit[i->second.ETA()] = i->first;
+               unitsinit[i->second.initiative()] = i->first;
 
        for (map<int, string>::iterator i = unitsinit.begin(); i != unitsinit.end(); ++i)
        {
@@ -123,6 +133,8 @@ void Planet::calcOneTick(Planet* friendly, Fleet* hostile, std::map<std::string,
                
                string unittype = i->second;
 
+               cerr << "Initiative: " << s_Units[unittype].initiative() << " with unit: " << unittype << endl;
+
                if (s_Units[unittype].type() == "EMP")  
                {
                        hostiletemp->takeEMP(unittype, friendly->freeFleet(unittype, 1));
@@ -159,10 +171,10 @@ void Planet::calcOneTick(Planet* friendly, Fleet* hostile, std::map<std::string,
                }
 
                //set the the objects so they point at the modified objects
-               delete friendly;
-               friendly = friendlytemp;
-               delete hostile;
-               hostile = hostiletemp;
+               *friendly = *friendlytemp;
+               delete friendlytemp;
+               *hostile = *hostiletemp;
+               delete hostiletemp;
        }
 }
 
index da293f2786f9c3bbae29da3024db3847ca05953f..8d5da689d32821851a4ae957eb4f9feb92d8460a 100644 (file)
@@ -105,6 +105,6 @@ void BSAppBase::battleSimulate()
 {
      QApplication::setOverrideCursor( Qt::WaitCursor );
      
-     //doc->runBattleSimulation();
+     doc->runBattleSimulation();
      QApplication::restoreOverrideCursor();
 }
\ No newline at end of file
index e64e2a562a131e26bf7b493bbbf03d9e4c827fb4..bd0d94917974047e88b92386d243cbd9c71538ee 100644 (file)
 <includes>
     <include location="local" impldecl="in implementation">roidseditview.ui.h</include>
 </includes>
+<variables>
+    <variable>QString test;</variable>
+</variables>
 <signals>
     <signal>changed(const QString&amp;, int)</signal>
 </signals>
index 225af827f0d4c8def97187889fb77c6b49f160f1..e22a408540798be1dd3ca9bffb6025cec21bd9b1 100644 (file)
@@ -30,7 +30,7 @@ void RoidsEditView::setValue( const QString & type, unsigned value )
 void RoidsEditView::slotValueChanged( const QString & s )
 {
        QString type = sender()->name();
-    
+       
        if (type == "MetalEdit")
                type = tr("metal");
        else if (type == "CrystalEdit")
@@ -39,8 +39,8 @@ void RoidsEditView::slotValueChanged( const QString & s )
                type = tr("eonium");
        else if (type == "UninitEdit")
                type = tr("uninit");
-  else if (type == "ScoreEdit")
+       else if (type == "ScoreEdit")
                type = tr("score");
-    
+       test = type;
     emit changed(type, s.toInt());
 }
\ No newline at end of file
index 387d7bd1ee3035d6220354be990eaca533ef0abd..b75880849a9c231094505458a43a2a80009f6e67 100644 (file)
                 <number>1</number>
             </property>
             <property name="minValue">
-                <number>1</number>
+                <number>0</number>
+            </property>
+            <property name="value">
+                <number>0</number>
             </property>
         </widget>
         <widget class="QLabel">
@@ -57,7 +60,7 @@
                 <cstring>maxTickSpin</cstring>
             </property>
             <property name="minValue">
-                <number>1</number>
+                <number>0</number>
             </property>
         </widget>
         <widget class="QCheckBox">
 <includes>
     <include location="local" impldecl="in implementation">tickviewbase.ui.h</include>
 </includes>
+<signals>
+    <signal>ticksChanged(int,int);</signal>
+</signals>
 <slots>
     <slot access="protected">slotMaxTick( int i )</slot>
     <slot access="protected">slotMinTick( int i )</slot>
index 741e407ae7fe199838f4dbb3c05d3a8615d2d8ac..83c23f7be9cfe42ebe9c91e6cd05194129e9b6f2 100644 (file)
@@ -14,6 +14,7 @@ void CTickViewBase::slotMaxTick(int i)
 {
      if ( !oneTickCheck->isChecked())
         minTickSpin->setMaxValue(i);
+     
 }
 
 void CTickViewBase::slotMinTick( int i )
@@ -29,6 +30,7 @@ void CTickViewBase::slotTickChanged(int i)
        maxTickSpin->setValue(i);
        minTickSpin->setValue(i);
     }
+   emit ticksChanged( minTickSpin->value(), maxTickSpin->value());
 }
 
 void CTickViewBase::slotOneTick( bool b )
index df5e5e6c1eb145f238efdf0e91b5691921f81148..871362e02d48b59dfa5e8ac379ecb10d815d2c2a 100644 (file)
+Mesonic Cutter
+5      Co      Fi      Co      --      49      25      40      1       3       50      -1      400     400     800     0       0       PDS
+Tachyon Beamer
+5      Fr      Fr      Co      --      50      20      35      1       10      75      -1      750     750     1500    0       0       PDS
+Pulse Cannon
+5      De      De      Fr      All     51      15      30      1       20      150     -1      2250    2250    4000    0       0       PDS
+Hadron Turret
+5      Cr      Cr      De      All     52      10      25      1       30      225     -1      5000    5000    8000    0       0       PDS
+Ion Launcher
+5      Bs      Bs      Cr      All     53      5       20      1       60      350     -1      10000   10000   16000   0       0       PDS
+Harpy
+1      Fi      Fi      Co      Fr      11      38      37      3       1       5       65      1250    0       0       10      2       Normal
+Phoenix
+1      Co      Fr      Co      Fi      18      25      22      2       5       10      55      2250    250     0       20      3       Normal
+Gryphon
+1      Co      Cr      De      --      19      24      13      1       10      12      65      2250    750     0       25      3       Normal
+Centaur
+1      Fr      Fi      Co      --      24      23      45      7       2       25      65      3500    2500    0       65      3       Normal
+Chimera
+1      Fr      Fr      De      All     25      22      23      5       2       35      70      5500    1500    0       80      4       Normal
+Drake
+1      Fr      De      Fr      Co      26      19      17      5       3       45      85      6250    2000    0       95      4       Normal
+Pegasus
+1      De      Fi      Co      --      10      23      45      12      3       50      75      4000    8000    0       135     3       Normal
+Unicorn
+1      De      Bs      Cr      De      30      17      10      3       25      85      80      12000   4000    0       175     4       Normal
+Hydra
+1      Cr      Fr      Co      --      35      13      22      7       16      140     70      14000   9000    0       225     4       Normal
+Syren
+1      Cr      Cr      De      All     36      10      15      8       15      180     75      22000   8000    0       350     5       Normal
+Wyvern
+1      Bs      De      Fr      --      28      12      15      12      27      160     90      30000   24000   0       400     4       Normal
+Dragon
+1      Bs      Bs      Cr      --      39      5       10      12      40      500     95      70000   16000   0       700     5       Normal
 Spider
-2      Fi      Co      Fi      --      7       30      0       1       0       5       65      1250    10      2       EMP
+2      Fi      Co      Fi      --      0       30      0       1       0       5       65      0       1250    0       10      2       EMP
 Vindicator
-2      Fi      Fi      Co      --      21      40      42      1       2       3       50      1250    10      2       Normal
+2      Fi      Fi      Co      --      14      40      42      1       2       3       50      1250    0       0       10      2       Normal
 Scarab
-2      Co      Fr      Co      --      8       23      0       2       0       20      55      2500    20      3       EMP
+2      Co      Fr      Co      --      1       23      0       1       0       20      55      1750    1250    0       20      3       EMP
 Defender
-2      Co      Cr      De      Fr      27      25      15      1       7       20      75      2500    30      3       Normal
+2      Co      Cr      De      Fr      20      25      15      1       7       20      75      2000    500     0       30      3       Normal
 Roach
-2      Co      De      Cr      --      9       20      0       3       0       25      65      3000    40      3       EMP
-Black Widowa
-2      Fr      Fr      Co       --     10      20  0   6       0       30      70      7500    85      4       EMP
+2      Co      De      Cr      --      2       20      0       1       0       25      65      2750    1250    0       40      3       EMP
+Black Widow
+2      Fr      Co      Fr      --      3       20      0       5       0       30      70      4500    3000    0       85      4       EMP
 Widow Maker
-2      De      Bs      Cr      --      40      15      10      3       20      100     80      16000   160     4       Normal
+2      De      Bs      Cr      --      33      15      10      3       20      100     80      10000   6000    0       160     4       Normal
 Tarantula
-2      Cr      Cr      De      All     11      12      0       6       0       135     70      28000   320     4       EMP
+2      Cr      Cr      De      All     6       14      0       6       0       135     70      16000   12000   0       320     4       EMP
 Avenger
-2      Cr      Co      Fr      All     44      10      27      10      4       150     75      30000   340     5       Normal
+2      Cr      Co      Fr      All     37      10      27      10      4       150     75      22500   7500    0       340     5       Normal
 Mantis
-2      Cr      Bs      --      --      12      7       0       10      0       225     85      33000   400     5       EMP
+2      Cr      Bs      --      --      5       7       0       10      0       225     85      20000   13000   0       400     5       EMP
 Guardian
-2      Bs      Fi      Co      Fr      48      5       40      25      4       600     96      86000   700     5       Normal
+2      Bs      Fi      Co      Fr      41      5       40      25      4       600     96      60000   26000   0       700     5       Normal
 Scorpion
-2      Bs      Fi      Co      --      13      5       0       100     0       400     99      76000   750     5       EMP
+2      Bs      Fi      Co      --      4       5       0       90      0       400     99      50000   36000   0       750     5       EMP
+Vsharrack Fighter
+3      Fi      Fi      Co      --      7       40      45      2       2       3       40      1250    0       0       10      2       Cloak
+Daeraith Pulsar
+3      Fi      Fr      De      --      8       35      25      3       2       2       45      1300    250     0       10      2       Cloak
+Lyvidian Sentinel
+3      Fi      Co      Fr      All     9       30      25      2       3       5       50      1600    350     0       10      3       Cloak
+Culdassa Arrowhead
+3      Co      Fi      Co      --      15      15      40      9       1       10      30      1250    1250    0       20      3       Cloak
+Voracean Predator
+3      Co      Fr      Co      All     16      25      20      4       2       15      35      1500    1250    0       25      3       Cloak
+Andvordian Bomber
+3      Co      Bs      Cr      De      17      25      20      1       8       10      40      2250    750     0       35      3       Cloak
+Tzen Bolt Thrower
+3      Fr      Fr      Co      --      21      20      23      6       5       30      70      4000    3000    0       65      4       Cloak
+Hysperian Lancer
+3      Fr      De      Cr      --      22      18      20      4       7       35      60      3750    3750    0       75      4       Cloak
+Cryvellian Broadsword
+3      Fr      Cr      Bs      --      23      15      25      3       10      40      60      4250    3750    0       95      4       Cloak
+Kthal Fireblade
+3      De      Bs      De      --      29      10      5       4       50      65      85      18000   6000    0       165     4       Cloak
+Xentrallis Peacekeeper
+3      Cr      Cr      De      All     34      15      15      8       10      105     70      18000   12000   0       360     5       Cloak
+Valaerian Flagship
+3      Bs      Co      Fi      --      38      5       20      80      5       325     90      44000   34000   0       750     5       Cloak
+Corsair
+4      Fi      Fr      Co      --      12      45      25      2       1       1       15      400     350     0       5       2       Normal
+Cutlass
+4      Fi      Fi      Co      Fr      13      30      45      3       1       5       25      1250    0       0       10      2       Normal
+Smuggler
+4      Co      --      --      --      47      25      0       0       0       12      20      2000    600     0       25      3       Special
+Thief
+4      Fr      Co      Fi      --      42      20      25      2       4       22      60      1750    2250    0       75      4       Steal
+Cutter
+4      Fr      De      Co      Fi      27      20      20      4       5       35      60      5500    1500    0       65      4       Normal
+Buccaneer
+4      De      Bs      Cr      De      31      15      10      5       15      60      65      10000   6000    0       140     4       Normal
+Clipper
+4      De      De      Fr      All     32      18      20      15      5       65      65      4000    10000   0       150     4       Normal
+Marauder
+4      De      Fr      --      --      43      10      25      10      5       90      60      7500    8500    0       195     4       Steal
+Rogue
+4      Cr      De      Fr      --      44      10      20      8       10      95      40      8250    9750    0       410     5       Steal
+Pillager
+4      Cr      Cr      De      --      45      10      20      4       20      125     40      11000   13000   0       420     5       Steal
+Pirate
+4      Bs      Bs      Cr      --      46      6       10      5       30      275     80      28500   25500   0       700     5       Steal
+Man o' War
+4      Bs      Fr      Co      Fi      40      5       30      40      6       400     90      36000   40000   0       800     5       Normal
+Astro Pod
+0      Fr      --      --      --      48      20      0       0       0       10      55      1850    1850    0       125     4       Special