QTfrontend/namegen.cpp
changeset 6024 d38da7c19e43
parent 6015 daffc14a518a
--- a/QTfrontend/namegen.cpp	Sun Sep 25 16:09:55 2011 +0200
+++ b/QTfrontend/namegen.cpp	Sun Sep 25 19:30:10 2011 +0200
@@ -26,151 +26,211 @@
 #include "hwconsts.h"
 
 
-HWNamegen::HWNamegen() :
-    typesAvailable(false)
-{
-
-    loadTypes();
-}
+HWNamegen::HWNamegen() {}
 
-HWNamegen::~HWNamegen()
-{
-}
-
+QList<QStringList> HWNamegen::TypesTeamnames;
+QList<QStringList> HWNamegen::TypesHatnames;
+bool HWNamegen::typesAvailable = false;
 
 
-void HWNamegen::teamRandomName(HWTeam & team, const int HedgehogNumber)
-{
-    randomNameByHat(team, HedgehogNumber);
-}
-
 void HWNamegen::teamRandomNames(HWTeam & team, const bool changeteamname)
 {
-    if ((TypesHatnames.size() > 0) && typesAvailable){
+    // load types if not already loaded
+    if (!typesAvailable)
+        if (!loadTypes())
+            return; // abort if loading failed
+
+    // abort if there are no hat types
+    if (TypesHatnames.size() <= 0)
+        return;
 
-        int kind = (rand()%(TypesHatnames.size()));
+    // the hat will influence which names the hogs get
+    int kind = (rand()%(TypesHatnames.size()));
+
+    // pick team name based on hat
+    if (changeteamname)
+    {
+        if (TypesTeamnames[kind].size() > 0)
+            team.setName(TypesTeamnames[kind][rand()%(TypesTeamnames[kind].size())]);
 
-        if (changeteamname){
-            if (TypesTeamnames[kind].size() > 0){
-                team.setName(TypesTeamnames[kind][rand()%(TypesTeamnames[kind].size())]);
-            }
-            team.setGrave(getRandomGrave());
-            team.setFort(getRandomFort());
-            team.setVoicepack("Default");
+        team.setGrave(getRandomGrave());
+        team.setFort(getRandomFort());
+        team.setVoicepack("Default");
+    }
+
+    QStringList dicts;
+    QStringList dict;
+
+    if ((TypesHatnames[kind].size()) <= 0)
+    {
+        dicts = dictsForHat(team.hedgehog(0).Hat);
+        dict  = dictContents(dicts[rand()%(dicts.size())]);
+    }
+
+    for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++)
+    {
+        if ((TypesHatnames[kind].size()) > 0)
+        {
+            HWHog hh = team.hedgehog(i);
+            hh.Hat = TypesHatnames[kind][rand()%(TypesHatnames[kind].size())];
+            team.setHedgehog(i,hh);
         }
 
-        //give each hedgehog a random name:
-        //TODO: load the dictionary only once! (right now it's loaded once for each hedgehog)
-        for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++)
+        // there is a chance that this hog has the same hat as the previous one
+        // let's reuse the hat-specific dict in this case
+        if ((i == 0) or (team.hedgehog(i).Hat != team.hedgehog(i-1).Hat))
         {
-            if ((TypesHatnames[kind].size()) > 0){
-                HWHog hh = team.hedgehog(i);
-                hh.Hat = TypesHatnames[kind][rand()%(TypesHatnames[kind].size())];
-                team.setHedgehog(i,hh);
-            }
-            randomNameByHat(team,i);
+            dicts = dictsForHat(team.hedgehog(i).Hat);
+            dict  = dictContents(dicts[rand()%(dicts.size())]);
         }
 
+        // give each hedgehog a random name
+        HWNamegen::teamRandomName(team,i,dict);
     }
 
 }
 
+void HWNamegen::teamRandomName(HWTeam & team, const int HedgehogNumber)
+{
+    QStringList dicts = dictsForHat(team.hedgehog(HedgehogNumber).Hat);
 
-void HWNamegen::randomNameByHat(HWTeam & team, const int HedgehogNumber)
+    QStringList dict = dictContents(dicts[rand()%(dicts.size())]);
+
+    teamRandomName(team, HedgehogNumber, dict);
+}
+
+void HWNamegen::teamRandomName(HWTeam & team, const int HedgehogNumber, const QStringList & dict)
 {
-    QStringList Dictionaries;
-    hatCfgLoad(team.hedgehog(HedgehogNumber).Hat,Dictionaries);
+    QStringList namesDict = dict;
 
-    QStringList Dictionary;
-    dictLoad(Dictionaries[rand()%(Dictionaries.size())],Dictionary);
+    for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++)
+    {
+        namesDict.removeOne(team.hedgehog(i).Name);
+    }
+
+    // if our dict doesn't have any new names we'll have to use duplicates
+    if (namesDict.size() < 1)
+        namesDict = dict;
 
     HWHog hh = team.hedgehog(HedgehogNumber);
-    hh.Name = Dictionary[rand()%(Dictionary.size())];
+
+    hh.Name = namesDict[rand()%(namesDict.size())];
+
     team.setHedgehog(HedgehogNumber, hh);
 }
 
-void HWNamegen::dictLoad(const QString filename, QStringList &list)
+QStringList HWNamegen::dictContents(const QString filename)
 {
-    list.clear();
+    QStringList list;
 
     QFile file;
+
+    // find .cfg to load the names from
     file.setFileName(QString("%1/Data/Names/%2.txt").arg(cfgdir->absolutePath()).arg(filename));
-    if (!file.exists()) file.setFileName(QString("%1/Names/%2.txt").arg(datadir->absolutePath()).arg(filename));
+    if (!file.exists())
+        file.setFileName(QString("%1/Names/%2.txt").arg(datadir->absolutePath()).arg(filename));
+
     if (file.open(QIODevice::ReadOnly | QIODevice::Text))
     {
 
         QTextStream in(&file);
-        while (!in.atEnd()) {
+        while (!in.atEnd())
+        {
             QString line = in.readLine();
-            if(line != QString(""))
-                {list.append(line);}
+            if(!line.isEmpty())
+                list.append(line);
         }
     }
 
-    if (list.size()==0)
+    if (list.size() == 0)
          list.append(filename);
 
+    return list;
 }
 
 
-void HWNamegen::hatCfgLoad(const QString hatname, QStringList &list)
+QStringList HWNamegen::dictsForHat(const QString hatname)
 {
-    list.clear();
+    QStringList list;
 
     QFile file;
+
+    // find .cfg to load the names from
     file.setFileName(QString("%1/Data/Names/%2.cfg").arg(cfgdir->absolutePath()).arg(hatname));
-    if (!file.exists()) file.setFileName(QString("%1/Names/%2.cfg").arg(datadir->absolutePath()).arg(hatname));
+    if (!file.exists())
+        file.setFileName(QString("%1/Names/%2.cfg").arg(datadir->absolutePath()).arg(hatname));
+
+
     if (file.open(QIODevice::ReadOnly | QIODevice::Text))
     {
-
         QTextStream in(&file);
-        while (!in.atEnd()) {
+        while (!in.atEnd())
+        {
             QString line = in.readLine();
-            if(line != QString(""))
-                {list.append(line);}
+            if(!line.isEmpty())
+                list.append(line);
         }
     }
 
-    if (list.size()==0)
+    if (list.size() == 0)
          list.append(QString("generic"));
 
+    return list;
 }
 
+// loades types from ini files. returns true on success.
+bool HWNamegen::loadTypes()
+{
+    QFile file;
+
+    // find .cfg to load the names from
+    file.setFileName(QString("%1/Data/Names/types.ini").arg(cfgdir->absolutePath()));
+    if (!file.exists())
+        file.setFileName(QString("%1/Names/types.ini").arg(datadir->absolutePath()));
+
 
-void HWNamegen::loadTypes()
-{
-    QFile file;
-    file.setFileName(QString("%1/Data/Names/types.ini").arg(cfgdir->absolutePath()));
-    if (!file.exists()) file.setFileName(QString("%1/Names/types.ini").arg(datadir->absolutePath()));
     if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
-        {typesAvailable = false; return;}
+        return false;
 
     int counter = 0; //counter starts with 0 (teamnames mode)
     TypesTeamnames.append(QStringList());
     TypesHatnames.append(QStringList());
 
     QTextStream in(&file);
-    while (!in.atEnd()) {
+    while (!in.atEnd())
+    {
         QString line = in.readLine();
-        if (line == QString("#####")){
+        if (line == QString("#####"))
+        {
             counter++; //toggle mode (teamnames || hats)
-            if ((counter%2) == 0){
+            if ((counter%2) == 0)
+            {
                 TypesTeamnames.append(QStringList());
                 TypesHatnames.append(QStringList());
             }
-        } else if ((line == QString("*****")) || (line == QString("*END*"))){
-            typesAvailable = true; return; // bye bye
-        } else {
-            if ((counter%2) == 0){ // even => teamnames mode
+        }
+        else if ((line == QString("*****")) || (line == QString("*END*")))
+        {
+            typesAvailable = true;
+            return true; // bye bye
+        }
+        else
+        {
+            if ((counter%2) == 0)
+            {
+                // even => teamnames mode
                 TypesTeamnames[(counter/2)].append(line);
-            } else { // odd => hats mode
+            }
+            else
+            {
+                // odd => hats mode
                 TypesHatnames[((counter-1)/2)].append(line);
             }
         }
-//        Types.append(line);
     }
-        typesAvailable = true;
-    return;
+
+    typesAvailable = true;
+    return true;
 }